1. 程式人生 > >[AI] 使用object detection訓練自己的模型用於物體識別

[AI] 使用object detection訓練自己的模型用於物體識別

軟體環境

  • tensorflow (1.8.0)
  • libprotoc 3.0.0/3.3.0
  • tensorflow models models/research/object_detection (2018/dec版本)
    • models
    • git clone https://github.com/tensorflow/models.git
  • pretrained models: ssd_mobilenet_v1_coco_2018_01_28.tar.gz
    • wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2018_01_28.tar.gz
    • tar xfvz ./ssd_mobilenet_v1_coco_2018_01_28.tar.gz
  • Python pip libraries
pip install absl-py --user
pip install Cython --user
pip install pycocotools --user
pip install pillow --user       //PIL

參考網站

把 tensorflow路徑加到環境變數

nano ~/.bashrc
export PYTHONPATH=$PYTHONPATH:/home/guohj/AI/lib/tensorflow/models-master/research:/home/guohj/AI/lib/tensorflow/models-master/research/slim

編譯 proto files

[email protected]:/home/guohj/AI/lib/tensorflow/models-master/research$ ../../protobuf/v3.3/bin/protoc object_detection/protos/*.proto --python_out=.
[email protected]
:/home/guohj/AI/lib/tensorflow/models-master/research$

標記影象 label Images

使用工具LabelImg:

 git clone https://github.com/tzutalin/labelImg.git

Python 2 + Qt4

sudo apt-get install pyqt4-dev-tools
sudo pip install lxml
make qt4py2
python labelImg.py
python labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]

Python 3 + Qt5

sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3
python3 labelImg.py
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]

其他工具比較

  1. LabelMe: 最著名的工具之一。但是,使用者介面有點太慢,特別是放大影象時。
  2. RectLabel 簡單易用。僅適用於Mac
  3. LabelBox:非常適合大型標籤專案,並可選擇不同型別的標籤任務。
  4. VGG影象註釋器(VIA):快速,輕便,設計精良。這是我最終使用的那個。
  5. COCO UI:用於註釋COCO資料集的工具。

建立label map 檔案 (*.pbtxt)
 id需要從1開始,class-N便是自己需要識別的物體類別名,檔案字尾為.pbtxt

item{
    id:1,
    name: 'class-1',
},
item{
    id:2,
    name: 'class-2',
}

生成 Record File

使用工具:

  1. 標記XML轉CSV指令碼 xml_to_csv.py
  2. CSV+ JPG轉 tensorflow record檔案 generate_tfrecord.py

    在函式class_text_to_int() 中增加所有標籤以及對映值(*.pbtxt中的id)。

python utils/generate_tfrecord.py --csv_input=s7_train_labels.csv --output_path=train.record
python utils/generate_tfrecord.py --csv_input=s7_test_labels.csv --output_path=test.record

訓練集、測試集 劃分比例:

  1. 資料量很小時(幾百張圖片),可以讓訓練集和測試集相同
  2. 資料量不大的時候(萬級別及以下)一般將訓練集和測試集劃為7:3。若有驗證集,則劃為6:2:2.
  3. 到了大資料時代,資料量陡增為百萬級別,此時我們不需要那麼多的驗證集和訓練集。假設有100W條資料,只需要拿出1W條來當驗證集,1W條來當測試集,就能很好地work了。因此,在深度學習中若是資料很大,我們可以將訓練集、驗證集、測試集比例調整為98:1:1

training

  1. 下載並選擇一個coco資料集預訓練的模型:Tensorflow detection model zoo

    根據自己的需要,選擇一款用coco資料集預訓練的模型,把字首model.ckpt放置在待訓練的目錄,這裡meta檔案儲存了graph和metadata,ckpt儲存了網路的weights,這幾個檔案表示預訓練模型的初始狀態。
    比如選擇:ssd_mobilenet_v1_coco

wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2018_01_28.tar.gz
tar xfvz ./ssd_mobilenet_v1_coco_2018_01_28.tar.gz
  1. Edit pipeline.config file.

    1. num_classes:修改為自己的classes num
    2. 將所有PATH_TO_BE_CONFIGURED的地方修改為自己之前設定的路徑(共5處)
  2. 開始訓練
python object_detection/model_main.py  --pipeline_config_path=/home/guohj/AI/training/S7_tf_ssd_mobilenet/pretrained/ssd_mobilenet_v1_coco_2018_01_28/pipeline.config --model_dir=/home/guohj/AI/training/S7_tf_ssd_mobilenet/trainres/ --num_train_steps=30000 --num_eval_steps=2000 --alsologtostderr

Tensorboard 進行監控

通過tensorboard工具,可以監控訓練過程。

tensorboard --logdir=/home/guohj/AI/training/S7_tf_ssd_mobilenet/trainres/

GPU 運算

Tensorflow 只能使用 CUDA 9.0,即使CUDA9.1都不行