算法系列 | MobileNet V2—SSD 的車道線檢測方法剖析

2021-02-13 飛車俠

本文藉助 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

相關焦點

  • 移動端實時目標檢測網絡Mobilenet_v2-ssdlite及其keras實現(附代碼地址)
    two-stage的檢測網絡基於Region Proposal,包括:R-CNN,Fast R-CNN,Faster R-CNN等,雖然精度相對較高,但是檢測速度過慢,一幀需要幾秒的時間,遠遠達不到實時。而one-stage的檢測網絡,包括SSD和YOLO,雖然相比two-stage網絡速度較快,但在移動端還打不到試試效果,而且網絡本身過大,並不適合移動端使用。
  • 無人駕駛的圖像識別之車道線檢測(二)
    前言在《圖像識別之初級車道線檢測(1)》,我對計算機視覺技術的一些基本理論和OpenCV庫的使用進行了分享。這些技術包括圖像的灰度處理、邊緣提取算法、霍夫變換直線檢測算法以及數據的後處理方法。應用這些技術後,可以將圖像中近似直線的車道線檢測出來。檢測的效果如下圖紅線所示。
  • 使用霍夫變換檢測車道線
    車道線檢測是自動駕駛汽車的重要組成部分之一,有很多方法可以做到這一點。本文,我們將使用最簡單的霍夫變換方法。([x1, y1, x2, y2])這個函數有兩個參數,一個是帶有車道線的圖像,另一個是有平均斜率和y_int的列表,輸出每條線的起點和終點。
  • PaddleDetcion——紅綠燈檢測:PaddleDetection-SSD_Mobilenet-VOCdataset
    architecture: SSDpretrain_weights: https://paddlemodels.bj.bcebos.com/object_detection/ssd_mobilenet_v1_coco_pretrained.taruse_gpu: truemax_iters: 28000snapshot_iter: 2000log_smooth_window
  • 車道線檢測技術分析
    2.《Unifying Lane-Sensitive Architecture Search and Adaptive Point Blending》:採用CNN的方式,通過多尺度融合和輸出的方式提高定位精度,最後採用一種類似於NMS方法,將低層輸出中位置精度回歸較高的點逐步向高層輸出替換,得到最後融合優化的車道線點輸出。3.
  • 目標檢測|SSD原理與實現
    目標檢測近年來已經取得了很重要的進展,主流的算法主要分為兩個類型(參考RefineDet):(1)two-stage方法,如R-CNN系算法,其主要思路是先通過啟發式方法(selective search)或者CNN網絡(RPN)產生一系列稀疏的候選框,然後對這些候選框進行分類與回歸,two-stage方法的優勢是準確度高
  • 行人檢測--OpenCV與TensorFlow SSD對比
    .imread("1.jpg") cv2.imshow("src", img) hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) (rects, weights) = hog.detectMultiScale(img,
  • OpenCV DNN模塊教程(三)SSD/Faster-RCNN目標檢測實例
    本文以Model Zoo中的ssd_mobilenet_v1_coco為例,下載解壓後得到frozen_inference_graph.pb    (2) 使用指令用.pb文件生成.pbtxt文件, SSD模型使用tf_text_graph_ssd.py, Faster-RCNN模型使用tf_text_graph_faster_rcnn.py
  • 霍夫變換——形狀特徵提取算法:車道線檢測
    他的算法流程大致如下,給定一個物件、要辨別的形狀的種類,算法會在參數空間中執行投票來決定物體的形狀,而這是由累加空間(accumulator space)裡的局部最大值來決定。理論上,霍夫變換就是對於原圖上的每一個直線都在參數空間畫一條線,最終找出參數空間變換線比較密集的地方在對應回到xy 空間坐標系。為了方便理解,下面簡單寫了一下草稿,希望對你有幫助。
  • 基於Python的智能車道線檢測的Android開發(免費PDF kivy實戰開發電子書下載)
    首先基於OpenCV實現實時車道線檢測,其次基於Kivy實現UI界面和圖像車道線檢測、調用手機攝像頭的車道線檢測的程序開發,最後基於Pyinstaller,SetupFactory和Buildozer將程序打包成Windows安裝包和Android APK安裝包,經測試可以正常在Windows系統和Android系統正常安裝使用。
  • 車道線檢測:SCNN(一)
    二、算法流程本文章核心工作是提出了一種新的網絡結構,除了結構部分,在訓練和測試流程上與其他方法沒有大的區別,所以算法流程部分其實就是介紹網絡結構的部分。先祭出一張圖,展示一下作者設計的結構內容。這裡(a)是訓練的網絡,(b)是用網絡進行預測的流程,需要注意的是,(b)中右側輸出了四個數值,這四個數分別對應四條車道線的概率,0.99就是有車道線,0.02就是沒有車道線,所以圖中就顯示了三條車道線,至於為啥是四條,這就屬於作者設置的一個先驗信息了
  • 目標檢測算法之SSD
    _images = tf.placeholder(tf.float32, shape=[None, self.ssd_params.img_shape[0],                                                    self.ssd_params.img_shape[1], 3])    with tf.variable_scope("ssd
  • 基於閾值的車道標記
    .cvtColor(img, cv2.COLOR_RGB2GRAY) # 2) Take the derivative in x or y given orient = 'x' or 'y' sobel = cv2.Sobel(gray, cv2.CV_64F, orient=='x', orient=='y') # 3) Take the absolute value of the
  • 輕量級神經網絡系列——MobileNet V3
    本文授權轉載自:SIGAI前面的輕量級網絡架構中,介紹了mobilenet
  • Mobile-LPR——面向移動端的準商業級車牌識別庫
    ,以NCNN作為推理後端,使用DNN作為算法核心,支持多種車牌檢測算法,支持車牌識別和車牌顏色識別。特點超輕量,核心庫只依賴NCNN,並且對模型量化進行支持多檢測,支持SSD,MTCNN,LFFD等目標檢測算法精度高,LFFD目標檢測在CCPD檢測AP達到98.9,車牌識別達到99.95%, 綜合識別率超過99%易使用,只需要10行代碼即可完成車牌識別易擴展,可快速擴展各類檢測算法
  • MobileNetV2:下一代邊緣計算視覺網絡
    2017年穀歌引入了面向嵌入式設備設計的通用型計算機視覺神經網絡系列 MobileNetV1,支持分類和檢測等功能。隨著用戶對人工智慧交互需求的提高,算法對更高效神經網絡的需求也逐漸增加。也是基於算法的發展,出現了新的輕量級視覺網絡架構MobileNetV2 ,它將為下一代移動視覺應用提供支持。
  • PyTorch 版 YOLOv4 更新了,可自定義數據集,還集成了 MobileNet
    項目地址:https://github.com/argusswift/YOLOv4-PyTorch 除此以外,該項目還向主幹網絡添加了一些有用的注意力方法,並實現了 mobilenetv2-YOLOV4 和 mobilenetv3-YOLOV4。該項目向主幹網絡添加了一些注意力方法,如 SEnet、CBAM。
  • MobileNet系列之MobileNet_v3
    導言:    繼MobileNet_v1和v2提出後,在2019年,MobileNet_v3在眾人的期盼下出來了,MobileNet_v3論文提出了兩個模型,MobileNet_v3-Large和MobileNet_v3-small,其主要區別在於層數不同(其餘設計都一樣),此外還包括一個用於語義分割的MobileNet_v3-Large LRASPP模型。
  • 輔助駕駛 | 簡單車道線識別
    整體思路簡單的車道線識別可由以下幾步完成:讀取視頻-灰度變換-高斯濾波-邊緣檢測-感興趣區域檢測-霍夫變換-車道線擬合-圖片混合在下面的內容中,將按照以上步驟一步步實現,最終實現對車道線的檢測。大家都知道,視頻是由一幀幀的圖像組成,因此對視頻的車道線檢測本質上是對圖像的車道線進行檢測。
  • 入門指南:用Python實現實時目標檢測(內附代碼)
    目標檢測 (ObjectDetection) 也是計算機視覺最酷的應用之一,這是不容置疑的事實。現在的CV工具能夠輕鬆地將目標檢測應用於圖片甚至是直播視頻。本文將簡單地展示如何用TensorFlow創建實時目標檢測器。