目标检测常识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 工具
标注数据
(二)写好模型所需的配置文件打开 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 删除掉才可以
参考资料: