2018年10月10日 星期三

深度學習(8)--使用Tensorflow Object Detection API 實現物件自動辨識



2017年6月,Google公司開放了Tensorflow Object Detection API。這個專案使用TensorFlow 實現了大多數深度學習目標檢測架構,其中就包含Faster R-CNN。在本文章中將會介紹如何安裝Tensorflow Object Detection API,再介紹如何使用已訓練好的模型進行物體檢測,本文介紹的環境將會是架構在Windows 10 上面,使用Python 3.5.2,TensorFlow V1.9,最後並利用OPENCV 的WebCam攝影功能,利用攝影機即時辨別物體。

底下就先來觀看利用攝影機即時辨別物體的DEMO影片吧。

<Demo 影片>










 安裝Tensorflow Object Detection API

在GitHub上,Tensorflow Object Detection API 是儲存在tensorflow/models專案下
https://github.com/tensorflow/models  可以直接下載下來。

或是透過git來下載:
git clone https://github.com/tensorflow/models.git

下載tensorflow/models程式後,應該會獲得一個models資料夾。models資料夾中還有一個
research資料夾,底下安裝指令都是以research資料夾為根目錄執行的,所說的目錄也都是以
research資料夾為相對目錄。

1.安裝或升級protoc

    在object_detection/protos/中,可以看到一些proto檔案,需要使用protoc程式,將這些proto檔案編譯為python檔案。

安裝protobuf的方法,是登入protobuf的發布頁面:https://github.com/google/protobuf/releases
因為我們是安裝到windows 系統,所以我們可以直接下載如下檔案:
使用版本為protoc V.3.6.1,解壓縮之後有一protoc.exe,我的使用方法是直接放到research資料夾使用即可。


2. 編譯proto檔案

