资讯详情

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

点击上面的计算机视觉车间,选择星标

第一时间送达干货

d508cfd6a7dbf623c78d4ccdf106f888.png

作者丨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模型完成集成。

开源地址:

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两个任务(目标分类和定位)通过设计的样本分配方案和任务对齐损失,在学习任务交互、任务特征和任务对齐学习之间提供了更好的平衡。

一般目标检测算法在高分辨率图像目标的高分辨率图像中表现不佳,导致小目标检测的具体方法。一些研究采用基于粒子群优化的方法(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图像宽度为8000~在1333像素之间获得增强图像.、,因此,相对目标大小大于原始图像。

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

3.2 Slicing Aided Hyper Inference(SAHI)

图3 Slicing Aided Hyper Inference(SAHI)

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

defslice_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:&nbp;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所示。

图4

5参考

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

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

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在

也可申请加入我们的细分方向交流群,目前主要有等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。也请联系。

▲长按加微信群或投稿

▲长按关注公众号

:针对3D视觉领域的五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

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

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

标签: jcs油压继电器参数

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台