点击上方“计算机视觉工坊”,选择“星标”

干货第一时间送达

作者丨ChaucerG

来源丨 集智书童

检测小目标和远程目标检测是监控应用中的一个主要挑战。这些物体由图像中少量的像素表示,缺乏足够的细节,使得传统的检测器难以检测。在这项工作中,提出了一个名为切片辅助超推理(SAHI)的开源框架,该框架为小目标检测提供了一个通用的切片辅助推理和微调管道。所提出的技术是通用的,因为它可以应用在任何可用的目标检测器之上,而不需要进行任何微调。

利用Visdrone和xView空中目标检测数据集上的目标检测Baseline的实验评估表明,该推理方法可将FCOS、VFNet和TOOD检测器的目标检测AP分别提高6.8%、5.1%和5.3%。此外,通过切片辅助微调可以进一步提高检测精度,从而按相同的顺序累计增加了12.7%、13.4%和14.5%的AP。

所提出的技术已与Detectron2、MMDetection和YOLOv5模型完成集成。

开源地址:https://github.com/obss/sahi

sliced_inference

1简介

近年来,目标检测在人脸检测、视频目标检测、视频监控、自动驾驶汽车等不同应用领域得到了广泛的研究。在这一领域,深度学习架构的采用导致产生了高度精确的方法,如Faster R-CNN、RetinaNet,进一步发展为Cascade R-CNN、VarifocalNet和变体。

所有这些最近的检测器都是在著名的数据集上进行训练和评估的,如ImageNet、PascalVOC12、MSCOCO。这些数据集大多涉及低分辨率图像(640×480),包括相当大的像素覆盖的相当大的目标(平均覆盖图像高度的60%)。虽然训练后的模型对这些类型的输入数据具有成功的检测性能,但在高端无人机和监视摄像机生成的高分辨率图像中,它们对小目标检测任务的精度明显较低。

无人机、4K摄像机和深度学习研究的最新进展使远程目标检测成为可能,符合检测、观察、识别和DORI标准。DORI标准定义了不同任务对象的最小像素高度:10%的图像高度需要检测,20%的图像需要识别物体(全高清视频中的108像素)。相对较小的像素覆盖推动了基于CNN的目标检测方法的局限性,此外,高分辨率图像在计算和内存需求方面需要更大的需求。

在本文中提出了一种基于切片辅助推理和微调的通用解决方案,用于高分辨率图像上的小目标检测,同时保持较低的复杂度和内存需求。图1显示了Visdrone测试集样本图像上小目标检测的改进。

2相关工作

最近的基于学习的目标检测技术可分为两种主要类型。单级探测器,如SSD、YOLO、RetinaNet,直接预测物体的位置,而没有一个明确的建议阶段。两阶段区域建议的方法,如Fast R-CNN、Faster R-CNN、Cascade R-CNN,涉及区域建议阶段。然后对这些建议框进行细化,以定义目标的位置和大小。通常,单阶段方法比两阶段方法更快,而后者具有更高的精度。

最近,Anchor-Free检测器开始引起人们的注意。他们消除了Anchor box的使用,并将特征金字塔上的每个点分类为前景或背景,并直接预测从前景点到GT边界框的距离,从而产生检测。FCOS是第一个目标检测器,消除了预定义Anchor box集的需要,并需要计算需要。VarifocalNet(VFNet)学习预测IoU-aware classification score,它将目标存在的置信度和定位精度混合在一起,作为一个边界框的检测分数。学习是由基于一个新的星形边界框特征表示所提出的Varifocal Loss(VFL)监督的。TOOD以基于学习的方式将2个任务(目标分类和定位)明确对齐,通过设计的样本分配方案和任务对齐损失,在学习任务交互和任务特定特征和任务对齐学习之间提供了更好的平衡。

针对一般目标检测的算法在包含小而密集目标的高分辨率图像上表现不佳,导致了针对小目标检测的特定方法。有研究采用基于粒子群优化(PSO)和细菌觅食优化(BFO)的学习策略(PBLS)对分类器和损失函数进行优化。然而,这些对原始模型的重大修改阻止了从预训练的权重进行微调,需要从头开始训练。

此外,由于不寻常的优化步骤,它们很难适应目前的检测器。该方法对具有小目标的图像进行过采样,并通过复制多个小目标对其进行扩充。然而,这种增强需要分割注释,因此,它与目标检测数据集不兼容。有方法可以从原始图像中截取放大区域,从中学习到更丰富的小目标特征。额外的特征对检测性能有积极的贡献,但要扩大的区域的选择带来了计算负担。