接著使用protoc對proto檔案進行編譯,應當在research資料夾使用以下命令:
protoc object_detection/protos/*.proto --python_out=.

執行完成後,可以檢查object_detection/protos/資料夾,如果每個proto檔案都產生了對應的.py為附檔名的python原始程式碼,那就說明編譯成功了

這時通常會遇到如下錯誤:

如果遇到這個錯誤,簡單的解決方法是一個個檔案去編譯,如:
protoc object_detection/protos/anchor_generator.proto --python_out=.
protoc object_detection/protos/argmax_matcher.proto --python_out=.
protoc object_detection/protos/bipartite_matcher.proto --python_out=.
protoc object_detection/protos/box_coder.proto --python_out=.
protoc object_detection/protos/box_predictor.proto --python_out=.
protoc object_detection/protos/eval.proto --python_out=.
protoc object_detection/protos/faster_rcnn.proto --python_out=.
protoc object_detection/protos/faster_rcnn_box_coder.proto --python_out=.
protoc object_detection/protos/grid_anchor_generator.proto --python_out=.
protoc object_detection/protos/hyperparams.proto --python_out=.
protoc object_detection/protos/image_resizer.proto --python_out=.
protoc object_detection/protos/input_reader.proto --python_out=.
protoc object_detection/protos/keypoint_box_coder.proto --python_out=.
protoc object_detection/protos/losses.proto --python_out=.
protoc object_detection/protos/matcher.proto --python_out=.
protoc object_detection/protos/mean_stddev_box_coder.proto --python_out=.
protoc object_detection/protos/model.proto --python_out=.
protoc object_detection/protos/multiscale_anchor_generator.proto --python_out=.
protoc object_detection/protos/optimizer.proto --python_out=.
protoc object_detection/protos/pipeline.proto --python_out=.
protoc object_detection/protos/post_processing.proto --python_out=.
protoc object_detection/protos/preprocessor.proto --python_out=.
protoc object_detection/protos/region_similarity_calculator.proto --python_out=.
protoc object_detection/protos/square_box_coder.proto --python_out=.
protoc object_detection/protos/ssd.proto --python_out=.
protoc object_detection/protos/ssd_anchor_generator.proto --python_out=.
protoc object_detection/protos/string_int_label_map.proto --python_out=.
protoc object_detection/protos/train.proto --python_out=.

3.將Slim加入PYTHONPATH

     Tensorflow Object Detection API 是以Slim為基礎實現的,需要將Slim的目錄加入PYTHONPATH後才能正確執行,所以可以直接在research資料夾下直接執行以下命令,
這命令是for windows 使用:
SET PYTHONPATH=%cd%;%cd%\slim

在linux下使用命令如下:
export PYTHONPATH=$PYTHONPATH:'pwd':'pwd'/slim

執行上述命令完之後,可以用python指令開啟一個python shell,如果執行import slim成功則說明已經正確設定好。

4.安裝完成測試

在research資料夾下執行,以下測試程式:
python object_detection\builders\model_builder_test.py

如果出現以下訊息,表示Tensorflow Object Detection API 已安裝成功:


執行已訓練好的模型


          Tensorflow Object Detection API 預設提供了5個預訓練模型,他們都是使用COCO資料集訓練完成的,結構分別為SSD+MobileNet,SSD+Inception,R-FCN+ResNet101,Faster RCNN+ResNet101,Faster RCNN+Inception_ResNet。

官方已經提供了一個用Jupyter Notebook撰寫好的實例,請先在research資料夾執行 jupyter notebook指令,然後開啟http://localhost:8888,接著開啟object_detection資料夾,並點擊
object_detection_tutorial.ipynb ,執行範例檔案,如下圖:



檢測效果圖如下:






接著底下提供了利用OPENCV打開攝影機的範例程式碼

代碼可以從底下連結獲取:
https://github.com/Ashing00/TensorFlowObjectDetection/tree/master


直接執行TFOD.py就可以如Demo 影片般進行物件即時辨識。


最後底下有幾個可能安裝或是執行程式過程中會遇到的錯誤,在此也提供方法解決。

如果出現以下錯誤:


那麼可以直接copy  models\research\object_detection\utils 的目錄
放置你的python目錄裡的site-packages\
EX:
copy
D:\pycode35\models\research\object_detection\utils
to
D:\WinPython-64bit-3.5.2.3Qt5\python-3.5.2.amd64\Lib\site-packages\utils

D:\pycode35\==>是我python code的根目錄
D:\WinPython-64bit-3.5.2.3Qt5\  ==>這是我使用winpython的目錄

如果出現以下錯誤:


表示上面所說SET PYTHONPATH=%cd%;%cd%\slim,未執行正確。

如果出現以下錯誤:

請參閱TFOD.py程式碼及下圖



需更改PATH_TO_LABELS 路徑,在此我是使用絕對路徑,請依照你的路徑去修改,並且須注意路徑斜線的方向。


   以上就是這次的安裝心得筆記,一般來說安裝Tensorflow Object Detection API 在Ubuntu Linux系統的範例較多,而這裡則是提供了安裝在windows 10上的方式。


加入阿布拉機的3D列印與機器人的FB專頁
https://www.facebook.com/arbu00/



<其他相關文章>
人工神經網路(1)--使用Python實作perceptron(感知器)
人工神經網路(2)--使用Python實作後向傳遞神經網路演算法(Backprogation artificial neature network)
深度學習(1)-如何在windows安裝Theano +Keras +Tensorflow並使用GPU加速訓練神經網路
深度學習(2)--使用Tensorflow實作卷積神經網路(Convolutional neural network,CNN)
深度學習(3)--循環神經網絡(RNN, Recurrent Neural Networks)
深度學習(4)--使用Tensorflow實現類Lenet5手寫數字辨識
深度學習(5)--使用Tensorflow實現類AlexNet手寫數字辨識
深度學習(6)--使用Tensorflow實現類AlexNet model 訓練Cifar10數據集
深度學習(7)--使用Tensorflow實現類VGG model 訓練Cifar10數據集

機器學習(1)--使用OPENCV KNN實作手寫辨識
機器學習(2)--使用OPENCV SVM實作手寫辨識
機器學習(3)--適應線性神經元與梯度下降法(Adaline neuron and Gradient descent)
機器學習(4)--資料標準常態化與隨機梯度下降法( standardization & Stochastic Gradient descent)
機器學習(5)--邏輯斯迴歸,過度適合與正規化( Logistic regression,overfitting and regularization)
機器學習(6)--主成分分析(Principal component analysis,PCA)
機器學習(7)--利用核主成分分析(Kernel PCA)處理非線性對應
機器學習(8)--實作多層感知器(Multilayer Perceptron,MLP)手寫數字辨識