数据命名
- VOC2016 最早1093张person
- VOC2017 刘尧792张person
- VOC2018 恩德792张person_hand
- VOC2019 person_head_hand(hand/hand1) 但是可以不生成hand1的label
- VOC2020 person_head_hand size=224*224
- 2021_train.txt head and hand
- VOC2000 toys
- VOC2001 刘尧张恩德 1:3 404张
- VOC2002 刘尧 1:4 849张 白天,亮度两种
- VOV2003 罗定 1:4 699张 隧道
- VOC2004 白天,隧道组合 699+849=1548
问题提示
- 配置文件:
- cfg/yolo.cfg 或者 cfg/yolo-voc.cfg,定义网络结构
test
阶段batch=1
,train
阶段batch=64/128
出现CUDA out of memory
错误 - cfg/voc.data 或者 cfg/coco.data 定义类别,训练数据,测试数据的路径 出现
bounding box
正确,但是图片的标注与实际不符合
- 问题:数据标注,有些时候没有覆盖手,小物体检测效果不好
训练技巧
- random=1 多尺度训练
- anchor机制:数量(num),长宽比(根据最后一层输出map尺寸)
- batch大小
- passthrough layer(route)细粒度特征
- 模型大小压缩
配置文件修改
- 到
cfg
文件夹,将xxx.cfg
和voc.data
复制修改
.cfg
说明网络结构,[region]
小节的classes=20
,改为你的类别数,'num'改为anchors
数目,最后一个convolutional
小节的filters
改为(5+classes)×num
.data
说明训练数据索引位置train=
,训练过程权重保存位置backup=
,训练和测试过程类别数classes
,各类别名称names
- 在
data
文件夹中建立.data
文件中的names
列表,里面一行一个类别标签
labe数据的准备
- VOC数据集中,将自己的图片复制到
JPEGImages
,标注复制到Annotations
,在ImageSets/Main/make_text.py
修改1path,执行之后生成
train.txt` voc_label.py
文件修改
sets=[('2020', 'train')]
classes = ["person","head","hand"]
- 执行
voc_label.py
,在labels
文件夹下生成label
,同时在同一目录下生成./2020_train.txt
,其中包含训练数据路径
数据训练起点生成(basemodel)
./darknet partial cfg/darknet19.cfg darknet19.weights darknet19.conv.19 19
执行训练命令
./darknet detector train cfg/voc.data cfg/darknet19.cfg darknet19.conv.19 -gpus 0
模型对比分析
./darknet_test/param_size.py
执行结果显示参数大小和计算量cfg/tiny-yolo-voc-person-head-hand-decrease-anchor.cfg
- 大小(KKM*N): 3.6M
- 计算量(KKSSM*N):
- 帧率(pc-cpu)
./darknet detector demo cfg/voc-tiny-person-head-hand.data cfg/tiny-yolo-voc-person-head-hand-decrease-anchor.cfg weights_anchor_2020/tiny-yolo-voc-person-head-hand-decrease-anchor_16500.weights data/2.avi