1. 程式人生 > >TX2實現yolov2(目標檢測,計數,訓練自己的資料集)

TX2實現yolov2(目標檢測,計數,訓練自己的資料集)

git clone https://github.com/pjreddie/darknet
cd darknet

2.修改Makefile

  我們開啟MakeFile檔案:
  

nano Makefile

Makefile內容如下(我們只用關注前幾行,後面不需要做任何修改):

**GPU=0
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0**

ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \
      -gencode arch=compute_30,code=sm_30 \
      -gencode arch=compute_35,code=sm_35 \
      -gencode arch=compute_50,code=[sm_50,compute_50] \
      -gencode arch=compute_52,code=[sm_52,compute_52]

# This is what I use, uncomment if you know your arch and want to specify
# ARCH= -gencode arch=compute_52,code=compute_52 VPATH=./src/:./examples SLIB=libdarknet.so ALIB=libdarknet.a EXEC=darknet OBJDIR=./obj/ CC=gcc NVCC=nvcc

前五行的這些類似於巨集定義,在make的時候會導致某些程式功能的開啟與關閉,0代表關閉,1代表開啟。我直接把前四個都打開了。想用GPU,那麼前兩行就得開啟;想用webcom等OpenCV實現的程式,那麼就需要開啟OPENCV;至於OPENCMP,我只知道它是用來實現多執行緒優化加速的,所以我乾脆也打開了。

GPU=1
CUDNN=1
OPENCV=1
OPENMP=1
DEBUG=0

ARCH= -gencode arch=compute_53,code=[sm_53,sm_53]

3.儲存Makefile之後,開始編譯:

make

4.下載預訓練好的模型:

wget https://pjreddie.com/media/files/yolo.weights
wget https://pjreddie.com/media/files/tiny-yolo-voc.weights
wget https://pjreddie.com/media/files/tiny-yolo.weights

5.測試:

  我直接用webcom來測試。注意,必須使用支援V4L2的攝像頭,板載的攝像頭是不支援的,當然,如果你在Makefile裡面沒開啟Opencv,這裡是會報錯的。

COCO資料集訓練的YOLO(幹跑3幀左右):
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights

COCO資料集訓練的TINY-YOLO(幹跑15幀左右):

./darknet detector demo cfg/coco.data cfg/tiny-yolo.cfg tiny-yolo.weights

COCO資料集訓練的TINY-YOLO(幹跑15幀左右):

./darknet detector demo cfg/voc.data cfg/tiny-yolo-voc.cfg tiny-yolo-voc.weights

做完這些,我們就可以跑自己的資料集了,如何製作自己的資料集放入yolov2裡面,我已經在前面的部落格詳細說明了,同樣在tx2上可做。
http://blog.csdn.net/xiao__run/article/details/78714659
YOLO的改進
大家是不是不滿足上面的幀率,彆著急,WordZzzz帶著你搞優化啊。正經說來,也不算優化,就是調調引數,讓程式碼跑的快點。
修改網路模型輸入影象尺寸大小

  YOLOv2做了很多優化,其中就有為了提高小物體檢測準確率而增加的多尺度訓練(這裡說的不夠專業,後面有時間了專門寫篇講解YOLO的文章)。

  原來的YOLO網路使用固定的448 * 448的圖片作為輸入,現在加入anchor boxes後,輸入變成了416 * 416。目前的網路只用到了卷積層和池化層,那麼就可以進行動態調整(意思是可檢測任意大小圖片)。作者希望YOLOv2具有不同尺寸圖片的魯棒性,因此在訓練的時候也考慮了這一點。

  不同於固定輸入網路的圖片尺寸的方法,作者在幾次迭代後就會微調網路。沒經過10次訓練(10 epoch),就會隨機選擇新的圖片尺寸。YOLO網路使用的降取樣引數為32,那麼就使用32的倍數進行尺度池化{320,352,…,608}。最終最小的尺寸為320 * 320,最大的尺寸為608 * 608。接著按照輸入尺寸調整網路進行訓練。

  這種機制使得網路可以更好地預測不同尺寸的圖片,意味著同一個網路可以進行不同解析度的檢測任務,在小尺寸圖片上YOLOv2執行更快,在速度和精度上達到了平衡。

  所以,我們可以修改輸入尺寸大小,來提高YOLO執行速度。

  隨便開啟一個cfg下的cfg檔案,如“tiny-yolo.cfg”,內容如下:
  

[net]
# Training
# batch=64
# subdivisions=2
# Testing
batch=1
subdivisions=1
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

learning_rate=0.001
burn_in=1000
max_batches = 500200
policy=steps
steps=400000,450000
scales=.1,.1

[convolutional]
batch_normalize=1
filters=16
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=1

[convolutional]
batch_normalize=1
filters=1024
size=3
stride=1
pad=1
activation=leaky

###########

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=512
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=425
activation=linear

[region]
anchors =  0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828
bias_match=1
classes=80
coords=4
num=5
softmax=1
jitter=.2
rescore=0

object_scale=5
noobject_scale=1
class_scale=1
coord_scale=1

absolute=1
thresh = .6
random=1

同樣的,我們只需要看前面幾行就行,把width和height修改成最小尺度:

width=288
height=288

修改預覽解析度

  可以直接X掉預覽視窗,這樣,預覽視窗減小後,速度也會提升,只不過有時候效果不明顯。

  當然,大家也可以修改原始碼然後重新編譯。原始碼中預覽視窗大小的程式碼在src/demo.c中的第279行。我把預覽解析度改成了1280 * 720,當然你還可以改的更小。改完之後重新編譯。
  

 if(!prefix){
        cvNamedWindow("Demo", CV_WINDOW_NORMAL);
        if(fullscreen){
            cvSetWindowProperty("Demo", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
        } else {
            cvMoveWindow("Demo", 0, 0);
            cvResizeWindow("Demo", 1280, 720);
        }
    }

修改攝像頭解析度

  一開始就讓攝像頭採集到的解析度低點,也是有效果的。
  

./darknet detector demo cfg/coco.data cfg/tiny-yolo.cfg tiny-yolo.weights -w 640 -h 480

最後上一張識別海蔘的圖吧
這裡寫圖片描述
後面將為大家新增計數以及輸出位置座標的功能