目标检测YOLOv3笔记(2):尝试训练数据

接下来是训练自己的模型

自己标注数据

Ubuntu下载LabelImg标注工具

git clone https://github.com/tzutalin/labelImg

安装依赖

apt-get install pyqt4-dev-tools
apt-get install python-lxml

编译make all,运行

python labelImg.py

快捷键:

Ctrl + u 加载目录中的所有图像,鼠标点击Open dir同功能
Ctrl + r 更改默认注释目标目录(xml文件保存的地址) 
Ctrl + s 保存
Ctrl + d 复制当前标签和矩形框
space    将当前图像标记为已验证
w        创建一个矩形框
d        下一张图片
a        上一张图片
del      删除选定的矩形框
Ctrl++   放大
Ctrl--   缩小
↑→↓←     键盘箭头移动选定的矩形框

想要修改标签类别内容(如默认的dog、person、cat等)则在主目录下data文件夹中的predefined_classes.txt文件中修改。
选择保存类型yolo后点击保存按键或者使用ctrl+s快捷键保存就生成了相对应的txt位置信息文件,此时可以开始下一张图片的标注。

添加训练配置文件

图片标注好后,现在有图片有标注txt,放同一个文件夹,另外需要几个文件

xxx.data: classes类别数量,train训练数据文件(下面新建),names类别名文件,backup训练中间结果保存文件夹

classes= 1
train  = data_head/head_train.txt
valid  = data_head/head_train.txt
names = data_head/head_train.names
backup = data_head/backup

新建类别名文件,xxx.names,里面一行一个分类,我们只训练一个分类

head

新建训练数据文件,xxx.txt,一行一个刚才标注的图片地址

data_head/img/head1.jpg
data_head/img/head10.jpg
data_head/img/head11.jpg
data_head/img/head12.jpg

复制cfg/yolov3-voc.cfg,并修改部分内容

[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64    <-------训练图片的一个批次
subdivisions=16   <-------批次大小
...
[convolutional]
size=1
stride=1
pad=1
filters=18   <------- 3*(classes+1+4)
activation=linear

[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=1   <------- 标注种类数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

如果训练过程出现内存溢出(显存不足),修改subdivisions的大小,改大一点(64,32,16,8),还有ramdom=0

开始训练

下载预训练模型darknet53.conv.74

wget https://pjreddie.com/media/files/darknet53.conv.74

数据准备好后开始训练

./darknet detector train data_head/head.data data_head/head.cfg data_head/darknet53.conv.74

中断后继续训练
当训练进行到一半的时候,可能中途中断或者是停了想继续进行时,只需将上面的语句最后的预训练权重更换为之前在xxx.data中设置的模型训练保存路径中存在的权重即可,这里以yolov3.weights表示:

./darknet detector train data_head/head.data data_head/head.cfg data_head/backup/yolov3.weights

训练结果解读与一些补充

A.filters数目是怎么计算的:3x(classes数目+5),和聚类数目分布有关,论文中有说明;
B.如果想修改默认anchors数值,使用k-means即可;
C.如果显存很小,将random设置为0,关闭多尺度训练;

Region xx: cfg文件中yolo-layer的索引;
Avg IOU:当前迭代中,预测的box与标注的box的平均交并比,越大越好,期望数值为1;
Class: 标注物体的分类准确率,越大越好,期望数值为1;
obj: 越大越好,期望数值为1;
No obj: 越小越好;
.5R: 以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本
0.75R: 以IOU=0.75为阈值时候的recall;

添加新评论