【目標檢測從放棄到入門】一篇文章帶你入門前端視覺編譯技術

2020-04-08     sandag

前言

在前端領域,目前不斷地有 design2code 工具湧現。即給定視覺稿識別出裡面的元素並將其轉換成代碼。它們底層技術都離不開深度學習中的「目標檢測」。最近有幸接觸到這塊的內容,實踐下來發現深度學習也並不那麼的高深莫測,這裡用一篇文章帶大家快速入門目標檢測技術。並提供一個 開箱即用 的目標檢測框架。

「【劃重點!!】目標檢測通俗地來說就是識別出給定視圖中的物體,並將其定位。」

準備

團隊這邊的目標檢測是基於 tensorflow 提供的 object detection API 。整個訓練的過程可以簡要概括為訓練集的準備和訓練。

訓練集準備:

  1. 人工標註圖片,並轉成 xml 格式
  2. 將 xml 轉成 tf 能識別的數據格式即 tfrecord

訓練過程:

  1. 配置訓練參數,這裡需要配置目標檢測算法類型目標類別數量訓練步長訓練部署訓練集路徑模型輸出路徑*以及可以基於前人訓練好的模型微調
  2. 基於 slim 模塊實現模型訓練

過程

環境配置

我們需要準備好 python 的環境。系統內置的 python 一般為 2.7.x ,而訓練需要的版本為 3+ 。這裡推薦使用 pyenv 進行 python 的版本控制與切換。

$ brew install pyenv
$ brew install pyenv-virtualenv

$ pyenv virtualenv 3.6.5
$ pyenv activate

環境配置完成後,就可以著手開始我們的訓練了。

訓練集準備

首先我們需要準備 大量 的訓練集,可以針對自己的需求手動標註。我們用的是 labelImg 這個 python 工具。

(PS:如果只是想體驗下目標檢測過程,可以從網上下載已經標註好的訓練集和測試集。

本文的測試範例用的是撲克牌訓練集,來源於 github 上的大佬 >>> 倉庫地址:https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10 。)

labelImg 安裝使用具體參考文檔。簡要步驟如下:

# 基於上步切換到python3環境
# 安裝
$ pip install labelImg
# 啟動
$ labelImg

手動框選出目標,並儲存為 xml 文件。

最後會得到 image 和對應的 xml(annotations) 兩個目錄。(建議分目錄存儲)

訓練配置

tf object detection API 已經為我們準備了部分已經訓練好的模型。 我們可以對基於它們做fine-tuning(微調)從而來訓練我們的模型 。

Tensorflow detection model zoo:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

這裡包含了 SSD/Faster RCNN/RCNN 等目標檢測常用算法,比較遺憾的是沒有 Yolo 的。如果有一定深度學習基礎的同學可以基於 tf 訓練自己的 Yolo 模型。

先看一下目錄的基本結構

  • resources:文件轉換、訓練、模型導出目標代碼
  • config:配置文件,包括label_map 和 算法配置文件
  • model:fine_tuning模型
  • object_detection:tf object detection api
  • slim:tf slim目標代碼
  • train_assets:訓練集
  • train_data:訓練過程中輸出的文件

1、將xml轉成tfrecord

在使用 labelImg 標註後我們會得到 image 和對應 xml 兩份文件,要進行訓練還需要將其轉換成 tf 能識別的 tfrecord 格式文件。

tf object detection 已經提供了相應的文件轉換 API 。

tf/models中目標代碼路徑 >>> object_detection/dataset_tools/create_pascal_tf_record.py

上面提供的框架中已經將其處理好了

# 根目錄下調用
$ python resources/convert.py

這時候就能得到 train.record 文件。

2、將slim路徑添加到PATH中

這一步框架已經處理了,可以忽略,了解即可。

$ export PYTHONPATH=$PYTHONPATH:'pwd':'pwd'/slim

3、模型選用

模型指的是用以fine-tuning的由前人訓練好的模型。可以在上面的 model zoo 選擇下載。這裡採用的是 SSD 。上圖 model 目錄。

4、文件配置

訓練前我們需要配置檢測目標的類別,在 config/label_map 中定義

# config/label_map.pbtxt

