小目标检测 改进 拆分拼接

2023-11-07

小目标Trick

论文链接:

https://paperswithcode.com/paper/slicing-aided-hyper-inference-and-fine-tuning

代码链接:https://github.com/obss/sahi

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

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

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

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\timesN个重叠的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 verboseprint  

    verboselog = logger.info if verbose else lambda *a, **k: None  

    def _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 image  
        image_pil.save(slice_file_path)  
        verboselog("sliced image path: " + slice_file_path)  
      
    # create outdir if not present  
    if output_dir is not None:  
        Path(output_dir).mkdir(parents=True, exist_ok=True)  
      
    # read image  
    image_pil = read_image_as_pil(image)  
    verboselog("image.shape: " + str(image_pil.size))  
      
    image_width, image_height = image_pil.size  
    if 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 lists  
    sliced_image_result = SliceImageResult(original_image_size=[image_height, image_width], image_dir=output_dir)  
      
    # iterate over slices  
    for slice_bbox in slice_bboxes:  
        n_ims += 1  
      
        # extract image  
        image_pil_slice = image_pil.crop(slice_bbox)  
      
        # process annotations if coco_annotations is given  
        if coco_annotation_list is not None:  
            sliced_coco_annotation_list = process_coco_annotations(coco_annotation_list, slice_bbox, min_area_ratio)  
      
        # set image file suffixes  
        slice_suffixes = "_".join(map(str, slice_bbox))  
        if out_ext:  
            suffix = out_ext  
        else:  
            try:  
                suffix = Path(image_pil.filename).suffix  
            except AttributeError:  
                suffix = ".jpg"  
      
        # set image file name and path  
        slice_file_name = f"{output_file_name}_{slice_suffixes}{suffix}"  
      
        # create coco image  
        slice_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 image  
        if 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_result  
        sliced_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 provided  
    if 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所示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小目标检测 改进 拆分拼接 的相关文章

