下载VOCdevkit置于darknet-master\build\darknet\x64
目录下
1.xml放Annotations img放JPEGImages
2.cd到VOCdevkit\VOC2007 运行
python test.py
在C:\darknet-master\VOCdevkit\VOC2007\ImageSets\Main生成train.txt test.txt val.txt(所有图像名字的序号)
3.cd到VOCdevkit同一目录下 运行
修改voc_label.py中的sets年份
修改voc_label.py中的classes名字
python voc_label.py
结果1.生成图像的绝对路径 2007_train.txt 2007_test.txt 2007_val.txt(所有图像的绝对路径)放到C:\darknet-master\build\darknet\x64\data
下
结果2.生成txt标签文件,在labels下
修改cfg/voc.data中的classes数目 voc.data中指定了train.txt test.txt路径 voc.name路径 训练结果保存路径
修改data/voc.name中的类别名字
修改cfg/yolov3-voc.cfg中的
[net]
# Testing
# batch=1 #这里的batch跟subdivisions原来不是注释掉的,但是训练后没成功,有的blog上说为1的时候太小难以收敛,但是不知道下面训练模式的 batch=64 subdivisions=8 会不会覆盖掉,总之注释掉后就成功了,不过这个脚本不是很明白,还来不及验证
# subdivisions=1
# Training
batch=64
subdivisions=8
......
[convolutional]
size=1
stride=1
pad=1
filters=30 #---------------修改为3*(classes+5)即3*(5+5)=30
activation=linear
[yolo]
mask = 6,7,8
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=5 #---------------修改为标签类别个数,5类
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0 #1,如果显存很小,将random设置为0,关闭多尺度训练;(转自别的blog,还不太明白)
......
[convolutional]
size=1
stride=1
pad=1
filters=30 #---------------修改同上
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=5 #---------------修改同上
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0
......
[convolutional]
size=1
stride=1
pad=1
filters=30 #---------------修改同上
activation=linear
[yolo]
mask = 0,1,2
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=5 #---------------修改同上
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0
5.下载卷积层的预训练权重(154 MB),然后放到目录中build\darknet\x64中
6.训练语句
cd C:\darknet-master\build\darknet\x64
darknet.exe detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -map
经验
- 数据集最好每个类有2000张图片,至少需要迭代2000*类的个数
- 数据集最好有没有标注的对象,即负样本,对应空的txt文件,最好有多少样本就设计多少负样本。
为了小目标:
- 提升分辨率
- 在测试时候提升分辨率
- 数据集添加跟正样本数量一样多的负样本
- 数据集每个类至少2000张,训练迭代次数2000*classes个数
- 设置自己数据集的anchor
关于数据集的信息
- max_batches 最大训练次数:classes*2000 但不少于 4000
- 生成的txt标签文本 形如
<object-class> <x_center> <y_center> <width> <height>
然而:
- 代表物体类别的整数 ,从 0 到 (classes-1)
<x_center> <y_center> - 相对于整张图像长和宽的浮点数, 等同于区间 (0.0 to 1.0]
例如: = <absolute_x> / <image_width> or = <absolute_height> / <image_height>
注意: <x_center> <y_center> - 矩形框的中心 (并非左上角)
关于过拟合
形如你可以检测到数据集中训练过的图像,但是不能检测任何其他的图像. 你应该从Early Stopping Point:获得最终的权重
2.1. 首先,在文件 obj.data中你应该指定验证集的路径 valid = valid.txt (format of valid.txt as in train.txt),并且如果你没有验证集图像 , 就拷贝 data\train.txt 到 data\valid.txt.
2.2 如果训练在 9000 iterations后停了下来,为了验证之前的权重 使用命令行:
(If you use another GitHub repository, then use darknet.exe detector recall… instead of darknet.exe detector map…)
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_8000.weights
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_9000.weights
并且比较每个权重最后的输出曲线
选择拥有最高的mAP (mean average precision) 或 IoU (intersect over union)的权重文件
或者干脆训练的时候 命令行加上后缀 -map
darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 -map
mAP 值每4 Epochs会被计算一次,使用在obj.data file指定的valid=valid.txt 文件中的内容
(1 Epoch = images_in_train_txt / batch iterations)