天天看點

簡單好用的ImageAI程式設計庫!選擇最适合你的!

ImageAI是一套Python的電腦視覺程式設計庫,主要提供三大功能:Image prediction、Object detection、Video object Detection and tracking。

簡單好用的ImageAI程式設計庫!選擇最适合你的!

作者是兩個住在奈及利亞拉哥斯的黑人兄弟Moses Olafenwa和John Olafenwa,強調程式設計設計皆是自學而來,除了ImageAI,他們還另外開發了一套基于PyTorch的開源Deep learning framework,這些套件展現了他們非凡的程式設計功力和AI學養。

功能說明

Image prediction

針對Image prediction有四種深度學習模型可選擇:

– SqueezeNet

Size為4.82 mb,預測速度最快,精确度中等。

SqueezeNet由UC Berkeley和Stanford所合作開發,與MobileNet、ShuffleNet、Xception并稱為四種目前最知名的輕量級影像識别模型,它們皆針對模型中CNN卷積的方法作了改善,以減少深度并加快其效率。

– ResNet50

由Microsoft Research 所研發的模型,Size為98 mb,預測速度快,精确度高。

ResNet全名是Residual Neural Network,由微軟研究院所開發,中文多半翻譯為殘差網路。它的特點是神經網路不一定要一層層接續往下執行,可以是跳躍方式略過下一層而直達下下層。因為它改善了深度持續增加時所出現的Degradation問題,是以ResNet可以更深,如ResNet50。

– InceptionV3

Inception是由Google Brain team所研發,Size為91.6 mb,預測速度慢,但精确度較高。

Inception是一種network in network的架構,針對輸入資料同時并行不同filter尺寸的卷積處理和max pooling,最後再進行級聯,這讓系統在同一層便能取得不同level的特征。Inception是GoogLeNet的核心架構,一般所稱的Inception的各系列版本,即是指GoogLeNet。

– DenseNet121

這是由Facebook AI Research所開發的模型,Size為31.6 mb,預測速度最慢,但精确度最高。

透過大量Dense block(直接與下層layer建立連接配接,以避免梯度消失)使用,并減少每層的複雜度,DenseNet号稱使用大約一半的參數就能夠達到與ResNet相同的表現,但這是指相同的層數下,故DenseNet121預測速度仍較ResNet50慢。

速度:SqueezeNet>ResNet50>InceptionV3>DenseNet121

精度:DenseNet121>InceptionV3>ResNet50>SqueezeNet

Object detection

針對Object detection功能,目前僅RetinaNet可選擇,但官方說明會持續提供其它的模型選擇。

RetinaNet

目前主流的Object detection技術主要有兩種:one-stage及two-stage。

two-stage需先透過傳統Image pyramid、或後來改進的Object Box Proposals等等方式來輸出候選視窗,再去評估各區域的物件機率,此技術以Faster RCNN為代表。缺點是消耗的資源多,效率較低,但輸出結果的準确度高。

one-stage則以YOLO、SSD為最知名,可直接在影像各區域上計算物件機率、或直接判斷物件。這一類方法速度相當快,但準确度就沒有two-stage高。

Video object Detection and tracking

影片物件偵測功能其實是進行多張圖檔進行連續快速的detection,是以與Object detection相同,目前僅支援RetinaNet。

安裝

目前ImageAI僅支援Python3.5.1以上的版本,整個安裝過程在半小時左右便可順利結束。

安裝必要的模組:

pip3 install –upgrade tensorflow

pip3 install numpy

pip3 install scipy

pip3 install opencv-python

pip3 install pillow

pip3 install matplotlib

pip3 install h5py

pip3 install keras

主程式設計:

pip3 install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl

使用說明

Image prediction

ImageAI針對影像辨識提供了前述的四種模型SqueezeNet, ResNet, InceptionV3及DenseNet,并提供 ImageNet-1000 影像資料庫所訓練好的參數讓我們直接使用。(ImageNet-1000有120萬張相片,1000種物件類型。)

程式設計:

from imageai.Prediction import ImagePrediction

import os

execution_path = os.getcwd()

prediction = ImagePrediction()

