yolo系列(1):使用yolov3检测红绿灯

背景

  1. 官网:YOLO: Real-Time Object Detection
  2. 官方代码:github
  3. 非官方代码:github

使用yolov3检测红绿灯

机器配置

  1. GPU:GeForce GTX 1060 6GB/PCIe/SSE2
  2. 内存:7.7 GiB
  3. 环境:unbuntu 16.04

环境配置


  1. Ubuntu16.04搭建GTX1080+CUDA9.0+cuDNN7.0.4+Tensorflow1.6.0环境(驱动,cuda参考这个就行,其他的可以参考一下下面这个链接)
  2. CUDA和CUDNN(非必须,我这边跑yolov3的时候没有配置这个)安装

安装darknet及下载yolov3与训练权重

voc格式数据集制作

  1. 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文件夹。
  2. 本次实验采用的是交通信号灯识别公开数据集 Traffic Lights Recognition (TLR) public benchmarks,该数据集有提供相应动GroundTruth,所以不需要自己标注了,但是所提供的标签格式与yolov3要求动有点区别,可以使用preprocess脚本对图像格式以及label格式进行转换。通过generate_train_validation脚本将总的数据集分为训练集和验证集。

  3. 修改配置文件

    • 修改/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)
  4. 修改使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. 再拓展