目录
3.1 端对端、端到端,One to one:同一个模型输入,同一个模型产生最终的输出
3.3 ROI—region of interest 感兴趣区域
3.4 RP—region proposal: 候选框区域,选出来的区域
1、R-CNN,全称region with CNN features
5、RPN,区域生成网络(Region Proposal Network,简称RPN)
8、FPN网络—特征金字塔(Feature Pyramid Network)
四、SSD(Single Shot MultiBox Detector)
五、Yolo系列—You Only Look Once 2016CVPR
一、基础知识
1、目标检测算法分类
- 两步走的目标检测:先进行区域推荐,而后进行目标分类
- 代表:R-CNN、Fast R-CNN、Faster R-CNN
- 端到端的目标检测:采用一个网络一步到位
- 代表:YOLO、SSD
2、检测任务评估指标
2.1 MAP
分类:平均精确率(mean average precision)
- MAP = 所有类别的AP之和 / 类别的总个数=(AP1+AP2)
- 注:PR曲线,而AP(average precision)就是这个曲线下的面积(ROC与AUC)
2.2 IOU:交并比,定位:IOU(0~1)
- 两个区域的重叠程度overlap:侯选区域和标定区域的IoU值
3、名词解释
3.1 端对端、端到端,One to one:同一个模型输入,同一个模型产生最终的输出
3.2 非最大抑制(NMS)
Non-Maximum Suppression 非极大值抑制
- 筛选候选区域,目标是一个物体只保留一个最优的框,来抑制那些冗余的候选框
3.3 ROI—region of interest 感兴趣区域
1)解释1:region of interest 感兴趣区域
从被处理的图像以方框、圆、椭圆、不规则等方式勾勒出需要处理的区域,称为感兴趣区域 ROI。主要是遍历输入图像,找出可能出现物体或检测目标的输出区域。通常采用SS算法
2)ROI pooling—简单版本的SPP
1. 步骤:
- 根据输入image,将ROI映射到feature map 对应位置;
- 将映射后的区域划分为相同大小的section
- 对每个section进行max pooling 操作
2.作用:
- 从不同大小的方框得到固定大小的相应feature maps;
- 极大提高处理速度
3.4 RP—region proposal: 候选框区域,选出来的区域
3.5 anchor box: 锚框。
3.6 BFLOP/s
描述硬件运算性能的单位,全称是Billion Float operations per second,即每秒能进行多少个 十亿次浮点运算符
- FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。
- FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度
- 这个就是衡量模型前向传播所需的计算力
- GFLOPs:1GLOPs=10亿次浮点运算
在一个模型进行前向传播的时候,会进行卷积、池化、BatchNorm、Relu、Upsample等操作。这些操作的进行都会有其对应的计算力消耗产生,其中,卷积所对应的计算力消耗是所占比重最高的
3.7 Backbone(骨干网)
4、 Crop+Warp
- crop:截取原图片的一个固定大小的patch
- warp:将原图片的ROI缩放到一个固定大小的patch
5、TOP1、TOPN
TOP1:最高概率是正确类别才是正确
TOP5:分类概率前五个有正确的就是符合
计算 Top-N 准确率的步骤如下:
- 对于每个样本,模型生成一个预测结果列表,按照置信度或概率降序排列。
- 根据所需的 N 值,截取预测结果列表的前 N 个元素。
- 检查真实标签是否存在于截取的预测结果中。
- 如果真实标签存在于截取的预测结果中,则该样本被视为正确预测。
- 计算所有样本中正确预测的比例作为 Top-N 准确率。
6、滑动窗口
目标检测的暴力方法是从左到右、从上到下滑动窗口,利用分类识别目标。
将每张子图片输出类别以及位置,变成分类问题
7、SS算法
7.1 主要思想
Selective Search(选择性搜索)基于Graph-Based图像分割,是RCNN和Fast RCNN的区域推荐算法。图像中物体可能存在的区域应该是有某些相似性或者连续性区域的
7.2 流程
- step0:生成区域集R
- step1:计算区域集R里每个相邻区域的相似度S={s1, s2,…}
- step2:找出相似度最高的两个区域,将其合并为新集,添加进R
- step3:从S中移除所有与step2中有关的子集
- step4:计算新集与所有子集的相似度
- step5:跳至step2,直至S为空
7.3 选择搜索优点
- 计算效率优于滑窗法
- 由于采用子区域合并策略,所以可以包含各种大小的疑似物体框
- 合并区域相似的指标多样性,提高了检测物体的概率
8、图片标记后的数据表示
其中,p_c为预测结果的置信概率,b_x, b_y, b_w, b_h为边框坐标,C_1, C_2, C_3为属于某个类别的概率。通过预测结果、实际结果,构建损失函数。损失函数包含了分类、回归两部分组成。
9、目标检测中的损失函数
一般为分类损失+回归损失
分类损失函数:交叉熵
回归损失:均方误差
10、多尺度检测
使用大小不同的特征图,进行检测
原因:大的特征图,卷积比较浅,适合识别比较小的物体
小的特征图,卷积比较深,适合识别大的物体
11、特征融合
将大小不同的特征图融合在一起
两种融合方式
add:小特征图进行上采样(大特征图进行下采样),按元素相加
concat:按照指定维度进行连接
12、FPS(Frames per second)
每秒帧数,5FPS,每秒5帧
也特指第一人称视角的射击游戏(First Person shooter)
13、图像金字塔和特征金字塔
1)特征金字塔:将大小不同的特征图叠加到一起
2)图像金字塔:将图像缩放到不同的大小叠加到一起
3)金字塔中的特征融合方式
相加:在小的特征图上上采样,大的特征图下采样,按元素相加
连接:水平、垂直、深度方向的连接
14、Soft-NMS
论文链接:https://arxiv.org/pdf/1704.04503.pdf
代码:跳转中...
14.1 非极大值抑制算法NMS 存在的两个问题:
当阈值过小时,如图所示,绿色框容易被抑制;
当过大时,容易造成误检,即抑制效果不明显。
14.2 改进方式
Soft-NMS在进行非极大抑制的时同时考虑得分和 边框之间的重合程度。
原来的NMS:将IOU大于阈值的窗口的得分全部置为0。
如果一个检测框与M有大部分重叠,它会有很低的分数;而如果检测框与M只有小部分重叠,那么它的原有检测分数不会受太大影响
改进方式一:线性加权
改进方式二:高斯加权
二、传统机器学习解决图像任务
1、图像处理的任务分类
图像分类、目标检测、OCR、图像分割、图像拼接、图像配准、人脸识别、
图像去噪、图像复原、图像超分辨率重建、图像压缩
例如下面是OCR识别流程
2、关键算法:关键点检测![](https://i-blog.csdnimg.cn/blog_migrate/43be457aac09c955da0b1ab15cd4d5fc.png)
常用角点检测算法:SIFT(尺度不变特征变换)、FAST(快速特征检测)、Harris 角点检测、ORB(Oriented FAST and Rotated BRIEF)
最常用的是FAST和ORB
2.1 SIFT算法
博客:SIFT算法_mingcheng2650的博客-CSDN博客
尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。
2.2 FAST算法
2.2.1 FAST角点定义
若某像素点与周围邻域足够多的像素点处于不同区域,则该像素可能为角点。考虑灰度图像,即若某像素点的灰度值比周围邻域足够多的像素点的灰度值大或小,则该点可能为角点。
2.2.2 算法步骤
- 对于图像中一个像素点 p,其灰度值为 I_p
- 以该像素点为中心考虑一个半径为3的离散化的Bresenham圆,圆边界上有16个像素(如下图所示)
- 设定一个合适的阈值 t,如果圆上有n个连续像素点的灰度值小于 I_p - t 或者大于 I_p + t,那么这个点即可判断为角点(n的取值为 9 或 12)
2.2.3 一种快速排除大部分非角点像素的方法就是检查周围1、5、9、13四个位置的像素,
- 如果位置1和9与中心像素P点的灰度差小于给定阈值,则P点不可能是角点,直接排除;
- 否则进一步判断位置5和13与中心像素的灰度差,如果四个像素中至少有3个像素与P点的灰度差超过阈值,则考察邻域圆上16个像素点与中心点的灰度差,
- 如果有至少9个超过给定阈值则认为是角点。
2.2.4 角点分类器
多种图像进行角点检测,提取多个特征点,使用决策树对类似场景进行特征点检测和分类
三、RCNN系列
1、R-CNN,全称region with CNN features
1.1 介绍
CVPR 2014年中Ross Girshick提出R-CNN
用候选区域方法(region proposal method),创建目标检测的区域改变了图像领域实现物体检测的模型思路,R-CNN是以深度神经网络为基础的物体检测的模型
1.2 名称由来
用CNN提取出Region Proposals中的featues,然后进行SVM分类与bbox的回归
1.3 思想
将检测问题转化为分类问题
1.3.1 滑动窗口
1.4 网络结构
1.5 流程:
1、对原始图像进行ss算法(大约需要2S),找到RP
2、将每一个RP输入到预训练好的AlexNet(去掉全连接)中,提取特征向量(4096)
3、对每个目标(类别)训练一SVM分类器,识别该区域是否包含目标。
4、训练一个回归器,修正候选区域中目标的位置:对于每个类,训练一个线性回归模型判断当前框定位是否准确。
2、SPPNet—RCNN改进
2.1 改进方式:
流程:卷积之后,最后一个卷积层,加入金字塔池化层,网络输入任意大小图片,输出固定大小输出
- 先得一个feature map
- SS得到候选区域直接映射到特征向量中的位置
- 映射得到的向量,经过SPP输出固定大小的特征向量给FC层
2.2 金字塔池化层
意义:多尺度特征提取出固定大小的特征向量
将特征图划分为三种网格形式,4*4+2*2+1=21,每个块中提取一个特征,组成21维的特征向量
3、Fast-RCNN
3.1 改进:基于R-CNN和SPPnet,ROI projection映射方式
提出一个RoI pooling,然后整合整个模型,把CNN、RoIpooling、分类器、bbox回归几个模块整个一起训练
ROI projection映射方式
映射过程:左上角的点(x,y)映射到 feature map上的(x',y')
映射公式的原理就是卷积原理:
隐藏层边长 = (W-K+2P)/S +1,计算过程就是所有strides的乘积,与卷积核没有关系
例如上式中 x' = x/S + 1,论文中,经过4层提取特征,故x' = x/(x*2*2*2*2)+1
3.2 网络结构
RoI pooling只是一个简单版本的SPP,主要目的是将候选区域缩放至相同大小
3.3 流程
- 使用selective search生成region proposal,大约2000个左右区域候选框
- 使用CNN对图像进行卷积运算,得到整个图像的特征图
- 对于每个候选框,通过RoI Projection映射算法取出该候选框的特征图,再通过RoI池化层形成固定长度的特征向量
- 每个特征向量被送入一系列全连接(fc)层中,最终分支成两个同级输出层 :一个输出个类别加上1个背景类别的Softmax概率估计,另一个为个类别的每一个类别输出4个定位信息
3.4 网络修改
RCNN不能统一训练原因:特征提取CNN和SVM分类独立
- 去掉SVM,采用softmax
- 多任务损失Multi-task loss
- 分类loss,交叉熵损失,N个类别,1个背景
- 回归loss,MAE平均绝对误差即L1损失,调整anchor位置
4、Faster R-CNN
问题:Fast R-CNN还存在着瓶颈问题:Selective Search(选择性搜索)。要找出所有的候选框,那我们有没有一个更加高效的方法来求出这些候选框呢?
4.1 原理
候选区域生成,特征提取,分类,位置精修全部放在一个神经网络框架中
4.2 网络结构
4.3 损失函数
对一个图像的损失函数,是一个分类损失函数与回归损失函数的叠加:
4.5 流程
- Conv Layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的卷积/激活/池化层提取图像的特征(基础模型为resnet),形成一个特征图,用于后续的RPN层和全连接层。
- Region Proposal Networks(RPN)。RPN网络用于生成候选区域,该层通过softmax判断锚点(anchors)属于前景还是背景,在利用bounding box regression(包围边框回归)获得精确的候选区域。 RPN网络只用来判断框内有没有物体
- RoI Pooling。该层收集输入的特征图和候选区域,综合这些信息提取候选区特征图(proposal feature maps),送入后续全连接层判定目标的类别。固定特征图到相同大小
- Classification。利用取候选区特征图计算所属类别,并再次使用边框回归算法获得边框最终的精确位置。
4.6 改进
- 在VOC2007测试集测试mAP达到73.2%,目标检测速度可达5帧/秒
- 提出Region Proposal Network(RPN),取代selective search,生成待检测区域,时间从2秒缩减到了10毫秒
- 真正实现了一个完全的End-To-End的CNN目标检测模型
- 共享RPN与Fast RCNN的特征
4.7 缺点
- 还是无法达到实时检测目标
- 获取region proposal, 再对每个proposal分类计算量还是较大
5、RPN,区域生成网络(Region Proposal Network,简称RPN)
1) 作用
专门用来从特征图生成候选区域的网络,直接在特征图上做一个快速、粗糙的预测。主要预测的是锚点框内有没有物体
- 通过softmax判断anchors属于foreground或者background,有没有物体
- 再利用bounding box regression修正anchors获得精确的proposals,输出其Top-N(默认为300)的区域给RoI pooling,物体框的位置修正
2) 原理
用n×n(默认3×3=9)的大小窗口去扫描特征图得到K个候选窗口(例如32*32大小的图像,会得到32*32*9 anchors)
3)锚点:对于特征图上的每一个点(称之为anchor point,锚点),生成具有不同 尺度 和 宽高比 的锚点框,这个锚点框的坐标(x,y,w,h)是在原图上的坐标
4)网络结构
5)流程
- 用n×n(默认3×3=9)的大小窗口去扫描特征图,每个滑窗位置映射到一个低维的向量(默认256维),并为每个滑窗位置考虑k种(在论文设计中k=9)可能的参考窗口(论文中称为anchors)
- 3*3卷积核的中心点对应原图上的位置,将该点作为anchor的中心点,在原图中框出多尺度、多种长宽比的anchors,三种尺度{ 128,256,512 }, 三种长宽比{1:1,1:2,2:1},每个特征图中的像素点有9中框
7、FCN网络
7.1 介绍
FCN(Fully Convolutional Networks,全卷积网络) 用于图像语义分割
区别于图片分类网络,softmax输出为1维
不能标识每个像素点的类别,所以这种全连接方法不适用于图像分割
8、FPN网络—特征金字塔(Feature Pyramid Network)
8.1 作用
由不同大小的特征图构成的层次模型,主要用于在目标检测中实现多尺度检测。大的特征图适合检测较小的目标,小的特征图适合检测大的目标
四、SSD(Single Shot MultiBox Detector)
2016 论文网址:https://arxiv.org/abs/1512.02325
基础知识:
多尺度特征映射图(Multiscale Feature Maps):小编认为这是SSD算法的核心之一,原始图像经过卷积层转换后的数据称为特征映射图(Feature Map),特征映射图包含了原始图像的信息。SSD网络包含了多个卷积层,用多个卷积层后的特征映射图来定位和检测原始图像的物体。
先验框(Priors):在特征映射图的每个位置预先定义不同大小的矩形框,这些矩形框包含了不同的宽高比,它们用来匹配真实物体的矩形框。
预测矩形框:每个特征映射图的位置包含了不同大小的先验框,然后用预测卷积层对特征映射进行转换,输出每个位置的预测矩形框,预测矩形框包含了框的位置和物体的检测分数。比较预测矩形框和真实物体的矩形框,输出最佳的预测矩形框。
1 介绍
结合了YOLO中的回归思想和Faster-RCNN中的Anchor机制
核心思想:在不同尺度的特征特征图上采用卷积核来预测一系列Default Bounding Boxes的类别、坐标偏移。
2 网络结构
以VGG-16为基础,使用VGG的前五个卷积,后面增加从CONV6开始的5个卷积结构,输入图片要求300*300。
- backbone: VGG16用于图片特征提取的网络
- Extra: 用来获得更多的特征图
- Loc和cls: 用于框位置回归和目标分类的网络
3 特点
- SSD提取了不同尺度的特征图来做检测,大尺度特征图可以用来检测小物体,而小特征图用来检测大物体;
- SSD采用了不同尺度和长宽比的先验框,在faster r-cnn和yoloV2,V3中称为Anchors。
4、算法流程
5、损失函数
分为位置损失函数和置信度损失函数
五、Yolo系列—You Only Look Once 2016CVPR
1、演变进程
2、介绍
YOLO把目标检测看作一个回归问题,直接用一个网络进行分类和框回归。
核心思想:生成RoI+目标检测两阶段(two-stage)算法用一套网络的一阶段(one-stage)算法替代,直接在输出层回归bounding box的位置和所属类别
3、YOLO系列
1、YOLO-v1
论文资料
论文题目:You Only Look Once: Unified, Real-Time Object Detection
论文地址:https://arxiv.org/pdf/1506.02640.pdf
1.1 相较于Faster RCNN
预定义候选框,每个候选框,预测2个边框,每个边界框包含5个预测:x,y,w,h和置信度
5个检测框x,y,w,h,p * 2 = 10 分类:20种 故最终结果为7*7*30
1.2 网络结构
网络采用用于图像分类的GoogLe Net,共有24个卷积层+2个全连接层
没有使用GoogLe Net的inception模块,而是交替的使用1*1 filters(减少之前层的参数个数)+3*3卷积层
1.3 训练流程
1)预训练。采用前20个卷积层、平均池化层、全连接层进行了大约一周的预训练;
2)输入。输入数据为224*224和448*448大小的图像;
给个一个输入图像,首先将图像划分成7*7的网格
对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
根据上一步可以预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可
3)采用相对坐标。通过图像宽度和高度来规范边界框的宽度和高度,使它们落在0和1之间;边界框x和y坐标参数化为特定网格单元位置的偏移量,边界也在0和1之间;
448*448图内的小框位置相对坐标表示,Cx,Cy为(0.2,0.2),宽高为(0.5,0.5),小框的中心坐标为
1.4 损失函数
1.4.1均方误差
bounding box 损失:均方误差
x,y为框的预测坐标与真实坐标的MAE,h,w为宽高的误差,原因为大的框与小的框偏移距离相同时,小框的IOU减少非常大,而大框的IOU变化很小
置信损失:含object的boxconfidence损失,不含object损失
classes loss:
判断是否有object中心落在网络中
1.4.2 损失函数存在问题
- 第一,8维的localization error和20维的classification error同等重要显然是不合理的;
- 第二,如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。
1.5 采用相对坐标的原因
预测相对于网格单元位置的位置坐标。这使得真实值的界限在0到1之间。由于我们限制位置预测,因此参数化更容易学习,从而使网络更加稳定
相对坐标的表示方法
1.6 Yolov1缺陷
(1)由于每个网格只预测2个bounding boxes,这限制了模型可以预测的物体的数量
(2)多次使用下采样,所以预测模型边界框使用的是相对粗糙的特征
2、YOLO-v2
论文原名《YOLO9000: Better, Faster, Stronger 》
2.1 介绍
新的网络模型DarkNet19,在分类任务上采用联合训练方法,结合wordtree等方法
2.2 相较于v1的改进
(1)Batch Normalization(批量正则化),map提高2%
(2)High Resolution Classifier(高分辨率分类器)
先用224*224的输入从头开始训练网络,大概160个epoch(表示将所有训练数据循环跑160次),然后再将输入调整到448*448,再训练10个epoch。大约提升4%的map
(3)Convolutional With Anchor Boxes(带Anchor Boxes的卷积)
YOLOv1利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准。(全连接一维结构,破坏了空间信息)。
去掉了全连接层,使用Anchor Boxes预测边界框,同时为了得到更高分辨率的特征图,YOLOv2还去掉了一个池化层。
YOLOv2通过缩减网络,使用416*416的输入,模型下采样的总步长为32,最后得到13*13的特征图,然后对13*13的特征图的每个cell预测5个anchor boxes,对每个anchor box预测边界框的位置信息、置信度和一套分类概率值。使用anchor boxes之后,YOLOv2可以预测13*13*5=845个边界框
(4)Dimension Clusters(维度聚类),用k-mean聚类算法,得到YOLO2的先验框piror boxes
借鉴RPN的anchor boxes,有先验知识,预测更快
(5)New Network(新的网络)
分类网络模型(YOLO2自己的模型):Darknet-19
类似vgg,最后使用全局平均池化,每个特征图得到1个值,再用全连接会少很多参数。
Darknet19:19个卷积层 + 5个池化层,最后一个全局平均池化层输出1000类别(没有使用全连接层)
(6)直接定位预测(Direct location Prediction)
6.1)预测bounding box方法
网络在特征图(13 *13 )的每个cell上预测5个bounding boxes,
每一个bounding box预测5个坐标值:tx,ty,tw,th,P。
cx,cy:这个cell距离图像左上角的边距
pw,ph:该cell对应的box维度(bounding box prior)的长和宽分别为p_w,p_h,那么对应的box为:
其中,σ为sigmoid函数;t_x,t_y是预测的坐标偏移值(中心点坐标);t_w, t_h是尺度缩放,分别经过sigmoid,输出0-1之间的偏移量,与c_x, c_y相加后得到bounding box中心点的位置。
tx,ty,tw,th 都为超参数,初始值设置之后进行学习
(7)细粒度特征(Fine-Grained Features)
(8)多尺度训练(Multi-Scale Training)
多尺度预测,多尺度输入图像进行训练
FCN网络,不固定输入大小
3、YOLO-v3
3.1 改进
- 新网络结构:DarkNet-53;
- 用逻辑回归替代softmax作为分类器;
- 二分类代替多分类
- 融合FPN(特征金字塔网络),实现多尺度检测。
3.2 网络结构
Y1输出
416*416输入,第一次输出,经过32倍降采样称为13*13*255
其中255 = 3*(4+1+80),80个类别,每个划分区域预测3个框
Y2输出
26*26*255为13*13的特征图进行concat
3.3 算法训练流程图
图8 左边是输入图片,上半部分所示的过程是使用卷积神经网络对图片提取特征,随着网络不断向前传播,特征图的尺寸越来越小,每个像素点会代表更加抽象的特征模式,直到输出特征图,其尺寸减小为原图的1/32
图8 下半部分描述了生成候选区域的过程,首先将原图划分成多个小方块,每个小方块的大小是32X32,,然后以每个小方块为中心分别生成一系列锚框,整张图片都会被锚框覆盖到。在每个锚框的基础上产生一个与之对应的预测框,根据锚框和预测框与图片上物体真实框之间的位置关系,对这些预测框进行标注。
将上方支路中输出的特征图与下方支路中产生的预测框标签建立关联,创建损失函数,开启端到端的训练过程。
3.4 候选区域产生及微调
- 按一定的规则在图片上生成一系列位置固定的锚框,将这些锚框看作是可能的候选区域。
- 对锚框是否包含目标物体进行预测,如果包含目标物体,还需要预测所包含物体的类别,以及预测框相对于锚框位置需要调整的幅度。
飞桨PaddlePaddle-源于产业实践的开源深度学习平台
3.5 损失函数
三个层级加起来
3.6 根据输出特征图计算预测框的位置和类别
4、YOLOv4(2020)
4.1 改进
- 输入端。采用更大的输入图像,采用新的样本增强方法;
- 骨干网。采用新的、改进的骨干网CSPDarknet53;新的激活函数(mish)和dropout策略;
- 特征融合部分。插入SPP,FPN+PAN等新的结构;
- 输出端。采用改进的损失函数。
4.2 输入端
1)Mosaic(马赛克)数据增强
Mosaic数据增强则采用了4张图片,随机缩放,随机裁剪,随机排布的方式进行拼接 。这样使得模型更获得更多相关或不相关的上下文信息,学习到更加鲁棒的特征。
2)自对抗训练(SAT,Self Adversarial Trainning)
3)CmBN(交叉小批量归一化)
不止像BN层考虑当前批次,考虑到了前k个时刻统计量,进行批量归一化
4.3 Backbone
1)CSPDarknet53
CSPDarknet53是在YOLOv3主干网络Darknet53的基础上
其中CSPNet(Cross Stage Partial Network,跨阶段局部网络)主要用来提高学习能力同时,降低模型对资源的消耗
2)激活函数
为什么Mish的效果好一点,大约可以提升0.9%的准确率:比relu更平滑
Mish激活函数。一种新的、非单调、平滑激活函数,表达式为:
图像为
3) Dropblock策略
其原理是在特征图上通过dropout一部分相邻的区0域,使得模型学习别的部位的特征,从而表现出更好的泛化能力
dropout是随机丢弃,一个一个随机丢弃。下图左侧为dropout,右侧为dropblack
4.4 Neck部分
SPP模块。SPP模块位于Backbone网络之后,使用k={1x1, 5 x 5, 9 x 9, 13 x 13}最大池化操作,再将不同尺度的特征图进行Concat融合。
FPN + PAN. FTP指特征金字塔,其思想是将高层次卷积得到的较小特征图进行上采样,和低层次较大的特征图进行特征融合(自顶向下),这样做的优点是将高层次较强的语义特征传递下来。而PAN结构借鉴2018年图像分割领域PANet
PANet(Path Aggregation Network,路径聚合网络)的创新点,FPN的后面添加一个自底向上的特征金字塔,将低层次强定位特征传递上来(自底向上),从而形成对FPN的补充
4.5 IOU改进
IOU用来度量预测定位是否准确,但存在一定的问题
GIOU_loss:在IOU的基础上,解决了边界框不重合的问题
DIOU_loss:在IOU和GIOU的基础上,考虑了边界框中心点距离的信息。(YOLOv4采用)
CLOU_Loss: 在DIOU的基础上,考虑边界框宽高比的尺度比例
解释为比较图中相同颜色候选框的对比,哪个比较好,计算量少
DIOU_NMS。NMS主要用于预测框的筛选,YOLOv4使用DIOU来进行NMS(即选择DIOU最大的值),实验证明在重叠目标的检测中,DIOU_NMS的效果优于传统的NMS
4.6 网络结构
作者提出了一个目标检测的通用框架,分为Input,Backbone,Neck,Head
Reshape unit 解决梯度消失
CSPX主要用来进行特征融合
SPP 也是特征融合
5、Yolov5
5.1 网络结构
5.1.1 改进方式
(1)输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放
(2)Backbone:Focus结构,CSP结构
(3)Neck:FPN+PAN结构
(4)Prediction:GIOU_Loss
1)输入端
1.1)自适应锚框计算
但Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。
当然,如果觉得计算的锚框效果不是很好,也可以在代码中将自动计算锚框功能关闭。
v2/v3计算锚框位置时,如果中心点落在单元格左上角顶点或右下角顶点处,则公式中的
x,y=(0,0) or (1,1)此时t_x,t_y应为正无穷或负无穷,因此公式可能在此处无法求解,故引入缩放因子,消除敏感度,将值域范围缩放至[-0.5,1.5]
作者的大致意思是,原来的计算公式并没有对预测目标宽高做限制,这样可能出现梯度爆炸,训练不稳定等问题。下图是修改前(相对Anchor宽高的倍率因子)的变化曲线, 很明显调整后倍率因子被限制在(0,4)之间。
1.2)自适应图片缩放
计算方式:深入浅出Yolo系列之Yolov5核心基础知识完整讲解 - 知乎
在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。
作者认为,在项目实际使用时,很多图片的长宽比不同,因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。
因此在Yolov5的代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边。
两种填充方式的对比
2)Backbone
2.1)Focus结构
比较关键是切片操作
比如右图的切片示意图,4*4*3的图像切片后变成2*2*12的特征图。
以Yolov5s的结构为例,原始608*608*3的图像输入Focus结构,采用切片操作,先变成304*304*12的特征图,再经过一次32个卷积核的卷积操作,最终变成304*304*32的特征图。
需要注意的是:Yolov5s的Focus结构最后使用了32个卷积核,而其他三种结构,使用的数量有所增加,先注意下,后面会讲解到四种结构的不同点。
5.2 网络分类
共有四种网络结构,每种网络深度和宽度上都不相同
(1) Yolov5s可视化网络结构图:点击查看
1) Yolov5s
Yolov5s网络是Yolov5系列中深度最小,特征图的宽度最小的网络。后面的3种都是在此基础上不断加深,不断加宽。
2) Yolov5m网络结构
此处也放上netron打开的Yolov5m网络结构可视图,点击即可查看,后面第二版块会详细说明不同模型的不同点。
3) Yolov5l网络结构
此处也放上netronx打开的Yolov5l网络结构可视图,点击即可查看。
4) Yolov5x网络结构
此处也放上netronx打开的Yolov5x网络结构可视图,点击即可查看
5.4 Yolov5四种网络的宽度
5.5 Yolov5损失函数
与之前类似,三部分损失函数构成
分类损失还是使用BCELoss(二分类交叉熵)
6、Yolov6
论文链接及代码:YOLOv6 (paper, code) and YOLOv7 (paper, code)
是美团视觉智能部研发的一款目标检测框架,致力于工业应用
6.1 Yolov6框架
6.2 改进部分
Backbone、Neck、Head以及训练策略等
6.2.1
受硬件感知神经网络设计思想的启发,基于Rap成功过 style 设计了可重参数化、更高效的骨干网络EfficientRep Backbone 和Rep-PAN Neck
优化设计更高效的Decoupled Head,在维持精度的同时,进一步降低一般解耦头带来的额外延时开销
在训练策略中,采用Anchor-free无锚范式,辅以SIMOTA标签分配策略以及SloU边界框回归损失来进一步提高检测精度
1)Hardware-friendly 骨干网络设计(硬件友好骨干网络)
2)
3)训练策略
3.1)Anchor-free无锚范式
Yolov1采用的就是Anchor-free,注意区别于Anchor-base
2/3/4/5 采用Anchor-base
3.2)simOTA
作用是为不同目标设定不同的正样本数量,例如蚂蚁和西瓜,传统的正样本分配方案常常为同一场景下的西瓜和蚂蚁分配同样的正样本数,那要么蚂蚁有很多低质量的正样本,要么西瓜仅仅只有一两个正样本。对于哪个分配方式都是不合适的。
SimOTA出现在yolox中,首先会计算一个cost代价矩阵,代表每个真实框和每个特征点之间的代价关系,Cost代价矩阵由三个部分组成:
(1)每个真实框和当前特征点预测框的重合程度;
(2)每个真实框和当前特征点预测框的种类预测准确度;
(3)每个真实框的中心是否落在了特征点的一定半径内。
解释一下为什么要由这三个部分组成?
(1)每个真实框和当前特征点预测框的重合程度越高,代表这个特征点已经尝试去拟合该真实框了,因此它的Cost代价就会越小。
(2)每个真实框和当前特征点预测框的种类预测准确度越高,也代表这个特征点已经尝试去拟合该真实框了,因此它的Cost代价就会越小。
(3)每个真实框的中心如果落在了特征点的一定半径内,代表这个特征点应该去拟合该真实框,因此它的Cost代价就会越小。
Cost代价矩阵的目的是自适应的找到当前特征点应该去拟合的真实框,重合度越高越需要拟合,分类越准越需要拟合,在一定半径内越需要拟合。
那如何动态的为不同目标设定不同的正样本数量(dynamic_k)呢?
SimOTA的具体做法
(1)计算每个目标cost最低的10个特征点
(2)把这10个特征点预测的预测框与真实框进行IOU操作,则会得到10个IOU的值
(3)将10个IOU的值进行sum操作后会得到一个值,此时的值为dynamic_k。
6.3 如何选择模型
7、Yolov7
7.1 改进策略
1.模型重参数化
YOLOV7将模型重参数化引入到网络架构中,重参数化这一思想最早出现于REPVGG中。
2.标签分配策略
YOLOV7的标签分配策略采用的是YOLOV5的跨网格搜索,以及YOLOX的匹配策略。
3.ELAN高效网络架构
YOLOV7中提出的一个新的网络架构,以高效为主。
4.带辅助头的训练
YOLOV7提出了辅助头的一个训练方法,主要目的是通过增加训练成本,提升精度,同时不影响推理的时间,因为辅助头只会出现在训练过程中。
7.2 网络结构
7.2.1 CBS模块
激活函数silu是swish变体
swish(x)=x⋅sigmoid(βx) silu(x)=x⋅sigmoid(x)
从架构图中我们可以看出,CBS模块这里有三种颜色,三种颜色代表它们的卷积核(k)和步长(s)不同。
首先最浅的颜色,也就是第一个CBS模块的颜色,它是一个1x1的卷积,stride(步长为1)。
其次稍浅的颜色,也就是第二个CBS模块的颜色,它是一个3x3的卷积,stride(步长为1)。
最后最深的颜色,也就是第三个CBS模块的颜色,它是一个3x3的卷积,stride(步长为2)。
1x1的卷积主要用来改变通道数。
3x3的卷积,步长为1,主要用来特征提取。
3x3的卷积,步长为2,主要用来下采样。
8、Yolov8
8.1 概述
论文没有使用yolov8,而是ultralytics 这个词,原因是 ultralytics 将这个库定位为算法框架,而非某一个特定算法,一个主要特点是可扩展性。其希望这个库不仅仅能够用于 YOLO 系列模型,而是能够支持非 YOLO 模型以及分类分割姿态估计等各类任务。
8.2 安装
!pip install ultralytics --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
# 查看是否安装成功
import ultralytics
ultralytics.checks()
9、YoloX
在Yolov6之前发布的YoloX
YOLOX: Exceeding YOLO Series in 2021
YOLOX = YOLO v5-5.0 + FCOS + OTA. YOLOX整体上依然沿用了YOLO v5(5.0版)的结构,但在检测头上进行了修改,使用了类似FCOS的检测头(一些细节上有差异). 此外,YOLOX是Anchor-free的,标签分配策略上其基于OTA进行了简化,提出SimOTA,SimOTA更高效地实现了训练阶段给每个GT自适应动态分配k个正样本的过程.
9.1 网络结构
YOLOX整体依然沿用了YOLO v5-5.0的网络结构,主要差别在于head. YOLOX的具体网络结构如下所示.
10、yolov9
论文地址:https://arxiv.org/abs/2402.13616
10.1 改进
- 引入了可编程梯度信息(Programmable Gradient Information, PGI),这是一种全新的概念,旨在解决深层网络中信息丢失的问题
- 提供了更可靠的学习梯度,特别是对于较小的模型。
- 全新的网络架构——泛化高效层聚合网络(Generalized Efficient Layer Aggregation Network, GELAN)
- GELAN通过梯度路径规划,优化了网络结构,利用传统的卷积操作符实现了超越当前最先进方法(包括基于深度卷积的方法)的参数利用效率
- 最大限度地提高准确性,同时最大限度地减少参数和失败次数。
10.2 网络模型
10.3 关键结构
1)CSPNet
从 v5 开始,使用跨阶段部分网络 (CSPNet) 的主干来提高效率,跨并行网络分支聚合特征映射
串行堆叠,通常会导致冗余计算和过度参数化,例如一条串行堆叠的集大成者,DensNet
2)ELAN
YOLOv7将CSPNet升级为高效层聚合网络(ELAN),简化了块结构
ELAN 删除了各层之间的快捷连接,转而采用输出处的聚合节点。这进一步提高了参数和 FLOP 效率。
3)GELAN
融合了CSPNet和ELAN
- 可互换的计算模块 – 以前的 ELAN 具有固定的卷积层。 GELAN 允许替换任何计算模块,例如 ResNets 或 CSPNet,从而提供更多架构选项。
- 深度参数化 – 主分支与聚合器分支的单独块深度简化了资源使用的微调。
- 跨配置性能稳定 – GELAN 保持不同块类型和深度的准确性,允许灵活的缩放
效果
- 高效层聚合块 – 这些跨多个网络分支的聚合转换可以有效地捕获多尺度特征。
- 计算模块 – CSPNet 块有助于跨层传播信息。任何块都可以根据计算约束进行替换
10.4 PGI
10.4.1 概述
确定模型权重在训练期间更新的程度。嘈杂或误导性的梯度会导致收敛不良。对于较小的网络,这个问题变得更加明显。
通过生成更可靠的梯度,PGI 可以帮助较小的模型与较大的模型一样有效地训练
10.4.2 组成
- 主分支
- 推理时只使用 main branch,避免额外推理成本
- 辅助可逆分支
- 这些通过使用 RevCols 等块维持与输入的可逆连接来提供更清晰的梯度。
- 引入此组件是为了解决随着网络深度增加而引发的信息瓶颈问题。这种信息瓶颈会干扰损失函数生成有效梯度的能力,辅助可逆分支通过保持信息流动的完整性来克服这一障碍。
- 多级辅助信息
- 这避免了不同侧分支干扰的分歧。它在反馈到主模型之前结合所有分支的梯度。
- 此部分旨在解决深度监督可能导致的误差累积问题,尤其是在拥有多个预测分支的结构和轻量级模型中。通过引入多级辅助信息,模型能够更有效地学习并减少误差传播。
10.4.3 Multi-level Auxiliary Information
目标检测中,常用不同层次的特征金字塔来处理不同规模的目标。根据浅层特征识别小型目标,同时将其他规模的目标视为背景。
这一做法虽然针对性强,但可能导致深层特征金字塔在预测各种大小目标时丢失关键信息
为了有效地保持目标信息的完整性,每一级的特征金字塔都应该接受到有关所有目标大小的信息
作者引入了一种多级辅助信息框架,通过在辅助监督特征金字塔层和主分支之间加入集成网络
这个集成网络的角色是整合来自不同预测分支的梯度信息,并将这一聚合的信息传递给主分支,以促进参数的更新。
10.5 损失函数
- 样本匹配依旧使用的是TaskAlign样本匹配。和YOLOv8、YOLOE、YOLOv6等算法保持一致;
- 分类损失:BCE Loss 回归损失:DFL Loss + CIoU Loss
self.assigner = TaskAlignedAssigner(topk=int(os.getenv('YOLOM', 10)),
num_classes=self.nc,
alpha=float(os.getenv('YOLOA', 0.5)),
beta=float(os.getenv('YOLOB', 6.0)))
self.bbox_loss = BboxLoss(m.reg_max - 1, use_dfl=use_dfl).to(device)
self.proj = torch.arange(m.reg_max).float().to(device) # / 120.0
self.use_dfl = use_dfl
11、Yolov10
11.1 简介
论文:https://arxiv.org/abs/2405.14458
代码:github
Yolov10是清华大学研究人员,通过解决Yolo以前版本在后处理和模型架构方面的不足,进行的改进。主要是消除NMS,优化了各种模组件,显著降低计算开销的同时,实现了最先进的性能。
最近稍微有些时间,简单做了一套数据集,跑了一下Yolov10的目标检测。用的是最轻量化的版本,yolov10-N,与yolov8和v9的轻量化版本比较,模型的参数量和计算量占用更少了,不过性能有些许下降,总的来说还是非常不错的。
PS:详细的不是很深入,我仅仅是一个调参侠,主要工作是传统算法
11.2 网络结构
backbone:增强版的 CSPNet(跨阶段部分网络),以改善梯度流并减少计算冗余。大核卷积扩大感受野
NeckNet:PAN汇聚不同尺度的特征,实现多尺度特征融合,和以前一样
DetectHead:主要工作在这里和后处理。轻量级Head,双重标签分配,在训练过程中将一对多和一对一策略结合起来,以确保丰富的监督和高效的端到端部署
后处理:无NMS训练,利用一致的双重分配来消除对NMS的需求,减少推理延迟
11.3 总结
大核卷积扩大感受野,部分自注意力模块,不增加计算成本的情况下提高性能,这个可以详细看一下,我自己的稍微加一些注意力模块,模型的参数量,计算量和占用内存都有不少的增加。边缘端对这个比较敏感。
现在的模块做的东西太多,对于我这种拿来主义和想要改进的人来说,代码太冗余了。虽然不太难,但是看着累。
如果是自己训练,最好直接把 ultralytics 模块卸载了,下载的代码里有这个模块,可能你在调整的时候,已经修改了模型,但还是会加载到原始的版本。
其他目标检测模型
YOLOF、FCOS
DETR、CLIP、DALL·E,与NLP互相借鉴,做的都挺不错。
最近买了一本系列的目标检测书,还是比较系统和工程化的,讲的挺细,有时间把这些也记录一下,基本流程没啥太大的改变,最新的发展可能都转到了大模型,多模态,图像处理这边没啥一鸣惊人的大迭代了。下个阶段准备做一下目标跟踪和3D视觉。主要硬件设备不太行,很多东西没办法很快实现,看看理论感觉都是在隔靴搔痒。
以前寄予厚望的GNN,今年也没怎么关注,分身乏术。