也有研究提出了一种用于小目标检测的全卷积网络,该网络包含了一种早期的视觉注意力机制,用来选择最有希望的包含小目标及其上下文的区域。还有研究提出了一种基于切片的技术,但其实现并不通用,仅适用于特定的目标检测器。也有研究提出了一种新型的小型行人检测网络(JCS-Net),该网络将分类任务和超分辨率任务整合在一个统一的框架中。

有学者提出了一种利用生成式对抗网络(GAN)从模糊的小人脸直接生成清晰的高分辨率人脸的算法。然而,由于这些技术提出了新的检测器体系结构,它们需要从头开始用大型数据集进行预训练,这是昂贵的。

3本文方法

为了解决小目标检测问题,作者提出了一个在微调和推理阶段基于切片的通用框架。将输入图像划分为重叠的切片,对于小目标相对于输入网络的图像产生相对较大的像素区域。

3.1 Slicing Aided Fine-tuning(SF)

图2 Slicing Aided Fine-tuning(SF)

广泛使用的目标检测框架,如Detectron2、MMDetection和YOLOv5,在ImageNet和MSCOCO等数据集上提供预训练的权重。这允许使用更小的数据集和更短的训练跨度来对模型进行微调,而不是使用大数据集从头开始进行训练。

这些常见的数据集大多涉及低分辨率的图像(640×480),它们具有相当大的目标和较大的像素覆盖(平均覆盖图像高度的60%)。使用这些数据集进行预训练的模型为相似的输入提供了非常成功的检测性能。另一方面,在由高端无人机和监视摄像头生成的高分辨率图像中,它们对小目标检测任务的精度明显较低。

为了克服这个问题,作者通过从图像微调数据集中提取patch来增强数据集,如图2所示。每幅图像、、...、被分割成重叠的patch 、、…在预定义范围和内选择N和N的被视为超参数。然后在微调过程中,通过保留高宽比来调整patch的大小,使图像宽度在800~1333像素之间,以获得增强图像、、...、,因此相对的目标大小比原始图像更大。

这些图像、、...、,以及原始图像、、...、(便于检测大物体),在微调过程中被利用。需要注意的是,随着patch size的减小,较大的物体可能不适合一个切片和交叉区域,这可能导致对较大物体的检测性能较差。

3.2 Slicing Aided Hyper Inference(SAHI)

图3 Slicing Aided Hyper Inference(SAHI)

在推理步骤中也使用了切片方法,如图3所示。首先,将原始查询图像I分割成1个M×N个重叠的patch 、、……。然后,在保持高宽比的同时,调整每个patch的大小。然后,对每个重叠的patch都独立地应用目标检测正向传递。使用原始图像的一个可选的全推理(FI)可以用于检测较大的目标。最后,重叠的预测结果,如果使用,FI结果使用NMS合并回原始大小。在NMS过程中,具有比预定义匹配阈值Tm的Union(IoU)比值更高的box被匹配,并且对于每个匹配,具有检测概率低于的检测被删除。

