前言:本文主要梳理了目标检测任务,包括目标检测简介、常用数据集、常用技巧,以及经典的两段式和一段式模型。
目标检测(Object Detection)的目的是“识别目标并给出其在图中的确切位置”,其内容可解构为三部分:识别某个目标(Classification);给出目标在图中的位置(Localization);识别图中所有的目标及其位置(Detection)。从这三点可以看出目标检测的难度要比图像分类大很多,后者只需要确定输入的图像属于哪一类即可,而前者需要从图像中自动抠出(crop)合适大小的patch,并确定它的类别。其中抠出patch这一步难度很大,因为1:图像中目标个数不确定;2:目标的尺度和形状(大小和宽高比)不确定。
传统的目标检测主要是采用滑动窗口法:利用一系列不同大小和宽高比的滑动窗口,在图像上以一定步长来crop,从而得到一堆的小图;然后将每个小图送给后面的分类器(比如SVM或CNN)进行分类;之后再通过NMS来过滤掉重复的预测框。这个方法很经典,即从所有可能的小图中过滤三次,留下来的就是检测到的目标。后来的许多目标检测算法也都是从这里做进一步的改进。
滑动窗口法的缺陷也很明显:
- 定位不准。第一步利用不同大小和宽高比的滑动窗口来过滤时,只能得到固定大小和宽高比的小窗口,所以绝大部分目标的尺寸都会有一定的偏移(框的不太准)。
- 难以同时检测距离较近的目标。
- 计算量太大。这个是最大的问题,为了检测出更多不同尺寸的目标,为了定位更准确,为了检测出距离较近的目标,都不得不增加滑动窗口的个数,这就意味着超高的计算成本。
当前目标检测算法主要有两个分支,两段式检测算法和一段式检测算法:
- 两段式典型算法:R-CNN,SPP,Fast R-CNN,Faster R-CNN,R-FCN,Mask R-CNN
- 一段式典型算法:YOLO,SSD
两段式目标检测算法(比如R-CNN系列)的改进思路大方向主要有两点:
- 不再暴力的把所有小窗口都拿来做分类,而是先利用某些方法,从一大堆的小窗口中选出更可能是目标的候选框(region proposal),然后再拿去做分类。这就在一定程度上减少了计算成本。
- 粗略选出的候选框即便包含目标,也很可能有偏移,因此采用边框回归这一神器来校正窗口的位置。
而一段式中SSD算法则更加直接,直接用不同大小和宽高比的锚框(anchor box,也叫预设框,default box)将图像密密麻麻的铺满,然后再分别拿去做分类。这个思路实际上和滑动窗口法很相似,但高明之处在于:
- 只利用CNN提取一次特征,把特征图上各个像素和原图上预设的锚框联系起来,因此拿去做分类的并不是原图中crop出来的小窗口,而是特征图上各个像素对应的特征向量(这些特征向量就代表了对应感受野的局部语义特征)。
- 和两段式算法一样,也利用边框回归器来校正锚框的准确位置。
从这些方向可以看出,当前目标检测算法的主要思想是:在CNN提取图像特征的基础上,有针对性的crop部分窗口(或者预设特定尺寸的锚框)+边框回归器修正边框位置。
2 目标检测常用数据集
PASCAL VOC:包含20个类别。通常是用VOC07和VOC12的trainval并集作为训练,用VOC07的测试集作为测试。
MS COCO:COCO比VOC更困难。COCO包含80k训练图像、40k验证图像、和20k没有公开标记的测试图像(test-dev),80个类别,平均每张图7.2个目标。通常是用80k训练和35k验证图像的并集作为训练,其余5k图像作为验证,20k测试图像用于线上测试。
四种结合使用方式:
- 使用 VOC2007 的 train+val 和 VOC2012的 train+val 训练,然后使用 VOC2007的test测试,这个用法是论文中经常看到的 07+12,研究者可以自己测试在VOC2007上的结果,因为VOC2007的test是公开的。
- 使用 VOC2007 的 train+val+test 和 VOC2012 的 train+val训练,然后使用 VOC2012 的test测试,这个用法是论文中经常看到的 07++12,这种方法需提交到VOC官方服务器上评估结果,因为VOC2012 test没有公布。
- 先在 MS COCO 的 trainval 上预训练,再使用 VOC2007 的 train+val、 VOC2012的 train+val 微调训练,然后使用 VOC2007的test测试,这个用法是论文中经常看到的 07+12+COCO 。
- 先在 MS COCO 的 trainval 上预训练,再使用 VOC2007 的 train+val+test、 VOC2012的 train+val 微调训练,然后使用 VOC2012的test测试,这个用法是论文中经常看到的 07++12+COCO,需提交到VOC官方服务器上评估结果。
3 目标检测中常用技巧
3.1 常用评估指标
mAP(mean of Average Precision):平均精确度(average precision)的平均(mean),是目标检测中模型性能的衡量标准。方法是先获取各个类别的PR曲线下面积(经过插值),然后对所有类别求平均值。
FPS(frame/per second):每秒帧数,用于评估算法的速度。一个算法好,要么是它的mAP高,要么是它的mAP和FPS的trade off很好。
交并比(intersection over union, IOU):预测框和真值框交集的面积除以这两个矩形框并集的面积,取值为[0,1]。IOU度量了预测框和真值框的接近程度,IOU越大,两个矩形框的重叠程度越高。
3.2 NMS(Non-max Suppression)
目标检测可能会出现的一个问题是,模型会对同一目标做出多次预测,得到多个预测框。NMS旨在保留最接近真值框的那一个预测框,而抑制其他的预测框。NMS的做法是,首先,对每个类别,NMS先统计每个预测框属于该类别的概率值,并将预测结果按该概率由高至低排序。其次,NMS排除那些概率值小于一定阈值的预测框。然后,NMS在剩余的预测框中,找到对应概率最大的预测框,将其输出,并抑制和该预测框IOU大于一定阈值的预测框。重复上一步,直到所有的预测结果均被处理。
绝大部分目标检测方法,最后都要用到NMS进行后处理。但这种方法存在一点问题:如果NMS的阈值设计的过小,则容易删掉距离很近的不同目标;设计的过大,又容易增加重复检测框。为了解决这个问题,2017年一篇论文提出Soft-NMS的方法,思想是不要粗鲁地删除所有IOU大于阈值的框,而是降低其置信度。
3.3 锚框(Anchor Box)
锚框+边框回归的思想是目标检测中一种经典思想。即先使用预先定义大小和宽高比的矩形框(即锚框),将图像密密麻麻的铺满,然后判断各个锚框的类别,最后再利用边框回归对判断为目标的锚框进行位置修正。使用锚框的原因包括:(1)图像中的候选区域大小和宽高比不同,直接回归比对锚框坐标修正训练起来更困难。(2)特征图中像素对应的特征向量代表了对应感受野下的局部语义特征,每个特征向量可能包含了不止一个目标,使用多个锚框可以同时对感受野内出现的多个目标进行预测。(3)使用锚框也可以认为这是向神经网络引入先验知识的一种方式。我们可以根据数据中真值框通常出现的形状和大小设定一组锚框。锚框之间是独立的,不同的锚框对应不同的目标,比如人对应高瘦的锚框,而车辆对应矮胖的锚框。
3.4 边框回归(Bounding-box Regression)
边框回归是一个很重要的思想,当前大部分目标检测算法都需要用边框回归来校正预测框的准确位置。对于窗口一般使用四维向量(x,y,w,h)来表示,分别表示窗口的中心点坐标和宽高,但是我们不能直接回归这4个值,因为原图的尺寸和目标的尺寸都是不固定的;不同尺寸的目标特征向量应该是一样的,显然不能指望同一个特征向量能回归出不同的位置。因此需要对预测的形式做一个变换,即回归的是锚框的偏移量((t_x,t_y,t_w,t_h))。这篇博客讲的挺好。
3.5 FPN(Feature Pyramid Network)
目的:2016年提出,主要解决的是目标检测中的多尺度问题,通过简单的网络连接改变,在基本不增加原有模型计算量情况下,大幅度提升小物体检测的性能。
背景:在物体检测里面,随着网络深度的加深,通常stride也会不断的变大,当stride超过原图中小目标的尺寸后,小目标的检测性能会急剧下降。传统的目标检测方式通常都是在最后一个特征图上做预测,这样会对小目标检测不利。为了解决这个问题,通常有两种做法,一是利用图像金字塔,得到不同分辨率的图像,然后分别提取特征进行预测,缺点是计算量太大;二是类似SSD框架,直接从不同尺度的特征图上引出预测器,来得到不同分辨率的语义信息,缺点是靠前面的特征图虽然分辨率较高,但是高级语义信息提取不充分,所以对小目标检测性能提升不明显。
结构:FPN直接在原来的单网络上做修改,整体结构中包括自下而上、自上而下和横向连接三个部分,每个分辨率的 feature map 经过1x1卷积后和后一分辨率缩放两倍的 feature map 做融合(这里是element-wise 相加)。通过这样的连接,每一层预测所用的 feature map 都融合了不同分辨率、不同语义强度的特征。
3.6 OHEM(Online Hard Example Mining)
目的:从训练过程着手,解决正负样本不平衡带来的问题。
背景:R-CNN在训练SVM分类器时使用了困难样本挖掘(hard negative mining)的思想,但Fast R-CNN和Faster R-CNN由于使用端到端的训练策略并没有使用困难样本挖掘(只是设置了正负样本的比例并随机抽取)。CVPR2016的Training Region-based Object Detectors with Online Hard Example Mining(oral)将困难样本挖掘(hard example mining)机制嵌入到SGD算法中,使得Fast R-CNN在训练的过程中根据损失大小自动选取合适的候选框(region proposal)作为正负例训练。实验结果表明使用OHEM(Online Hard Example Mining)机制可以使得Fast R-CNN算法在VOC2007和VOC2012上mAP提高4%左右。
方法:选择一些困难样本作为训练的样本从而改善网络参数效果。OHEM论文中将负样本按照loss大小排序,选择较大loss的样本来回传梯度,同时考虑到重叠情况,使用了NMS。值得注意的是,有些模型略有区别,没有使用NMS,比如SSD中使用的OHEM就是按照正负样本1:3的比例,来选取loss最大的负样本,没有做NMS。
3.7 Focal Loss
目的:2017年提出,从损失函数着手,解决正负样本不平衡带来的问题。
背景:
- 作者认为one-stage和two-stage的表现差异主要原因是大量前景背景类别不平衡导致,于是设计了focal loss,并通过ResNet+FPN+FL设计了一个网络结构RetinaNet来验证效果。
- 不平衡是目标检测中常见的一个大问题,类别不平衡导致:正样本的损失被淹没在负样本的损失里面,导致其没有太多话语权;带来困难容易样本不均衡问题;
- 常规解决不平衡问题:调整正负样本权重、过采样和欠采样、OHEM(只保留loss高的样本,忽略简单样本);(要么简单粗暴、要么太复杂丑陋,而FL就比较优雅)
- two-stage能解决类别平衡的原因:RPN阶段可以滤掉大部分背景样本(只留下一两千);第二阶段可以用采样控制正负样本1:3,或者OHEM来选出困难样本。虽然一段式也可以用采样或者困难样本挖掘的方法,但效果仍然不够。
要点:
- 伽马项用于调节困难样本和容易样本的权重,当概率值越大(说明样本越容易),则权重下降的越厉害;伽马值越大,这种压缩权重的影响越大;
- (alpha_t)用于调节正负样本的权重。在二分类情况下,正样本的(alpha_t=alpha),负样本的(alpha_t=1-alpha);在多元分类情况下,将(alpha_t)设置为一个列表,表明各个类别的权重。
4 目标检测经典算法
当前目标检测算法主要有两个分支,两段式检测算法和一段式检测算法,下面依次介绍。
由于资料中候选框和RoI(Region of Interest)这两个概念的使用比较混乱,为避免混淆,本文中候选框(region proposal)特指原图像中的候选框,RoI特指候选框对应特征图上的特征区域。
4.1 两段式检测算法
两段式检测算法也称为基于区域(Region-based)的方法,主要思想是先选出一部分包含目标可能性较大的候选框,然后再做进一步的分类和边框回归,过程分为两个阶段,因此叫两段式。典型代表有R-CNN,SPP,Fast R-CNN,Faster R-CNN,R-FCN,Mask R-CNN,这些刚好也是按照时间顺序,在前人基础上一步一步发展起来的。
4.1.1 R-CNN
2013年由rbg提出,是利用卷积神经网络来做目标检测的开山之作,意义重大。
检测过程:
- 输入测试图像,利用选择性搜索Selective Search算法在图像中提取2000个左右的可能包含物体的候选框;
- 因为取出的候选框大小各不相同,所以需要将每个候选框缩放(warp)成统一的227x227的大小并输入到CNN,将CNN的fc7层的输出作为提取到的特征;
- 将每个候选框提取到的CNN特征输入到SVM进行分类;
- 对那些识别出目标的特征向量,送到边框回归器中校正窗口,生成预测窗口坐标。
训练过程:
- 步骤一,训练CNN:首先下载(或者训练)一个分类模型(比如AlexNet);然后对模型进行微调,即将分类数从1000改为20,比如20个物体类别 + 1个背景,训练完之后去掉最后一个全连接层。
- 步骤二,提取特征:提取图像的所有候选框(选择性搜索Selective Search);针对每一个区域,将每个候选框缩放(warp)后输入到CNN,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘。
- 步骤三,训练分类器:针对每一个类别,训练一个SVM分类器(二分类),是就是positive,反之nagative。
- 步骤四,训练边框回归器:针对每一个类别,训练一个对应的边框回归器。
注意:
- 针对每一个类别,都有一个SVM分类器,采用OVR方法完成多类别的分类;(林轩田老师在机器学习基石课上说这种方法不好,因为采用硬分类器的OVR会导致有些样本无法归类,或者被归为不同的类,所以应该用软分类LR)(个人理解:此处用SVM分类器,可能是图像特征空间维度特别大,所以各类别的特征之间离得很远,故不需担心这种问题)
R-CNN缺点:
- 训练分为多个阶段,需要微调网络+训练SVM+训练边框回归器,步骤繁琐:
- Selective Search选出来的候选框大小不一,都要经过缩放之后再提取特征,会丢失一些信息;
- 每张原图约有2000张候选框,每个都要进行特征提取,导致大量的重复计算(很多候选区域重叠),一方面耗时(使用GPU,VGG16模型处理一张图像需要47s),另一方面提取出的特征占用大量磁盘空间(5000张图像产生几百G的特征文件)。
4.1.2 SPP-Net
2014年何恺明提出SPP-Net,解决了R-CNN中两个大问题:一是每个候选框都要送到CNN中提取特征;二是每个候选框都要缩放成固定大小。SPP-Net利用CNN,只提取一次图像的特征,将各个候选框的坐标映射到特征图上,从而直接得到各个候选框的特征区域(ROI),避免了R-CNN中对各个候选框重复地提取特征;使用空间金字塔池化,使得任意大小的ROI都能够转换成固定大小的特征向量。
检测过程:
- 第一步同R-CNN,利用Selective Search算法在图像中提取2000个左右的可能包含物体的候选框;
- 将原图输入ZF-5网络,提取出图像的特征(通道个数为256维);
- 利用stride映射方法,将各个候选框坐标直接映射到特征图上,从而得到各个候选框对应的ROI;
- 利用空间金字塔网络,将上一步得到的ROI转换成固定大小的输出(12800维);
- 将上一步得到的12800维向量接上fc6和fc7,之后去做分类和边框回归。
空间金字塔池化的具体过程:针对任意一张ROI,用一张6x6的格子模板将其切成36块;同理,继续用3x3、2x2、1x1的格子将其切分成不同尺度的块(总共可以切成50块),然后做最大池化,从而得到了50x256=12800维的特征向量。(上图为示意图,其中只有4x4、2x2、1x1的格子,因此输出的是21x256=5376维的特征向量)
如何将原图候选框映射到特征图上:在文章的附录A中直接给出了一个简单的计算公式,即对于top/left坐标 (x'= lfloor x/S rfloor + 1),对于bottom/right坐标 (x'= lceil x/S rceil - 1)。其中(x')表示特征图中的坐标,(x)表示原图中坐标,S表示stride,即下采样倍数。
4.1.3 Fast R-CNN
2015年rbg提出Fast R-CNN,吸收了SPP-Net中这两个巧妙的解决方案,并针对损失函数做了优化。Fast R-CNN和R-CNN相比,训练时间从84小时减少到9.5小时,测试时间从47秒减少到0.32秒,并且在PASCAL VOC 2007上测试的准确率相差无几,约在66%-67%之间。
针对R-CNN的主要改进点:
- 吸收SPP Net的思想,只对原图做一次特征提取,然后将选择出来的候选区域映射到特征图上,直接从特征图上得到ROI;
- 将VGG最后一层池化层换成ROI池化层(即单层SPP),可以将不同尺度的ROI转化为固定的尺寸,便于和后面全连接层对接;
- 将分类器由SVM换成softmax,将边框回归器的损失换成smooth L1损失,然后将两个损失函数合并成一个多任务损失函数(multi-task loss),将边框回归器和分类器放在一块训练,这样整个的训练过程是端到端的(除去Region Proposal提取阶段)。(smooth L1 loss让loss对于离群点更加鲁棒,即:相比于L2损失函数,其对离群点、异常值(outlier)不敏感,梯度变化相对更小,训练时不容易跑飞。)
4.1.4 Faster R-CNN
经过对R-CNN的改进,Fast R-CNN可以把处理一张图像的时间从47s降到0.32s(不包括提取候选框的时间),但Selective Search在原图像上提取候选框这一步的时间接近2s,所以整个检测环节的瓶颈就卡在这一步。于是,2015年任少卿等人提出Faster R-CNN,直接把Selective Search提取候选框这一步换成RPN(Region Proposal NetWork),即Faster R-CNN = RPN + Fast R-CNN。RPN(Region Proposal Networks)的结构很简单,只有两层卷积,利用一个分类器和一个边框回归器,直接从特征图上提取ROI,然后送到后面进一步细分。经过改进,Faster R-CNN将特征抽取(feature extraction)、ROI提取、边框回归、分类都整合在了一个网络中,把处理一张图像的时间从2s降到了0.2s(包括提取候选框的时间)。
RPN运行机制:
- 利用CNN(比如ZFNet、VGG16、ResNet)提取图像特征;
- 利用3x3卷积核对整张特征图进行卷积,得到尺寸不变的特征图,其中每个像素对应的256维特征向量代表了对应感受野的局部语义特征;每个像素点对应k个锚框,这里k=9,因此需要获得每个锚框的类别概率和偏移量;
- 对于每个256维特征向量,分别通过1x1卷积,得到2x9的分类结果和4x9的回归结果;
- 将RPN输出的前景和偏移量映射回原图,得到一堆的预测框,经过NMS和TopN处理后即可得到一堆的候选框;
- 将候选框坐标通过Fast R-CNN中stride映射的方式,map到整张特征图上,即可得到一堆候ROI。
注意:
- RPN中使用3x3进行卷积,卷积结果对应的感受野:ZFNet是171,VGG16是228;而Faster R-CNN实际使用了3组大小(128×128、256×256、512×512)、3组长宽比(1:1、1:2、2:1),共计9个锚框。换句话说,感受野大致和中等锚框的尺寸一致,但小于大锚框的尺寸,作者解释这样也是可行的。
- 基于ResNet101的Faster R-CNN,ROI池化层插在第四个卷积模块的输出后面,而非第五个,即利用第四个卷积模块的输出作为提取到的图像特征,所有的计算只共享前面91层(1+(3+4+23)x3=91)。
- 可参考RPN 解析,一文读懂Faster RCNN.
4.1.5 R-FCN
Faster R-CNN在ROI pooling之后,需要对每个ROI单独进行两分支预测,比如基于ResNet101时,所有的计算只共享前面91层卷积,而抠出来的各个ROI都不得不单独跑一遍后10层卷积。2016年微软戴季峰等人提出R-FCN,旨在使几乎所有的计算共享,以进一步加快速度。
主要思路:
- 对于region-based的检测方法,以Faster R-CNN为例,实际上是分成了几个subnetwork,第一个用来在整张图上做比较耗时的conv,这些操作与region无关,是计算共享的。第二个subnetwork是用来产生候选框(如RPN),第三个subnetwork用来分类或回归(如Fast RCNN),这个subnetwork和region是有关系的,必须每个region单独跑网络,衔接在这个subnetwork和前两个subnetwork中间的就是ROI pooling。我们希望的是,耗时的卷积都尽量移到前面共享的subnetwork上。
- 但是直接将ROI池化层放到ResNet101的第五个卷积模块后面会导致效果变差,因为网络太深,导致出来的特征图尺寸不够,难以携带足够的信息,特别是位置信息,于是设置一个位置敏感得分图,用来保留位置信息。
- 因此R-FCN的做法是,从conv4引出RPN获得ROI,再将ROI映射到得分图上,通过位置敏感ROI池化(position sensitive roi pooling)的方法获得ROI池化特征图。(Faster R-CNN是从conv4特征图上抠出ROI特征区域后,用普通ROI池化的方法得到ROI池化特征图的)
具体细节可参考源码。以k=7, C=20为例,假设ResNet的输出为100x100x2048,则数据流如下所示:
R-FCN的网络结构:
- 基础conv网络是ResNet101,将全局平均池化和fc层去掉,换成1x1的卷积层以减少通道数(由2048转成1024),即这101层卷积网络是共享的。
- 针对上一步中101层网络的输出,采用(k^2 * (C+1))个1x1卷积核来卷积,得到(k^2)组特征图,其中每组有C+1个通道(即总通道数为1029),即称为位置敏感得分图rfcn_cls,其宽高不变。另一条路径rfcn_bbox类似,输出通道数8x7x7=392。
- RPN从conv4的输出引出分类器和回归器,映射到原图上,得到一堆候选框。
- 将候选框映射到rfcn_cls上(实现时直接除以stride=16),并通过位置敏感ROI池化的方法,得到大小为7x7,通道数为21的ROI池化特征图,再经过全局平均池化和softmax之后输出分类结果;另一路类似,得到回归结果。
- 位置敏感ROI池化和Faster R-CNN中普通ROI池化不同,后者只需要把ROI切成7x7个格子,每个格子做最大池化即可,而前者将ROI切成7x7个格子后,每个格子取自不同的组,然后再做池化(如第一幅图中位置敏感池化后,特征图中每一个格子都对应不同的颜色,注意图中只是分类那一支,且取k=3)。
4.1.6 Mask R-CNN
2017年何恺明提出Mask R-CNN,综合了很多此前优秀的研究成果,可以同时进行目标检测和实例分割。简单而言,Mask R-CNN = ResNet + FPN + Faster R-CNN + Mask,并通过RoI Align和特殊的mask损失进一步提升性能。
模型细节:
- 沿用了Faster R-CNN的思想:即利用RPN获取候选框,再映射到特征图上抠出RoI,经过池化后得到固定大小的RoI,之后就送去做分类和回归。但Mask R-CNN在RoI之后又加了另一个Mask分支,用于做实例分割。即每个RoI在池化后有两路分支head:分类和回归head、mask head。
- Backbone有多种选择,比如ResNet50、ResNet101、ResNeXt50、ResNeXt101,用network-depth-features来表示,比如常用的ResNet-50-C4,表示采用的是ResNet50上第4个卷积模块的输出特征图;另外还可以选择带或者不带FPN,比如ResNeXt-101-FPN表示采用的是ResNeXt101上FPN输出的特征图。这里只以ResNet-101-FPN为例。
- ResNet-FPN的架构,是从P2、P3、P4、P5、P6特征图引出RPN,经过后处理得到一堆的候选框,然后针对每个候选框,从P2、P3、P4、P5这四个特征图上通过公式 (k = lfloor k_0 + log_2(frac{sqrt{wh}}{224}) rfloor) 选择一个特征图((k_0)通常选4),来抠出对应的RoI。
- 普通的RoI池化层在两个地方做了取整操作:一是将候选框映射到特征图上抠出RoI时,一是进行RoI池化时。这对目标检测任务影响不大,但由于mask分支是像素级别的预测,因此需要更精细的坐标对应。所以将普通RoI池化层换成RoI Align层,即在这两步中保留浮点数,在池化时采用双线性插值的方法获得固定大小的池化特征图。
- 上一步得到RoI池化特征图之后,分别送到两个分支,分类和回归分支仍然用Fast R-CNN,mask分支采用FCN的方式获得像素级别的mask模板,通道数为类别个数80,其中每一层的mask都代表了对应的类别概率。(注意这里的类别概率是各个像素上每一个类别进行sigmoid激活)
- 特殊的损失函数:FCN是对每个像素进行多类别softmax分类,然后计算交叉熵损失,而这里不同。区别1:mask分支输出的80层mask,并非是80个类别进行softmax激活,而是每一个类别进行sigmoid激活;区别2:对于每一个像素来说,计算损失时,并非是直接拿80个类别的概率来计算交叉熵损失,而是这个像素属于哪个类别,就拿那个类别对应的概率值来计算二值交叉熵。这样就避免了类间竞争,让其他类别不再贡献损失(如果用softmax计算交叉熵,则其他类别会间接贡献损失)。
- 下图是两种head配置,分别是利用ResNet-C4和ResNet-FPN的backbone。
4.2 一段式目标检测
一段式目标检测的算法主要代表是YOLO(v1/v2/v3)和SSD。由于图像只需前馈网络一次,速度通常更快,可以达到实时。
(这一段还在整理中...)
Reference:
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:计算机视觉中目标检测任务脉络梳理 - Python技术站