使用yolo-v3和yolov3-tiny训练自己的数据

使用yolo-v3和yolov3-tiny训练自己的数据

yolov3的官网:教程官网都有,老详细了。

确立我们的目标:

训练我们自己的数据集,从而生成一个XXX.weights文件,这就是炼丹练出来的丹

先搞定darknet

安装+编译

  1. 先建个文件夹
  2. 打开命令行进入这个文件夹
  3. git clone https://github.com/pjreddie/darknet建议下,有点小大
  4. cd darknet
  5. make
  6. ok darknet算是成功安装了

测试一下yolo能不能用

  1. darknet文件夹中
  2. 下载这个放到darknet文件夹中(不的速度感人)yolov3.weights
  3. 运行命令./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
  4. 应该就能看到结果了,在darknet 文件夹下生成了predictions.jpg图片

我们在试试tiny-yolo的检测

  1. 下载这个放到darknet文件夹中(不的速度感人)yolov3-tiny.weights
  2. 结果同上,不做赘述了

训练的数据准备

  1. 准备好训练图片,保存在train_imgs

  2. 准备好测试图片,保存在test_imgs

  3. 准备好训练集

    1. 建一个文件夹train_dataset
    2. 里面含有train_imags的全部图片,比如img1.jpg,img2.jpg,img3.jpg……
    3. 同含有每张图片对应的标注信息,比如img1.txt,img2.txt,img3.txt……,也就是说每有一张图片,就有一个图片名.txt的文件与之对应。
    4. 图片名.txt里的内容是
      label名 x y w h
      label名 x y w h
      label名 x y w h
      label名 x y w h
      ……
      x y w h 计算法则如下:
      x = X ( 框 中 心 x 坐 标 ) W ( 图 宽 ) x=\frac{X(框中心x坐标)}{W(图宽)} x=WXx
      y = Y ( 框 中 心 y 坐 标 ) H ( 图 高 ) y=\frac{Y(框中心y坐标)}{H(图高)} y=HYy
      w = w ( 框 宽 ) W ( 图 宽 ) w=\frac{w(框宽)}{W(图宽)} w=Ww
      w = h ( 框 高 ) H ( 图 高 ) w=\frac{h(框高)}{H(图高)} w=Hh

    实例如下:

    	bicycle 0.37543085813522337 0.2680371602376302 0.05270464420318603 0.1362799326578776
    	bird 0.43849892616271974 0.25673709445529513 0.05238265991210937 0.11692102220323351
    	bird 0.5161398410797119 0.24423293007744684 0.022611427307128906 0.11158682505289713
    	bird 0.5623636245727539 0.23595088322957355 0.053014373779296874 0.1280634774102105
    
  4. 同训练集一样准备好测试集test_dataset

  5. 准备一个文件,名字是classes.txt,里面是检测的类别,也就是label,例如

    aeroplane
    bicycle
    bird
    boat
    bottle
    bus
    car
    cat
    chair
    cow
    diningtable
    dog
    horse
    motorbike
    person
    pottedplant
    sheep
    sofa
    train
    tvmonitor
    
  6. 准备一个文件,名字是train.txt,里面内容是train_dataset下图片的路径,样例如下

    my_train_file/train_dataset/1332578596102866930.jpg
    my_train_file/train_dataset/-182-change_1328765264291956722.jpg
    my_train_file/train_dataset/-2508-change_1328134675046074354.jpg
    my_train_file/train_dataset/-1883-change_other-2-1328304958688200690.jpg
    
  7. 准备一个文件,名字是test.txt,里面内容是测试图片的路径,样例如上

  8. 准备一个文件,命名为own.data,内容举个例子(我的注释要删掉)

    classes= 20	#类别数
    train  = my_train_file/train.txt	#train.txt文件夹路径
    valid  = my_train_file/test.txt	#test.txt文件夹路径
    names = my_train_file/classes.txt	#类别名文件夹路径
    backup = backup	#训练出来的权重保存的位置,现在是在 darknet/backup
    

    备注:这个文件中的相对路径是相对于darknet文件路径的。

满配的yolo训练

  1. 官网提供了Imagenet上预先训练的卷积权重,darknet53.conv.74
  2. 这个是预训练好的权重,用的是Imagenet数据集,我们提取他的前74层的权重偏置和等等一堆参数值,提取出来就是darknet53.conv.74,我们用这个作为初始值,开始用我们自己的数据,用yoloV4网络,训练我们自己的参数
  3. 整理一下现在已经有的东西train_imgstest_imgstrain_datasettest_datasetclasses.txttrain.txttest.txtown.datadarknet53.conv.74yolov3.weightsyolov3-tiny.weights
  4. 这一步在darknet文件夹下新建个文件夹,名为my_train_file,把darknet53.conv.74train.txttest.txtown.dataclasses.txttrain_datasettest_dataset,都放到这里来。
  5. 进入darknet文件夹,运行./darknet detector train my_train_file/own.data cfg/yolov3.cfg my_train_file/darknet53.conv.74
    命令解释:<运行darknet网络> <执行命令> <训练> <上一节第8步文件的路径> <网络路径> <预训练权重路径>
  6. 这里说一下,上一步的 <网络> 是在darknet/cfg里的,里面有各种darknet作者搭好的网络,我们这里选yolov3.cfg
    注意:
    使用yolo-v3和yolov3-tiny训练自己的数据_第1张图片
    打开yolov3.cfg文件,查看其是否处于训练状态,上图就是训练状态,把# Training下面的注释掉,把# Testing下面的注释去掉,就是测试模式
  7. 结果保存在backup文件夹下

tiny-yolo的训练

备注:本节是接上一节的操作后进行的,务必先执行完上一节的前四步

  1. yolov3-tiny.weights,放到darknet文件夹下
  2. 提取其前15层的参数,在darknet文件夹下运行./darknet partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15
  3. 把新生成的yolov3-tiny.conv.15文件移动到my_train_file
  4. darknet文件夹下运行./darknet detector train my_train_file/own.data cfg/yolov3-tiny.cfg my_train_file/yolov3-tiny.conv.15
  5. 注意这里yolov3-tiny.cfg要符合上一节的第6步

训练完成之后,用训练的结果批量检测新的图像
用于生成yolo数据的工具:labelImg
图片筛选分离
数据增强

你可能感兴趣的:(目标检测)