单阶段模型:YOLO, SSD, Retina-Net
两阶段模型:RCNN, SPPNet
yolo系列:精度并不是最高的,但推理运行速度高
FPS:帧/s
精度、速度性价比高
1、YOLOv1
将目标检测当作一个单一的回归任务
将图片分成s*s个网格
物体中心点落在哪个网格上,就由该网格对应锚框负责检测该物体
2、YOLOv2
优化方法
骨干网络:224*224 -> 448 *448 ,DarkNet19
全卷积网络结构:Conv+Batch Norm
Kmeans聚类Anchor
多尺度训练
优化效果
推理速度由40FPS到67FPS
待改进点
小目标召回率不高
靠近的群体目标检测效果不好
检测精度需要进一步优化
3、YOLOv3
优化方法
骨干网络:DarkNet53
多尺度预测,跨尺度特征融合
COCO数据集聚类9种不同尺度的Anchor,每个尺度三个
优化效果
COCO数据集精度33.0
推理速度高于SSD 3倍
推理速度高于RetinaNet 3.8倍
待改进的点
召回率相对较低
定位精度优化
靠近群体目标检测效果差
整体网络构造:
首先输入图片,然后Darknet53特征提取,其中经过五次下采样,还使用了残差结构,目的是使网络结构在很深的情况下,仍能收敛并继续训练下去。
然后经过DBL特征提取得到第一个尺度特征图:然后接着用DBL后特征图上采样后与倒数第二次下采样的结果相加,得到第二个尺度特征图; 最后的特征图上采样后与倒数第三次下采样的特征图相加得到第三个尺度的特征图;
总的来说会输出3个不同尺度的特征图,每个尺度的特征图负责预测不同大小的目标。
每个特征图对应3种anchor大小不同的负责预测目标。最初图像还被分成13x13个网格,目标落在哪个网格中,哪个网格就负责预测目标,一个网格对应3个anchor(anchor的尺寸根据特征图相对于原图的比例等比缩小)。预测时,yolov3采用多个独立的逻辑分类器来计算属于特定标签的可能性,在计算分类损失时,它对每个标签使用二元交叉熵损失,降低了计算复杂度。
BackBone
为了提升模型的检测精度,作者单独设计了darknet-53。在ImageNet上实验结果表明:darknet-53达到了和ResNet-152/ResNet-101相当的分类精度前提下,计算速度大幅度提升,网络层数也比他们少。
Yolo_v3使用了darknet-53的前52层(去掉全连接层)做为backbone,用于特征提取。yolo_v3是一个全卷积网络,大量使用残差的跳层连接;同时为了降低池化带来的梯度负面效果,作者直接摒弃了POOLing,降采样是通过改变卷积核的步长来实现的【即使用的是步长为2的卷积来进行降采样】,如红色框所示,darknet-53一共进行5次下采样操作,将输出特征图缩小到输入的1/32。所以,通常都要求输入图片的分辨率大小是32的倍数。
优点:
推理速度快,性价比高
背景误检率低
通用性强
缺点
召回率低
定位精度差
对于靠近/遮挡的群体、小物体,检测能力相对较弱
3、Output:
为了兼顾大小物体的检测精度,YOLO v3通过upsample和concat操作进行多尺度输出。
一共输出3个scale,输出特征图大小分别为13-13、26-26和52-52【以输入分辨率416-416为例】,小的特征图下采样倍数大,拥有更大的感受野,即每个格子对应的原图的范围更大。用于大目标的检测,大分辨率则用于小目标的检测。通过上采样将深层特征提取,其维度是与将要融合的特征层维度相同的(channel不同),通过concat实现深层–浅层特征的融合,提升检测的精度。
YOLO v3采用3条支路进行检测输出,每条支路最后一个卷积层的卷积核个数等于网络的输出维度。以COCO数据集80类为例,输出的维度为3*(80+4+1)=255,其中3表示一个grid cell(网格点)包含3个bounding box,80表示类别的个数,每个维度表示该类的分数,4表示框的4个坐标信息(x, y, w, h),1表示objectness score。
(1)32倍下采样输出结果:
1)13*13网格数
2)3个先验框
3)每个框分别有:4个边框坐标系-1个边框置信度-80个对象类别数
(2)16倍下采样输出结果:
1)26*26网格数
2)3个先验框
3)每个框分别有:4个边框坐标系-1个边框置信度-80个对象类别数
(3)8倍下采样输出结果:
1)52*52网格数
2)3个先验框
3)每个框分别有:4个边框坐标系-1个边框置信度-80个对象类别数
(4)锚框
在COCO数据集的真实框上Kmeans聚类了9(3*3)种尺度的anchor(先验的超参数)
特征图:13×13
感受野大,先验框为(116×90)(156×189)(373×326)
特征图:26×26
感受野中等,先验框为(30×61)(62×45)(59×119)
特征图:52×52
感受野中等,先验框为(10×13)(16×30)(×)
paddle中实现
! python tools/anchor_cluster.py -c ../yolov3_darknet_baseline.yml -n 9 -s 896 -m v2 -i 2000
聚类后的输出需要手动在配置文件中修改:
(4)
最初图像首先分成13x13个网格,目标落在哪个网格中,哪个网格就负责预测目标,一个网格对应3个anchor(anchor的尺寸根据特征图相对于原图的比例等比缩小)。
有目标的网格左上角为初始点(Cx, Cy)
输出特征图高度、宽度为H、W,相当于将图像划分为H*W个网格
图像的每个网格对应输出特征图HW平面上的一个特征点
将每个网格上都放上锚框,每个网格上的每个锚框都对应一个预测框(网格数*锚框数=预测框数)
所有的9个锚框中,与真实框最匹配的,即IOU最大的锚框负责检测这个真实框
C = B*(5+class_num) B为该特征图上分配的锚框个数
中心点偏移:每个锚框初始点都在左上角
使用sigmoid函数:值固定在0-1之间
中心点偏移不能出网格,偏移应在0-1之间
宽高拉伸:
使用exp函数:无论x取值符号,输出都为正
一键式训练:
python tools/train.py -c configs/yolov3_darknet.yml --eval
一键式预测:
python tools/eval.py -c configs/yolov3_darknet.yml \
-o weights==https://paddlemodels.bj.bcebos.com/object_detection/yolov3_darknet.tar
一键式评估:
python tools/eval.py -c configs/yolov3_darknet.yml \
-o weights==https://paddlemodels.bj.bcebos.com/object_detection/yolov3_darknet.tar \
--infer_img=demo/000000014439.jpg
课程链接:飞桨AI Studio - 人工智能学习实训社区 (baidu.com)