物体检测 - YOLO V1-V3 阅读笔记

目标检测常识

  • two-stage:Faster-Rcnn、Mask-Rcnn (5FPS)
  • one-stage:YOLO (类似回归任务,速度快,效果没上边的好)
  • recall = T P T P + F N \frac{TP}{TP+FN} TP+FNTP (查全率、召回率、覆盖率) 基于置信度阈值计算
  • precision = T P T P + F P \frac{TP}{TP+FP} TP+FPTP (精度、信噪比) 基于置信度阈值计算
  • AP:PR 曲线下边的面积,mAP:所有类别的平均 AP

YOLO V1

  • 网络架构
    物体检测 - YOLO V1-V3 阅读笔记_第1张图片
  • 输出中每个结果的意义(S 为网格大小,B 为先验框个数)

物体检测 - YOLO V1-V3 阅读笔记_第2张图片

  • 损失函数

物体检测 - YOLO V1-V3 阅读笔记_第3张图片

  • 测试时对 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 V1-V3 阅读笔记_第4张图片

  • 最后输出的特征图融合前一层的特征
    物体检测 - YOLO V1-V3 阅读笔记_第5张图片

  • 多尺度:迭代一定次数后改变输入图像的大小

YOLO V3

  • 聚类得到 3 个尺度(每个尺度 3 种)的先验框

  • 在多个 scale 上检测,并使用特征金字塔进行特征融合

  • 网络结构:全卷积网络,无池化和全连接层,下采样通过 stride =2 实现
    物体检测 - YOLO V1-V3 阅读笔记_第6张图片

物体检测 - YOLO V1-V3 阅读笔记_第7张图片

  • 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 训练自己的数据与任务:
(一)数据打标签

  1. 安装 labelme 工具
  2. 标注数据

(二)写好模型所需的配置文件

  1. 安装 git,https://git-scm.com/

  2. 打开 config 文件夹

  3. bash create_custom_model.sh 2 (后面的数字表示你的任务的类别个数)

  4. 自动生成 yolov3-custom.cfg

(三):标签格式转换:

  1. 用 json2yolo.py 来把标签转换成 yolo 所需的格式(labelme —>x1,y1,x2,y2,YOLO-V3---->Cx,Cy,W,H 相对位置(取值范围 0-1))

(四):写好数据和标签的路径

  1. 转换好的输出路径:data\custom\labels
    json_floder_path:labelme 生成标签的文件夹
    物体检测 - YOLO V1-V3 阅读笔记_第8张图片

(五):完全其他配置操作

  1. 数据放到相应位置,注意名字和 label 的得一致
    物体检测 - YOLO V1-V3 阅读笔记_第9张图片
  1. classes.names 改成你任务里有的类别名字

  2. 在 train.txt 与 val.txt 中写好对应的路径
    物体检测 - YOLO V1-V3 阅读笔记_第10张图片

  1. custom.data
    物体检测 - YOLO V1-V3 阅读笔记_第11张图片

物体检测 - YOLO V1-V3 阅读笔记_第12张图片

(六):训练代码更改

  • train.py 需要设置的参数
    1. –model_def config/yolov3-custom.cfg
    2. –data_config config/custom.data
    3. –pretrained_weights weights/darknet53.conv.74 #如果需要修改网络

(七):预测操作

  1. –image_folder data/samples/ #预测的数据
  2. –checkpoint_model checkpoints/yolov3_ckpt_100.pth #训练好模型的路径
  3. –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

你可能感兴趣的:(物体检测 - YOLO V1-V3 阅读笔记)