天天看點

基于tensorflow的自定義目辨別别(win10環境) ——電氣攻城獅的AI入門之旅(3)

前面介紹的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左右,是以識别有一些錯誤。。

基于tensorflow的自定義目辨別别(win10環境) ——電氣攻城獅的AI入門之旅(3)
基于tensorflow的自定義目辨別别(win10環境) ——電氣攻城獅的AI入門之旅(3)

這個是攻城獅自己訓練的認貓狗模型。

如果有朋友下載下傳不友善的話,請留言,攻城獅想想辦法把本地的檔案傳上去供大家下載下傳。

這篇教程是攻城獅看過的最良心的一篇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裡。

完成後,檔案夾結構如下:

基于tensorflow的自定義目辨別别(win10環境) ——電氣攻城獅的AI入門之旅(3)

如果你想要訓練自己的識别模型,請删掉以下檔案(不要删檔案夾):

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
           

如果正常運作,會出現:

基于tensorflow的自定義目辨別别(win10環境) ——電氣攻城獅的AI入門之旅(3)

識别了兩隻狗狗,以及一張海濱的圖檔。

這裡是用了已有的模型對兩張示例圖檔做識别。

3、收集和标記圖檔

作者在家裡自己拍了140張圖檔,然後從網上下載下傳了一些,總計311張圖來訓練模型。

基于tensorflow的自定義目辨別别(win10環境) ——電氣攻城獅的AI入門之旅(3)

這裡作者提醒,每張圖檔最好小于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
           

如果一切正常,會出現訓練過程如下:

基于tensorflow的自定義目辨別别(win10環境) ——電氣攻城獅的AI入門之旅(3)

作者建議訓練到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識别網絡錄影機。

賣家秀:

基于tensorflow的自定義目辨別别(win10環境) ——電氣攻城獅的AI入門之旅(3)

買家秀(loss=0.15左右)

基于tensorflow的自定義目辨別别(win10環境) ——電氣攻城獅的AI入門之旅(3)

繼續閱讀