小目標(biāo)Trick | Detectron2、MMDetection、YOLOv5都通用的小目標(biāo)檢測(cè)解決方案
點(diǎn)擊下方“AI算法與圖像處理”,一起進(jìn)步!
重磅干貨,第一時(shí)間送達(dá)
極市導(dǎo)讀
?檢測(cè)小目標(biāo)和遠(yuǎn)程目標(biāo)檢測(cè)是監(jiān)控應(yīng)用中的一個(gè)主要挑戰(zhàn)。這些物體由圖像中少量的像素表示,缺乏足夠的細(xì)節(jié),使得傳統(tǒng)的檢測(cè)器難以檢測(cè)。本文提出了一個(gè)名為切片輔助超推理(SAHI)的開(kāi)源框架,該框架為小目標(biāo)檢測(cè)提供了一個(gè)通用的切片輔助推理和微調(diào)管道。所提出的技術(shù)可以應(yīng)用在任何可用的目標(biāo)檢測(cè)器之上,而不需要進(jìn)行任何微調(diào)。?>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺(jué)的最前沿

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

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

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

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

在推理步驟中也使用了切片方法, 如圖3所示。首先,將原始查詢圖像I分割成1個(gè)M\timesN個(gè)重疊的patch 。然后,在保持高寬比的同時(shí), 調(diào)整每個(gè)patch的大小。然后,對(duì)每個(gè)重疊的patch都獨(dú)立地應(yīng)用目標(biāo)檢測(cè)正向傳遞。使用原始圖像的一個(gè)可選的全推理(FI)可以用 于檢測(cè)較大的目標(biāo)。最后,重疊的預(yù)測(cè)結(jié)果, 如果使用,FI結(jié)果使用NMS合并回原始大小。在NMS過(guò)程中,具有比預(yù)定義匹配閾值Tm的Union(IoU)比值更高的box被匹配, 并且對(duì)于每個(gè)匹配, 具有檢測(cè)概率低于 的檢測(cè)被刪除。
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 實(shí)驗(yàn)結(jié)果
本文采用了MS COCO評(píng)估協(xié)議進(jìn)行評(píng)估,包括總體和尺寸方面的AP50評(píng)分。具體來(lái)說(shuō),AP50在所有類別的單個(gè)IoU閾值0.5處計(jì)算,最大檢測(cè)數(shù)設(shè)置為500。
在表1和表2對(duì)原始圖像的常規(guī)推理中,以FI(Full inference)作為Baseline。SF(切片輔助微調(diào))是在表1和表2中patch大小分別為480-640和300-500的增強(qiáng)數(shù)據(jù)集上進(jìn)行微調(diào)的模型。
SAHI(切片輔助Hyper Inference)是指表1和表2中patch大小分別為640×640和400×400的推理。OP(Overlap Patch)表示切片推理過(guò)程中Patch之間有25%的重疊。

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

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

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

交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有美顏、三維視覺(jué)、計(jì)算攝影、檢測(cè)、分割、識(shí)別、NeRF、GAN、算法競(jìng)賽等微信群
個(gè)人微信(如果沒(méi)有備注不拉群!) 請(qǐng)注明:地區(qū)+學(xué)校/企業(yè)+研究方向+昵稱
下載1:何愷明頂會(huì)分享
在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結(jié)分析
下載2:終身受益的編程指南:Google編程風(fēng)格指南
在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):c++,即可下載。歷經(jīng)十年考驗(yàn),最權(quán)威的編程規(guī)范!
下載3 CVPR2021 在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):CVPR,即可下載1467篇CVPR?2020論文 和 CVPR 2021 最新論文

