小目標Trick | Detectron2、MMDetection、YOLOv5都通用的小目標檢測解決方案

極市導讀
?檢測小目標和遠程目標檢測是監(jiān)控應用中的一個主要挑戰(zhàn)。這些物體由圖像中少量的像素表示,缺乏足夠的細節(jié),使得傳統(tǒng)的檢測器難以檢測。本文提出了一個名為切片輔助超推理(SAHI)的開源框架,該框架為小目標檢測提供了一個通用的切片輔助推理和微調(diào)管道。所提出的技術(shù)可以應用在任何可用的目標檢測器之上,而不需要進行任何微調(diào)。?>>加入極市CV技術(shù)交流群,走在計算機視覺的最前沿

論文鏈接:
https://paperswithcode.com/paper/slicing-aided-hyper-inference-and-fine-tuning
代碼鏈接:https://github.com/obss/sahi
檢測小目標和遠程目標檢測是監(jiān)控應用中的一個主要挑戰(zhàn)。這些物體由圖像中少量的像素表示,缺乏足夠的細節(jié),使得傳統(tǒng)的檢測器難以檢測。在這項工作中,提出了一個名為切片輔助超推理(SAHI)的開源框架,該框架為小目標檢測提供了一個通用的切片輔助推理和微調(diào)管道。所提出的技術(shù)是通用的,因為它可以應用在任何可用的目標檢測器之上,而不需要進行任何微調(diào)。
利用Visdrone和xView空中目標檢測數(shù)據(jù)集上的目標檢測Baseline的實驗評估表明,該推理方法可將FCOS、VFNet和TOOD檢測器的目標檢測AP分別提高6.8%、5.1%和5.3%。此外,通過切片輔助微調(diào)可以進一步提高檢測精度,從而按相同的順序累計增加了12.7%、13.4%和14.5%的AP。
所提出的技術(shù)已與Detectron2、MMDetection和YOLOv5模型完成集成。

1 簡介
近年來,目標檢測在人臉檢測、視頻目標檢測、視頻監(jiān)控、自動駕駛汽車等不同應用領(lǐng)域得到了廣泛的研究。在這一領(lǐng)域,深度學習架構(gòu)的采用導致產(chǎn)生了高度精確的方法,如Faster R-CNN、RetinaNet,進一步發(fā)展為Cascade R-CNN、VarifocalNet和變體。
所有這些最近的檢測器都是在著名的數(shù)據(jù)集上進行訓練和評估的,如ImageNet、PascalVOC12、MSCOCO。這些數(shù)據(jù)集大多涉及低分辨率圖像(640×480),包括相當大的像素覆蓋的相當大的目標(平均覆蓋圖像高度的60%)。雖然訓練后的模型對這些類型的輸入數(shù)據(jù)具有成功的檢測性能,但在高端無人機和監(jiān)視攝像機生成的高分辨率圖像中,它們對小目標檢測任務的精度明顯較低。

無人機、4K攝像機和深度學習研究的最新進展使遠程目標檢測成為可能,符合檢測、觀察、識別和DORI標準。DORI標準定義了不同任務對象的最小像素高度:10%的圖像高度需要檢測,20%的圖像需要識別物體(全高清視頻中的108像素)。相對較小的像素覆蓋推動了基于CNN的目標檢測方法的局限性,此外,高分辨率圖像在計算和內(nèi)存需求方面需要更大的需求。
在本文中提出了一種基于切片輔助推理和微調(diào)的通用解決方案,用于高分辨率圖像上的小目標檢測,同時保持較低的復雜度和內(nèi)存需求。圖1顯示了Visdrone測試集樣本圖像上小目標檢測的改進。
2 相關(guān)工作
最近的基于學習的目標檢測技術(shù)可分為兩種主要類型。單級探測器,如SSD、YOLO、RetinaNet,直接預測物體的位置,而沒有一個明確的建議階段。兩階段區(qū)域建議的方法,如Fast R-CNN、Faster R-CNN、Cascade R-CNN,涉及區(qū)域建議階段。然后對這些建議框進行細化,以定義目標的位置和大小。通常,單階段方法比兩階段方法更快,而后者具有更高的精度。
最近,Anchor-Free檢測器開始引起人們的注意。他們消除了Anchor box的使用,并將特征金字塔上的每個點分類為前景或背景,并直接預測從前景點到GT邊界框的距離,從而產(chǎn)生檢測。FCOS是第一個目標檢測器,消除了預定義Anchor box集的需要,并需要計算需要。VarifocalNet(VFNet)學習預測IoU-aware classification score,它將目標存在的置信度和定位精度混合在一起,作為一個邊界框的檢測分數(shù)。學習是由基于一個新的星形邊界框特征表示所提出的Varifocal Loss(VFL)監(jiān)督的。TOOD以基于學習的方式將2個任務(目標分類和定位)明確對齊,通過設計的樣本分配方案和任務對齊損失,在學習任務交互和任務特定特征和任務對齊學習之間提供了更好的平衡。
針對一般目標檢測的算法在包含小而密集目標的高分辨率圖像上表現(xiàn)不佳,導致了針對小目標檢測的特定方法。有研究采用基于粒子群優(yōu)化(PSO)和細菌覓食優(yōu)化(BFO)的學習策略(PBLS)對分類器和損失函數(shù)進行優(yōu)化。然而,這些對原始模型的重大修改阻止了從預訓練的權(quán)重進行微調(diào),需要從頭開始訓練。
此外,由于不尋常的優(yōu)化步驟,它們很難適應目前的檢測器。該方法對具有小目標的圖像進行過采樣,并通過復制多個小目標對其進行擴充。然而,這種增強需要分割注釋,因此,它與目標檢測數(shù)據(jù)集不兼容。有方法可以從原始圖像中截取放大區(qū)域,從中學習到更豐富的小目標特征。額外的特征對檢測性能有積極的貢獻,但要擴大的區(qū)域的選擇帶來了計算負擔。也有研究提出了一種用于小目標檢測的全卷積網(wǎng)絡,該網(wǎng)絡包含了一種早期的視覺注意力機制,用來選擇最有希望的包含小目標及其上下文的區(qū)域。還有研究提出了一種基于切片的技術(shù),但其實現(xiàn)并不通用,僅適用于特定的目標檢測器。也有研究提出了一種新型的小型行人檢測網(wǎng)絡(JCS-Net),該網(wǎng)絡將分類任務和超分辨率任務整合在一個統(tǒng)一的框架中。
有學者提出了一種利用生成式對抗網(wǎng)絡(GAN)從模糊的小人臉直接生成清晰的高分辨率人臉的算法。然而,由于這些技術(shù)提出了新的檢測器體系結(jié)構(gòu),它們需要從頭開始用大型數(shù)據(jù)集進行預訓練,這是昂貴的。
3 本文方法
為了解決小目標檢測問題,作者提出了一個在微調(diào)和推理階段基于切片的通用框架。將輸入圖像劃分為重疊的切片,對于小目標相對于輸入網(wǎng)絡的圖像產(chǎn)生相對較大的像素區(qū)域。
3.1 Slicing Aided Fine-tuning(SF)

