前面介紹的ImageAI可以使用固定模型準确識别預設目标。但有的時候我們需要識别一些自定義的目标,是以需要能自定義識别的工具。
這篇教程是攻城獅看過的最良心的一篇win10環境的目辨別别教程之一。在這裡部分摘錄翻譯,供大家交流學習,共同進步。
算法結構為fast-rcnn,當然也可以讀取其他結構。程式原作者已經封裝好了,改config檔案就可以用。
支援識别圖檔、視訊和網絡攝像頭。
本文翻譯自GITHUB的《How to train a TensorFlow Object Detection Classifier for multiple object detection on Windows》。
原文作者為:Evan EdjeElectronics 此處僅做翻譯。
原文連結:https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10
教學視訊連結:https://www.youtube.com/watch?v=Rgpfk6eYxJA
先放一個買家秀,攻城獅沒有安裝gpu版本的tensorflow,是以隻訓練到loss=0.15左右,是以識别有一些錯誤。。
這個是攻城獅自己訓練的認貓狗模型。
如果有朋友下載下傳不友善的話,請留言,攻城獅想想辦法把本地的檔案傳上去供大家下載下傳。
這篇教程是攻城獅看過的最良心的一篇win10環境的目辨別别教程之一。在這裡部分摘錄翻譯,供大家交流學習,共同進步。
原文和原教學視訊連結放在上面了,講得比我的翻譯更清楚,大家有條件可以去看看。
這篇教程的目标是識别部分撲克牌,同時标記撲克牌的位置。屬于标記識别範疇。該程式支援自定義模型訓練,是以,你可以用它來訓練自己的模型,例如識别人臉、識别花鳥等等。
最後的結果支援識别圖檔、視訊和網絡攝像頭攝像結果。
以下為正文内容:
1、安裝Tensorflow(GPU版本)
這一步相關教程有很多了,這裡放一個連結:
https://www.youtube.com/watch?v=RplXYjxgZbw
2、建立項目檔案夾(Tensorflow1)并配置ananconda的項目環境
在C槽建立一個檔案夾 /Tensorflow1。
下載下傳 https://github.com/tensorflow/models 上的models—master檔案,解壓并且放在/Tensorflow1裡。将models—master重命名為models。
下載下傳Faster-RCNN-Inception-V2模型。連結在這裡:
http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2018_01_28.tar.gz
用解壓軟體解壓并放在C:\tensorflow1\models\research\object_detection folder這個路徑下。
下載下傳原文位址的壓縮包,複制到C:\tensorflow1\models\research\object_detection裡。
完成後,檔案夾結構如下:
如果你想要訓練自己的識别模型,請删掉以下檔案(不要删檔案夾):
All files in \object_detection\images\train and \object_detection\images\test
The “test_labels.csv” and “train_labels.csv” files in \object_detection\images
All files in \object_detection\training
All files in \object_detection\inference_graph
建立一個anaconda項目環境(tensorflow1)
建立一個叫做tensorflow1的項目環境
C:\> conda create -n tensorflow1 pip python=3.5
激活tensorflow1環境
C:\> activate tensorflow1
在該環境内安裝tensorflow(gpu)版本
(tensorflow1) C:\> pip install --ignore-installed --upgrade tensorflow-gpu
安裝一些必要的庫
(tensorflow1) C:\> conda install -c anaconda protobuf
(tensorflow1) C:\> pip install pillow
(tensorflow1) C:\> pip install lxml
(tensorflow1) C:\> pip install Cython
(tensorflow1) C:\> pip install jupyter
(tensorflow1) C:\> pip install matplotlib
(tensorflow1) C:\> pip install pandas
(tensorflow1) C:\> pip install opencv-python
把PYTHONPATH指到我們的檔案夾
(tensorflow1) C:\> set PYTHONPATH=C:\tensorflow1\models;C:\tensorflow1\models\research;C:\tensorflow1\models\research\slim
每次重新啟動指令行的時候,都要重新輸一遍這個指令。
編譯Protobufs 并且運作run setup.py
在anaconda的Prompt裡運作
protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eval.proto .\object_detection\protos\faster_rcnn.proto .\object_detection\protos\faster_rcnn_box_coder.proto .\object_detection\protos\grid_anchor_generator.proto .\object_detection\protos\hyperparams.proto .\object_detection\protos\image_resizer.proto .\object_detection\protos\input_reader.proto .\object_detection\protos\losses.proto .\object_detection\protos\matcher.proto .\object_detection\protos\mean_stddev_box_coder.proto .\object_detection\protos\model.proto .\object_detection\protos\optimizer.proto .\object_detection\protos\pipeline.proto .\object_detection\protos\post_processing.proto .\object_detection\protos\preprocessor.proto .\object_detection\protos\region_similarity_calculator.proto .\object_detection\protos\square_box_coder.proto .\object_detection\protos\ssd.proto .\object_detection\protos\ssd_anchor_generator.proto .\object_detection\protos\string_int_label_map.proto .\object_detection\protos\train.proto .\object_detection\protos\keypoint_box_coder.proto .\object_detection\protos\multiscale_anchor_generator.proto .\object_detection\protos\graph_rewriter.proto
在指令行裡運作
(tensorflow1) C:\tensorflow1\models\research> python setup.py build
(tensorflow1) C:\tensorflow1\models\research> python setup.py install
用以下代碼測試一下環境能否正常工作
(tensorflow1) C:\tensorflow1\models\research\object_detection> jupyter notebook object_detection_tutorial.ipynb
如果正常運作,會出現:
識别了兩隻狗狗,以及一張海濱的圖檔。
這裡是用了已有的模型對兩張示例圖檔做識别。
3、收集和标記圖檔
作者在家裡自己拍了140張圖檔,然後從網上下載下傳了一些,總計311張圖來訓練模型。
這裡作者提醒,每張圖檔最好小于200KB,分辨率不超過720x1280,否則會訓練得非常慢。
準備好照片後,把20% 的照片放進 \object_detection\images\test檔案夾。
把80% 的照片放進 \object_detection\images\train檔案夾。
在labelmg軟體中标記圖檔,下載下傳連結:
https://www.dropbox.com/s/tq7zfrcwl44vxan/windows_v1.6.0.zip?dl=1
這一步是最耗時的,攻城獅标了一個上午。。
标記完成後,生成的使很多.xml檔案,我們需要把它轉化成 .csv檔案。
在Anaconda command prompt裡,執行以下指令:
(tensorflow1) C:\tensorflow1\models\research\object_detection> python xml_to_csv.py
這一步在\object_detection\images檔案夾裡把之前的.xml轉化成.csv檔案。
如果你想訓練自己的模型,需要調整labelmap.pbtxt 的内容
例如
# TO-DO replace this with label map
def class_text_to_int(row_label):
if row_label == 'nine':
return 1
elif row_label == 'ten':
return 2
elif row_label == 'jack':
return 3
elif row_label == 'queen':
return 4
elif row_label == 'king':
return 5
elif row_label == 'ace':
return 6
else:
return None
調整為
# TO-DO replace this with label map
def class_text_to_int(row_label):
if row_label == 'basketball':
return 1
elif row_label == 'shirt':
return 2
elif row_label == 'shoe':
return 3
else:
return None
然後,把檔案轉化成TFRecord
python generate_tfrecord.py --csv_input=images\train_labels.csv --image_dir=images\train --output_path=train.record
python generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=images\test --output_path=test.record
5、建立Labelmap并且設定訓練的輸入輸出路徑
在C:\tensorflow1\models\research\object_detection\training裡建立記事本檔案,儲存為labelmap.pbtxt。注意是pbtxt,不是txt。
在檔案裡寫以下代碼
item {
id: 1
name: 'nine'
}
item {
id: 2
name: 'ten'
}
item {
id: 3
name: 'jack'
}
item {
id: 4
name: 'queen'
}
item {
id: 5
name: 'king'
}
item {
id: 6
name: 'ace'
}
如果要訓練自己的模型,可以做一些修改,例如改成
item {
id: 1
name: 'basketball'
}
item {
id: 2
name: 'shirt'
}
item {
id: 3
name: 'shoe'
}
設定訓練輸入輸出通道:
在 C:\tensorflow1\models\research\object_detection\samples\configs檔案夾裡,複制faster_rcnn_inception_v2_pets.config檔案到\object_detection\training檔案夾裡。
對faster_rcnn_inception_v2_pets.config檔案做一下修改(這塊攻城獅直接拷貝的原文,因為怕翻譯造成意思上的歧義:
第 9行. 把classes的num改成你想要探測的類的數量。
例如:For the above basketball, shirt, and shoe detector, it would be num_classes : 3 .
Line 110. Change fine_tune_checkpoint to:
fine_tune_checkpoint : “C:/tensorflow1/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt”
Lines 126 and 128. In the train_input_reader section, change input_path and label_map_path to:
input_path : “C:/tensorflow1/models/research/object_detection/train.record”
label_map_path: “C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt”
Line 132. Change num_examples to the number of images you have in the \images\test directory.
Lines 140 and 142. In the eval_input_reader section, change input_path and label_map_path to:
input_path : “C:/tensorflow1/models/research/object_detection/test.record”
label_map_path: “C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt”
6、訓練模型
在\object_detection目錄内,執行以下指令:
python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config
如果一切正常,會出現訓練過程如下:
作者建議訓練到loss低于0.05為止。
在Anaconda Prompt裡,激活tensorflow1環境,并且輸入以下指令
(tensorflow1) C:\tensorflow1\models\research\object_detection>tensorboard --logdir=training
會得到一個網址:YourPCName:6006
在浏覽器裡輸入這個網址,可以打開TensorBoard,讓你可視化地看訓練過程。
訓練中,可以用Ctrl+C 中止,之後重複前面的訓練操作可以繼續訓練,從最後一個記錄點繼續。
7、輸出Inference Graph
在指令行裡執行
其中,XXXX需要換成你的模型号
python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_pets.config --trained_checkpoint_prefix training/model.ckpt-XXXX --output_directory inference_graph
在\object_detection\inference_graph檔案夾裡建立一個.pb檔案。
8、使用目辨別别探測器
在Anaconda Command Prompt裡(tensorflow1環境)中輸入:idle。
對應視窗中打開 \object_detection檔案夾的Object_detection_image.py檔案來識别單個圖檔。(Object_detection_image.py檔案裡的圖檔名可以改成\object_detection檔案夾裡的對應圖檔名,來識别你想識别的圖檔)
同樣,可以用Object_detection_video.py來識别視訊
用Object_detection_webcam.py識别網絡錄影機。
賣家秀:
買家秀(loss=0.15左右)