prediction.setModelTypeAsResNet()

prediction.setModelPath(os.path.join(execution_path, “prediction/resnet50_weights_tf_dim_ordering_tf_kernels.h5″))

prediction.loadModel()

predictions, probabilities = prediction.predictImage(os.path.join(execution_path, “predict1.jpg"), result_count=5 )

for eachPrediction, eachProbability in zip(predictions, probabilities):

print(eachPrediction + " : " + eachProbability)

不到十行程式設計便可完成相片預測功能了!

上述程式設計中所定義的預訓練模型參數檔 .h5可從https://github.com/OlafenwaMoses/ImageAI/tree/master/imageai/Prediction 下載下傳,共有四種。下面為我們要預測的圖檔predict1.jpg。

簡單好用的ImageAI程式設計庫!選擇最适合你的!

B) OBJECT DETECTION

Object detection的功能透過ImageAI framework也是相當簡單。

from imageai.Detection import ObjectDetection

import os

execution_path = os.getcwd()

detector = ObjectDetection()

detector.setModelTypeAsRetinaNet()

detector.setModelPath( os.path.join(execution_path , “detection/resnet50_coco_best_v2.0.1.h5″))

detector.loadModel()

detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , “2.jpg"), output_image_path=os.path.join(execution_path , “2new.jpg"))

for eachObject in detections:

print(eachObject[“name"] + " : " + eachObject[“percentage_probability"] )

print(“——————————–“)

RetinaNet的預訓練權重檔請從 https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5 下載下傳。

我們以這張相片2.jpf為例。

簡單好用的ImageAI程式設計庫!選擇最适合你的!

其預測結果如下:

簡單好用的ImageAI程式設計庫!選擇最适合你的!

C) VIDEO OBJECT DETECTION AND TRACKING

ImageAI提供的Video object detection使用的模型為RetinaNet,可偵測80種物件類别如下:

person, bicycle, car, motorcycle, airplane, bus, train, truck, boat, traffic light, fire hydrant, stop_sign, parking meter, bench, bird, cat, dog, horse, sheep, cow, elephant, bear, zebra, giraffe, backpack, umbrella, handbag, tie, suitcase, frisbee, skis, snowboard, sports ball, kite, baseball bat, baseball glove, skateboard, surfboard, tennis racket, bottle, wine glass, cup, fork, knife, spoon, bowl, banana, apple, sandwich, orange, broccoli, carrot, hot dog, pizza, donot, cake, chair, couch, potted plant, bed, dining table, toilet, tv, laptop, mouse, remote, keyboard, cell phone, microwave, oven, toaster, sink, refrigerator, book, clock, vase, scissors, teddy bear, hair dryer, toothbrush.

不過嚴格來說,從ImageAI提供的檔案上看不出有Tracking的功能,僅能加入custom_objects參數來指定要偵測特定的物件類别。此外,Video object detection功能并非實時播放影片偵測,而是将輸入影片進行偵測後再輸出為新的影片,如果我們需要即時的處理影片串流,應該使用其object detection功能by frame來處理。

CUSTOM MODEL TRAINING & PREDICTION

值得一提的是,ImageAI提供很友善的方法,可讓您訓練自己的Image prediction模型,也是有四種模型可選:SqueezeNet、ResNet50、InceptionV3、DenseNet121,訓練完之後,可得到.json(label定義)及.h5(模型權重檔),我們可透過這兩個檔案來進行影像的預測。

Step1:Dataset準備

舉例來說,如果我想訓練一個數字0~5的手勢模型,那麼,我需要準備如格式下的image dataset,兩層式的資料夾,第一層為dataset名稱,第二層為各類别名稱,然後在第二層資料夾放入相對應的圖檔。

簡單好用的ImageAI程式設計庫!選擇最适合你的!

Step2:定義訓練參數

下面五行

from imageai.Prediction.Custom import ModelTraining

model_trainer = ModelTraining()

model_trainer.setModelTypeAsInceptionV3()

