TX2实现yolov2(目标检测,计数,训练自己的数据集)

TX2如何刷机,安装caffe,cuda,cudnn,请参考我的上一篇博客http://blog.csdn.net/xiao__run/article/details/78776834
YOLOv2安装
1.获取源码

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

最后上一张识别海参的图吧
这里写图片描述
后面将为大家添加计数以及输出位置坐标的功能

猜你喜欢

转载自blog.csdn.net/xiao__run/article/details/78787121