1.MMdetection上的實驗
1.1 cascade_rcnn_x101
CUDA_VISIBLE_DEVICES=3 python ./tools/test.py ./configs/cascade_rcnn_x101_64x4d_fpn_1x.py ./checkpoints/cascade_rcnn_x101_64x4d_fpn_2x_20181218-5add321e.pth --out RESULT_cascade_101_fpn_2.pkl --json_out RESULT_cascade_101_fpn_2.json --eval bbox
1.2 cascade_rcnn_HRnet
CUDA_VISIBLE_DEVICES=3 python ./tools/test.py ./configs/hrnet/cascade_rcnn_hrnetv2p_w48_20e.py ./checkpoints/cascade_rcnn_hrnetv2p_w48_20e_20190810-f40ed8e1.pth --out RESULT_cascade_hrnet.pkl --json_out RESULT_cascade_hrnet.json --eval bbox
1.3 cascade_mask_rcnn_x101
CUDA_VISIBLE_DEVICES=4 python ./tools/test.py ./configs/cascade_mask_rcnn_x101_64x4d_fpn_1x.py ./checkpoints/cascade_mask_rcnn_x101_64x4d_fpn_20e_20181218-630773a7.pth --out RESULT_cascade_mask_x101.pkl --json_out RESULT_cascade_mask_x101.json --eval bbox
1.4 cascade_mask_rcnn_101
CUDA_VISIBLE_DEVICES=4 python ./tools/test.py ./configs/cascade_mask_rcnn_x101_64x4d_fpn_1x.py ./checkpoints/cascade_mask_rcnn_hrnetv2p_w48_20e_20190810-d04a1415.pth --out RESULT_cascade_mask_x101.pkl --json_out RESULT_cascade_mask_x101.json --eval bbox
測試集爲5000個樣本的小測試集
訓練集和訓練集上的結果
序號 | AP/AR | 說明 | 訓練集 | 測試集 | hrnet |
---|---|---|---|---|---|
1 | Average Precision (AP) | @[ IoU=0.50:0.95 area= all maxDets=100 ] | 0.607 | 0.447 | 0.446 |
2 | Average Precision (AP) | @[ IoU=0.50 area= all maxDets=100 ] | 0.799 | 0.631 | 0.627 |
3 | Average Precision (AP) | @[ IoU=0.75 area= all maxDets=100 ] | 0.682 | 0.490 | 0.487 |
4 | Average Precision (AP) | @[ IoU=0.50:0.95 area= small maxDets=100 ] | 0.424 | 0.258 | 0.263 |
5 | Average Precision (AP) | @[ IoU=0.50:0.95 area=medium maxDets=100 ] | 0.666 | 0.483 | 0.481 |
6 | Average Precision (AP) | @[ IoU=0.50:0.95 area= large maxDets=100 ] | 0.729 | 0.588 | 0.585 |
7 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets= 1 ] | 0.427 | 0.352 | 0.352 |
8 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets= 10 ] | 0.673 | 0.544 | 0.553 |
9 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets=100 ] | 0.698 | 0.567 | 0.577 |
10 | Average Recall (AR) | @[ IoU=0.50:0.95 area= small maxDets=100 ] | 0.513 | 0.348 | 0.373 |
11 | Average Recall (AR) | @[ IoU=0.50:0.95 area=medium maxDets=100 ] | 0.756 | 0.605 | 0.553 |
12 | Average Recall (AR) | @[ IoU=0.50:0.95 area= large maxDets=100 ] | 0.838 | 0.726 | 0.553(?) |
- 總體上,訓練集的AP能夠高達0.607,而驗證集上只能達到0.447,這說明還有很大的提升空間。
- 觀察AP50, 對應VOC的指標,訓練集上能夠達到0.799,VOC目前見到的SOTA能達到約0.85,還有提升空間,而測試集上爲0.631,還有大量提升空間。
- 從IOU = 0.50到IOU = 0.75,AP降低了較多,說明還存在不少定位不準的bbox,與gt的IOU沒有那麼高。
- 觀察4, 5, 6,訓練集上的表現都要明顯優於測試集。過擬合?兩個方法在大中小物體上的表現幾乎一致,hrnet在小物體上要略高一點點。
- 觀察7,8,9,recall的下降都差不多,兩個方法的recal幾乎沒有區別。兩個方法的AP也十分接近,是否說明了
- 觀察10,11,12,小物體的recal也較低。
1.實驗
寫了一些程序來分析檢測器的效果。
檢測器:cascade_rcnn_x101
1. 在原圖(val)上畫出GT和Det。
1’. 根據類別不同在原圖(val)上畫出GT和Det
1實現:根據test.py輸出的result.json就可以畫出來Det。GT同理,用annotation就可以。
1’實現:按照類別分門別類就行了。
相當多的圖片都標的挺準的,就像上面兩張圖片那樣。但也發現了一些現象,可能是導致指標不好的原因
000000091500.jpg
就比如說上面圖中的椅子,篩選後如下圖:
1,我們可以觀察到椅子露出的部分越多,score越大。score是由卷積核(模板)和feature map做點積得到,與模板越接近則confidence越大。可以猜測:整體的feature是由部分的feature進行類似於線性相加得到的,進而整體的score是由部分的feature線性相加得到的。
2,我們觀察到右邊人的椅子有一個confidence較高的框,框出了椅子的整體,CNN具有一定的腦補能力,能夠推測出物體的全貌進而框出整個物體,而GT只標註了部分。
推測原因:
- 判斷椅子主要用的是context信息,context信息是場景信息,在網絡的加深過程中逐漸彙集到物體的中心附近,這樣卷積核就能夠根據彙集的信息來判斷出該位置是椅子。場景信息 + 物體自身的部分信息 -> 整體bbox。
3,對於一個椅子,有多個框與之對應。
推測原因:
- . 一個物體會在不同尺度的特徵圖上留下特徵,所以會在多尺度上給出bbox。統一尺度相近的bbox可以通過NMS的進行篩選,但是不同尺度的bbox就不能這麼做了。因爲IOU不夠大,篩不掉。 小尺度的物體在小分辨率特徵圖上存在,大尺度物體在小分辨率特徵圖上存在,那麼出現多個框也不足爲奇了。IDEA,讓尺度更加分明,比如說SNIP的訓練方法,
- 由於GT中有部分椅子,也有出現整體椅子,因此網絡需要同時學習到兩種類型圖像的判斷,這就會出現混淆,一些卷積核預測了部分,而另一些預測了整體,導致多個框出現,還沒法用NMS篩選。
4, 在COCO數據集中有一個標籤是iscrowd,如果是TRUE的話,那麼bbox標註的是一羣物體。但是檢測器並不能分辨這種情況。
5,如果觀察蘋果類別和胡蘿蔔類別的話,就可以發現這種情況,有些紅色、橘黃色的小色塊被標註爲了蘋果或者胡蘿蔔。觀察胡蘿蔔還可以發現基本上這種誤識別的色塊都是由於在餐盤上。可推測:餐盤 + 橘黃色色塊 -> 胡蘿蔔,網絡學習到的特徵還不夠魯棒。IDEA:這個咋想啊?
3. 繪製每類物體不同area的PR曲線
思路:
1.將cocoapi的cocoeval.py移到項目內,在accumulate函數中添加代碼,將image id、tps、fps存儲下來:
E_id = np.concatenate(
[np.ones(len(e['dtScores'][0:maxDet]))*e['image_id'] for e in E])
E_id = E_id[inds]
content = {}
content['imgid_ids'] = E_id.astype(np.float).tolist()
content['tps'] = tps.tolist()
content['fps'] = fps.tolist()
SAVE_TPS_IMGID[str((k, a, m))] = content
存儲在SAVE_TPS_IMGID中,SAVE_TPS_IMGID有3個索引
k:類別,category
a:area,all、small、medium、big
m:max det,1,10,100
其中,fps爲10個元素的列表,索引爲t,代表iou閾值。
2. 使用draw_PR_SMB畫出圖來,默認maxdet=100。
圖例:
大體趨勢就是這個樣子,隨着recall的增加,precision陡然下降。
假如fp和tp是均勻分佈的話,那麼precision是呈線性下降。orange的PR曲線就是這種趨勢,說明存在着很多高score的bbox沒有迴歸到位(更可能是數據集沒有GT與之對應,比方說一堆橘子,但是有iscrowd)。
但一般而言還是像person(下面那張)一樣,Precision以指數的趨勢下降。這說明fp隨着score的增加而指數級增長,離GT較遠的Det的score會顯著下降。這說明檢測器能夠將特徵集中在特定位置上。
對比小中大的PR曲線可以得知,小物體的召回率不足,而且Precision衰減的更快,這是由於小物體特徵聚集的位置更小,不像大物體那麼分散。大物體的特徵會被網絡聚集到一個特定的地方,然後卷積核進行卷積得到迴歸和分類的結果,但是這個特定的地方並不一定是物體中心。(idea,觀察是否是物體的中心點回歸,還是頭部啦,車輪子啦,椅子腿啦的Anchor迴歸。)
3. 調查precision和precision數量之間的關係
實現:
- 使用3中的SAVE_TPS_IMGID,使用TPS_Analysis.py。對每一類,計算每張圖片的FP和TP,裝進列表裏。之後計算每張圖片的precision(TP / (FP + TP))和proposal數量(TP + FP),觀察proposal數量和precision的關係。Proposal = 10,對應有M個圖片有10個proposal,將這M個圖片的precision平均,得到該proposal數量的平均精度。
- 繪製平均淨度曲線
- 將各個類別得到的曲線進行進一步平均,得到總體的precision-proposal曲線。
觀察:
從每個類別上很難看出趨勢,但是平均後就能看出來了:
當一張圖片中proposal數量越多的時候,precision會越低。proposal多的情況一般發生在圖片出現多個物體的時候,比方說一盤胡蘿蔔,一堆蘋果,一羣人,這時候大多出現的是小物體,而且很可能GT沒有標註那麼多,也就是造成了precision的降低。
4. 去除部分圖片觀察ap的變化
- 利用3中的方法,將count > 10,ratio(某一類的precision)< (0.3, 0.2, 0.1)的圖片挑出來,形成R01C20.json等包含image_id的文件。
- 將coco的annotation_val2017中對應的圖片刪除掉,使用COCO_EXP的reasoning_annotations。
- 將result file中對應圖片的bbox去除。(之前還試過添加ignore標籤來越過檢查,後來發現直接去除圖片就行了。)
- 觀察ap的變化
以下爲ap的變化:
R01:某類proposal的TP / (FP + TP) < 10 且 數量 > 10,共293張
R02:共524張
R03:共814張
序號 | AP/AR | 說明 | org | R01 | R02 | R03 |
---|---|---|---|---|---|---|
1 | Average Precision (AP) | @[ IoU=0.50:0.95 area= all maxDets=100 ] | 0.447 | 0.460 | 0.469 | 0.481 |
2 | Average Precision (AP) | @[ IoU=0.50 area= all maxDets=100 ] | 0.631 | 0.647 | 0.656 | 0.666 |
3 | Average Precision (AP) | @[ IoU=0.75 area= all maxDets=100 ] | 0.490 | 0.502 | 0.512 | 0.528 |
4 | Average Precision (AP) | @[ IoU=0.50:0.95 area= small maxDets=100 ] | 0.258 | 0.273 | 0.281 | 0.295 |
5 | Average Precision (AP) | @[ IoU=0.50:0.95 area=medium maxDets=100 ] | 0.483 | 0.494 | 0.493 | 0.500 |
6 | Average Precision (AP) | @[ IoU=0.50:0.95 area= large maxDets=100 ] | 0.588 | 0.596 | 0.599 | 0.603 |
7 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets= 1 ] | 0.352 | 0.361 | 0.373 | 0.390 |
8 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets= 10 ] | 0.544 | 0.556 | 0.570 | 0.586 |
9 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets=100 ] | 0.567 | 0.577 | 0.587 | 0.599 |
10 | Average Recall (AR) | @[ IoU=0.50:0.95 area= small maxDets=100 ] | 0.348 | 0.358 | 0.369 | 0.382 |
11 | Average Recall (AR) | @[ IoU=0.50:0.95 area=medium maxDets=100 ] | 0.605 | 0.611 | 0.606 | 0.609 |
12 | Average Recall (AR) | @[ IoU=0.50:0.95 area= large maxDets=100 ] | 0.726 | 0.732 | 0.734 | 0.735 |
idea:按照場景數目不同進行訓練
4. 兩個模型的比較
序號 | AP/AR | 說明 | Cascade | HTC |
---|---|---|---|---|
1 | Average Precision (AP) | @[ IoU=0.50:0.95 area= all maxDets=100 ] | 0.447 | 0.506 |
2 | Average Precision (AP) | @[ IoU=0.50 area= all maxDets=100 ] | 0.631 | 0.701 |
3 | Average Precision (AP) | @[ IoU=0.75 area= all maxDets=100 ] | 0.490 | 0.551 |
4 | Average Precision (AP) | @[ IoU=0.50:0.95 area= small maxDets=100 ] | 0.258 | 0.328 |
5 | Average Precision (AP) | @[ IoU=0.50:0.95 area=medium maxDets=100 ] | 0.483 | 0.547 |
6 | Average Precision (AP) | @[ IoU=0.50:0.95 area= large maxDets=100 ] | 0.588 | 0.664 |
7 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets= 1 ] | 0.352 | 0.384 |
8 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets= 10 ] | 0.544 | 0.620 |
9 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets=100 ] | 0.567 | 0.654 |
10 | Average Recall (AR) | @[ IoU=0.50:0.95 area= small maxDets=100 ] | 0.348 | 0.480 |
11 | Average Recall (AR) | @[ IoU=0.50:0.95 area=medium maxDets=100 ] | 0.605 | 0.699 |
12 | Average Recall (AR) | @[ IoU=0.50:0.95 area= large maxDets=100 ] | 0.726 | 0.810 |
4. 繪製出沒有匹配到的gt
目的:查看小物體recall低的原因。
網絡使用的是map=0.506的HTC檢測網絡。首先是小物體
紅色的是GT。粉色(洋紅)的是DT(area)
apple:
000000030213.jpg、74209、139099
有大量的proposa,但是沒有匹配上。
還有一種情況,就是蘋果堆:303566
總體上來看,網絡能夠具有較高的recall,但是對於密集小目標仍然難以處理,coco數據集中也存在着很多圖片,標註的物體很難識別。
backpack
很多標註本來就很難。
banana
主要還是有很多物體(香蕉堆、香蕉塊),也能識別和定位,但是有GT的物體沒有匹配上。
bird:令人驚訝的效果好,但是依然有沒有被檢測出來的。
主要是因爲鳥之間的間距足夠開吧。
也出現過檢測框只框住鳥頭的情況。可能是因爲鳥的特徵最後集中在了鳥頭。
5. RetinaNet
CUDA_VISIBLE_DEVICES=4 python ./tools/test.py ./configs/retinanet_x101_64x4d_fpn_1x.py ./checkpoints/RetinaNet/retinanet_x101_64x4d_fpn_2x_20181218-5e88d045.pth --out ./results/RESULT_retinanet_x101.pkl --json_out RESULT_retinanet_x101.json --eval bbox
序號 | AP/AR | 說明 | Cascade | RetinaNet |
---|---|---|---|---|
1 | Average Precision (AP) | @[ IoU=0.50:0.95 area= all maxDets=100 ] | 0.447 | 0.396 |
2 | Average Precision (AP) | @[ IoU=0.50 area= all maxDets=100 ] | 0.631 | 0.603 |
3 | Average Precision (AP) | @[ IoU=0.75 area= all maxDets=100 ] | 0.490 | 0.423 |
4 | Average Precision (AP) | @[ IoU=0.50:0.95 area= small maxDets=100 ] | 0.258 | 0.216 |
5 | Average Precision (AP) | @[ IoU=0.50:0.95 area=medium maxDets=100 ] | 0.483 | 0.435 |
6 | Average Precision (AP) | @[ IoU=0.50:0.95 area= large maxDets=100 ] | 0.588 | 0.535 |
7 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets= 1 ] | 0.352 | 0.329 |
8 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets= 10 ] | 0.544 | 0.516 |
9 | Average Recall (AR) | @[ IoU=0.50:0.95 area= all maxDets=100 ] | 0.567 | 0.545 |
10 | Average Recall (AR) | @[ IoU=0.50:0.95 area= small maxDets=100 ] | 0.348 | 0.350 |
11 | Average Recall (AR) | @[ IoU=0.50:0.95 area=medium maxDets=100 ] | 0.605 | 0.587 |
12 | Average Recall (AR) | @[ IoU=0.50:0.95 area= large maxDets=100 ] | 0.726 | 0.706 |
6. 對比RetinaNet和HTC的AP、AR-IOUthr曲線
- 隨着IOUthr升高。AP、AR的下降趨勢與倒數函數接近。IOU=0.5相當於兩個bbox的重疊面積至少達到了2/3。設,兩個bbox中較大一個的面積爲倍另一個()的面積。則重合面積至少要佔到的,是倒數函數。可以猜想,檢測器的DT在不同重合率(重合面積/DT的面積)上的分佈基本上是均勻的。IOU的要求比較嚴苛,當IOU=0.75時,需要最少0.86的重合面積。
- 對比大中小的AR和AP,顯然,隨着物體的尺寸減小,AR,PR均減小,與IOUthr無關。
- 對比兩個網絡的AP-IOUthr曲線, RetinaNet的曲線整體低於HTC的曲線。
- 對比兩個網絡的AR-IOUthr曲線, 和2中一致,RetinaNet整體低於HTC,與尺寸無關。小物體的Recall在IOUthr=0.5時分別爲0.4和0.52,從recall上可以提升。
- 如果從比率上來看的話,那麼小物體的Recall和Precision下降的最快。但是事實上從圖中可以看出小物體的PR,Recall下降是呈線性的,至少沒有出現預料的指數下降。
所以,最好的HTC和較差的RetinaNet在Precision,AR上的規律基本是一致的。只要能夠在源頭上提高AR和AP就可以了。小物體的AR、AP更低,這說明小物體的定位能力還是不準。
6. 對比RetinaNet和HTC的AP、AR-IOUthr曲線(IOUthr[0.05, 0.95])
將IOUthr的範圍改變,查看AR,PR曲線,結論與之前基本相似。
上面這個是小物體的AR曲線。召回率可以有一定的提升,Retina的可以從0.6提升到大約0.73,0.73對應IOUthr=0.05,只有1/10的重合面積,即使如此,平均上依然有1/4的物體沒有被檢測器識別到。這說明很可能不是檢測器檢測到了物體而沒有給出好的bbox,而是檢測器根本沒有檢測到物體。從另一方面,對比IOUthr=0.35時候的RetinaNet(最少重疊0.5)和HTC在IOUthr=0.65(最少重疊0.79)的Recall,可以發現差不多,所以的確存在着定位不準的問題,而且在小物體上更爲明顯,如果我們能夠讓定位更準,至少能夠讓RetinaNet達到HTC的水準。
大中物體的AR沒有很大的差別,如下兩張圖:
如果觀察IOUthr=0.5基本上差不多,但可以看出來,當IOUthr增加的時候,RetinaNet的AR下降的更快,這說明RetinaNet在定位的準確度上有所欠缺,而大 中 物體是能夠檢測到的。
篩選出RetinaNet、HTC的含有unmatched物體的圖片。並進行統計,有下表:
UNM代表沒有匹配,M代表匹配,數字表示包含未匹配物體的圖片的數量。一張圖片中可能出現多個未匹配物體,圖片會出現重複計數。
序號 | 說明 | Small | Medium | Big | Total |
---|---|---|---|---|---|
1 | Retina UNM | 2428 | 889 | 187 | 3504 |
2 | Dense Retina UNM | 1409 | 333 | 63 | 1805 |
3 | HTC UNM | 1874 | 614 | 177 | 2665 |
4 | Retina UNM, HTC M | 769 | 450 | 102 | 1323 |
5 | HTC UNM, Retina M | 215 | 175 | 94 | 484 |
6 | Dense Retina UNM, HTC M | 351 | 147 | 33 | 531 |
7 | HTC UNM, Dense Retina M | 816 | 428 | 147 | 1391 |
8 | HTC UNM, Retina UNM | 1659 | 439 | 83 | 2181 |
9 | HTC UNM, Dense Retina UNM | 1058 | 186 | 30 | 1272 |
Dense Retina爲將IOU閾值設置爲0.05的ReainNet,如果該閾值還沒有匹配的話,就說明根本沒有匹配上了。
- 在大物體上,兩個網絡都有一定數量沒有匹配上,對比4, 5可知,兩個網絡沒有匹配的種類也不太相同。
- 觀察 4, 5,可以知道有大量的小物體是兩個網絡都沒有匹配上的,7更證明了這個事實,並且中小物體也是如此,可以認爲這些兩個網絡都沒匹配到的物體是極難匹配的物體,是不可避免的,或者是由於COCO本身的標註,或者是出現crowd的情況。
- 觀察與Dense Retina有關的項。對比2,3,Dense Retina在小物體上可以做的更好,只要將Precision提升,就很好了,中、大型物體由於IOU過小不具有先考價值。
總之:RetinaNet依然存在定位不準的情況,另一方面還存在着檢測不到的情況。改進前者
用faster rcnn的