对象检测⽬标⼩⽤什么模型好_⼩⽬标检测技术分析
⼩⽬标检测技术分析
⼩⽬标检测及跟踪系统分为四个模块:
硬件模块
硬件模块
该模块基于标准PCI总线,并配以超⼤规模可编程芯⽚(DSP、FPGA),具有极强的运算、处理能⼒。
DSP 程序模块
DSP 程序模块
其功能主要实现复杂背景下的⼩⽬标检测、跟踪。考虑到系统的实时性要求,复杂背景下的⼩⽬标检测采⽤红外能量积累技术。⾸先对红外图像进⾏增强;然后在对⼩⽬标进⾏粗检测;最后在视频序列上分割提取⼩⽬标。同时,采⽤预测技术对⽬标的可能位置和存在区域进⾏估计,以实现实时、准确跟踪(或记忆)⽬标。系统按照搜索、捕获、跟踪、记忆跟踪四个状态及其转换运⾏,以实现⼩⽬标的实时检测与跟踪。
驱动程序模块
驱动程序模块
其主要功能是实现硬件模块与上层应⽤程序进⾏数据通信与信息交互。系统采⽤了PCI 9054 Target ⽅式的单周期读/写;在图像数据传送的时候为了满⾜每秒25帧图像的实时传送和处理的要求,采⽤了PCI 9054的Scatter/Gather DMA⽅式的数据传输。在整个系统的信息交互中,采⽤了⼀次握⼿协议,也就是请求—应答协议。
上层应⽤程序模块
上层应⽤程序模块
该模块主要功能是向硬件模块下载DSP跟踪程序,启动/停⽌DSP,实时显⽰场景视频,对运动⽬标序列进⾏实时存储,对运动⽬标序列的基本特性进⾏实时分析和结果显⽰。
⽬标检测(object detection),就是在给定的⼀张图⽚中精确找到物体所在的位置,并标注出物体的类别。所以,⽬标检测要解决的问⽬标检测(object detection)
题就是物体在哪⾥以及是什么的整个流程问题。但是,在实际照⽚中,物体的尺⼨变化范围很⼤,摆放物体的⾓度、姿态、在图⽚中的位置都不⼀样,物体之间可能还有重叠现象,这使得⽬标检测的难度变得很⼤。
⽬标检测近些年取得了较⼤发展,主要原因就是卷积神经⽹络在⽬标检测任务的应⽤代替了原有的基于⼈⼯规则提取特征的⽅法。
传统的⽬标检测算法:
传统的⽬标检测算法:
Cascade + HOG/DPM + Haar/SVM以及上述⽅法的诸多改进、优化。
传统的⽬标检测中,多尺度形变部件模型DPM(Deformable Part Model)表现⽐较优秀,连续获得VOC(Visual Object
Class)2007到2009的检测冠军五香粉一般用在哪
,。DPM把物体看成了多个组成的部件(⽐如⼈脸的⿐⼦、嘴巴等),⽤部件间的关系来描述物体,这个特性⾮常符合⾃然界很多物体的⾮刚体特征。DPM可以看做是HOG+SVM的扩展,很好的继承了两者的优点,在⼈脸检测、⾏⼈检测等任务上取得了不错的效果,但是DPM相对复杂,检测速度也较慢,从⽽也出现了很多改进的⽅法。
但传统⽬标检测存在两个主要问题:⼀个是基于滑动窗⼝的区域选择策略没有针对性,时间复杂度⾼,窗⼝冗余;⼆是⼿⼯设计的特征对于多样性的变化并没有很好的鲁棒性。
基于深度学习的⽬标检测算法:
基于深度学习的⽬标检测算法:
o 以候选区域/框(Region Proposal) + 深度学习分类的算法:
通过提取候选区域,并对相应区域进⾏以深度学习⽅法为主的分类的⽅案,⽐如R-CNN(Selective Search + CNN + SVM)、SPP-
net(ROI Pooling)、Fast R-CNN(Selective Search + CNN + ROI)、Faster R-CNN(RPN + CNN + ROI)、Mask R-
CNN(Mask Prediction Branch+RPN + CNN + ROI)等。
o 基于深度学习的回归算法:
YOLO、SSD、YOLOv2、YOLOv3等算法
⽬前⽬标检测领域的深度学习⽅法主要分为两类:two stage 的⽬标检测算法;one stage 的⽬标检测算法。前者是先由算法⽣成⼀系列作为样本的候选框,再通过卷积神经⽹络进⾏样本分类;后者则不⽤产⽣候选框,直接将⽬标边框定位的问题转化为回归问题处理。正是由于两种⽅法的差异,在性能上也有不同,前者在检测准确率和定位精度上占优,后者在算法速度上占优。
⼩⽬标检测
⼩⽬标有两种定义⽅式,⼀种是相对尺⼨⼤⼩,如⽬标尺⼨的长宽是原图像尺⼨的0.1,即可认为是⼩⽬标,另外⼀种是绝对尺⼨的定义,即尺⼨⼩于32*32像素的⽬标即可认为是⼩⽬标。
⼩⽬标检测在深度学习卷积神经⽹络模型中⼀直是⼀个难题。早期的⽬标检测框架⼤多数是针对通⽤的⽬标来进⾏脚后跟疼怎么缓解
检测,如经典的单阶段⽅法yolo和ssd,两阶段⽅法faster-rcnn等,这些⽅法主要是针对通⽤⽬标数据集来设计的解决⽅案,因此对于图像中的⼩⽬标来说,检测效果不是很理想。
为了解决⼩⽬标问题提出的⽅法有:
图像的缩放。也是最琐碎的⼀个⽅向——是在检测前对图像进⾏缩放。但是,由于⼤图像变得太⼤,⽆法装⼊GPU进⾏训练,因此单纯的升级并不有效。ao等[2017]⾸先下采样图像,然后利⽤强化学习训练基于注意⼒的模型,动态搜索图像中感兴趣的区域。然后对选定的区域进⾏⾼分辨率的研究,并可⽤于预测较⼩的⽬标。这避免了对图像中每个像素进⾏同等关注分析的需要,节省了⼀些计算成本。⼀些论⽂[Dai等,2016b,2017年,Singh和Davis, 2018年]在⽬标检测上下⽂中训练时使⽤图像⾦字塔,⽽[Ren et al., 2017]在测试时使⽤。
浅⽹络。⼩物体更容易被接受场较⼩的探测器预测。较深的⽹络具有较⼤的接受域,容易丢失关于较粗层中较⼩对象的⼀些信息。Sommer等[2017b]提出了⼀种⾮常浅的⽹络,只有四个卷积层和三个完全连接的层,⽤于检测航空图像中的⽬标。当期望的实例类型很⼩时,这种类型的检测器⾮常有⽤。但是,如果预期的实例具有不同的⼤⼩,则效果更好上下⽂信息。利⽤围绕⼩对象实例的上下⽂。Gidaris和Komodakis [2015], Zhu等[2015b]使⽤上下⽂来提⾼性能,Chen等[2016a]则专门使⽤上下⽂来提⾼⼩对象的性能。他们使⽤上下⽂补丁对R-CNN进⾏了扩展,与区域建议⽹络⽣成的建议补丁并⾏。Zagoruyko等⼈[2016]将他们的⽅法与深度掩模对象建议相结合,使信息通过多条路径流动。
超分辨率。还有针对⼩⽬标的图像增强等。最典型的是利⽤⽣成对抗性⽹络选择性地提⾼⼩⽬标的分辨率。
它的⽣成器学会了将⼩对象的不佳表⽰增强为超分辨对象,这些超分辨对象与真实的⼤对象⾮常相似,⾜以欺骗竞争的鉴别器。
近两年提出了利⽤多层特征图的⽅法(特征⾦字塔、RNN思想、逐层预测),对⼩⽬标检测的效果产⽣了显著的提升。
现阶段主流算法有:
图像⾦字塔:较早提出对训练图⽚上采样出多尺度的图像⾦字塔。通过上采样能够加强⼩⽬标的细粒度特征,在理论上能够优化⼩⽬标检测的定位和识别效果。但基于图像⾦字塔训练卷积神经⽹络模型对计算机算⼒和内存都有⾮常⾼的要求。计算机硬件发展⾄今也难有胜任。故该⽅法在实际应⽤中极少。
逐层预测:该⽅法对于卷积神经⽹络的每层特征图输出进⾏⼀次预测,最后综合考量得出结果。同样,该⽅法也需要极⾼的硬件性能。
特征⾦字塔:参考多尺度特征图的特征信息,同时兼顾了较强的语义特征和位置特征。该⽅法的优势
在于,多尺度特征图是卷积神经⽹络中固有的过渡模块,堆叠多尺度特征图对于算法复杂度的增加微乎其微。
RNN思想:参考了RNN算法中的门限机制、长短期记忆等,同时记录多层次的特征信息(注:和特征⾦字塔有本质区别)。但RNN固有的缺陷是训练速度较慢(部分操作⽆法矩阵化)。
所谓的⼩⽬标,要看是绝对⼩⽬标(像素),和相对⼩⽬标(相对原图的长宽来看的)。⼤⽬标⼩⽬标只跟receptive field(感受野)有关,cnn本⾝可以检测任何尺度的物体。ssd对⼩⽬标检测不太适⽤,但R-FCN速度和鲁棒存在问题。
⼩⽬标分为很多种,背景单⼀还是⽐较好做冷冻猪肉
的。有⼀篇⼩⼈脸检测⽤的是 fullyconvolutionalnetwork(FCN) + ResNet ,此篇论⽂检测⼩⽬标⽤了其周边的信息,如头发,肩膀。
⾸先,⼩⽬标像素少特征不明显,因此和⼤⽬标相⽐,⼩⽬标的检测率低,这个⽤任何算法上都是⽆法避免的。那不同算法之间的⼩⽬标检测的区别呢?SSD,YOLO等单阶段多尺度算法,⼩⽬标检测需要较⾼的分辨率,SSD对于⾼分辨率的底层特征没有再利⽤,⽽这些层对于检测⼩⽬标很重要,因此主要在底部的特征层进⾏检测,⽐如SSD中的conv4_3,但底部特征层的语义信息不够如何清蒸大闸蟹
丰富,这是⼀个⽭盾,但卷积层加⾜够深的话影响其实没这么⼤。我觉得最重要的因素还是因为sc脚出汗多是什么原因怎么办
ale设置的不好
导致的,SSD中默认最低⼀层的anchor为
0.1~0.2,对于720p的图像最⼩检测尺⼨就有72个像素,还是太⼤了。事实上SSD的源码允许⼀个特征层做多个尺度的滑窗,将参数
min_sizes⾥的每个元素初始化为⼀个列表,就可以在相应特征层中⽣成不同尺度的anchor,如果你设计的⾜够仔细,基本就可以覆盖⾜够⼩的⽬标了,不过此时anchor的数量估计会涨不少,速度也会降下来。
faster rcnn,yolo,ssd对⼩⽬标检测结果都不好,原因在于卷积⽹络结构的最后⼀层feature map太⼩,例如32*32的⽬标经过vgg后变成2*2,导致之后的检测和回归⽆法满⾜要求。卷积⽹络越深语义信息越强,⽽越低层则是描述的局部外观信息越多,⽽且我想VGG16卷积层设计成这么多肯定是有意义的,如果靠前的效果好,VGG的研究者应该想到减少层数了,我觉得可以考虑提取多层的特征这样表达能⼒强些。⽐如样本猫狗图像,较⼩的猫的ground truth只是出现在底层,⾼层没有猫的ground truth,⽽较⼤物体狗匹配到的ground truth在⾼层feature map上),其他层的信息只是简单拼接(所以⼩物体检测的语义信息,contex信息差⼀些)。
SSD是多尺度的特征图进⾏paopasal提取,ssd相对于yolo来说对⼩⽬标更稳定。yolo则是通过全局特征去直接得到预测结果,完全要靠数据堆积起来,对待⼩⽬标我觉得要考虑减少pooling
SSD⾥负责检测⼩⽬标的层为conv4_3(38*38)对应的尺度为0.2(可⼈为设置)。这就对应了SSD所能检测的尺度⼤概为0.2上下。在这种情况下,如果物体过于⼩的话,甚⾄在训练阶段,GT都没法找到相应的的default box与它匹配,效果怎么可能会好。如果不介意整体检测效果的话,可以把尺度调低,看看对于⼩⽬标的检测效果是否有提升。另外,利⽤多尺度进⾏检测也能提⾼⼩物体的检测效果。
SSD使⽤的VGG16作为特征抽取,在conv4_3 feature map 的分辨率已经缩⼩了8倍,在conv5_3缩⼩了16倍,⽐如⼀个32*32⼤⼩的物体,在vgg16 的 conv5_3的feature map 对应仅为2*2,位置信息有较⼤的损失。有两种⽅法可决绝这个问题:1.使⽤不同层的特征,⽐如hyperNet,MultiPath。2.保证感受也不缩⼩的情况下feature map的分辨率不⾄于缩⼩太多,如采⽤DeepLab中采⽤的Hole algorithm,在保证感受野的同时分辨变化较⼩。
他们对⼩⽬标检测不好的原因主要是,SSD/YOLO 对原图做了缩放,因为感受野的原因,导致“相对尺⼨⼩”⽬标检测困难。如果说RCNN系列,并没有对原图进⾏缩放,但是如果”绝对尺⼨⼩“的话,也没有办法,因为到了⼀定深度的Feature map,⼩⽬标可能已经丢失respon了。1.⼩⽬标往往更依赖浅层特征,因为浅层特征有更⾼的分辨率,然⽽对语义区分较差。2.SSD检测和分类⼀起做,会把⼀些检测到但是分类模糊,分数不⾼的结果过滤掉。⽽rpn不会,前200个候选继续分类,都会有个结果。3.为了速度,本来是全卷积⽹络,却也固定了输⼊尺⼨,对⼤图的⼩⽬标影响很⼤。
⼀些⽐较好的观点
CNN特征的分辨率较差,这点不⽐其它low-level(浅层)的特征,证据就是在pedestrian detection(⾏⼈检测)上, ⼀些hand-crafted features(⼿⼯制作特征)的效果还是不错的;Faster-rcnn和SSD本⾝的问题,原始的Faster-rnn在RPN中将input的最短边固定resize 到600>SSD512>SSD300,SSD使⽤300和512的原因是为了提⾼detection speed,所以SSD才这样快;同时为保证精度,SSD才加上了multi-工会活动
scale和data augmentation(尤其值得注意这个augmentation,数据增强)。
yolo和ssd确实对⼩物体很⽆⼒,⽽有些普通的图像算法对⼩物体检测反⽽好的多,只是不太鲁棒。可以尝试下R-FCN,我测试了⼏张,好像对⼩物体还可以,但是速度慢些。在970下0.18s⼀张的样⼦。我之前在VGG16上做过R-FCN的实验,使⽤相同的res101-
proposal(只关注detection的效果所以使⽤的⼀样),效果不如fast rcnn。同理,在google-v1上(也是全卷积)也是不如,我估计是浅⽹络的overfitting问题(因为⽤VGG的proposal去做效果很不好)。
S柠檬下火吗
SD是⼀种基于全卷积的⽹络的检测器,⽤不同层检测不同⼤⼩的物体。这中间有个⽭盾,前⾯的 feature map⼤,但mantic(语义)不够,后⾯的matic够了,但经过太多的pooling,feature map太⼩了。要检测⼩物体,既需要⼀张⾜够⼤的feature map来提供更加精细的特征和做更加密集的采样,同时也需要⾜够的mantic meaning来与背景区分开。参会时问过SSD的作者,如果将最后的fe
ature map放⼤接上前⾯的话,是不是能够改善性能,作者说值得⼀试。
SSD is a class aware RPN with a lot of bells and whistles。每⼀个feature map上⾯的pixel对应⼏个an旋木吉他谱
chor,这个⽹络对anchor进⾏训练,以此驱动对feature进⾏训练。这是前⾔。作为⼩物体,其所对应的anchor⽐较少 (gt overlap > 0.5 的 anchor),也就是说对应feature map上的pixel难以得到充分训练。读者可以脑补每⼀个⼤的ROI可能覆盖很多 anchor,那么这些 anchor 均有机会得到训练。然⽽⼀个⼩物体并不能覆盖很多 anchor。没有得到充分训练有什么问题?在test的时候这个pixel的预测结果可能就是乱的,会极⼤⼲扰正常结果。为什么SSD的data augmentation能涨这么多点,就是因为通过randomly crop,让每⼀个anchor都得到充分训练(也就是
说,crop出⼀个⼩物体,在新图⾥⾯就变成⼤物体了)只能说这种without region propisal的结果 naturally 不擅长⼩物体。通过往上堆hack 才能慢慢⽐上吧。
我试过SSD最前⾯的卷积为深度残差⽹络,检测⼩物体效果还不错,⽐YOLO要好得多。另外SSD原论⽂中,多级别的物体基本尺⼨从0.1到0.8,实际上0.1的⽐例还是很⼤的,如1024*1024的输⼊,0.1都到102了,其实不⼩。可以根据需求调整级别,我使⽤的为
1/64~1,即不同级别格⼦本⾝⼤⼩。当然,级别从线性分割变成指数分割后,在基本⼤⼩之上的各个变形也需要调整⼀下(主要是变⼤),不然有可能覆盖不到有些位于两个格⼦中间的某些⼤⼩的物体。Y
OLO⽐较坑的地⽅在于倒数第⼆层为全连接,后⾯的7*7格⼦不能扩张太⼤,不然前⾯的全连接要爆。格⼦⼤了,同⼀个格⼦可能会包括多个⼩物体,检测就不好搞了。⽽YOLO全连接的作⽤⼜是整合全局信息,要去掉全连接,就需要增加最后点的感受野,所以深度残差就⾮常适合。提到深度残差,再说另外⼀点。在深度残差的作者kaiming⼤神另⼀篇⽂章R-FCN: Object Detection via Region戴诚
-bad Fully Convolutional Networks,中有使⽤空间pooling,发现深度残差就是天然的⾃带空间pooling效果的结构啊。补充⼀点,SSD前⾯的CNN结构,⼀定要是全对称的,特别是pooling的时候,这样最后输出点的感受野中⼼才与每个格⼦的中⼼是重合的。如果是⾮对称的,CNN前⾯特征提取的时候,它会纠结,造成⼤量的⼩物体不好学习。⽽YOLO最后有全连接都还好,问题不⼤。最后⼀句,深度残差就是⾃带空间pooling结构,这个怎么理解呢。深度残差中的最⼩单元,⼀边为两个卷积垒在⼀起,假设作⽤只是把图像平移,另⼀个为直连,那最后接合在⼀起,就是⼀个空间相关的组合了嘛。