1. 程式人生 > >目標檢測之四,使用multinet的KittiBox部分進行車輛檢測 (demo,train,evalute)

目標檢測之四,使用multinet的KittiBox部分進行車輛檢測 (demo,train,evalute)

目標檢測之四,使用multinet的KittiBox部分進行車輛檢測(demo,train,evalute)

         使用KittiBox進行車輛檢測,訓練環境和配置:Ubuntu16.04,python3.5,TensorFlow1.4,i76700K+雙GTX Titan X。由於不能直接用作者的原始碼直接跑,修改了一點點地方,整個過程挺艱辛的(新手剛上路),希望能給大家一點經驗。        

最近一直在看目標檢測的論文和程式碼,這是一篇用於自動駕駛的論文,在kitti資料集上檢測效果特別好,論文稱超過了faster-rcnn,在速度和精度上都超越了。能實時檢測。Multinet,顧名思義就是指多個網路,這裡是指該網路能同時進行三項任務,分類,檢測和語義分割。

網路結構如下:

 

網路共用一個編碼器,三個任務分別使用三個解碼器。上圖編碼器部分使用VGG16為例進行編碼部分的特徵提取,也可以改為其他的網路結構,比如googlenet,resnet50,resnet101之類的替換。

主要看看檢測解碼器

檢測解碼器FastBox, 被設計為基於迴歸的檢測系統。我們選擇一種基於候選區域的解碼器, 因為它可以進行端對端的訓練, 並且可以非常有效地完成訓練和推理。方法靈感來自ReInspect[39], Yolo [38]Overfeat [44]。除了標準迴歸流程之外, 我們還包含一個ROI池化方法, 它允許網路利用更高解析度的特徵, 類似較慢的Faster-RCNN

該解碼器的第一步是產生bounding box的粗略估計。為了實現這一目標, 首先用500個濾波器的1×1卷積層傳遞編碼的特徵, 產生一個39×12×500大小的張量, 我們稱之為隱藏層。隨後該張量用另一個1×1卷積層處理, 輸出6個解析度為39×12的通道。我們稱這個張量為prediction, 張量的值具有語義含義。該張量的前兩個通道形成影象的粗分割。這些值表示感興趣目標存在於39×12網格中的特定位置處的置信度。最後四個通道表示該單元周圍區域中邊界框的座標。圖3表示有cell的影象。

然而, 這種預測不是非常準確。在本文中, 我們認為這是由於編碼器輸出時的解析度已經丟失。為了減輕這個問題,

我們引入了一個rezoom, 它通過利用高解析度特徵來預測邊界框位置上的殘差。它通過將更高解析度的VGG特徵的子集(156×48)與隱藏特徵(39×12)連線並在其上應用1×1卷積來完成。為了使其成為可能, 需要從高解析度VGG特徵產生39×12網格, 這些網格是通過應用ROI池化[40]使用由tensorprediction提供的粗預測來實現的。最後, 它與39×12×6特徵連線, 並通過1×1卷積層以產生殘差。


3:視覺化我們的標籤編碼。藍色網格:單元(cells)。紅細胞:含有汽車的細胞。灰色細胞:無關區域的細胞。綠色框:真實值

損失函式

 

訓練過程

整個訓練過程在作者的GitHub上面講的蠻多的,很詳細,但是吧有些程式碼是python2 的,如果你對環境是python3,直接按照步驟不能真確執行。需要對好幾個檔案做一些小小的修改,下面是我的一些訓練記錄和筆記。

首先是修改了哪些地方,具體檔案和具體內容:

程式碼修改日誌,改了5個地方

1.incl/utils/data_utils.py", line 71,in get_cell_grid
   for iy in xrange(cell_height):
xrange改為range
2. "/incl/utils/data_utils.py",line 129, in annotation_jitter
   if random.random > 0.8:
TypeError: unorderable types:builtin_function_or_method() > float()
 
random.random 改為random.random()
3.inputs/kitti_input.py", line 160
generator的next屬性  gen.next()改為gen.__next__() 
4.incl/tensorvision/train.py", line163, in _print_eval_dict
   print_str = string.join([nam + ": %.2f" for nam ineval_names],
AttributeError: module 'string' has noattribute 'join'
改為print_str=", ".join([nam + ": %.2f" for nam ineval_names])
5.tensorflow.python.framework.errors_impl.InvalidArgumentError:0-th value returned by pyfunc_0 is uint8, but expects float
修改fastBox.py的evaluaction函式
473行
   pred_log_img = tf.py_func(log_image,
                              [images,test_pred_confidences,
                               test_pred_boxes,global_step, 'pred'],
                              [tf.float32])
改為
   pred_log_img = tf.py_func(log_image,
                              [images,test_pred_confidences,
                               test_pred_boxes,global_step, 'pred'],
                              [tf.uint8])


修改完後。就可以按照GitHub上面的步驟進行訓練了。我複製了一下

  1. Clone this repository: git clone https://github.com/MarvinTeichmann/KittiBox.git
  2. Initialize all submodules: git submodule update --init --recursive
  3. Run cd submodules/utils && make to build cython code
  4. [Optional] Download Kitti Object Detection Data
  5. [Optional] Run cd submodules/KittiObjective2/ && make to build the Kitti evaluation code (seesubmodules/KittiObjective2/README.md for more information)

資料集是KITTI 資料集,上面有下載連結,點選會讓你輸入一個郵箱,郵箱裡有下載的具體地址。當然你也可以取kitti官網直接下載資料和標籤。

沒有資料集你可以先跑個demo看看效果,跑demo你需要下載KittiBox_pretrained.zip(下載目錄ftp://mi.eng.cam.ac.uk/pub/mttt2/models/),demo.py程式是可以自己下載的有點大,2G左右,我是自己下載好的,解壓放到新建的RUNS(根據demo.py可以看到)。Run: pythondemo.py --input_image data/demo.pngtoobtain a prediction using demo.pngasinput.

Demo.py還是很容易跑通的。它會輸出一大堆資訊,然後在demo.png目錄下生成一個demo_rects.png就是檢測結果。

python demo.py --input_image data/5.png--logdir RUNS/kittiBox_VGG_2017_12_16_19.14 --gpus 0,1

--logdir指定model路徑,可以使用任意訓練好的model

現在就可以正式開始訓練了

python train.py --hypes hypes/kittiBox_VGG.json  --gpus 0,1 指定hypes檔案,關於網路的一些引數資訊

後面還可以指定一些其他的東西,比如hypes資訊,通常是一個json檔案,關於model、訓練引數等一些資訊;

還可以指定GPU訓練等等

正常訓練的截圖:

 

第一次訓練我沒有修改引數,全是選用預設引數,訓練了很久,雙GTX-Titan x訓練了40個小時左右吧。

訓練完後對模型進行評估

evaluate.py檔案

python evaluate.py --hypes hypes/kittiBox_VGG.json --RUNkittiBox_VGG_2017_12_16_19.14 --gpus 0,1 評估,指定hypes檔案和model目錄

我自己訓練的模型評估截圖

下面是作者提供的pre_trained的評估結果:


從上圖的對比可以看到,我訓練的效果竟然比它更好,平均要高1-3的百分點,簡直出乎我的意料。

再貼幾張檢測結果的截圖吧

 

參考

這是我訓練KittiBox的一些筆記,不知道會不會適合其他人,有問題歡迎底下交流。