廣泛使用的目標檢測框架,如Detectron2、MMDetection和YOLOv5,在ImageNet和MSCOCO等數(shù)據(jù)集上提供預訓練的權(quán)重。這允許使用更小的數(shù)據(jù)集和更短的訓練跨度來對模型進行微調(diào),而不是使用大數(shù)據(jù)集從頭開始進行訓練。
這些常見的數(shù)據(jù)集大多涉及低分辨率的圖像(640×480),它們具有相當大的目標和較大的像素覆蓋(平均覆蓋圖像高度的60%)。使用這些數(shù)據(jù)集進行預訓練的模型為相似的輸入提供了非常成功的檢測性能。另一方面,在由高端無人機和監(jiān)視攝像頭生成的高分辨率圖像中,它們對小目標檢測任務的精度明顯較低。
為了克服這個問題, 作者通過從圖像微調(diào)數(shù)據(jù)集中提取patch來增強數(shù)據(jù)集, 如圖2所示。每幅 圖像 被分割成重疊的patch 在預定義范圍 和 內(nèi)選擇N和N的 被視為超參數(shù)。然后在微調(diào)過程中, 通過保留高寬比來調(diào)整 patch的大小, 使圖像寬度在800 1333像素之間, 以獲得增強圖像 , 因此相對的目標大小比原始圖像更大。
這些圖像, 以及原始圖像 (便于檢測大物體) , 在微調(diào)過程中被利用。需要注意的是, 隨著patch size的減小, 較大的物體可能不適合一個切片和交叉區(qū)域, 這可能導致對較大物體的檢測性能較差。
3.2 Slicing Aided Hyper Inference(SAHI)

在推理步驟中也使用了切片方法, 如圖3所示。首先,將原始查詢圖像I分割成1個M\timesN個重疊的patch 。然后,在保持高寬比的同時, 調(diào)整每個patch的大小。然后,對每個重疊的patch都獨立地應用目標檢測正向傳遞。使用原始圖像的一個可選的全推理(FI)可以用 于檢測較大的目標。最后,重疊的預測結(jié)果, 如果使用,FI結(jié)果使用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 實驗結(jié)果
本文采用了MS COCO評估協(xié)議進行評估,包括總體和尺寸方面的AP50評分。具體來說,AP50在所有類別的單個IoU閾值0.5處計算,最大檢測數(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可以看出,SAHI使目標檢測AP分別提高了6.8%、5.1%和5.3%。SF可進一步提高檢測精度,F(xiàn)COS、VFNet和tod檢測器的累計AP分別提高12.7%、13.4%和14.5%。在推理過程中,應用切片間25%的重疊,會增加小/中物體AP和整體AP,但略微降低大物體AP。增加是由切片預測的額外小目標真陽性引起,減少是由匹配大GT框的切片預測的假陽性引起。小目標檢測AP以SF最佳,SI次之,大目標檢測AP以SF最佳,F(xiàn)I次之,證實了FI對大目標檢測的貢獻。

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

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

公眾號后臺回復“數(shù)據(jù)集”獲取30+深度學習數(shù)據(jù)集下載~

#?CV技術(shù)社群邀請函?#

備注:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳)
即可申請加入極市目標檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術(shù)交流群
每月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~

