写在前面:YOLOV3只有修改了源码才需要重新make,而且make之前要先make clean。

一.准备数据

在/darknet/VOCdevkit1下建立文件夹VOC2007.

voc2007文件夹下建立三个文件夹,分别为Annotations,ImageSets和JPEGImages,其中JPEGImages存放所有.jpg格式的训练图片,Annotations存放所有图片的xml文件

图片最好按数字顺序排列,如00001.jpg,00002.jpg等,可以用脚本生成。

ImageSets文件夹下存放三个子文件夹,Main中存放train.txt,即用于训练的图片名字

二.生成xml文件

xml文件采用labelimg标注

  1. cd labelImg
  2. python labelImg.py

先进入labelImg所在路径,然后用python打开.py文件,即可打开标注工具。

三、生成txt文件

因为YOLOV3训练时需要用的是txt文件,因此需要将xml生成对应的txt,可采用voc_label.py脚本。

在利用voc_label.py脚本生成txt文件之前,还需要先生成一个train.txt文件,该文件位于ImageSets文件夹下的Main文件夹中,主要存图片名称(不包含后缀)

可采用以下脚本生成

  1. # -*- coding:utf-8 -*-
  2. import sys
  3. import os
  4. import random
  5. data_dir='/home/wmy/darknet/VOCdevkit1/VOC2007/JPEGImages'
  6. file_list=[]
  7. write_file_name='/home/wmy/darknet/VOCdevkit1/VOC2007/ImageSets/Main/train.txt'
  8. write_file=open(write_file_name,'w')
  9. for file in os.listdir(data_dir):
  10. if file.endswith(".jpg"):
  11. write_name=file.split('.')[0]
  12. file_list.append(write_name)
  13. sorted(file_list)
  14. number_of_lines=len(file_list)
  15. for current_line in range(number_of_lines):
  16. write_file.write(file_list[current_line]+'\n')
  17. write_file.close()

运行该脚本将生成存放图片名称的txt文件。

