基于 Yolov4 和 Yolov4-tiny 的 Human Detector 训练记录
网络训练
序言本实验总体目标是基于 Yolov4 和 Yolov4-tiny,训练仅包含“人类”一类的人体检测器(Human Detector);
本文档包含:
Human Detector 使用步骤:描述如何使用预训练好的基于 Yolov4 和 Yolov4-tiny 的 Human Detector(以下简称 HD_yolov4, HD_yolov4_tiny);
自定义数据集训练 Yolov4 & Yolov4-tiny:描述如何使用自定义数据集训练 Yolov4 和 Yolov4-tiny;
性能对比: Yolov4 和 Yolov4-tiny 分别作为 Base Model 的 Human Detector 精度和速度对比。
基本信息数据集:COCO 2017 的仅 human 类
1、Human Detector 使用步骤下载 pretrained model:
新建 backup 文件夹,并将以下 pretrained model 权重文件放入。
编译:
视频 demo 测试:
以 HD_yolov4_tiny 为例,通过以下命令对测试视频 tslist.mp4(提取码:h21b) 进行检测,并输出保存为 tiny_yolov4_demo.mp4。
./darknet detector demo data/obj.data cfg/human_detector_yolov4-tiny-custom.cfg backup/human_detector_yolov4-tiny-custom_best.weights -ext_output tslist.mp4 -i 0 -thresh 0.30 -out_filename tiny_yolov4_demo.mp4
data/obj.data 中可进行测试集配置
cfg/human_detector_yolov4-tiny-custom.cfg 是模型的配置文件
./backup/human_detector_yolov4-tiny-custom_best.weights 是上述下载的 pretrained model
-ext_output 是在画面中显示检测 bbox
-i 输入视频,默认为 0
-thresh 检测出的 bbox 阈值,低于该阈值的 bbox 框将不被显示在画面中
-out_filename 是输出视频的命名
假如视频帧率太大不方便查看,可用以下命令将其转换为帧率为 10 的视频片段。
ffmpeg -y -r 30 -i tiny_yolov4_demo.mp4 -r 10 tiny_yolov4_demo_fps10.mp4
可以直接运行 video_tiny.sh & video_yolov4.sh 脚本分别对 HD_yolov4_tiny 和 HD_yolov4 进行测试。
测试模型性能:
以 HD_yolov4_tiny 为例,测试模型精度 mAP (mean average precisions):
./darknet detector map data/obj.data cfg/human_detector_yolov4-tiny-custom.cfg ./backup/human_detector_yolov4-tiny-custom_best.weights
可直接运行 map_yolov4.sh & map_tiny.sh 进行测试
以 HD_yolov4_tiny 为例,测试模型速度FPS:
./darknet detector demo data/obj.data cfg/human_detector_yolov4-tiny-custom.cfg backup/human_detector_yolov4-tiny-custom_best.weights tslist.mp4 -benchmark
运行 fps_yolov4.sh & fps_tiny.sh 进行测试
2、自定义数据集训练 Yolov4 & Yolov4-tinyYolov4 和 Yolov4-tiny 模型训练不同之处仅在于配置文件不同,即2.1 准备文件不同,数据集配置和训练和测试命令格式一致,因此本节只区分2.1 准备文件部分,其他部分的参数请自行替换。
2.1 准备文件修改 cfg/coco.data 为 cfg/obj.data:
classes = 1
train = /hdd01/wanghuijiao/darknet/data/train2017_human.txt
valid = /hdd01/wanghuijiao/darknet/data/val2017_human.txt
names = ./data/obj.names
backup = ./backup
eval=coco
修改 data/coco.name,新文件命名为 data/obj.names,删除除person之外的其他 79 类标签,最终 obj.name 文件内容为:
person
(HD_yolov4)修改 yolov4.cfg,新文件命名为 whj_yolov4.cfg,修改以下行:
width=512 (需被32整除)
height=512(需被32整除)
subdivisions=8 (若 run time error,则改成16)
max_batches=6000(=2000*检测类别数,注意:该数需不少于6000,且不少于训练图像数量)
steps=4800,5400 (max_batches的80%,90%)
修改 3 个 [yolo] 层的 classes=1
修改 3 个 [yolo] 层前 3 个 [convolutional] 层的 filters=255 为 filters=(classes+5)*3=18
3`.(HD_yolov4_tiny)修改 cfg/yolov4-tiny-custom.cfg, 新文件命名为 human_detector_yolov4-tiny-custom.cfg,修改以下行:
width=512 (需被32整除)
height=512(需被32整除)
subdivisions=8 (若 run time error,则改成16)
max_batches=6000(=2000*检测类别数,注意:该数需不少于6000,且不少于训练图像数量)
steps=4800,5400 (max_batches的80%,90%)
(HD_yolov4)csdarnet53-omega.conv.105 -这是在ImageNet上预训练过的 darknet53 网络前105层:从这下载 csdarknet53-omega_final.weights
取前105层
./darknet partial cfg/csdarknet53-omega.cfg csdarknet53-omega_final.weights csdarknet53-omega.conv.105 105
4`. (HD_yolov4_tiny)yolov4-tiny.conv.29
从这下载 yolov4-tiny 预训练权重的前29层。
2.2 准备数据标注文件格式:为每张 .jpg 图片生成单独的 .txt 文件,图片中每个目标对象占一行,格式为
object-class x_center y_center width height
object-class:从标号为 0 到 (classes-1) 的整数,表示类别标签序号
x_center y_center width height: 是与图像标签框宽和高有关的浮点数,例如:
x_center = absolute_x_center / image_width
height = absolute_height / image_height
x_center, y_center 是矩形框的中心并非左上角。
.txt文件名和 .jpg 图片名保持一致
txt 内容示例如:
1 0.716797 0.395833 0.216406 0.147222
0 0.687109 0.379167 0.255469 0.158333
1 0.420312 0.395833 0.140625 0.166667
模型数据读入为保存图片绝对路径的 train.txt 文件, 如:
/hdd01/wanghuijiao/darknet/coco/train2017/img1.jpg
/hdd01/wanghuijiao/darknet/coco/train2017/img2.jpg
/hdd01/wanghuijiao/darknet/coco/train2017/img3.jpg
COCO 80类数据集位置:服务器:10.0.10.56 上 /hdd02/zhangyiyang/data/coco/ 下的 train2017 和 val2017
将 COCO 的 human 类单独提取为 yolov4 数据格式的脚本为 convert_coco_labels.py
2.3 训练和测试模型训练 (以 HD_yolov4_tiny 为例):
单 GPU:
./darknet detector train data/obj.data cfg/human_detector_yolov4-tiny-custom.cfg yolov4-tiny.conv.29 -dont_show -map
data/obj.data 中可进行测试集配置
cfg/human_detector_yolov4-tiny-custom.cfg 是模型的配置文件
./backup/human_detector_yolov4-tiny-custom_best.weights 是上述下载的 pretrained model
yolov4-tiny.conv.29 是2.1中的4`中下载的初始权重,也可以是 backup 中的 XXXX_last.weights,即紧接上一个权重文件继续训练。
-dont_show 是指不显示损失函数窗口,单可以通过 chart.png 查看损失函数曲线
-map 是在训练过程中计算 mAP 并显示在损失函数曲线上
每 100 个 iteration 会在 backup (默认)文件夹中保存 XXXX_last.weights,每 2000 个 iteration 会保存一个权重模型例如 XXXX_2000.weights
多 GPU:
./darknet detector train data/obj.data cfg/human_detector_yolov4-tiny-custom.cfg yolov4-tiny.conv.29 -dont_show -map -gpus 1,2,3,4
-gpus 开启多 GPU 训练
测试单张图片命令
./darknet detector test data/obj.data cfg/human_detector_yolov4-tiny-custom.cfg backup/human_detector_yolov4-tiny-custom_best.weights -thresh 0.25 -ext_output data/person.jpg
-thresh 检测出的 bbox 阈值,低于该阈值的 bbox 框将不被显示在画面中
-ext_output 是在画面中显示检测 bbox
视频 demo 测试:以 HD_yolov4_tiny 为例,通过以下命令对测试视频 tslist.mp4(提取码:h21b) 进行检测,并输出保存为 tiny_yolov4_demo.mp4。
./darknet detector demo data/obj.data cfg/human_detector_yolov4-tiny-custom.cfg backup/human_detector_yolov4-tiny-custom_best.weights -ext_output tslist.mp4 -i 0 -thresh 0.30 -out_filename tiny_yolov4_demo.mp4
-i 输入视频,默认为 0
-out_filename 是输出视频的命名
假如视频帧率太大不方便查看,可用以下命令将其转换为帧率为 10 的视频片段。
ffmpeg -y -r 30 -i tiny_yolov4_demo.mp4 -r 10 tiny_yolov4_demo_fps10.mp4
测试模型性能:
测试模型精度 mAP (mean average precisions):
./darknet detector map your_.data_file your_model_.cfg_file your_pretrained_weights
以 HD_yolov4_tiny 为例:
./darknet detector map data/obj.data cfg/human_detector_yolov4-tiny-custom.cfg ./backup/human_detector_yolov4-tiny-custom_best.weights
测试模型速度FPS:
./darknet detector demo your_.data_file your_model_.cfg_file your_pretrained_weights test.mp4 -benchmark
以 HD_yolov4_tiny 为例,用 tslist.mp4 测试:
./darknet detector demo data/obj.data cfg/human_detector_yolov4-tiny-custom.cfg backup/human_detector_yolov4-tiny-custom_best.weights tslist.mp4 -benchmark
3、性能对比实验编号/分支名
参数
描述
状态
精度
GPU/CPU 速度(官方GPU:FPS,CPU:无)
模型大小
显存占用
yolov4_80
2017coco; max_batches = 500500; width=512 height=512
源码+pretrained_weight
done
ap=83.22%
83.0FPS/t>1s (83FPS)
245 MB
1745MB
HD01
2014coco; max_batches = 6000; width=512,height=512;
基于 yolov4 的 human detector (改源码)
done
ap=60.37%
83.9FPS/t>1s(83FPS)
245 MB
1745MB
HD02 (HD_yolov4)
2017coco; max_batches = 70000; train_num: 64115; val_num: 2693; width=512 height=512;
基于 yolov4 的 human detector (改数据格式)
done
ap=79.30%
82.6FPS/t>1s (83FPS)
245 MB
1745MB
tiny_yolov4_80
2017coco; max_batches = 500500 ;width=512 height=512
源码+pretrained_weight
done
ap=58.29%
134.0FPS/0.5FPS
23.1 MB
823MB
HD03 (HD_yolov4_tiny)
2017coco; max_batches = 80000; train_num: 64115; val_num: 2693; width=512 height=512
基于 yolo-tiny 的 human detector改数据格式
done
ap=65.75%
134.8FPS/0.5FPS
23.1 MB
823MB
- 测试环境:
- GPU:Tesla V100-32GB 4卡
- 服务器:10.0.10.56
- 输入图片分辨率:1920*1080