随机推荐

  • MySQL主从复制详解

    文章目录 1 简介 1 1 应用场景 1 2 复制形式 2 复制原理 3 复制类型 3 1 异步复制 3 2 同步复制 3 3 半同步复制 4 复制方式 4 1 语句复制 Statement格式 4 2 行数据复制 Row格式 4 3 混合
  • 3.Elasticsearch基础操作

    介绍ES的基本操作 如创建索引 mappings doc的一些基本操作 在doc操作中将分别介绍查询单条数据和多条数据 通过DSL的方式和JAVA api的方式体现 3 1 索引操作 索引操作是一种很危险的操作 索引就像相当于关系型数据库的
  • 浅浅谈Canvas和SVG的区别

    1 Canvas Canvas 中文名称叫 画布 它是游戏中所有UI组件的 容器 一个场景中 可以允许多个Canvas对象的存在 还允许Canvas之间可以进行 嵌套 使用 需要注意的是 场景中的任何一个UI对象 都肯定是某个Canvas对
  • idea web项目中java程序的配置文件放在resources目录下,但是读取不到配置文件

    每个人遇到的情况可能不一样 这个问题困扰我一天多 最后才发现是用错了加载器 可能是同样的加载器调用的方法不一样作用也不一样吧 直接获取系统类加载器 当使用系统类加载器加载配置文件时报空指针异常 当时没考虑到加载器问题 一味的修改路径 绝对路
  • 层次分析法(附代码)

    层次分析法 The Analytic Hierarchy Process即AHP 是一种系统分析与决策的综合评价方法 其较合理地解决了定性问题定量化的处理过程 AHP的主要特点是通过建立递阶层次结构 把人类的判断转化到若干因素两两之间重要度
  • 最新服务器处理器天梯,服务器cpu天梯图2020 至强处理器天梯排名

    排名名称评分 1Intel Xeon Platinum 8173M 2 00GHz28 860 2Intel Xeon Gold 6154 3 00GHz27 722 3Intel Xeon Gold 6138 2 00GHz25 416
  • 判断环形链表及寻找入环口问题详解

    文章目录 一 判断环形链表 1 1 题目描述 1 2 题解详细思路与解答 二 找环形链表的入环点 2 1 题目描述 2 2 题解思路 2 2 1 为什么快指针每次走两步 慢指针走一步可以 2 2 2 快指针一次走3步 走4步 n步行吗 2
  • start.S文件分析

    S 显示源代码和反汇编代码 arm linux objdump S u boot arm linux objdump S u boot less 34800000 是这句代码的内存地址 是在Makefile中定义的 ea000014 将该汇
  • 错误:类 xxx 是公共的, 应在名为 xxx.java 的文件中声明

    此错误是因为类名和类文件名不一致造成的 我之前遇到是因为类名书写没有遵循驼峰规则 于是改了一下类名 但是类文件名没有改 启动项目时报错
  • Android Studio 之 Gradle与Project Structure详解

    http blog sina com cn s blog 77d5a0310102vhw1 html
  • 独角访谈

    1 序言 从比特币和区块链诞生的那天起 去中心化这个词就进入了大家的视野 技术极客们也纷纷开始研究这一开创性的技术及其应用 其中包括开发去中心化的数字货币交易所 然而这种交易所目前还未被大众熟知 原因有很多 比如大家目前还不够理解区块链技术
  • 时间控件里面禁选国家节假日期和双休,将其置灰

    继上篇文章 两个日期之间计算节假日 根据项目需要 对时间的选择进行约束 只能选择工作日 还是之前笨办法取到2018年和2019年的所有节假日 在计算属性中新增方法 判断是否是节假日 返回true和false 然后在时间控件中引用就可以了 看
  • 步道乐跑怎么刷次数_大事件

    别看了 没有方法 好好跑步锻炼身体才是硬道理 校会君很认真地建议大家好好跑步道乐跑哟 理由如下 没有看错 你的目标的确是80次 准备好了吗 再擦几次眼睛也没有用 女生的里程数确确实实是增加到了1 6公里 每天可以跑两次了 不过校会君觉得你应
  • Warning: Your Nexus 7 Tablet Is Not Actually a "Tablet" (But Here's How You Make It One)

    If the Nexus 7 wasn t your first Android tablet you may have noticed something different with the user interface when co
  • 将一个项目发布到Tomcat上并进行运行

    1 下载任意版本的Tomcat 我这里是9的版本 应该是当前我认为比较好用的一个版本了 有需要的话可以到公众号自取 微信公众号搜索 是短短吖 后台回复 Tomcat 即可 2 在webapp下部署一个项目Test 名字自选 英文即可 新建项
  • Python爬虫入门3:使用google浏览器获取网站访问的http信息

    前往老猿Python博客 https blog csdn net LaoYuanPython 一 开启开发者工具 为了简单处理 本次介绍的内容是基于网站已经登录的情况下去获取网页访问的http信息 首先需要使用谷歌浏览器登录指定网站 并访问
  • 分治法时间复杂度求解:主定理、代换法和递归树

    分治策略 分解 将原问题划分成形式相同的子问题 规模可以不等 对半或2 3对1 3的划分 解决 对于子问题的解决 很明显 采用的是递归求解的方式 如果子问题足够小了 就停止递归 直接求解 合并 将子问题的解合并成原问题的解 这里引出了一个如
  • error: DIV usage mismatch between xx and output

    使用NDK编译代码的时候 常常需要导入预编译库 然而使用预编译库的时候报错了 因为库文件是android源码编译出来或者是其他NDK版本产生的 库版本存在了不兼容的情况 这里明显看出DIV 函数不兼容 home u android ndk
  • 【ESP-Matter】matter协议学习笔记--以乐鑫方案为例

    matter协议学习笔记 以乐鑫方案为例 0 写在前边的话 1 matter 协议基本概念 2 设备间的本地自动化交互 2 1 同步控制的实例 2 2 异步通知 订阅 报告 3 桥接设备 4 thread 边界路由器 5 专业名词 0 写在
  • 小目标检测 改进 拆分拼接

    小目标Trick 论文链接 https paperswithcode com paper slicing aided hyper inference and fine tuning 代码链接 https github com obss sa