def slice_image(image: Union[str, Image.Image],coco_annotation_list: Optional[CocoAnnotation] = None,output_file_name: Optional[str] = None,output_dir: Optional[str] = None,slice_height: int = 512,slice_width: int = 512,overlap_height_ratio: float = 0.2,overlap_width_ratio: float = 0.2,min_area_ratio: float = 0.1,out_ext: Optional[str] = None,verbose: bool = False,
) -> SliceImageResult:# define verboseprintverboselog = logger.info if verbose else lambda *a, **k: Nonedef _export_single_slice(image: np.ndarray, output_dir: str, slice_file_name: str):image_pil = read_image_as_pil(image)slice_file_path = str(Path(output_dir) / slice_file_name)# export sliced imageimage_pil.save(slice_file_path)verboselog("sliced image path: " + slice_file_path)# create outdir if not presentif output_dir is not None:Path(output_dir).mkdir(parents=True, exist_ok=True)# read imageimage_pil = read_image_as_pil(image)verboselog("image.shape: " + str(image_pil.size))image_width, image_height = image_pil.sizeif not (image_width != 0 and image_height != 0):raise RuntimeError(f"invalid image size: {image_pil.size} for 'slice_image'.")slice_bboxes = get_slice_bboxes(image_height=image_height,image_width=image_width,slice_height=slice_height,slice_width=slice_width,overlap_height_ratio=overlap_height_ratio,overlap_width_ratio=overlap_width_ratio,)t0 = time.time()n_ims = 0# init images and annotations listssliced_image_result = SliceImageResult(original_image_size=[image_height, image_width], image_dir=output_dir)# iterate over slicesfor slice_bbox in slice_bboxes:n_ims += 1# extract imageimage_pil_slice = image_pil.crop(slice_bbox)# process annotations if coco_annotations is givenif coco_annotation_list is not None:sliced_coco_annotation_list = process_coco_annotations(coco_annotation_list, slice_bbox, min_area_ratio)# set image file suffixesslice_suffixes = "_".join(map(str, slice_bbox))if out_ext:suffix = out_extelse:try:suffix = Path(image_pil.filename).suffixexcept AttributeError:suffix = ".jpg"# set image file name and pathslice_file_name = f"{output_file_name}_{slice_suffixes}{suffix}"# create coco imageslice_width = slice_bbox[2] - slice_bbox[0]slice_height = slice_bbox[3] - slice_bbox[1]coco_image = CocoImage(file_name=slice_file_name, height=slice_height, width=slice_width)# append coco annotations (if present) to coco imageif coco_annotation_list:for coco_annotation in sliced_coco_annotation_list:coco_image.add_annotation(coco_annotation)# create sliced image and append to sliced_image_resultsliced_image = SlicedImage(image=np.asarray(image_pil_slice), coco_image=coco_image, starting_pixel=[slice_bbox[0], slice_bbox[1]],)sliced_image_result.add_sliced_image(sliced_image)# export slices if output directory is providedif output_file_name and output_dir:conc_exec = concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS)conc_exec.map(_export_single_slice, sliced_image_result.images, [output_dir] * len(sliced_image_result), sliced_image_result.filenames,)verboselog("Num slices: " + str(n_ims) + " slice_height: " + str(slice_height) + " slice_width: " + str(slice_width),)return sliced_image_result

4实验结果

本文采用了MS COCO评估协议进行评估,包括总体和尺寸方面的AP50评分。具体来说,AP50在所有类别的单个IoU阈值0.5处计算,最大检测数设置为500。

在表1和表2对原始图像的常规推理中,以FI(Full inference)作为Baseline。SF(切片辅助微调)是在表1和表2中patch大小分别为480-640和300-500的增强数据集上进行微调的模型。

SAHI(切片辅助Hyper Inference)是指表1和表2中patch大小分别为640×640和400×400的推理。OP(Overlap Patch)表示切片推理过程中Patch之间有25%的重叠。

表1

从表1可以看出,SAHI使目标检测AP分别提高了6.8%、5.1%和5.3%。SF可进一步提高检测精度,FCOS、VFNet和tod检测器的累计AP分别提高12.7%、13.4%和14.5%。在推理过程中,应用切片间25%的重叠,会增加小/中物体AP和整体AP,但略微降低大物体AP。增加是由切片预测的额外小目标真阳性引起,减少是由匹配大GT框的切片预测的假阳性引起。小目标检测AP以SF最佳,SI次之,大目标检测AP以SF最佳,FI次之,证实了FI对大目标检测的贡献。

表2

xView数据集的结果如表2所示。由于xView目标非常小,经常使用原始图像进行训练,检测性能较差,SF大大提高了结果。FI的集成使大目标AP增加了3.0%,但导致小型/中型目标AP略有下降,这是预期的,因为一些较大的目标可能无法从较小的切片中检测到。切片间25%的重叠可以增加2.9%的检测AP。

图3

xView包含高度不平衡的60个目标类别,尽管FCOS是一个较老的,据说较弱的检测器,但对于这个数据集,FCOS比VFNet有更好的性能。这一观察结果证实了FCOS中Focal Loss的有效性,该方法旨在处理类别失衡。TOOD在训练过程中也受益于Focal Loss,在3种检测器中检测效果最好。tod检测器在Visdrone和xView数据集上的误差分析结果分别如图3和图4所示。

图4

5参考

[1].SLICING AIDED HYPER INFERENCE AND FINE-TUNING FOR SMALL OBJECT DETECTION

本文仅做学术分享,如有侵权,请联系删文。

重磅!计算机视觉工坊-学习交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~

