物体检测 - YOLO V1-V3 阅读笔记
目标检测常识
- two-stage:Faster-Rcnn、Mask-Rcnn (5FPS)
- one-stage:YOLO (类似回归任务,速度快,效果没上边的好)
- recall = (查全率、召回率、覆盖率) 基于置信度阈值计算
- precision = (精度、信噪比) 基于置信度阈值计算
- AP:PR 曲线下边的面积,mAP:所有类别的平均 AP
YOLO V1
- 网络架构
- 输出中每个结果的意义(S 为网格大小,B 为先验框个数)
- 损失函数
-
测试时对 iou 大于一定值的预测框进行置信度 NMS
-
问题:
- 难以检测重叠物体(小物体检测不到)
- 多标签物体无法检测(只能二分类)
YOLO V2
-
舍弃了 dropout(一般用在全连接层,V2 中也舍去了全连接层),每个卷积层后加 BN 层
-
v1 中训练时用 224*224 大小的图片,测试时用的是 448*448 的图片。在 v2 中训练时又额外进行了 10 次
448*448 的微调 -
网络结构 darknet:没有 FC 层,5 次降采样(实际输入 416*416,5 次降采样后特征图大小 13*13),使用 1*1 的卷积改变通道数(减少了参数)
-
聚类提取先验框:先验框的大小由标注框 k-means 聚类得到(5 类),k-means 中的距离 d=1-IoU,mAP 略微下降 0.3,recall 提升 7%
-
位置预测:预测偏移量时 相对 grid cell
-
最后输出的特征图融合前一层的特征
-
多尺度:迭代一定次数后改变输入图像的大小
YOLO V3
-
聚类得到 3 个尺度(每个尺度 3 种)的先验框
-
在多个 scale 上检测,并使用特征金字塔进行特征融合
-
网络结构:全卷积网络,无池化和全连接层,下采样通过 stride =2 实现
- softmax 层改进,用来预测多标签任务
源码阅读
-
训练时修改 data/coco/ images、labels、5k.txt、trainvalno5k.txt,dataset.py 中 ListDataset 类中
__getitem__
方法中,修改 img_path 和 label_path -
config 包含 所有网络结构 , shortcut 残差连接 ,route 层 拼接特征图,shortcut 层 直接相加
-
梯度累加:梯度累加就是,每次获取 1 个 batch 的数据,计算 1 次梯度,梯度不清空,不断累加,累加一定次数后,根据累加的梯度更新网络参数,然后清空梯度,进行下一次循环。一定条件下,batchsize 越大训练效果越好,梯度累加则实现了 batchsize 的变相扩大,如果 accumulation_steps 为 8,则 batchsize ‘变相’ 扩大了 8 倍,是解决显存受限的一个不错的 trick,使用时需要注意,学习率也要适当放大。
-
总体步骤:
1.加载配置参数 2.构造模型(网络定义、前向传播) 3.读入预训练模型和数据 4.训练模型
-
读入图像后转换成 tensor 格式,并进行图像增强(此处用了水平翻转,注意标签也要跟着变)
-
损失函数中的置信度损失有两部分,有目标的损失+无目标的损失
-
训练网络时,可先聚类生成 9 种先验框大小,并在 cfg 文件最后的 yolo 层中更改
构建自己的数据集
基于 YOLO-V3 训练自己的数据与任务:
(一)数据打标签
- 安装 labelme 工具
- 标注数据
(二)写好模型所需的配置文件
-
安装 git,https://git-scm.com/
-
打开 config 文件夹
-
bash create_custom_model.sh 2 (后面的数字表示你的任务的类别个数)
-
自动生成 yolov3-custom.cfg
(三):标签格式转换:
- 用 json2yolo.py 来把标签转换成 yolo 所需的格式(labelme —>x1,y1,x2,y2,YOLO-V3---->Cx,Cy,W,H 相对位置(取值范围 0-1))
(四):写好数据和标签的路径
- 转换好的输出路径:data\custom\labels
json_floder_path:labelme 生成标签的文件夹
(五):完全其他配置操作
- 数据放到相应位置,注意名字和 label 的得一致
-
classes.names 改成你任务里有的类别名字
-
在 train.txt 与 val.txt 中写好对应的路径
- custom.data
(六):训练代码更改
- train.py 需要设置的参数
- –model_def config/yolov3-custom.cfg
- –data_config config/custom.data
- –pretrained_weights weights/darknet53.conv.74 #如果需要修改网络
(七):预测操作
- –image_folder data/samples/ #预测的数据
- –checkpoint_model checkpoints/yolov3_ckpt_100.pth #训练好模型的路径
- –class_path data/custom/classes.names #画图时候要把框上显示出来 name
额外注意:create_custom_model.sh 不能重复执行,要先把 yolov3-custom.cfg 删除掉才可以
参考资料:
1.深度学习-物体检测-YOLO 实战系列 https://edu.51cto.com/course/22647.html
2.深度学习前沿论文学习笔记
https://zhuanlan.zhihu.com/p/43973503