目标检测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;