鹽田區(qū)網(wǎng)站建設(shè)百度網(wǎng)站ip地址
前言
常規(guī)的目標(biāo)檢測(cè)往往是根據(jù)圖像的特征來捕捉出目標(biāo)信息,那么是否有辦法加入一些先驗(yàn)信息來提升目標(biāo)檢測(cè)的精準(zhǔn)度?
一種可行的思路是在目標(biāo)檢測(cè)的輸出加入目標(biāo)之間的關(guān)聯(lián)信息,從而對(duì)目標(biāo)進(jìn)行干涉。
2017年8月,新加波管理大學(xué)的Yuan Fang等人發(fā)表了一篇文章《Object Detection Meets Knowledge Graphs》,就按照這個(gè)思路做了一些工作。
論文地址:https://www.ijcai.org/proceedings/2017/0230.pdf
文章寫得非常通俗易懂,因此本文進(jìn)行思路解讀和代碼復(fù)現(xiàn)。
工作架構(gòu)
這篇文章作者提出的是一個(gè)通用的知識(shí)引入架構(gòu),因此對(duì)于任何目標(biāo)檢測(cè)模型都可以適用。
知識(shí)引入的流程圖如下圖所示:
原論文作者采用的是Faster R-CNN算法進(jìn)行檢測(cè),正常檢測(cè)輸出結(jié)果會(huì)是一個(gè)P矩陣(即圖中的Existing model output),這里的列表示總共的目標(biāo)數(shù),行表示類別。
圖中的這個(gè)矩陣意義是:第一個(gè)檢測(cè)目標(biāo)屬于類別1的置信度為0.6,屬于類別2的置信度為0.4;第二個(gè)檢測(cè)目標(biāo)屬于類別1的置信度為0.2,屬于類別2的置信度為0.8;
在這個(gè)輸出結(jié)果基礎(chǔ)上,從先驗(yàn)知識(shí)(Knowledge)中提取出類別之間的語義一致性(semantic consistency),從而對(duì)輸出結(jié)果進(jìn)行干涉,得到最終的輸出結(jié)果(Knowledge-aware output)。
語義一致性提取
那么這套架構(gòu)的關(guān)鍵就是如何提取語義一致性,這一點(diǎn)作者給出了兩種思路。
思路一:基于頻率的知識(shí)(Frequency-based knowledge)
基于頻率應(yīng)該是最容易想到的知識(shí)關(guān)聯(lián)方式,比如兩個(gè)目標(biāo)同時(shí)出現(xiàn)的頻率高(比如鍵盤和鼠標(biāo)經(jīng)常一起出現(xiàn)),那么檢測(cè)出其中一個(gè)目標(biāo)時(shí),自然可以考慮增加另一個(gè)目標(biāo)的置信度。
因此,作者提出了一個(gè)對(duì)陣矩陣S,作為目標(biāo)類別之間的語義一致性矩陣,計(jì)算公式如下:
- n(l,l’):類別l和類別l‘一起出現(xiàn)的次數(shù)
- n(l):類別l出現(xiàn)的次數(shù)
- n(l’):類別l’出現(xiàn)的次數(shù)
- N:所有類別出現(xiàn)的總次數(shù)
思路二:基于知識(shí)圖譜的知識(shí)(Graph-based knowledge)
思路一的方式比較直觀,不過存在的缺陷是無法表征兩個(gè)沒有同時(shí)出現(xiàn)過的類別之間的關(guān)系。比如,車和游艇沒有在一個(gè)場(chǎng)景中同時(shí)出現(xiàn),但不能“粗暴”的認(rèn)為這兩者毫無關(guān)聯(lián)吧,肯定需要一個(gè)微弱的權(quán)值來表示兩者之間的關(guān)系。
因此,作者想到了用知識(shí)圖譜的方式來提取語義一致性。
首先,通過對(duì)一些公開的大型知識(shí)圖譜進(jìn)行過濾,提取出需要檢測(cè)的類別信息和關(guān)系。
之后,通過重啟隨機(jī)游走算法(random walk with restart)來得到該關(guān)系圖的收斂狀態(tài)。重啟隨機(jī)游走算法是經(jīng)典的隨機(jī)游走算法的一個(gè)變種,相當(dāng)于在隨機(jī)游走算法的基礎(chǔ)上,添加了一個(gè)重啟概率,觸發(fā)重啟后會(huì)回到原點(diǎn)。
收斂之后,會(huì)得到一個(gè)R矩陣,這個(gè)矩陣表征了當(dāng)算子處于某個(gè)狀態(tài)類別時(shí),向另一狀態(tài)類別轉(zhuǎn)移的概率。由于語義一致性矩陣是對(duì)稱矩陣,因此作者采用了一個(gè)狀態(tài)相乘再開方的操作。
干涉檢測(cè)輸出
有了語義一致性矩陣S之后,就可以對(duì)輸出結(jié)果進(jìn)行干涉。論文中,對(duì)于如何進(jìn)行干涉并沒有說明。
通過后面閱讀源碼可知,干涉的思路主要是選取某目標(biāo)類別最鄰近的5個(gè)類別,然后對(duì)其一致性矩陣數(shù)值求和得到關(guān)聯(lián)性特征向量。再將該向量和原始檢測(cè)結(jié)果進(jìn)行加權(quán)相加。
核心代碼:
num = torch.sum(torch.mm(S_highest, torch.transpose(p_hat_temp[box_nearest[b]], 0, 1)), 1)
denom = torch.sum(S_highest, dim=1) * bk
p_hat[b] = (1 - epsilon) * torch.squeeze(torch.div(num, denom)) + epsilon * p
這里的epsilon
代表權(quán)重,復(fù)現(xiàn)時(shí)取0.75,表示75%保留原始結(jié)果,25%進(jìn)行知識(shí)干涉。
后面一部分就是損失函數(shù)以及網(wǎng)絡(luò)更新部分了。
下面是損失函數(shù)的計(jì)算公式,相當(dāng)于將知識(shí)嵌入的結(jié)果納入到網(wǎng)絡(luò)的更新之中。
實(shí)驗(yàn)結(jié)果
作者在Coco和VOC數(shù)據(jù)集上進(jìn)行了實(shí)驗(yàn),下表是coco的實(shí)驗(yàn)結(jié)果:
- FRCNN:原始檢測(cè)網(wǎng)絡(luò)輸出結(jié)果
- KF-500:通過思路一來獲得一致性矩陣,選擇500張訓(xùn)練集圖片
- KF-All:通過思路一來獲得一致性矩陣,選擇所有訓(xùn)練集圖片
- KG-CNet:通過思路二來獲得一致性矩陣
從表中數(shù)據(jù)可知,該思路的改進(jìn)對(duì)檢測(cè)輸出的mAP并沒有起到提升作用,不過有效提升了召回率。相當(dāng)于降低了網(wǎng)絡(luò)的誤檢率。
結(jié)果可視化
最后是結(jié)果的可視化,作者選取了一幅圖來演示:左圖是直接檢測(cè)結(jié)果,右圖是添加知識(shí)圖譜之后的檢測(cè)結(jié)果。
紫框表示模型的檢測(cè)輸出,紅框表示實(shí)際的標(biāo)簽。
由圖可知,原始的FRCNN沒有檢測(cè)出鍵盤(keyboard),添加知識(shí)圖譜后,通過鼠標(biāo)、筆記本等目標(biāo)的關(guān)聯(lián)信息,成功將鍵盤檢測(cè)出來。
實(shí)驗(yàn)復(fù)現(xiàn)
原論文發(fā)布時(shí)間較早,使用Caffe框架進(jìn)行實(shí)驗(yàn),目前已無法找到。
后面有人使用Pytorch對(duì)其進(jìn)行復(fù)現(xiàn)。
代碼地址:https://github.com/tue-mps/rescience-ijcai2017-230
復(fù)現(xiàn)結(jié)論
復(fù)現(xiàn)作者提到:
對(duì)于所描述的任何一種方法,作者的主張都無法得到證實(shí)。結(jié)果要么顯示以 mAP 降低為代價(jià)的召回率增加,要么顯示 mAP 保持不變,召回率沒有改善。三種不同的骨干模型在重新優(yōu)化后表現(xiàn)出相似的行為,結(jié)論是知識(shí)感知的重新優(yōu)化對(duì)目標(biāo)檢測(cè)算法沒有好處。
不清楚是否是超參數(shù)的影響,總之論文的效果無法實(shí)現(xiàn)。
代碼運(yùn)行
該代碼寫得比較清晰,并且作者提供了處理好的數(shù)據(jù)集和語義一致性矩陣。
下載好之后,放置路徑如下即可:
之后修改Utils/testing.py
里面這三行內(nèi)容,我測(cè)試的時(shí)候遇到的小bug:
# 原始
# boxes_temp = prediction[1][0]['boxes']
# labels_temp = prediction[1][0]['labels']
# scores_temp = prediction[1][0]['scores']
# 修改為
boxes_temp = prediction[0]['boxes']
labels_temp = prediction[0]['labels']
scores_temp = prediction[0]['scores']
最后運(yùn)行Results/results_coco.py
即可進(jìn)行單輪測(cè)試。
實(shí)驗(yàn)結(jié)果
由于原論文作者使用的是VGG16作為backbone,因此這里model_type
我設(shè)置為coco-FRCNN-vgg16
,下面是在我RTX2060下用Coco數(shù)據(jù)集的實(shí)驗(yàn)結(jié)果:
模型 | mAP @ 100 | Recall @ 100 all classes |
---|---|---|
FRCNN | 0.247 | 0.477 |
KF-All-COCO | 0.245 | 0.432 |
KG-CNet-55-COCO | 0.243 | 0.436 |
KG-CNet-57-COCO | 0.243 | 0.437 |
- FRCNN:Fast-RCNN直接檢測(cè)
- KF-ALL-COCO:思路一獲取語義一致性矩陣
- KG-CNet-55-COCO:思路二通過大型常識(shí)知識(shí)庫(kù)
ConceptNet-assertions55
提取一致性矩陣 - KG-CNet-57-COCO:思路二通過大型常識(shí)知識(shí)庫(kù)
ConceptNet-assertions57
提取一致性矩陣
從結(jié)果來看,的確沒什么卵用,mAP和Recall均下降了。。