国产亚洲精品AA片在线观看,丰满熟妇HD,亚洲成色www成人网站妖精,丁香五月天婷婷五月天男人天堂

博客專欄

EEPW首頁 > 博客 > 小目標(biāo)Trick | Detectron2、MMDetection、YOLOv5都通用的小目標(biāo)檢測解決方案

小目標(biāo)Trick | Detectron2、MMDetection、YOLOv5都通用的小目標(biāo)檢測解決方案

發(fā)布人:CV研究院 時間:2022-11-20 來源:工程師 發(fā)布文章
檢測小目標(biāo)和遠程目標(biāo)檢測是監(jiān)控應(yīng)用中的一個主要挑戰(zhàn)。這些物體由圖像中少量的像素表示,缺乏足夠的細節(jié),使得傳統(tǒng)的檢測器難以檢測。在這項工作中,提出了一個名為切片輔助超推理(SAHI)的開源框架,該框架為小目標(biāo)檢測提供了一個通用的切片輔助推理和微調(diào)管道。所提出的技術(shù)是通用的,因為它可以應(yīng)用在任何可用的目標(biāo)檢測器之上,而不需要進行任何微調(diào)。


00

圖片

前言

圖片

利用Visdrone和xView空中目標(biāo)檢測數(shù)據(jù)集上的目標(biāo)檢測Baseline的實驗評估表明,該推理方法可將FCOS、VFNet和TOOD檢測器的目標(biāo)檢測AP分別提高6.8%、5.1%和5.3%。此外,通過切片輔助微調(diào)可以進一步提高檢測精度,從而按相同的順序累計增加了12.7%、13.4%和14.5%的AP。

所提出的技術(shù)已與Detectron2、MMDetection和YOLOv5模型完成集成。

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

圖片sliced_inference

1簡介

近年來,目標(biāo)檢測在人臉檢測、視頻目標(biāo)檢測、視頻監(jiān)控、自動駕駛汽車等不同應(yīng)用領(lǐng)域得到了廣泛的研究。在這一領(lǐng)域,深度學(xué)習(xí)架構(gòu)的采用導(dǎo)致產(chǎn)生了高度精確的方法,如Faster R-CNN、RetinaNet,進一步發(fā)展為Cascade R-CNN、VarifocalNet和變體。

所有這些最近的檢測器都是在著名的數(shù)據(jù)集上進行訓(xùn)練和評估的,如ImageNet、PascalVOC12、MSCOCO。這些數(shù)據(jù)集大多涉及低分辨率圖像(640×480),包括相當(dāng)大的像素覆蓋的相當(dāng)大的目標(biāo)(平均覆蓋圖像高度的60%)。雖然訓(xùn)練后的模型對這些類型的輸入數(shù)據(jù)具有成功的檢測性能,但在高端無人機和監(jiān)視攝像機生成的高分辨率圖像中,它們對小目標(biāo)檢測任務(wù)的精度明顯較低。

圖片

無人機、4K攝像機和深度學(xué)習(xí)研究的最新進展使遠程目標(biāo)檢測成為可能,符合檢測、觀察、識別和DORI標(biāo)準(zhǔn)。DORI標(biāo)準(zhǔn)定義了不同任務(wù)對象的最小像素高度:10%的圖像高度需要檢測,20%的圖像需要識別物體(全高清視頻中的108像素)。相對較小的像素覆蓋推動了基于CNN的目標(biāo)檢測方法的局限性,此外,高分辨率圖像在計算和內(nèi)存需求方面需要更大的需求。

在本文中提出了一種基于切片輔助推理和微調(diào)的通用解決方案,用于高分辨率圖像上的小目標(biāo)檢測,同時保持較低的復(fù)雜度和內(nèi)存需求。圖1顯示了Visdrone測試集樣本圖像上小目標(biāo)檢測的改進。

2相關(guān)工作

最近的基于學(xué)習(xí)的目標(biāo)檢測技術(shù)可分為兩種主要類型。單級探測器,如SSD、YOLO、RetinaNet,直接預(yù)測物體的位置,而沒有一個明確的建議階段。兩階段區(qū)域建議的方法,如Fast R-CNN、Faster R-CNN、Cascade R-CNN,涉及區(qū)域建議階段。然后對這些建議框進行細化,以定義目標(biāo)的位置和大小。通常,單階段方法比兩階段方法更快,而后者具有更高的精度。

