首页 > 编程语言 >YOLO算法的学习

YOLO算法的学习

时间:2022-09-03 18:44:24浏览次数:77  
标签:box py voc -- YOLO V2 学习 算法

 

 

 

 

 

 

 

 

YOLO V1

置信度(confidence):当前点所对应的候选框,是否是物体。

√网络架构

 

 

 注:

  • 7*7*30:7*7的格子,每个格子当中有30个值,每个格子产生两种候选框(x,y,w,h,confidence)共10个值,为相对图像的归一化结果,剩下20个值为20类(属于每一类的概率是多少)。
  • 10=(x,y,h,w,c)*B;当前数据集中有20个类别
  • 最终实际大小:(S*S)*(B*5+C)

√预测过程

输入:488*488*3图像

输出:7*7*30张量

 

 

具体步骤:

  • 图像分为7*7(s*s)网格(grid cell)
  • 通过卷积神经网络得到7*7*30的张量(上面已解释相关数据的含义
  • 每个网格先经验得到2(B)个bounding box,一共98个bounding box,每个bounding box带有5个参数 :置信度(confidence)、框的左上角X与Y坐标、框的长宽H和W【98*5+49*20=7*7*(5*2+20)】
    • 这样的话用置信度*每种类别的概率就是每个bounding box对应各个类别的概率
    • 一般情况下框的粗细代表置信度大小,框的颜色代表种类
  • 过滤低置信度的框,并且把重复的框去掉,只保留一个,从而得到最终的检测结果
    • 相当于98个bounding box对应20个类别的全概率
    • 假设这98个张量的1号位置元素是表示物体位置是“狗”的概率,那么针对狗这个类别:
      • 设置一个概率值p,将98个张量的1号位置小于p的全部置为0,相当于这些框不可能是狗
      • 将这98个张量按照1号元素的大小(是狗的概率)依次排序
      • 进行非极大值抑制    

非极大值抑制:主要是为了去除重复的框

  • 我们已经将按照狗概率最大的排好序了,那么我们将排在第一位的拿出来,依次和后面的框做IoU(交并比,可以体现两个框重合部分大小)
  • 设置一个阈值,如果两者IoU大于阈值,说明重合度很高,那我们就保留概率大的,概率小的概率值设置为0,直接淘汰
  • 第一位和第二位比较完,第二位再按照相同规则依次类推
  • 我们已经将狗的情况过滤完成,后面就要将剩余19个分类按照以上步骤完成

√损失函数

 

 

 注:

  • 系数λ相当于权重项
  • 第一行:每个网格的B(论文中为2)种预选框,中心位置误差
  • 第二行:w与h的误差;同等w和h的变化,物体较小时较为敏感,较大时不太敏感,所以采用此种根号形式
  • 第三行:object是前景时是1,是背景是是0(IoU>0.5可能是前景,多候选框重叠时选择IoU最大的候选框)不加权重,容易被背景影响,而我们的误差更多的时前景影响的
  • 第四行:分类误差

NMS(非极大值抑制):会有很多候选框重叠,按照置信度进行排序,选择最大值保存,其它删掉

优缺点:

  • 快速简单
  • 每个cell只可预测一个类别,重合在一起的前景很难检测
  • 一小物体检测一般,长宽比可选的单一,个前景多个标签时也会出现问题

YOLO V2

 

 

 

 (Dropout可以防止过拟合,杀死一些神经元)

主要变YOLO-V2-Batch NormalizationV2版本舍弃Dropout,卷积后全部加入Batch Normalization

    • 网络的每一层的输入都做了归一化,收敛相对容易
    • 经过Batch Normalization处理后的网络会提升2%的mAP
  • YOLO-V2-更大的分辨率
    • V1训练时使用的是224*224,测试时使用448*448
    • 可能导致模型会出现问题,V2训练时额外又进行了10次448*448的微调
    • 使用高分辨率分类器后,YOLOv2的mAP提升了约4%
  • YOLO-V2-网络结构
    • DarkNet/DarkNet19,实际输入为416*416(可以整除32,最后得到的最好是奇数,好确定中心点)
    • 没有FC全连接层,5次降采样(Maxpool,2^5=32,则图像变化为h/32,w/32大小,最终得到图像结果为13*13)
    • 1*1卷积节省了很多参数(传递信息)
  • YOLO-V2-聚类提取先验框
    • faster-rcnn系列选择的先验比例9(3*3)种都是常规的,但是不一定完全适合数据集
    • K-means聚类中的距离d(box,centroids)=1-IOU(box,centroids)【分类后,找出每一类的实际中心点,这样还可以限制了范围,并且与物体小无绝对直接关系,论文中k=5】
  • YOLO-V2-Anchor Box
    • 通过引入anchor boxes,使得预测的box数量更多(13*13*n)
    • 跟faster-rcnn系列不同的是先验框并不是直接按照长款固定比给定的
  • YOLO-V2-Directed Location Predicition
    • v1直接预测得到直接偏移量可能会偏移太多

 

 

  •  YOLO-V2-Fine-Grained Features
    • 感受野:概述来说就特征图上的点能看到原始图像多大区域
    • 最后一层时感受野太大了,小目标可能丢失了,需要融合之前的特征

 

  •  YOLO-V2-Multi-Scale
    • 都是卷积操作,最小的图像尺寸为320*320,最大的图像尺寸为608*608,特征图的拆分融合

 

YOLO-V3

1.优缺点

  • 最大的改进就是网络结构,使其更适合小目标的检测
  • 特征做的更加细致,融入多持续特征图信息来预测不同规格物体
  • 先验框更丰富了,3种scale,每种三个规格,一共9种
  • softmax改进,预测多标签任务

2.主要变化

  • 多scale
    • 为了检测到不同大小的物体,设计了3个scale
    • 最后一次特征图上采样(线性插值等),

 

  •  残差连接
    • V3中也用了resnet的思想,堆叠更多的层来进行特征提取,至少不比原来差

 

 

 

  •  核心网络架构

 

 

    •  没有池化和全连接层,全部卷积(池化压缩特征)
    • 下采样通过stride为2实现
    • 3种scale,更多先验框
  • 先验框设计

 

  •  softmax层替代
    • 物体检测任务中可能一个物体有多个标签
    • logistic激活函数来完成,就能预测每一个类别是/不是

 

 

 

 YOLO V5

1.主要改变

  • 输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放
    • 数据增强:随机缩放、随机裁剪、随机排布
    • 自适应锚框计算:在Yolov3、Yolov4中,训练不同的数据集时,计算初始锚框的值是通过单独的程序运行的。但Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。
    • 自适应图片缩放:在Yolov5的代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边。
  • backbone:Focus结构,CSP结构
    • Focus结构:主要是切片操作
  • Neck:FPN+PAN结构
    • Yolov5的Neck结构中,采用借鉴CSPnet设计的CSP2结构,加强网络特征融合的能力。
  • Prediction:GIOU_Loss

 

YOLO-V5复现

1.win10+CUDA11.6+cuDNN+pytorch+anaconda

2.yolov5项目地址:https://github.com/ultralytics/yolov5/releases/tag/v3.1

  • 下载好yolov5项目
  • 安装所需库
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simpe
  • 下载权重文件,例:yolov5s.pt,并放置在weights文件夹下
  • 安装测试,在yolov5的路径下执行
python detect.py --source ./inference/images/ --weights weights/yolov5s.pt --conf 0.4
  • 下载项目文件夹(所用数据集为voc2007和voc2012)
  • 生成训练集和验证集文件
python get_voc_windows.py

(可以看到在VOC devkit / VOC2007和VOC devkit / VOC2012目录下生成了文件夹labels;在VOC目录下生成了images和labels文件夹

 

  • 修改配置文件
    • 新建文件data/voc_new.yaml(可以复制data/voc.yaml再根据自己的情况修改,注释掉download: bash data/scripts/get_voc.sh)
    • 新建文件models/yolov5s-voc.yaml(可以复制models/yolov5s.yaml再根据自己的情况修改)
  •  训练自己的数据集命令
python train.py --data data/voc_new.yaml --cfg models/yolov5s-voc.yaml --weights weights/yolov5s.pt --batch-size 16 --epochs 200
  • 训练过程可视化
tensorboard --logdir=./runs
  • 测试图片
python test.py --source ./VOC/images/val/000001.jpg --weights runs/exp0/weights/best.pt --conf 0.4
  • train.py数据加载器旨在兼顾速度和准确性
  • test.py旨在获得验证数据集上的最佳mAP
  • detect.py旨在真实世界中获得最佳的推理结果

 

标签:box,py,voc,--,YOLO,V2,学习,算法
From: https://www.cnblogs.com/bonel/p/16652368.html

相关文章