文章来自目标检测方向的一些面试问题,能帮助我们理解目标检测有一定的作用。故转发。
来源于干货 | CV 面试问题详解宝典--目标检测篇
yolo是单阶段检测算法的开山之作,最初的yolov1是在图像分类网络的基础上直接进行的改进,摒弃了二阶段检测算法中的RPN操作,直接对输入图像进行分类预测和回归,所以它相对于二阶段的目标检测算法而言,速度非常的快,但是精度会低很多;但是在迭代到目前的V4、V5版本后,yolo的精度已经可以媲美甚至超过二阶段的目标检测算法,同时保持着非常快的速度,是目前工业界内最受欢迎的算法之一。yolo的核心思想是将输入的图像经过backbone特征提取后,将的到的特征图划分为S x S的网格,物体的中心落在哪一个网格内,这个网格就负责预测该物体的置信度、类别以及坐标位置。
yolov3采用了作者自己设计的darknet53作为主干网络,darknet53借鉴了残差网络的思想,与resnet101、resnet152相比,在精度上差不多的同时,有着更快的速度,网络里使用了大量的残差跳层连接,并且抛弃了pooling池化操作,直接使用步长为2的卷积来实现下采样。在特征融合方面,为了加强小目标的检测,引入了类似与FPN的多尺度特征融合,特征图在经过上采样后与前面层的输出进行concat操作,浅层特征和深层特征的融合,使得yolov3在小目标的精度上有了很大的提升。yolov3的输出分为三个部分,首先是置信度、然后是坐标信息,最后是分类信息。在推理的时候,特征图会等分成S x S的网格,通过设置置信度阈值对格子进行筛选,如果某个格子上存在目标,那么这个格子就负责预测该物体的置信度、坐标和类别信息。
YOLO、SSD和Faster-RCNN都是目标检测领域里面非常经典的算法,无论是在工业界还是学术界,都有着深远的影响;Faster-RCNN是基于候选区域的双阶段检测器代表作,而YOLO和SSD则是单阶段检测器的代表;在速度上,单阶段的YOLO和SSD要比双阶段的Faster-RCNN的快很多,而YOLO又比SSD要快,在精度上,Faster-RCNN精度要优于单阶段的YOLO和SSD;不过这也是在前几年的情况下,目标检测发展到现在,单阶段检测器精度已经不虚双阶段,并且保持着非常快的速度,现阶段SSD和Faster-RCNN已经不更了,但是YOLO仍在飞快的发展,目前已经迭代到V4、V5,速度更快,精度更高,在COCO精度上双双破了50map,这是很多双阶段检测器都达不到的精度。SSD和Faster-RCNN有很多相关的变体,同样有着不错的精度和性能,例如Cascade R-CNN、RefineDet等等。
CenterNet是属于anchor-free系列的目标检测算法的代表作之一,与它之前的目标算法相比,速度和精度都有不小的提高,尤其是和yolov3相比,在速度相同的情况下,CenterNet精度要比yolov3高好几个点。它的结构非常的简单,而且不需要太多了后处理,连NMS都省了,直接检测目标的中心点和大小,实现了真正的anchor-free。CenterNet论文中用到了三个主干网络:ResNet-18、DLA-34和Hourglass-104,实际应用中,也可以使用resnet-50等网络作为backbone;
CenterNet的算法流程是:一张512*512(1x3x512x512)的图片输入到网络中,经过backbone特征提取后得到下采样32倍后的特征图(1x2048x16x16),然后再经过三层反卷积模块上采样到128*128的尺寸,最后分别送入三个head分支进行预测:分别预测物体的类别、长宽尺寸和中心点偏置。其中推理的核心是从headmap中提取需要的bounding box,通过使用3*3的最大池化,检查当前热点的值是否比周围的8个临近点值都大,每个类别取100个这样的点,经过box后处理后再进行阈值筛选,得到最终的预测框。
heatmap的生成可以通过高斯核公式来理解,其中(x,y)为待检测图像中枚举的步长块位置,(px,py)为低分辨率图像中对应于GT关键点的坐标。可以看出,当枚举块的位置和GT关键点坐标接近重合的时候,高斯核输出值接近为1;当枚举块位置和GT关键点相差很大时,高斯核输出值接近为0.这样一来经过高斯核映射后的每个关键点(块)高斯热图为:
每个点的范围是0-1,而1则代表 这个目标的中心点,也就是要预测学习的点,该点处为最大值,沿着半径向外按高斯函数递减 。一个类别对应一张heatmap,80个类别则有80张heatmap,若还有一只狗,则狗的keypoint再另一张heatmap上。
目前大多数深度学习算法模型要落地对算力要求还是比较高的,如果在服务器上,可以使用GPU进行加速,但是在边缘端或者算力匮乏的开发板子上,不得不对模型进一步的压缩或者改进,也可以针对特定的场景使用市面上现有的推理优化加速框架进行推理。目前来说比较常见的几种部署方案为:
nvidia GPU:pytorch->onnx->TensorRT
intel CPU:pytorch->onnx->openvino
移动端(手机、开发板等):pytorch->onnx->MNN、NCNN、TNN、TF-lite、Paddle-lite、RKNN等
在工作中,我通常会根据不同的任务选取不同的算法模型:
目标检测:yolov5、yolov3、CenterNet、SSD、Faster RCNN、EfficientDet;
图像分类:mobileNetv2、mobileNetv3、ghostNet、ResNet系列、ShuffleNetV2、EfficientNet;
实例分割:mask-rcnn、yolact、solo;
语义分割:deeplabv3、deeplabv3+、UNet;
文本检测:CTPN、PSENet、DBNet、YOLOV5;
文本识别:CRNN+CTC、CRNN+Attention;
通常,我比较喜欢性能好的模型,性能的指标由两部分,一个是精度,一个是速度。比如在目标检测中,用的比较多的是yolo系列,特别是v4、v5出来后。通常在图像分类的任务上,分类并不困难的情况下会选择一些轻量型的网络,能够一定程度上节省算力资源。其他领域的任务算法抉择也大同小异。
yolov5和v4都是在v3基础上改进的,性能与v4基旗鼓相当,但是从用户的角度来说,易用性和工程性要优于v4,v5的原理可以分为四部分:输入端、backbone、Neck、输出端;
输入端:针对小目标的检测,沿用了v4的mosaic增强,当然这个也是v5作者在他复现的v3上的原创,对不同的图片进行随机缩放、裁剪、排布后进行拼接;二是自适应锚框计算,在v3、v4中,初始化锚框是通过对coco数据集的进行聚类得到,v5中将锚框的计算加入了训练的代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值;
backbone:沿用了V4的CSPDarkNet53结构,但是在图片输入前加入了Focus切片操作,CSP结构实际上就是基于Densnet的思想,复制基础层的特征映射图,通过dense block发送到下一个阶段,从而将基础层的特征映射图分离出来。这样可以有效缓解梯度消失问题,支持特征传播,鼓励网络重用特征,从而减少网络参数数量。在V5中,提供了四种不同大小的网络结构:s、m、l、x,通过depth(深度)和width(宽度)两个参数控制。
Neck:采用了SPP+PAN多尺度特征融合,PAN是一种自下而上的特征金字塔结构,是在FPN的基础上进行的改进,相对于FPN有着更好的特征融合效果。
输出端:沿用了V3的head,使用GIOU损失进行边框回归,输出还是三个部分:置信度、边框信息、分类信息。
9. 在你的项目中为什么选用yolov5模型而不用v4?
yolov4和v5都是yolo系列性能非常优秀的算法,性能上不分伯仲,而且出来的scale yolov4更是达到了55的map。在项目中选择v5的原因是因为在v4、v5出来之前,就一直在用U版的yolov3,相对于原版的v3,做了很多改进,而V5是在这个hub的基础上改进的,用起来上手比较快,而且代码和之前的v3相似度很高,可以无缝对接以前的项目。另一方面,v5可选的模型比较多,在速度和精度上对比v4有一定的优势,而且模型采用半精度存储,模型很小,训练和推理上都很友好。通常用s或者m版本的基本上都可以满足项目需求。
比较官方一点的回答:
代码易读,整合了大量的计算机视觉技术,非常有利于学习和借鉴。
不仅易于配置环境,模型训练也非常快速,并且批处理推理产生实时结果。
能够直接对单个图像,批处理图像,视频甚至网络摄像头端口输入进行有效推理。
能够轻松的将Pytorch权重文件转化为安卓使用的ONXX格式,然后可以转换为OPENCV的使用格式,或者通过CoreML转化为IOS格式,直接部署到手机应用端。
最后YOLO V5s高达140FPS的对象识别速度令人印象非常深刻,使用体验非常棒。
10. 介绍yolov5中Focus模块的原理和作用
Focus模块,将W、H信息集中到通道空间,输入通道扩充了4倍,作用是可以使信息不丢失的情况下提高计算力。具体操作为把一张图片每隔一个像素拿到一个值,类似于邻近下采样,这样我们就拿到了4张图,4张图片互补,长的差不多,但信息没有丢失,拼接起来相当于RGB模式下变为12个通道,通道多少对计算量影响不大,但图像缩小,大大减少了计算量。
以Yolov5s的结构为例,原始640×640×3的图像输入Focus结构,采用切片操作,先变成320×320×12的特征图,再经过一次32个卷积核的卷积操作,最终变成320×320×32的特征图。
CSP结构是一种思想,它和ResNet、DenseNet类似,可以看作是DenseNet的升级版,它将feature map拆成两个部分,一部分进行卷积操作,另一部分和上一部分卷积操作的结果进行concate。主要解决了三个问题:1. 增强CNN的学习能力,能够在轻量化的同时保持着准确性;2. 降低计算成本;3. 降低内存开销。CSPNet改进了密集块和过渡层的信息流,优化了梯度反向传播的路径,提升了网络的学习能力,同时在处理速度和内存方面提升了不少。
目前比较流行的目标检测算法有以下几种类型,不局限于这几种:
anchor-based:yolov3、yolov4、yolov5、pp-yolo、SSD、Faster-R-CNN、Cascade R-CNN、EfficientDet,RetinaNet、MTCNN;
anchor-free:CornerNet、CenterNet、CornerNet-lite、FCOS;
transform:DETR;
mobile-detector:mobileNet-yolo、mobileNet-SSD、tiny-yolo、nanodet、yolo-fastest、YOLObile、mobilenet-retinaNet、MTCNN;
还有很多很多。。。mmdetection里面就实现了几十种,可以去看一看,这里面最想总结的是移动端的det,很多都是一些大佬在原生算法基础上的改进。
Faster-RCNN是基于候选区域的双阶段检测器代表作,总的来说可以分为四部分:首先是主干卷积网络的特征提取,然后是RPN层,RPN层通过softmax判断anchors属于positive或者negative,再利用边框回归修正anchors获得精确的候选区域,RPN生成了大量的候选区域,这些候选区域和feature maps一起送入ROI pooling中,得到了候选特征区域,最后送入分类层中进行类别判断和边框回归,得到最终的预测结果。
Cascade R-CNN算法是在Faster R-CNN上的改进,通过级联几个检测网络达到不断优化预测结果的目的,预普通的级联不同,Cascade R-CNN的几个检测网络是基于不同的IOU阈值确定的正负样本上训练得到的。简单来说cascade R-CNN是由一系列的检测模型组成,每个检测模型都基于不同IOU阈值的正负样本训练得到,前一个检测模型的输出作为后一个检测模型的输入,因此是stage by stage的训练方式,而且越往后的检测模型,其界定正负样本的IOU阈值是不断上升的。
这里说的是SSD相对于YOLOv1的改进,因为现在SSD已经不更了,但是YOLO还如日中天,已经发展到v5,性能在目标检测算法里一骑绝尘。那么最原始的SSD相对于YOLOv1做了哪些改进呢?
SSD提取了不同尺度的特征图来做检测,而YOLO在检测是只用了最高层的Feature maps;
SSD引入了Faster-RCNN的anchor机制,采用了不同尺度和长宽比的先验框;
SSD网络结构是全卷积,采用卷积做检测,YOLO用到了FC(全连接)层;
SSD算法流程
输入一幅图,让图片经过卷积神经网络(VGG)提取特征,生成feature map
抽取其中六层的feature map,然后分别在这些feature map层上面的每一个点构造4、个不同尺度大小的default box,然后分别进行检测和分类(各层的个数不同,但每个点都有)
将生成的所有default box都集合起来,全部丢到NMS中,输出筛选后的default box。
轻量型的目标检测其实有很多,大多数都是基于yolo、SSD的改进,当然也有基于其他算法改的;比较常用的改进方法是使用轻量型的backbone替换原始的主干网络,例如mobilenet-ssd、mobilenet-yolov3、yolo-fastest、yolobile、yolo-nano、nanodet、tiny-yolo等等,在减少了计算量的同时保持着不错的精度,经过移动部署框架推理后,无论是在服务器还是移动端都有着不错的精度和速度。
图像金字塔和多尺度滑动窗口检测(MTCNN)
多尺度特征融合检测(FPN、PAN、ASFF等)
增大训练、检测图像分辨率;
超分策略放大后检测;
NMS全称是非极大值抑制,顾名思义就是抑制不是极大值的元素。在目标检测任务中,通常在解析模型输出的预测框时,预测目标框会非常的多,其中有很多重复的框定位到了同一个目标,NMS的作用就是用来除去这些重复框,从而获得真正的目标框。而NMS的过程则用到了IOU,IOU是一种用于衡量真实和预测之间相关度的标准,相关度越高,该值就越高。IOU的计算是两个区域重叠的部分除以两个区域的集合部分,简单的来说就是交集除以并集。
在NMS中,首先对预测框的置信度进行排序,依次取置信度最大的预测框与后面的框进行IOU比较,当IOU大于某个阈值时,可以认为两个预测框框到了同一个目标,而置信度较低的那个将会被剔除,依次进行比较,最终得到所有的预测框。
yolov3和SSD比网络更加深了,虽然anchors比SSD少了许多,但是加深的网络深度明显会增加更多的计算量,那么为什么yolov3会比SSD快3倍?
SSD用的很老的VGG16,V3用的其最新原创的Darknet,darknet-53与resnet的网络结构,darknet-53会先用1x1的卷积核对feature降维,随后再利用3x3的卷积核升维,这个过程中,就会大大降低参数的计算量以及模型的大小,有点类似于低秩分解。究其原因是做了很多优化,比如用卷积替代替代全连接,1X1卷积减小计算量等。
干货 | CV 面试问题详解宝典--目标检测篇