本文藉助 Tensorflow Object detection API 開源框架和 MobileNet V2—SSD 算法,闡述如何創建、訓練自定義車道線數據集,並獲得 LDW 目標檢測模型。
前期準備工作主要包含模型下載、環境配置以及 py 文件生成等,詳細內容如下:
1)模型下載
API 是基於 TensorFlow 構造的開源框架,易於構建、訓練、部署目標檢測模型,下載網址:https://github.com/tensorflow/models;模型下載後解壓,並將其放置於指定位置,方便後期進行模型訓練。其次,Protoc 用於將 Tensorflow object detection API 模型文件中的 .pro 文件編譯成 python 文件,protoc-3.4.0-win32 版本,下載網址:https://github.com/protocolbuffers/protobuf/releases,文件下載後解壓,並將 bin 文件夾的路徑添加到 PC 環境變量;之後打開 cmd,輸入 protoc,輸入如下信息即表示添加環境變量成功,如圖 1.1 所示。
2)環境配置
通用軟體平臺為 Win 10、JetBrains PyCharm Community Edition 2019.2 x64、 Anaconda 3( 64 bit )。數據集格式轉換的主要配置為 Python 3.7、TensorFlow 1.13.1;模型訓練、生成與測試的主要配置為 Python 3.5、TensorFlow 1.10.0、TensorFlow-gpu 1.10.0。
3)py 文件生成
將解壓後的 API 文件命名為 model,其子路徑 model\research\object_detection\protos 中有很多的 .proto 文件;Protoc 可以將上述 .proto 文件編譯成 py 文件,即在 cmd 下, 一路 cd 到 …\models\research 文件夾下,輸入:protoc ./object_detection/protos/*.proto --python_out=.
即可快速編譯所有 proto 格式文件;*.proto 相當於匹配所有的 .proto 文件(本次總結文件已將生成的 py 文件一併釋放,後期可提供)。編譯之後的文件如圖 1.2 所示。
4)補充配置環境 —— 將 API 解壓後的目錄 research 及其子目錄 slim 添加到環境變量,如圖 1.3 所示。
自定義數據集分為標註軟體的安裝、數據集的標註與生成以及格式轉換。
1)標註軟體的安裝
下載 labelImg,並創建 data 文件夾,如圖 2.1 所示;data 路徑下創建 predefined_classes.txt,其內容為:輸入自定義的分類類別 —— 本次檢查目標為車道線,即為 「lane」。如圖 2.2 所示。
2)數據集的標註與生成
打開 labelImg,按快捷鍵 CTRL+R,修改默認的輸出文件的保存路徑,接著點擊 open dir,添加圖片所在的路徑,如圖 2.3 所示。點擊 edit->create rectbox 進行標記。標記完後點擊 save 即可,點擊 next page 進行下一張圖片標記。最終生成的數據文件如圖 2.4 所示(圖片與 XML 文件的名稱與數量務必一一對應)。
圖 2.4 labellmg 圖像標註生成文件示意圖
補充說明:本次車道線數據集來源於上海某高架路段,採用視頻截屏方式作為數據源,總數為 362 張,每張圖片約有 8 ~~ 12 個標註對象。
3)數據格式轉換
TensorFlow object detection API 對訓練數據的格式要求是 tfrecord 格式,需要將 labelImg 生成的車道線數據格式以此轉換為 xml à csv à tfrecord。詳細步驟(請重點關注紅色加深字體)如下:
第一步:將標記生成 xml 文件轉換為 csv 文件:model\research\object_detection 目錄下分布創建 xml_to_csv.py、 generate_tfrecord.py 以及 images 文件夾(創建 train_and_eval_images —— 放置原始車道線數據圖片及其對應的 xml 文件)。
第二步:修改 xml_to_csv.py 文件 code(請重點關注紅色加深字體)如下所示。
//************************************************************//
第 33、34 行 Code 更改為輸出 csv 的路徑和輸出文件名:
33 train_df.to_csv('images/train.csv', index=None)
34 eval_df.to_csv('images/eval.csv', index=None)
第 38 行 Code 更改為原始數據路徑(亦可用相對路徑),參數更改為 xml 文件所在的文件夾路徑修改:
path = 'D:\\WPI\\WorkSources\\pycharmExample\\Q4API\\model\\research\\object_detection\\images\\train_and_eval_images'
在 pycharm 平臺運行上述代碼並生成兩個 csv 文件,即為 train.csv、 eval.csv。
第三步:修改 generate_tfrecord.py 文件 code 如下所示。
第 34、37 行更改標籤及其對應的數字:
def class_text_to_int(row_label):
if row_label == 'lane': #此處更改為自定義檢測對象,與 predefined_classes.txt 標籤內容一致
return 1 #label 對應的數字標籤,其值從 1 開始設置
else:
None #二分類情況下,此處為背景標籤,設置為 None 即可
//************************************************************//
generate_tfrecord.py 在 pycharm 終端分別運行如下命令:
python generate_tfrecord.py --csv_input=images/train.csv --image_dir=images/train_and_eval_images --output_path=images/train.record #生成 train.record
python generate_tfrecord.py --csv_input=images/ eval.csv --image_dir=images/train_and_eval_images --output_path=images/ eval.record #生成 eval.record
生成效果如圖 2.5 所示。
生成模塊分為補充配置、模型訓練、pb 生成以及模型測試等,詳細內容如下:
1)補充配置
配置一:在指定目錄( …\model\dataset )下創建 data 文件夾,並在其路徑下創建 pbtxt 文件,內容如圖 3.1 所示。文件中 id 和 name 分別代表被測對象的數字標籤 label 及其名稱的字符串文本,若為多目標檢測,本文件需要另起一行,同時 id 數字依次增 1,相應的 name 也要更新(字符串不能重名)。
配置二:dataset 文件夾下創建 fine_tune_model 文件夾,下載 fine-tune 模型,網址是 https://github.com/tensorflow/models/tree/master/research/slim,如圖 3.2 所示;解壓後複製三個 .ckpt 文件放到 fine_tune_model 文件夾下,如圖 3.3 所示。
圖 3.3 fine_tune_model 示意圖
配置三:配置管道文件,找到目錄research\object_detection\samples\configs\ssdlite_mobilenet_v2_coco.config 文件,將此文件複製到 dataset/data 文件夾下,並將前面生成的 train.record、 eval.record 放置於 dataset/data 路徑下。修改 ssdlite_mobilenet_v2_coco.config 文件 code (請重點關注紅色加深字體)如下所示:
//************************************************************//
第 9 行 Code 更改為檢測種類數量:
num_classes: 1 #此處為被檢查對象的數量,本次僅對車道線檢測,故而設置為 1
第 158 行更改為 fine_tune_model 位置與同類名稱
fine_tune_checkpoint: "D:/WPI/WorkSources/pycharmExample/Q4API/model/dataset/fine_tune_model/model.ckpt"
第 165 行更改為訓練次數:
num_steps: 200000 #此處為訓練次數設置,根據需要設定所需數值
第 178 行更改為訓練 record 文件輸入路徑
input_path: "D:/WPI/WorkSources/pycharmExample/Q4API/model/dataset/data/train.record"
第 180 行將 label_map_path 參數改為 pbtxt 文件的路徑(可以是相對路徑或絕對路徑)
label_map_path: "D:/WPI/WorkSources/pycharmExample/Q4API/model/dataset/data/label_map.pbtxt"
第 184 行為 patch 參數,其數值不能太大,否則會出現顯卡內存溢出等問題,建議從小到大,逐步調參
num_examples: 27 #此處為 patch 參數,其數值不能太大,否則會出現顯卡內存溢出等問題,建議從小到大,逐步調參
第 192 行為測試 record 文件輸入路徑
input_path: "D:/WPI/WorkSources/pycharmExample/Q4API/model/dataset/data/eval.record"
第 194 行為 label_map_path 參數改為 pbtxt 文件的路徑
label_map_path: "D:/WPI/WorkSources/pycharmExample/Q4API/model/dataset/data/label_map.pbtxt"
//************************************************************//
2)模型訓練
首先,找到 …\model\research\object_detection 目錄下 trainer.py 更改為 train_Lite.py(名稱根據自己需要任意命名),修改上述文件的 code 如下:
//************************************************************//
第 76 行第二個參數為模型輸出路徑,可以根據需要定義相對路徑或絕對路徑
flags.DEFINE_string('train_dir', '..\\..\\dataset\\ssdlite_train_output_dir',
'Directory to save the checkpoints and training summaries.')
第 79 行第二個參數為模型訓練所需的配合文件路徑,可以定義相對路徑或絕對路徑
flags.DEFINE_string('pipeline_config_path', r'D:\WPI\WorkSources\pycharmExample\Q4API\model\dataset\data\ssdlite_mobilenet_v2_coco.config',
'Path to a pipeline_pb2.TrainEvalPipelineConfig config '
'file. If provided, other configs are ignored')
//************************************************************//
至此,運行腳本修改完畢,運行上述 py 文件進行訓練(注意此處選擇的配置),訓練過程如圖 3.4 所示。模型訓練 20 萬次之後如圖 3.5 所示。
3)pb 生成
將 …\model\research\object_detection 路徑下的 export_inference_graph.py 複製到 ..\model\dataset 路徑下,修改 code (請重點關注紅色加深字體)如下所示:
//************************************************************//
第 118 行第二個參數為 pb 轉換所需的模型配置文件路徑(可以是絕對路徑或相對路徑)
flags.DEFINE_string('pipeline_config_path', 'D:\\WPI\\WorkSources\\pycharmExample\\Q4API\\model\\dataset\\data\\ssdlite_mobilenet_v2_coco.config',
'Path to a pipeline_pb2.TrainEvalPipelineConfig config '
'file.')
第 121 行第二個參數為模型訓練後生成的依賴文件路徑(可以是絕對路徑或相對路徑)
flags.DEFINE_string('trained_checkpoint_prefix', 'D:\\WPI\\WorkSources\\pycharmExample\\Q4API\\model\\dataset\\ssdlite_train_output_dir\\model.ckpt-200000',
'Path to trained checkpoint, typically of the form '
'path/to/model.ckpt')
第 124 行第二個參數為 pb 輸出路徑(可以是絕對路徑或相對路徑)
flags.DEFINE_string('output_directory', 'D:\\WPI\\WorkSources\\pycharmExample\\Q4API\\model\\dataset\\ssdlite_train_output_dir',
'Path to write outputs.')
//************************************************************//
Pb 文件生成效果如圖 3.6 所示。
4)模型測試
將生成的 pb 模型文件對視頻中的車道線進行檢測,object_detection_video.py 為檢測運行腳本,修改內容(請重點關注紅色加深字體)如下:
//************************************************************//
第 35 行修改成車道線 pb 模型路徑(可以是絕對路徑或相對路徑)
PATH_TO_CKPT = 'D:\\WPI\\WorkSources\\pycharmExample\\Q4API\\model\\dataset\\ssdlite_train_output_dir\\frozen_inference_graph.pb'
第 40 行修改成自己的 pbtxt 文件(可以是絕對路徑或相對路徑)
PATH_TO_LABELS = os.path.join('D:\WPI\WorkSources\pycharmExample\Q4API\model\dataset\data', 'label_map.pbtxt')
第 43 行其數值參數為被檢查對象的數量,本次檢查只有車道線,故而數值是 1
NUM_CLASSES = 1
第 65 行更改為自己的視頻,其格式可以為 avi、mp4
capture = cv2.VideoCapture('./test_video/lane_17_21.avi')
//************************************************************//
本次車道線檢測效果如圖 3.7 所示。
本文完成 Tensorflow Object detection API 開源框架配合 MobileNet_v2 – SSD 算法實現車道線的目標檢測,其檢測精度可達 95% 以上;鑑於數據集來自上海市某高架橋,其魯棒性還有待提高,後期 WPI ATU 將對模型進行修改、裁剪、調參、提高幀率等優化操作。
我們也將持續分享更多關於 ADAS 算法以及 ADAS 相關的技術文章,同時也會把在開發好調試過程中遇到的問題整理出來跟大家一起分享。如果需要更深入的技術交流,歡迎大家給我留言~
1.途徑北海道 —— Tensorflow object detection API訓練自己的目標檢測模型
連結:https://blog.csdn.net/zj1131190425/article/details/80711857
大聯大旗下世平集團 ATU 部門可以提供相關設計方案和技術支持,需要請聯繫 atu.cn@wpi-group.com