当前位置: 首页 > 科技观察

1.8M超轻目标检测模型NanoDet跑得比YOLO还快

时间:2023-03-13 06:34:27 科技观察

本文经AI新媒体量子比特(公众号ID:QbitAI)授权转载,转载请联系出处。如何将anchor-free模型移植到移动或嵌入式设备上?本项目对单级检测模型(Head、Neck、Backbone)三个模块进行了轻量化,得到模型尺寸仅为1.8m、速度超快的轻量化模型NanoDet-m。目标检测一直是计算机视觉领域的一大难题。它的目标是找到图像中所有感兴趣的区域,并确定这些区域的位置和类别。目标检测中的深度学习方法已经发展多年,出现了不同类型的检测方法。目前,深度学习目标检测方法主要分为两类,即两阶段和单阶段目标检测算法。两阶段目标检测框架首先生成候选区域,然后将它们分类到不同的目标类别中。代表模型有R-CNN、FastR-CNN等;单阶段目标检测框架将目标检测任务视为一个统一的端到端回归问题,代表模型有MultiBox、YOLO、SSD等,此类框架通常结构更简单,检测速度更快。深度学习目标检测方法也可以分为两类:Anchor-base和Anchor-free。今年开始出现了使用Transformer进行目标检测的尝试,各种方法百花齐放。但在移动目标检测算法方面,YOLO系列、SSD等Anchor-base模型一直占据主导地位。最近GitHub上出现了一个项目nanodet,开源了一个移动端实时Anchor-free检测模型,希望能提供不亚于YOLO系列的性能,同时也方便训练和移植。项目上线仅两天,Star数就突破了200。项目地址:https://github.com/RangiLyu/nanodetNanoDet模型介绍NanoDet是一款超快、轻量级的移动端Anchor-free目标检测模型.该模型具有以下优点:超轻量级:模型文件大小仅为1.8m;超快:在移动ARMCPU上为97fps(10.23ms);训练友好:GPU内存成本远低于其他模型。GTX10606G上的Batch-size为80;易于部署:提供基于ncnn推理框架的C++实现和Androiddemo。模型性能目前开源的NanoDet-m模型输入分辨率为320x320,整个模型的Flops只有0.72B,而yolov4-tiny有6.96B,小了近十倍。模型参数大小仅为0.95M,使用ncnn优化16位存储后权重文件仅为1.8MB。虽然该机型非常轻巧,但其性能却不容小觑。与其他模型对比时,项目作者选择使用COCOmAP(0.5:0.95)作为评价指标,考虑到检测和定位的准确性,在COCOval5000张图片上进行测试,没有使用Testing-Time-Augmentation.在此设置下,320分辨率输入可达到20.6mAP,比tiny-yolov3高出4个百分点,仅比yolov4-tiny低1个百分点。当保持输入分辨率与YOLO一致时,两者都使用416个输入,NanoDet得分与yolov4-tiny相当。具体结果如下表所示:以上性能基于ncnn和Kirin980(4xA76+4xA55)ARMCPU。另外,项目作者将ncnn部署到手机(ARM架构CPU麒麟980,4个A76核,4个A55核)后跑了一个benchmark。模型的正向计算时间只有10毫秒左右,而yolov3和v4tiny都在30毫秒量级。在安卓相机demoapp上,NanoDet可以轻松跑到40+FPS,包括图像预处理、检测框后处理、检测框绘制的时间。NanoDet和yolov4-tiny的性能比较。最后,该项目提供了一个Androiddemo、一个C++demo和一个Pythondemo。NanoDet在Android端的目标检测结果如下:NanoDet方法NanoDet是一个FCOS风格的单阶段anchor-free目标检测模型,使用ATSS进行目标采样,使用GeneralizedFocalLoss损失函数进行分类和分类框回归(boxregression)。).据项目作者介绍,该项目的主要目的是开源一个移动端实时Anchor-free检测模型,可以提供不亚于YOLO系列的性能,并且方便训练和移植。为此,他参考了以下研究:NanoDet模型的最终结构如下:损失函数项目的作者想实现一个FCOS风格的anchor-free目标检测模型,但是在处理FCOS轻量级时,因为FCOS的centerness分支在轻量级模型上很难收敛,模型效果不如预期。最后,NanoDet使用了LiXiang等人提出的GeneralizedFocalLoss损失函数。该函数可以去除FCOS的Centerness分支,省去该分支上的大量卷积,从而减少检测头的计算开销,非常适合移动端的轻量化部署。Source:https://arxiv.org/pdf/2006.04388.pdfdetectionhead轻量化后找到合适的损失函数,如何让它在轻量化模型上工作?首先需要优化的是检测头。FCOS系列采用权值共享检测头,即对来自FPN的多尺度FeatureMap使用同一组卷积预测检测框,然后用一个可学习的Scale值作为每一层的系数对预测的进行缩放帧。图片来源:https://openaccess.thecvf.com/content_ICCV_2019/papers/Tian_FCOS_Fully_Convolutional_One-Stage_Object_Detection_ICCV_2019_paper.pdf这样做的好处是可以将检测头的参数数量减少到不共享状态的1/5权重。这对于单独检测头有数百个通道卷积的大型模型非常有用,但对于轻量级模型,共享权重检测头没有多大意义。由于移动端模型的推理是由CPU进行的,共享权重不会加快推理过程,而当检测头很轻时,共享权重会进一步降低检测能力,因此项目作者认为选择每个层特征使用一组卷积更合适。同时,FCOS系列在检测头上采用了GroupNormalization(GN)作为归一化方法。与BN(BatchNormalization)相比,GN有很多优点,但也有缺点:BN可以在推理时对其参数进行归一化处理,直接融合到卷积中,这一步计算可以省略,而GN不能。为了能够在归一化操作中节省时间,项目作者选择将GN替换为BN。FCOS的detectionhead使用了4个256通道的卷积作为一个分支,也就是说边界回归和分类分支上总共有8个c=256的卷积,计算量非常大。为了轻量化,项目作者首先选择用depthwiseseparableconvolution代替普通卷积,并将卷积栈的数量从4组减少到2组。在通道数方面,将256维压缩为96维。之所以选择96,是因为通道数需要保持在8或16的倍数,才能享受到大部分推理框架的并行加速。最后,项目作者借鉴了YOLO系列,使用同组卷积计算边界回归和分类,然后拆分成两部分。得到的轻量级检测头如下图所示:FPNlayerimprovement目前对于FPN的改进有很多,比如EfficientDet使用BiFPN,YOLOv4和v5使用PAN,此外还有BalancedFPN等等。BiFPN虽然性能强大,但是堆叠的特征融合操作会降低运行速度,而PAN只有自顶向下和自底向上两条路径,非常简单,是轻量级模型特征融合的不错选择。原始的PAN和YOLO系列中的PAN都是使用stride=2的卷积将大尺度的FeatureMap缩放到小尺度。为了轻量,本项目选择完全去除PAN中的所有卷积,只保留主干网络提取特征后的1x1卷积,对齐特征通道维度。上采样和下采样都是使用插值完成的。.与YOLO使用的concatenate操作不同,项目作者选择直接加入多尺度FeatureMap,这样整个特征融合模块的计算量就变得很小。得到的极小版本PAN结构非常简单:NanoDet使用的超轻量级PAN(来源:https://zhuanlan.zhihu.com/p/306530300)骨干网项目作者选择使用ShuffleNetV21.0x作为骨干网络。去掉网络最后一层卷积,提取8、16、32倍下采样的特征,输入PAN进行多尺度特征融合。整个backbone模型使用了Torchvision提供的代码,可以直接加载Torchvision提供的imagenet预训练权重,大大有助于加快模型收敛。目前项目作者已经开源了Pytorch训练代码、基于NCNN的Linux和WindowsC++部署代码、Android摄像头demo,并在Readme中提供了详细教程,详见项目GitHub主页。