model_trainer.setDataDirectory(“gesture")

model_trainer.trainModel(num_objects=6, num_experiments=10, enhance_data=True, batch_size=32, show_network_summary=True)

model_trainer.setModelTypeAsInceptionV3() → 指定訓練模型為InceptionV3

model_trainer.setDataDirectory(“gesture") → 定義該dataset的第一層目錄。

num_objects=6 → 要訓練的物件類别數目,以本例來說,有0~5 六種手勢。

num_experiments → 要訓練的疊代次數,亦即epoch

enhance_data → 資料強化,亦即data augmentation,此選項為optional。

batch_size → 每一批次訓練的image數目。

show_network_summary → 顯示模型的層次架構,類似keras的model.summary。

Step3:開始訓練

執接執行上方的程式設計,便會開始訓練。建議一定要在GPU環境執行,否則原本2個小時的訓練可能一整天也跑不完。執行時如下,一開始會顯示模型的layer定義,然後開始訓練。如果您有安裝Nvidia Cuda的GPU環境,那麼程式設計會自動使用GPU來訓練。

訓練了50 epochs,最終vlaidation成績是0.9650

Step4:使用此模型

最後,讓我們在程式設計中使用此模型吧,model_palm_mixed.h5以及model_palm_mixed.json是剛剛産生的檔案。這個手勢辨識dataset是我用webcamera拍攝自己手部擺出的0, 1, 2 ~ 5的數字手勢。

import cv2

import matplotlib.pyplot as plt

%matplotlib inline

from imageai.Prediction.Custom import CustomImagePrediction

import os

execution_path = os.getcwd()

prediction = CustomImagePrediction()

prediction.setModelTypeAsInceptionV3()

prediction.setModelPath(os.path.join(execution_path, “model_palm_mixed.h5″))

prediction.setJsonPath(os.path.join(execution_path, “model_palm_mixed.json"))

prediction.loadModel(num_objects=7)

imgPath = “/home/chtseng/works/train-opencvCascade/keras/datasets/palm/train/3/aug_0_3215.jpg"

img = cv2.imread(imgPath)

plt.imshow(img[…,::-1])

#辨識command

predictions, probabilities = prediction.predictImage(imgPath, result_count=2 )

for eachPrediction, eachProbability in zip(predictions, probabilities):

print(eachPrediction + " : " + eachProbability)

下面我們從Test dataset(非train dataset)找出幾個樣本來測試。看起來效果相當不錯,不過這些圖檔都是來自我自己的手勢,樣本變化太小,僅能作為測試性質。

簡單好用的ImageAI程式設計庫!選擇最适合你的!

ImageAI這個套件相當的友善簡單,适合剛入門想嘗試一下計算機視覺的朋友們。

延伸閱讀:谷歌的TPU是什麼?真能吊打GPU?

谷歌的TPU預計将減少對大型資料中心的需求,否則需要更多的CPU和GPU來處理人工智能應用程式,從語音識别和分析,圖像和視訊處理,到提供搜尋服務,再到那些小谷歌智能家庭系統。

TPU是針對TensorFlow上的機器學習工作負載量身定制的定制應用專用內建電路(ASIC)。 雖然第一代TPU僅用于推理,但Cloud TPU适用于推理和機器學習教育訓練。 Cloud TPU采用四個定制ASIC建構,可提供強大的64 GB高帶寬記憶體和180 TFLOPS性能。

去年,谷歌宣稱它的TPU比現代GPU和推理CPU快15到30倍,并且TOPS / Watt測量值提高了30-80倍。在機器學習教育訓練中,Cloud TPU的性能更強(180對120 TFLOPS),記憶體容量(64 GB對16 GB記憶體)比Nvidia最好的GPU Tesla V100大四倍。

簡單好用的ImageAI程式設計庫!選擇最适合你的!

此外,谷歌還釋出了Edge TPU,特定用途 ASIC 晶片,專為在裝置上運作 TensorFlow Lite ML 模型而設計。Edge TPU 可以加速裝置上的 ML 推理,或與 Google Cloud 配對,建立完整的雲到邊緣 ML 堆棧。針對Edge TPU的新裝置是:AIY Edge TPU Dev 開發闆和 AIY Edge TPU 加速器,二者皆采用 Google 的 Edge TPU 晶片。

繼續閱讀