原文:https://makeoptim.com/deep-learning/yiai-object-detection
- 前言
- 目標(biāo)檢測(cè)
- 發(fā)展史
- TensorFlow Object Detection API
- 工程創(chuàng)建
- 數(shù)據(jù)集
- 模型訓(xùn)練
- 小結(jié)
- 參考鏈接
前言
本文將介紹目標(biāo)檢測(cè)(Object Detection)的概念漠吻,并通過案例講解如何使用 TensorFlow Object Detection API 來訓(xùn)練自定義的目標(biāo)檢測(cè)器吃引,包括:數(shù)據(jù)集采集和制作、TensorFlow Object Detection API 安裝以及模型的訓(xùn)練闷游。
案例效果如下圖所示:
目標(biāo)檢測(cè)
如上圖所示拜姿,圖像分類解決的問題是圖中的物體是什么烙样,而目標(biāo)檢測(cè)能識(shí)別圖片中有哪些物體以及物體的位置(坐標(biāo))。
位置
目標(biāo)檢測(cè)的位置信息一般有兩種格式:
- 極坐標(biāo)(xmin, ymin, xmax, ymax):
- xmin,ymin:x,y 坐標(biāo)的最小值
- xmin,ymin:x,y 坐標(biāo)的最大值
- 中心點(diǎn):(x_center, y_center, w, h)
- x_center, y_center:目標(biāo)檢測(cè)框的中心點(diǎn)坐標(biāo)
- w,h:目標(biāo)檢測(cè)框的寬蕊肥、高
注:圖片左上角為原點(diǎn)(0,0)
發(fā)展史
傳統(tǒng)方法(候選區(qū)域+手工特征提取+分類器)
HOG+SVM谒获、DPM
Region Proposal+CNN(Two-stage)
R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN
端到端(One-stage)
YOLO、SSD
TensorFlow Object Detection API
TensorFlow Object Detection API 是一個(gè)構(gòu)建在 TensorFlow 之上的開源框架晴埂,可以輕松構(gòu)建究反、訓(xùn)練和部署對(duì)象檢測(cè)模型。另外儒洛,TensorFlow Object Detection API 還提供了 Model Zoo 方便我們選擇和切換預(yù)訓(xùn)練模型精耐。
安裝依賴項(xiàng)
使用以下命令檢查是否安裝成功。
$ conda --version
conda 4.9.2
$ protoc --version
libprotoc 3.17.1
安裝 API
TensorFlow Object Detection API 官方的安裝步驟較為繁瑣琅锻,筆者寫了一個(gè)腳本直接一鍵安裝卦停。
執(zhí)行 git clone https://github.com/CatchZeng/object-detection-api.git
下載倉(cāng)庫(kù),然后到該倉(cāng)庫(kù)(下文簡(jiǎn)稱 oda
倉(cāng)庫(kù))目錄下恼蓬,執(zhí)行以下命令惊完,如果看到如下輸出,表示安裝成功处硬。
$ conda create -n od python=3.8.5 && conda activate od && make install
......
----------------------------------------------------------------------
Ran 24 tests in 21.869s
OK (skipped=1)
注:如果你不想用 conda小槐,可以在自己的 python 環(huán)境上直接使用
make install
安裝即可,比如在 colab 中使用荷辕。
注:由于
cudaDNN
和toolkit
更新可能沒有 TensorFlow 快凿跳。因此,如果你的機(jī)器有 GPU疮方,安裝完成后控嗜,需要將 TensorFlow 降回到cudaDNN
和toolkit
支持的版本這樣才能支持 GPU 訓(xùn)練,以2.4.1
為例:$ pip install --upgrade tf-models-official==2.4.0 $ pip install --upgrade tensorflow==2.4.1
注:如果安裝失敗骡显,可以參考官方文檔的詳細(xì)步驟安裝疆栏。
工程創(chuàng)建
注:!!! 從這里開始曾掂,請(qǐng)確保在
conda od
的環(huán)境下執(zhí)行。$ conda activate od $ conda env list # conda environments: # od * /Users/catchzeng/.conda/envs/od tensorflow /Users/catchzeng/.conda/envs/tensorflow base /Users/catchzeng/miniconda3
到 oda
倉(cāng)庫(kù)目錄下壁顶,執(zhí)行以下命令珠洗,創(chuàng)建工程目錄結(jié)構(gòu)。
注:
SAVE_DIR
為保存項(xiàng)目的目錄若专,NAME
為項(xiàng)目的名稱险污。
$ make workspace-box SAVE_DIR=workspace NAME=test
└── workspace
└── test
├── Makefile
├── annotations:存放標(biāo)注好的數(shù)據(jù)集數(shù)據(jù)(val.record、train.record富岳、label_map.pbtxt)
├── convert_quant_lite.py:量化 tflite 模型腳本
├── export_tflite_graph_tf2.py:導(dǎo)出 tflite 模型腳本
├── exported-models:存放訓(xùn)練完之后導(dǎo)出的模型
├── exporter_main_v2.py:導(dǎo)出模型腳本
├── images:數(shù)據(jù)集圖片和 xml 標(biāo)注
│ ├── test:手動(dòng)驗(yàn)證圖片
│ ├── train:訓(xùn)練集圖片和 xml 標(biāo)注
│ └── val:驗(yàn)證集圖片和 xml 標(biāo)注
├── model_main_tf2.py:訓(xùn)練模型腳本
├── models:自定義模型
├── pre-trained-models:TensorFlow Model Zoo 提供的預(yù)訓(xùn)練模型
└── test_images.py:手動(dòng)驗(yàn)證圖片腳本
數(shù)據(jù)集
圖片
筆者喜歡喝茶,這次就用茶杯(cup)拯腮、茶壺(teapot)窖式、加濕器(humidifier) 來做案例吧。
將收集的圖片动壤,放入工程目錄的 images
的三個(gè)子目錄下萝喘。
注:本案例只是為了驗(yàn)證如何訓(xùn)練目標(biāo)識(shí)別模型,因此數(shù)據(jù)集采集得比較少琼懊,實(shí)際項(xiàng)目中記得盡量采集多點(diǎn)數(shù)據(jù)集阁簸。
標(biāo)注
收集完圖片后,需要對(duì)訓(xùn)練和驗(yàn)證集圖片進(jìn)行標(biāo)注哼丈。標(biāo)注工具启妹,選用較為常用的 LabelImg。
根據(jù) installation 的說明安裝好 LabelImg醉旦,然后執(zhí)行 labelImg
選擇 train
和 val
文件夾進(jìn)行標(biāo)注饶米。
標(biāo)注完成后,會(huì)生成圖片對(duì)應(yīng)的 xml
標(biāo)注文件车胡,如下所示:
workspace/test/images
├── test
│ ├── 15.jpg
│ └── 16.jpg
├── train
│ ├── 1.jpg
│ ├── 1.xml
│ ├── 10.jpg
│ ├── 10.xml
│ ├── 2.jpg
│ ├── 2.xml
│ ├── 3.jpg
│ ├── 3.xml
│ ├── 4.jpg
│ ├── 4.xml
│ ├── 5.jpg
│ ├── 5.xml
│ ├── 6.jpg
│ ├── 6.xml
│ ├── 7.jpg
│ ├── 7.xml
│ ├── 8.jpg
│ ├── 8.xml
│ ├── 9.jpg
│ └── 9.xml
└── val
├── 11.jpg
├── 11.xml
├── 12.jpg
├── 12.xml
├── 13.jpg
├── 13.xml
├── 14.jpg
└── 14.xml
創(chuàng)建 TFRecord
TensorFlow Object Detection API 只支持 TFRecord 格式的數(shù)據(jù)集檬输,因此,需要把標(biāo)注好的數(shù)據(jù)集進(jìn)行轉(zhuǎn)換匈棘。
先 cd
到工程目錄(cd workspace/test
)丧慈,然后執(zhí)行 make gen-tfrecord
,將在 annotations
文件夾下生成 label_map.pbtxt
和 TFRecord 格式的數(shù)據(jù)集主卫。
$ make gen-tfrecord
python gen_label_map.py
unsorted: ['cup', 'teapot', 'humidifier']
sorted: ['cup', 'humidifier', 'teapot']
item {
id: 1
name: 'cup'
}
item {
id: 2
name: 'humidifier'
}
item {
id: 3
name: 'teapot'
}
python generate_tfrecord.py \
-x images/train \
-l annotations/label_map.pbtxt \
-o annotations/train.record
Successfully created the TFRecord file: annotations/train.record
python generate_tfrecord.py \
-x images/val \
-l annotations/label_map.pbtxt \
-o annotations/val.record
Successfully created the TFRecord file: annotations/val.record
annotations
├── label_map.pbtxt
├── train.record
└── val.record
# label_map.pbtxt
item {
id: 1
name: 'cup'
}
item {
id: 2
name: 'humidifier'
}
item {
id: 3
name: 'teapot'
}
模型訓(xùn)練
注:!!! 從這里開始逃默,請(qǐng)確保已經(jīng)
cd
到工程目錄(cd workspace/test
)。
下載預(yù)訓(xùn)練模型
從 Model Zoo 中選擇合適的模型下載解壓并放到 workspace/test/pre-trained-models
中队秩。
如果你選擇的是 SSD MobileNet V2 FPNLite 320x320
可以執(zhí)行如下命令笑旺,自動(dòng)下載并解壓
$ make dl-model
目錄結(jié)構(gòu)如下:
└── test
└── pre-trained-models
└── ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8
├── checkpoint
├── pipeline.config
└── saved_model
配置訓(xùn)練 Pipeline
在 models
目錄創(chuàng)建對(duì)應(yīng)的模型文件夾,比如:ssd_mobilenet_v2_fpnlite_320x320
馍资,并拷貝 pre-trained-models/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/pipeline.config
筒主。
└── test
├── models
│ └── ssd_mobilenet_v2_fpnlite_320x320
│ └── pipeline.config
└── pre-trained-models
其中关噪,pipeline.config
如下幾處需要根據(jù)項(xiàng)目修改
model {
ssd {
num_classes: 3 # 修改為需要識(shí)別的目標(biāo)個(gè)數(shù),示例項(xiàng)目為 3 種
......
}
train_config {
batch_size: 8 # 這里需要根據(jù)自己的配置乌妙,調(diào)整大小使兔,這里設(shè)置為 8
......
optimizer {
momentum_optimizer {
learning_rate {
cosine_decay_learning_rate {
learning_rate_base: 0.07999999821186066
total_steps: 10000 # 修改為想要訓(xùn)練的總步數(shù)
warmup_learning_rate: 0.026666000485420227
warmup_steps: 1000
}
}
momentum_optimizer_value: 0.8999999761581421
}
use_moving_average: false
}
fine_tune_checkpoint: "pre-trained-models/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/checkpoint/ckpt-0" # 修改為預(yù)制模型的路徑
num_steps: 10000 # 修改為想要訓(xùn)練的總步數(shù)
startup_delay_steps: 0.0
replicas_to_aggregate: 8
max_number_of_boxes: 100
unpad_groundtruth_tensors: false
fine_tune_checkpoint_type: "detection" # 這里需要修改為 detection,因?yàn)槲覀兪亲瞿繕?biāo)檢測(cè)
fine_tune_checkpoint_version: V2
}
train_input_reader {
label_map_path: "annotations/label_map.pbtxt" # 修改為標(biāo)注的路徑
tf_record_input_reader {
input_path: "annotations/train.record" # 修改為訓(xùn)練集的路徑
}
}
eval_config {
metrics_set: "coco_detection_metrics"
use_moving_averages: false
}
eval_input_reader {
label_map_path: "annotations/label_map.pbtxt" # 修改為標(biāo)注的路徑
shuffle: false
num_epochs: 1
tf_record_input_reader {
input_path: "annotations/val.record" # 修改為驗(yàn)證集的路徑
}
}
訓(xùn)練模型
$ make train
注:如遇以下問題
ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject
執(zhí)行以下命令藤韵,重新安裝下
numpy
即可虐沥。pip uninstall numpy pip install numpy
模型導(dǎo)出與轉(zhuǎn)換
-
普通模型
$ make export
-
TFLite 模型
$ make export-lite
-
轉(zhuǎn)換 TFLite 模型
$ make convert-lite
-
轉(zhuǎn)換量化版 TFLite 模型
$ make convert-quant-lite
注:以上命令,大家可以加
-640
表示使用SSD MobileNet V2 FPNLite 640x640
的模型泽艘,比如:make train
->make train-640
測(cè)試模型
執(zhí)行 make export
導(dǎo)出模型后欲险,將測(cè)試圖片放到 images/test
文件夾下,然后執(zhí)行 python test_images.py
即可輸出標(biāo)記好目標(biāo)的圖片到 images/test_annotated
匹涮。
小結(jié)
本文通過案例將目標(biāo)檢測(cè)的整個(gè)流程都過了一遍天试,希望能幫助大家快速掌握訓(xùn)練自定義目標(biāo)檢測(cè)器的能力。
案例的代碼和數(shù)據(jù)集都已經(jīng)放在了 https://github.com/CatchZeng/object-detection-api然低,有需要的同學(xué)可以自行獲取喜每。
后面的文章將會(huì)為大家?guī)恚?strong>目標(biāo)檢測(cè)的原理、常用的目標(biāo)檢測(cè)網(wǎng)絡(luò)雳攘,以及目標(biāo)分割带兜。本篇就到這了,咱們下一篇見吨灭。
參考鏈接
- https://github.com/tensorflow/models/tree/master/research/object_detection
- https://arxiv.org/pdf/1905.05055.pdf
- https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_detection_zoo.md
- https://stackoverflow.com/questions/66060487/valueerror-numpy-ndarray-size-changed-may-indicate-binary-incompatibility-exp