最近,Anchor-Free檢測器開始引起人們的注意。他們消除了Anchor box的使用,并將特征金字塔上的每個點分類為前景或背景,并直接預(yù)測從前景點到GT邊界框的距離,從而產(chǎn)生檢測。FCOS是第一個目標(biāo)檢測器,消除了預(yù)定義Anchor box集的需要,并需要計算需要。VarifocalNet(VFNet)學(xué)習(xí)預(yù)測IoU-aware classification score,它將目標(biāo)存在的置信度和定位精度混合在一起,作為一個邊界框的檢測分?jǐn)?shù)。學(xué)習(xí)是由基于一個新的星形邊界框特征表示所提出的Varifocal Loss(VFL)監(jiān)督的。TOOD以基于學(xué)習(xí)的方式將2個任務(wù)(目標(biāo)分類和定位)明確對齊,通過設(shè)計的樣本分配方案和任務(wù)對齊損失,在學(xué)習(xí)任務(wù)交互和任務(wù)特定特征和任務(wù)對齊學(xué)習(xí)之間提供了更好的平衡。

針對一般目標(biāo)檢測的算法在包含小而密集目標(biāo)的高分辨率圖像上表現(xiàn)不佳,導(dǎo)致了針對小目標(biāo)檢測的特定方法。有研究采用基于粒子群優(yōu)化(PSO)和細菌覓食優(yōu)化(BFO)的學(xué)習(xí)策略(PBLS)對分類器和損失函數(shù)進行優(yōu)化。然而,這些對原始模型的重大修改阻止了從預(yù)訓(xùn)練的權(quán)重進行微調(diào),需要從頭開始訓(xùn)練。

此外,由于不尋常的優(yōu)化步驟,它們很難適應(yīng)目前的檢測器。該方法對具有小目標(biāo)的圖像進行過采樣,并通過復(fù)制多個小目標(biāo)對其進行擴充。然而,這種增強需要分割注釋,因此,它與目標(biāo)檢測數(shù)據(jù)集不兼容。有方法可以從原始圖像中截取放大區(qū)域,從中學(xué)習(xí)到更豐富的小目標(biāo)特征。額外的特征對檢測性能有積極的貢獻,但要擴大的區(qū)域的選擇帶來了計算負擔(dān)。

也有研究提出了一種用于小目標(biāo)檢測的全卷積網(wǎng)絡(luò),該網(wǎng)絡(luò)包含了一種早期的視覺注意力機制,用來選擇最有希望的包含小目標(biāo)及其上下文的區(qū)域。還有研究提出了一種基于切片的技術(shù),但其實現(xiàn)并不通用,僅適用于特定的目標(biāo)檢測器。也有研究提出了一種新型的小型行人檢測網(wǎng)絡(luò)(JCS-Net),該網(wǎng)絡(luò)將分類任務(wù)和超分辨率任務(wù)整合在一個統(tǒng)一的框架中。

有學(xué)者提出了一種利用生成式對抗網(wǎng)絡(luò)(GAN)從模糊的小人臉直接生成清晰的高分辨率人臉的算法。然而,由于這些技術(shù)提出了新的檢測器體系結(jié)構(gòu),它們需要從頭開始用大型數(shù)據(jù)集進行預(yù)訓(xùn)練,這是昂貴的。

3本文方法

為了解決小目標(biāo)檢測問題,作者提出了一個在微調(diào)和推理階段基于切片的通用框架。將輸入圖像劃分為重疊的切片,對于小目標(biāo)相對于輸入網(wǎng)絡(luò)的圖像產(chǎn)生相對較大的像素區(qū)域。

3.1 Slicing Aided Fine-tuning(SF)

圖片圖2 Slicing Aided Fine-tuning(SF)

廣泛使用的目標(biāo)檢測框架,如Detectron2、MMDetection和YOLOv5,在ImageNet和MSCOCO等數(shù)據(jù)集上提供預(yù)訓(xùn)練的權(quán)重。這允許使用更小的數(shù)據(jù)集和更短的訓(xùn)練跨度來對模型進行微調(diào),而不是使用大數(shù)據(jù)集從頭開始進行訓(xùn)練。

這些常見的數(shù)據(jù)集大多涉及低分辨率的圖像(640×480),它們具有相當(dāng)大的目標(biāo)和較大的像素覆蓋(平均覆蓋圖像高度的60%)。使用這些數(shù)據(jù)集進行預(yù)訓(xùn)練的模型為相似的輸入提供了非常成功的檢測性能。另一方面,在由高端無人機和監(jiān)視攝像頭生成的高分辨率圖像中,它們對小目標(biāo)檢測任務(wù)的精度明顯較低。

