背景
- 官网:YOLO: Real-Time Object Detection
- 官方代码:github
- 非官方代码:github
使用yolov3检测红绿灯
机器配置
- GPU:GeForce GTX 1060 6GB/PCIe/SSE2
- 内存:7.7 GiB
- 环境:unbuntu 16.04
环境配置
Ubuntu16.04搭建GTX1080+CUDA9.0+cuDNN7.0.4+Tensorflow1.6.0环境(驱动,cuda参考这个就行,其他的可以参考一下下面这个链接)- CUDA和CUDNN(非必须,我这边跑yolov3的时候没有配置这个)安装
安装darknet及下载yolov3与训练权重
voc格式数据集制作
voc格式
- 参考YOLOv2训练自己的数据集(VOC格式);【YOLO学习】使用YOLO v2训练自己的数据
- 训练图片格式类似000001.jpg、000002.jpg
按照voc数据集的结构放置图像文件。1)Annotation中主要存放xml文件,每一个xml对应一张图像,并且每个xml中存放的是标记的各个目标的位置和类别信息,命名通常与对应的原始图像一样;2)ImageSets我们只需要用到Main文件夹,这里面存放的是一些文本文件,通常为train.txt、test.txt等,该文本文件里面的内容是需要用来训练或测试的图像的名字;3)JPEGImages文件夹中放我们已按统一规则命名好的原始图像。
--VOC --Annotations --ImageSets --Main --Layout --Segmentation --JPEGImages --SegmentationClass//暂时可有可无 --SegmentationObject //暂时可有可无
将新建的voc文件夹放到scripts/VOCdevkit/目录下,若无VOCdevkit文件夹则新建一个。
- 用labelImg标注图像,windows版本;linux版本。会自己生成相关标签的xml文件,很好用。
- 根据自己情况修改/scripts/voc_label.py脚本并运行,将xml文件转换成yolo格式的txt文件。同时会在scripts文件夹下生成labels文件夹。
本次实验采用的是交通信号灯识别公开数据集 Traffic Lights Recognition (TLR) public benchmarks,该数据集有提供相应动GroundTruth,所以不需要自己标注了,但是所提供的标签格式与yolov3要求动有点区别,可以使用preprocess脚本对图像格式以及label格式进行转换。通过generate_train_validation脚本将总的数据集分为训练集和验证集。
修改配置文件
- 修改/cfg/voc.data文件,class为类别数目,train为训练数据txt所放的位置,valid为validation数据txt所放的位置,names为voc.names所放的位置,backup为模型训练过程中存储模型参数的位置
- 修改/data/voc.name文件,一行一个类别标签
- 修改/cfg/yolov3-voc.cfg,用的哪个模型就修改哪个模型的.cfg文件,这边用动是yolov3-voc。1)修改batchsize=64和subdivisions=8,batch_size表示每一个批次用来训练的图片张数,subdivisions表示一个批分成几组导入训练。若出现GPU训练动时候提示memory_out可以修改这两个参数试试;2)filters=75->filters=27,计算公式为filters=3x(classes数目+5);3)[yolo]子参数下,classes大小改成你的训练数据的类别数目,这边为4,random改成0(关闭多尺度训练,如果显存足够可以置为1)
修改使yolov3在GPU上运行
- 将makefile中的第一行改成GPU=1
- 重新make一下
训练以及检测
- 训练:运行
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
- 测试:运行
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg yolov3.weights
;yolov3.weights为你训练好的模型权重,之前存在.name文件中设置的backup路径中
扩展
1.理解yolo的输出含义(译文)
2.批量测试yolo模型效果
3. 别的一些训练数据集
- 常用图像数据集
- 车辆检测相关数据集
- 行人检测
- 自动驾驶数据集
4.训练中遇到的问题
- ————————————2018.4.28————————————
- Q1: region82和region94都为nan
- A1:可能是框太小之后就不能识别了
- Q2:- darknet已经训练了5000轮差不多,想看下测试效果;在继续训练的情下运行
./darknet dector test cfg/voc.data cfg/yolov3-voc.cfg yolov3-voc.wegiths /data/red.jpg
的时候报错:CUDA Error: __global__ function call is not configured darknet: ./src/cuda.c:36: check_error: Assertion 0 failed.已放弃 (核心已转储)
; - A2: 在命令前面加上
sudo
- Q3:CUDA Error: out of memory darknet: ./src/cuda.c:36: check_error: Assertion `0’ failed.
- A3:显存不够,降低batchsize
5. 再拓展
- ————————————2018.5.13————————————
- 在Jetson TX2上部署yolov3,YOLOv3 on Jetson TX2
- 后续测试发现TX2上摄像头实时检测速率只有3FPS左右,因此后续考虑部署tensorrt
- 使用tensorrt加速参考:TensorRT 3.0在Jetson TX2部署实战,使用tensorRT后速度能提升到10fps,参考jetson tx2 3fps why?