将该脚本放在与VOCdevkit1同等目录下,稍作修改。

  1. import xml.etree.ElementTree as ET
  2. import pickle
  3. import os
  4. from os import listdir, getcwd
  5. from os.path import join
  6.  
  7. sets=[(', 'train')] #根据数据修改
  8.  
  9. classes = ["person"] #修改
  10.  
  11. def convert(size, box):
  12. dw = 1./(size[0])
  13. dh = 1./(size[1])
  14. x = (box[0] + box[1])/2.0 - 1
  15. y = (box[2] + box[3])/2.0 - 1
  16. w = box[1] - box[0]
  17. h = box[3] - box[2]
  18. x = x*dw
  19. w = w*dw
  20. y = y*dh
  21. h = h*dh
  22. return (x,y,w,h)
  23.  
  24. def convert_annotation(year, image_id):
  25. in_file = open('VOCdevkit1/VOC%s/Annotations/%s.xml'%(year, image_id)) #修改为数据路径
  26. out_file = open('VOCdevkit1/VOC%s/labels/%s.txt'%(year, image_id), 'w') #修改
  27. tree=ET.parse(in_file)
  28. root = tree.getroot()
  29. size = root.find('size')
  30. w = int(size.find('width').text)
  31. h = int(size.find('height').text)
  32.  
  33. for obj in root.iter('object'):
  34. difficult = obj.find('difficult').text
  35. cls = obj.find('name').text
  36. if cls not in classes or int(difficult)==1:
  37. continue
  38. cls_id = classes.index(cls)
  39. xmlbox = obj.find('bndbox')
  40. b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
  41. bb = convert((w,h), b)
  42. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  43.  
  44. wd = getcwd()
  45.  
  46. for year, image_set in sets:
  47. if not os.path.exists('VOCdevkit1/VOC%s/labels/'%(year)): #修改
  48. os.makedirs('VOCdevkit1/VOC%s/labels/'%(year)) #修改
  49. image_ids = open('VOCdevkit1/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split() #修改
  50. list_file = open('%s_%s.txt'%(year, image_set), 'w')
  51. for image_id in image_ids:
  52. list_file.write('%s/VOCdevkit1/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
  53. #修改
  54. convert_annotation(year, image_id)
  55. list_file.close()

脚本中标注部分需修改,主要修改数据标签、路径。

运行改程序,将在VOCdevkit1同等路径下生成2007_train.txt文件。

四、修改配置文件

1.修改data/voc.names ,我的数据为1类,‘person'

2.修改cfg/voc.data   ,主要修改类别,训练数据路径

3.修改yolov3-voc.cfg,修改class=1,将最后一个卷积层中的filter修改为18(计算公式为filter=(class+5)*3,yolov2中的计算公式为5*(5+classes))

五、训练

  1. ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

在终端输入该命令即可开始训练,训练模型每迭代1000保存一次,保存于backup文件夹内。

训练完成后的模型讲保存在backup文件夹。

每1000次迭代保存一次模型,最后模型为yolov3-voc_final.weights。

测试模型:

  1. ./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights data/4.jpg

终端输入上述命令,运行模型,得出单张检测结果。

  1. ./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights

输入上述命令,可得多张检测结果。

参数解释:

1.batch

每一次迭代送到网络中的图片数量。增大该值可以使网络在较少的迭代次数内完成一个epoch。增大该值会延长训练时间,但会的更好的寻找梯度下降方向;减小该值可能会导致训练陷入局部最优,或不收敛。

2.subdivision

让每一个batch分为subdivision份丢入网络。降低对显存的占有情况。

3.angle

图片旋转角度,可通过旋转增大数据集

4.saturation exposure hue

分别是饱和度,曝光度和色调,都是增大数据集的

5.max_batches

最大迭代次数

6.policy

学习策略

7.random

设置为1时,在训练时每一batch图片会随机的改成320-640的倍数。目的也是增大数据集

8.Region Avg IOU

预测的bbx与实际bbx的交集,越接近1越好

训练时各参数意义:

region 82 avg IOU:当前尺度当前图片的平均IOU,预测矩形框与真实矩形框之比,越接近1越好。82表示最大尺度,yolov3在三个尺度和那个检测目标,分别是82,94和106,分别表示最大预测尺度/中间预测尺度和最小预测尺度,不同预测尺度分别使用不同的mask。

class:标注物体分类的正确率,越接近1越好。

obj:越接近1越好。

no obj:越小越好,但不能为0。

.5R:以0.5为阈值时的recall,指当前模型在所有subvision图片中检测出的正样本与实际的正样本的比值,全部被正确检测则值为1,因此越接近1越好。

.7R:以0.7为阈值时的recall,recall指的是检测出的正样本/实际正样本。

count:所有当前subvision图片中包含正样本的图片数量。

voc数据集在差不多迭代5w次才能达到初步效果。

因为VOC数据集和coco数据集复杂,种类繁多,因此配置不高的时候,尽量采用小数据集,或者手动标注一个数据集。

YOLOV3中mask的作用:每一层都必须知道所有的锚箱(先验框),但是只预测其中的一个子集,第一个yolo层预测6,7,8,因为这是最大的箱子,最粗糙,第二个yolo层预测4,5,6,稍微小一些,第三个yoo层预测1,2,3,最精细。  这样做的目的是为了更好的检测目标,也提升了小目标的检测率,提升了检测速度。

训练中出现nan,是因为没有检测到目标,不是错误,但是还是要尽可能的减少nan的出现次数,据说适当增大batch大小,可以减少nan的出现,等gpu到了以后可以尝试一下。

锚的作用:在对真实标签进行聚类以后,发现大多数的边界框(bbx)具有一定的高宽比,因此yolo在预测边界框的时候,不是盲目的,而是选用特定的高宽比的预测框,这些预测框被称作锚

网络在预测的时候,不是在预测对象的最终大小,而是调整最近锚点的大小以适应对象。

锚的大小取决于网络输入的大小,而不是输出。在yolov2中,锚的大小不是实际像素值,yolov3的锚点大小就是实际像素大小。

利用YOLOV3训练自己的数据的更多相关文章

  1. YOLOv3训练自己的数据

    1.  下载预训练权重文件 YOLOv3使用在Imagenet上预训练好的模型参数(文件名称: darknet53.conv.74,大小76MB)基础上继续训练. darknet53.conv.74下 ...

  2. 第十一节,利用yolov3训练自己的数据集

    1.环境配置 tensorflow1.12.0 Opencv3.4.2 keras pycharm 2.配置yolov3 下载yolov3代码:https://github.com/qqwweee/k ...

  3. caffe 利用VGG训练自己的数据

    写这个是因为有童鞋在跑VGG的时候遇到各种问题,供参考一下. 网络结构 以VGG16为例,自己跑的细胞数据 solver.prototxt: net: "/media/dl/source/E ...

  4. YOLOv3:训练自己的数据(附优化与问题总结)

    环境说明 系统:ubuntu16.04 显卡:Tesla k80 12G显存 python环境: 2.7 && 3.6 前提条件:cuda9.0 cudnn7.0 opencv3.4. ...

  5. yolov3测试自己的数据

    yolov3测试自己的数据 前言 上一篇我已经介绍了利用yolov3预训练权重文件(只包含卷积层)并训练 只需要进行如下编译: ./darknet detector train cfg/voc.dat ...

  6. 人脸检测及识别python实现系列(3)——为模型训练准备人脸数据

    人脸检测及识别python实现系列(3)——为模型训练准备人脸数据 机器学习最本质的地方就是基于海量数据统计的学习,说白了,机器学习其实就是在模拟人类儿童的学习行为.举一个简单的例子,成年人并没有主动 ...

  7. TensorFlow下利用MNIST训练模型识别手写数字

    本文将参考TensorFlow中文社区官方文档使用mnist数据集训练一个多层卷积神经网络(LeNet5网络),并利用所训练的模型识别自己手写数字. 训练MNIST数据集,并保存训练模型 # Pyth ...

  8. YOLO2解读,训练自己的数据及相关转载以供学习

    https://pjreddie.com/darknet/yolo/ 具体安装及使用可以参考官方文档https://github.com/pjreddie/darknet https://blog.c ...

  9. PANet训练自己的数据(VIA标注)

    当前最好的实例分割网络非PANet莫属,可是由于模型太新,网上的资料太少,最近的项目需要 实例分割,只能自己踩踩坑了,目前我还没看到一篇关于PANet训练的博客,只有几篇讲论文的. 环境:ubuntu ...

随机推荐

  1. checkeds 选中获取tbale表格中某一列td标签中的值

    例如:  var checkedbox = $("input[type=checkbox][name='cid']:checked")   if (checkedbox.size( ...

  2. IP包头结构详解

    版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6) IP包头长度(Header Length):长度4比特.这个字段的作用是为了 ...

  3. (二)jdk8学习心得之Lambda表达式

    二.Lambda表达式 1. 格式 (参数1,参数2,…,参数n)->{方法体} 注意: (参数1,参数2,...,参数n)要与方法接口中的参数一致,但是名字可以不一样. 此外,方法类型接口,有 ...

  4. Java数据库学习之SQL语句动态拼接

    public class UserDaoImpl implements UserDao { @Override public List<User> getUserByPage(PageIn ...

  5. React Navigation & React Native & React Native Navigation

    React Navigation & React Native & React Native Navigation React Navigation https://facebook. ...

  6. bind:tap="onLike" 中不能添加参数 及 dataset 传值

    <view bind:tap="onLike({{id}})"></view> //Component "pages/book-detail/bo ...

  7. html 通用导航 a链接跳转时给当前导航添加选中颜色

    学习前端的同学或许会遇到这个问题 做一个基本的小站有几个导航的,如下图 无论有几个页面,这里的导航的样式都是一样,唯一不同的就是进入哪个页面时当前有个选中的样式 一般这样通用的导航在开发的时候都会封装 ...

  8. BZOJ2406矩阵——有上下界的可行流+二分答案

    题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...

  9. OMS自动化运维平台部署

    OMS自动化运维平台部署 一.基础环境安装 yum -y install mariadb mariadb-devel mariadb-server wget epel-release python-d ...

  10. .Net Core实践4 web 反向代理

    目标 将控制台程序改成web程序,通过IIS反向代理,处理请求 环境 win10 / .net core 2.1 / centos7 变成web程序 1.在新建的asp.net core控制台程序中添 ...