使用object detection訓練並識別自己的模型
1.安裝tensorflow(version>=1.4.0)
2.部署tensorflow models
- 在這里下載
- 解壓並安裝
- 解壓后重命名為models復制到tensorflow/目錄下
- 在linux下
- 進入tensorflow/models/research/目錄,運行protoc object_detection/protos/*.proto --python_out=.
- 在~/.bashrc file.中添加slim和models/research路徑
export PYTHONPATH=$PYTHONPATH:/path/to/slim:/path/to/research
- 在windows下
- 下載protoc-3.3.0-win32.zip(version==3.3,已知3.5版本會報錯)
- 解壓后將protoc.exe放入C:\Windows下
- 在tensorflow/models/research/打開powershell,運行protoc object_detection/protos/*.proto --python_out=.
3.訓練數據准備(標記分類的圖片)
- 安裝labelImg 用來手動標注圖片 ,圖片需要是png或者jpg格式
- 標注信息會被保存為xml文件,使用 這個腳本 將所有xml文件轉換為一個csv文件(xml文件路徑識別在29行,根據情況自己修改)
- 把生成的csv文件分成訓練集和測試集
4.生成TFRecord文件
- 使用 這個腳本 將兩個csv文件生成出兩個TFRecord文件(訓練自己的模型,必須使用TFRecord格式文件。圖片路徑識別在86行,根據情況自己修改)
5.創建label map文件
id需要從1開始,class-N便是自己需要識別的物體類別名,文件后綴為.pbtxt
item{
id:1
name: 'class-1'
}
item{
id:2
name: 'class-2'
}
6.下載模型並配置文件
- 下載一個模型(文件后綴.tar.gz)
- 修改對應的訓練pipline配置文件
- 查找文件中的PATH_TO_BE_CONFIGURED字段,並做相應修改
- num_classes 改為你模型中包含類別的數量
- fine_tune_checkpoint 解壓.tar.gz文件后的路徑 + /model.ckpt
- from_detection_checkpoint:true
- train_input_reader
- input_path 由train.csv生成的record格式訓練數據
- label_map_path 第5步創建的pbtxt文件路徑
- eval_input_reader
- input_path 由test.csv生成的record格式訓練數據
- label_map_path 第5步創建的pbtxt文件路徑
7. 訓練模型
- 進入tensorflow/models/research/目錄,運行
python object_detection/train.py --logtostderr --pipeline_config_path=${PATH_TO_YOUR_PIPELINE_CONFIG} //第六步中修改的pipline配置文件路徑// --train_dir=${PATH_TO_TRAIN_DIR} //生成的模型保存路徑//
8.導出模型
- 在第7步中,--train_dir指向的路徑中會生成一系列訓練中自動保存的checkpoint,一個checkpoint由三個文件組成,后綴分別是.data-00000-of-00001 .index和.meta,任然在第7步的路徑中,運行
python object_detection/export_inference_graph.py --input_type image_tensor --pipeline_config_path ${PIPELINE_CONFIG_PATH} //第六步中修改的pipline配置文件路徑// --trained_checkpoint_prefix ${TRAIN_PATH} //上述的一個checkpoint,例如model.ckpt-112254// --output_directory ${OUTPUT_PATH} //輸出模型文件的路徑//
- 目前直接使用export_infernce_graph.py會報錯,解決方法是將object_detection/目錄下的export.py文件中第71行的
rewrite_options = rewriter_config_pb2.RewriterConfig(layout_optimizer=rewriter_config_pb2.RewriterConfig.ON)
改為
rewrite_options = rewriter_config_pb2.RewriterConfig()
9.使用新模型識別圖片
- 在jupyter notebook中打開object_detection/路徑下的object_detection_tutorial.ipynb文件
- 修改第四步代碼中的PATH_TO_CKPT,指向第8步導出模型路徑中的frozen_inference_graph.pb文件
- 修改第四步代碼中的PATH_TO_LABELS,指向第5步創建的pbtxt文件路徑
- 修改第四步代碼中的NUM_CLASSES為模型實際包含的類別數
- 注釋掉第五步所有代碼
- 修改第九步代碼中的PATH_TO_TEST_IMAGES_DIR, 指向待識別圖片文件夾路徑
- 修改第九步代碼中TEST_IMAGE_PATHS, 將文件名和擴展名修改為實際圖片格式,如圖片為1.bmp、2.bmp... 則對應改為'{}.bmp',同時修改i值范圍以覆蓋所有待檢測圖片
參考文檔
https://gist.github.com/douglasrizzo/c70e186678f126f1b9005ca83d8bd2ce
https://towardsdatascience.com/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9