小目标Trick | Detectron2、MMDetection、YOLOv5都通用的小目标检测解决方案相关推荐

  1. 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔, 再过一个月就能生下一对小兔,并且此后每个月都生一对小

    public static void main(String[] args) {System.out.println(getCount(30));}//输入一个月份,返回这个月对应的兔子的对数publ ...

  2. 学Python真的可以无所欲为,连对门小姐姐的家wifi密码都可以破解

    明人不说暗话,我看上我家对面的那个小姐姐很久了,就是不知道怎么去搭讪,有一天链接wifi的时候,突然想着,小姐姐,小姐姐,我给你变个魔术,你信不信我知道你家的wifi密码,如果我猜对了,你就给我你的微 ...

  3. 给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)

    先贴代码 #include<stdio.h> #include <stdlib.h> #define N 10 int main(void){int p[10];char *s ...

  4. 使用YOLOv5实现多路摄像头实时目标检测

    文章目录 前言 一.YOLOV5的强大之处 二.YOLOV5部署多路摄像头的web应用 1.多路摄像头读取 2.模型封装 3.Flask后端处理 4.前端展示 总结 前言 YOLOV5模型从发布到现在 ...

  5. 目标检测论文解读复现之五:改进YOLOv5的SAR图像舰船目标检测

    目标检测论文解读复现 文章目录 目标检测论文解读复现 前言 一.摘要 二.网络模型及核心创新点 三.应用数据集 四.实验效果(部分展示) 五.实验结论 六.投稿期刊介绍 前言 此前出了目标改进算法专栏 ...

  6. Android手机充电器通用吗,安卓手机充电器是否都通用? 你的手机是否支持快充? 电池怎么鼓包了...

    原标题:安卓手机充电器是否都通用? 你的手机是否支持快充? 电池怎么鼓包了 1.安卓手机充电器是否通用 早在2007年的时候,欧盟就已经把手机充电接口的定为Micro-USB.从那时起,越来越多的手机 ...

  7. 神经网络学习小记录50——Pytorch 利用efficientnet系列模型搭建yolov3目标检测平台

    神经网络学习小记录50--Pytorch 利用efficientnet系列模型搭建yolov3目标检测平台 学习前言 什么是EfficientNet模型 源码下载 EfficientNet模型的实现思 ...

  8. 神经网络学习小记录26——Keras 利用efficientnet系列模型搭建yolov3目标检测平台

    神经网络学习小记录26--Keras 利用efficientnet系列模型搭建efficientnet-yolov3目标检测平台 学习前言 什么是EfficientNet模型 源码下载 Efficie ...

  9. YOLOv5在android端实现目标检测+跟踪+越界识别并报警

    YOLOv5在android端实现目标检测+跟踪+越界识别并报警 想要获取源码和相关资料说明的可以关注我的微信公众号:雨中算法屋, 后台回复越界识别即可获取,有问题也可以关注公众号加我微信联系我,相互 ...

  10. Effective Java:对于全部对象都通用的方法

    前言: 读这本书第1条规则的时候就感觉到这是一本非常好的书.可以把我们的Java功底提升一个档次,我还是比較推荐的.这里我主要就关于覆盖equals.hashCode和toString方法来做一个笔记 ...

最新文章

  1. HTTP中Accept与Content-Type区别
  2. MYSQL使用的时候遇到的一些问题
  3. 八款常用的 Python GUI 开发框架推荐
  4. Nginx+Lua(OpenResty) HelloWorld
  5. K8s遇到问题解决思路
  6. 4n35光耦引脚图_光耦继电器的主要特点以及输入特性!先进光半导体
  7. charles请求入参中有乱码
  8. 颜色模型和颜色应用---颜色选择及其应用
  9. ClickHouse到底有什么本事呢?互联网公司如此追捧
  10. 程序员不会SQL有多难?高级工程师:可能工作都找不到!
  11. 伏安特性曲线实验报告_【鼎阳硬件智库原创 | 测试测量】动手测量电解电容器的阻抗频率特性...
  12. 格式化输出%与format
  13. 总有被遗忘或者没有及时跟进的工作
  14. Python金融大数据分析——第11章 统计学(2)投资组合优化 笔记
  15. win7系统文件夹共享后有锁图标怎么去掉?
  16. 浅谈 GO 语言错误处理
  17. vmware虚拟机更改MAC地址方法
  18. copy() 与 clone() 的区别
  19. 2016计算机考研大纲视频,2016计算机考研大纲介绍:
  20. linux根文件系统配置,Linux学习笔记__ Linux根文件系统详解

热门文章

  1. 测试:第二章 测试过程
  2. Atitit 衡量项目的规模
  3. hdu 4619 Warm up 2 (二分匹配)
  4. 用Visual C#调用Windows API函数
  5. JSTL—fn使用方法总结
  6. Struts与Hibernate整合完成一个小案例
  7. 全国计算机三级数据库技术选择题,全国计算机三级数据库技术备考练习题
  8. 如何获取html输入框的值,jQuery如何获取各种input输入框的值
  9. python findall_Python 正则表达式:findall
  10. 服务器文件夹变成自读,服务器终端改文件读写权限