item {
id: 1
name: 'nine'
}

item {
id: 2
name: 'ten'
}

...more

同時需要配置算法文件(下載 fine_tuning 模型後對其xxx.config文件進行參數調整)重點配置如下

model {
ssd {
num_classes: 6 #用以目標檢測的類別數量
box_coder {...}
fine_tune_checkpoint: "" #本地fine_tuning模型路徑
num_steps: 10000 #訓練步長
}
train_input_reader: {
tf_record_input_reader {
input_path: "" #tfrecord文件路徑
}
label_map_path: "" #本地label_map路徑
}

完成配置後,在根目錄中調用以下命令

$ python resources/train.py

我們這邊使用的訓練 api 是 tf/model/object_detection/legacy/train.py , tf/model/object_detection/model_main 也可以提供相應的功能,但是在使用 cpu 訓練下會報錯,於是換成了 legacy/train 。

如果看到以下輸出就說明已經成功進行模型訓練了。

這裡的step指的是當前訓練的步數,loss指當前函數損失值,loss越小,說明模型越接近準確。

同時可以使用 tf 提供的命令行工具 tensorboard 實時查看訓練結果。

$ tensorboard --logdir=train_data/ssd

這裡可以看到, losses 波動特別大,顯然這個模型訓練得不是特別好。這裡等後面模型調優我們再來講。

模型導出

如果看到如下輸出,說明模型已經訓練完成。

我們此時需要對訓練完成的數據進行模型導出。 tf object detection 也提供了相應的 api ,具體文件路徑是 tf/model/object_detection/export_inference_graph.py 。

使用提供的框架可以直接調用

$ python resources/export.py

正常的話會得到如下結構的文件,其中 frozn_inference_graph.pb 就是訓練所得的模型了。

預測

在得到了訓練好的模型之後,我們就能用它對我們的視圖進行目標檢測了。

預測這邊 tf 提供的目標代碼是 tf/model/object_detection/object_detection_tutorial.py可以自行參考,根據自己需求改寫。

也可以在框架代碼根目錄下執行

$ python resources/detection.py

完成後會在 train_detections/ssd 目錄下生成被標記好的預測圖。

評估

單看上圖,我們的預測結果還是準確的,那對於目標物體模糊或者被遮擋的情況呢?我們單純跑一張圖預測的話其實還不足以評估模型的準確性,所以 tf 也提供了相應模型評估的函數。

具體可以參考 tf/model/object_detection/legacy/eval

也可以在框架代碼 valid_assets/ 下配置測試集,包括 images 和對應的 xml 。完成之後需要:

  • 將 xml 轉成 tfrecord
  • 配置算法文件 xxx.config
eval_config: {
num_examples: 67 # 測試集數量
# Note: The below line limits the evaluation process to 10 evaluations.
# Remove the below line to evaluate indefinitely.
max_evals: 1 # 評估次數,1次即可
}

eval_input_reader: {
tf_record_input_reader {
input_path: "" # valid tfrecord文件路徑
}
label_map_path: "" # label_map路徑
shuffle: false
num_readers: 1
}

配置完成後在根目錄下依次執行

$ python resources/convert.py valid
$ python resources/eval.py

控制台會輸出該模型下每個類別的檢測準確率。

微調

如果訓練出的模型準確率不是很高,我們需要對配置進行微調。這裡主要可以通過改變步長、算法、 batch_size 等方式。

算法

目標檢測的明星算法是 SSD/Faster RCNN/YOLO

步長

步長指訓練疊代的總長度,可以通過 tensorboard 實時觀測。步長設置過大可能會帶來過擬合的問題,設置不夠則會是欠擬合。

batch_size

batch_size 指一次疊代使用的樣本數量。如果訓練集足夠小,可以使用全數據集。而對於大數據集,可以使用一個適中的 batch_size 或者走向另一個極端就是每次只訓練一個樣本,即 batch_Size = 1。

對於 ssd 算法來說,使用小的 batch_size 貌似會造成 losses 波動大的情況而遲遲達不到一個穩定的 losses 值。

文章來源: https://twgreatdaily.com/zh-sg/NncEW3EBnkjnB-0zqGNa.html