為了克服這個問題,作者通過從圖像微調(diào)數(shù)據(jù)集中提取patch來增強數(shù)據(jù)集,如圖2所示。每幅圖像、...、被分割成重疊的patch 、、…在預(yù)定義范圍內(nèi)選擇N和N的被視為超參數(shù)。然后在微調(diào)過程中,通過保留高寬比來調(diào)整patch的大小,使圖像寬度在800~1333像素之間,以獲得增強圖像、、...、,因此相對的目標(biāo)大小比原始圖像更大。

這些圖像、...、,以及原始圖像、、...、(便于檢測大物體),在微調(diào)過程中被利用。需要注意的是,隨著patch size的減小,較大的物體可能不適合一個切片和交叉區(qū)域,這可能導(dǎo)致對較大物體的檢測性能較差。

3.2 Slicing Aided Hyper Inference(SAHI)

圖片圖3 Slicing Aided Hyper Inference(SAHI)

在推理步驟中也使用了切片方法,如圖3所示。首先,將原始查詢圖像I分割成1個M×N個重疊的patch 、、……。然后,在保持高寬比的同時,調(diào)整每個patch的大小。然后,對每個重疊的patch都獨立地應(yīng)用目標(biāo)檢測正向傳遞。使用原始圖像的一個可選的全推理(FI)可以用于檢測較大的目標(biāo)。最后,重疊的預(yù)測結(jié)果,如果使用,F(xiàn)I結(jié)果使用NMS合并回原始大小。在NMS過程中,具有比預(yù)定義匹配閾值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實驗結(jié)果

本文采用了MS COCO評估協(xié)議進行評估,包括總體和尺寸方面的AP50評分。具體來說,AP50在所有類別的單個IoU閾值0.5處計算,最大檢測數(shù)設(shè)置為500。

在表1和表2對原始圖像的常規(guī)推理中,以FI(Full inference)作為Baseline。SF(切片輔助微調(diào))是在表1和表2中patch大小分別為480-640和300-500的增強數(shù)據(jù)集上進行微調(diào)的模型。

SAHI(切片輔助Hyper Inference)是指表1和表2中patch大小分別為640×640和400×400的推理。OP(Overlap Patch)表示切片推理過程中Patch之間有25%的重疊。

圖片表1

從表1可以看出,SAHI使目標(biāo)檢測AP分別提高了6.8%、5.1%和5.3%。SF可進一步提高檢測精度,F(xiàn)COS、VFNet和tod檢測器的累計AP分別提高12.7%、13.4%和14.5%。在推理過程中,應(yīng)用切片間25%的重疊,會增加小/中物體AP和整體AP,但略微降低大物體AP。增加是由切片預(yù)測的額外小目標(biāo)真陽性引起,減少是由匹配大GT框的切片預(yù)測的假陽性引起。小目標(biāo)檢測AP以SF最佳,SI次之,大目標(biāo)檢測AP以SF最佳,F(xiàn)I次之,證實了FI對大目標(biāo)檢測的貢獻。

圖片表2

xView數(shù)據(jù)集的結(jié)果如表2所示。由于xView目標(biāo)非常小,經(jīng)常使用原始圖像進行訓(xùn)練,檢測性能較差,SF大大提高了結(jié)果。FI的集成使大目標(biāo)AP增加了3.0%,但導(dǎo)致小型/中型目標(biāo)AP略有下降,這是預(yù)期的,因為一些較大的目標(biāo)可能無法從較小的切片中檢測到。切片間25%的重疊可以增加2.9%的檢測AP。

圖片圖3

xView包含高度不平衡的60個目標(biāo)類別,盡管FCOS是一個較老的,據(jù)說較弱的檢測器,但對于這個數(shù)據(jù)集,F(xiàn)COS比VFNet有更好的性能。這一觀察結(jié)果證實了FCOS中Focal Loss的有效性,該方法旨在處理類別失衡。TOOD在訓(xùn)練過程中也受益于Focal Loss,在3種檢測器中檢測效果最好。tod檢測器在Visdrone和xView數(shù)據(jù)集上的誤差分析結(jié)果分別如圖3和圖4所示。

圖片圖4

5參考

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


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