Visual Commonsense R-CNN (CVPR2020)
這篇文章比較早,但是對于因果介紹的比較詳細,很值得學習。
代碼:https://github.com/Wangt-CN/VC-R-CNN
代碼花了挺長時間總算跑通了,在 3080 上調真是錯誤不斷,后來換到 2080 又是一頓調才好。這里跑通的主要環境為 ubuntu,2080,cuda 11.3, torch ‘1.10.1+cu113’ 。一些配置如下
- 安裝 conda 后,conda create --name vc_rcnn python=3.7
- conda activate vc_rcnn pip install ninja yacs cython matplotlib tqdm opencv-python h5py lmdb -i https://pypi.mirrors.ustc.edu.cn/simple/
- pip install torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio==0.10.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113 -i https://pypi.mirrors.ustc.edu.cn/simple/ (高于 1.10版本的話安裝 vc-r-cnn 會有問題)
- 參考代碼里的 install.md 安裝 coco 和 apex 以及 vc-rcnn 即可。
作者大大有個博客對于因果學習和這篇文章介紹的都很詳細,見 https://zhuanlan.zhihu.com/p/111306353
因此這里具體的介紹就不多寫了,可參考原始文章和博客。只說實現部分。
-
首先根據數據集構建 confounder Z Z Z 和先驗數據分布 P ( z ) P(z) P(z)。 具體而言,confunder 指的是特定類別的固定表征,利用的是 gt 獲得的,將特定類別的所有目標加一起取平均,對于coco而言獲得 80 × 1024 80 \times 1024 80×1024 的 confounder,每個行都對應一個類別。而先驗分布 P ( z ) P(z) P(z) 維度為 1 × 80 1 \times 80 1×80 ,表示特定類別出現的頻率(所有值加一起和為1),應該是特定類別出現的頻數除以總的目標個數得到。文章定義如下,是預先獲得直接加載的。
self.dic = torch.tensor(np.load(cfg.DIC_FILE)[1:], dtype=torch.float) # [80,1024]
self.prior = torch.tensor(np.load(cfg.PRIOR_PROB), dtype=torch.float) # [80] -
模型使用的是 ResNet+FPN, 也會生成不止一個 proposals。之后就是設計兩個分類器。Self Predictor 和一般使用的基本沒什么區別,重點關注 Context Predict。公式如下,代碼看后邊。 80 × 1024 80 \times 1024 80×1024 的 confounder 首先和 ROI 特征 y y y 計算attention,具體先經過全連接,然后點乘,再通過 softmax,獲得 4 × 80 4 \times 80 4×80 的attention (4 表示該樣本有 4 個 proposals)。按照我們一般的思路,這個 attention 可以直接聚合對應的 80 個特征向量。然而這里再和 confounder 的先驗分布 P ( z ) P(z) P(z) 相乘,很有意思,在 attention 中強行加入 confunder(即各個類別)的出現頻率(ps,感覺那么像解決長尾分布的問題)。最后對這些特征聚合得到 4 × 1024 4 \times 1024 4×1024 的特征。這些特征和模型獲得的 ROI 特征 x x x (公式是 x x x,但是代碼中表示的應該就是前面所說的 y y y,是一樣的 ROI 特征,不知道是不是表示錯誤還是我理解錯誤)進行拼接(公式里是相加,可能也表示拼接)。這樣就能獲得一個包含真實特征和 confounter 的特征。最后用 Context Predict (它的輸入是Self Predictor 輸入維度的兩倍)進行預測。
q = W 3 y , K = W 4 Z T E z [ g y ( z ) ] = ∑ z [ Softmax ? ( q T K / σ ) ⊙ Z ] P ( z ) E z [ f y ( x , z ) ] = W 1 x + W 2 ? E z [ g y ( z ) ] \boldsymbol{q}=\boldsymbol{W}_3 \boldsymbol{y}, \boldsymbol{K}=\boldsymbol{W}_4 \boldsymbol{Z}^T \\ \mathbb{E}_{\boldsymbol{z}}\left[g_y(\boldsymbol{z})\right]=\sum_z\left[\operatorname{Softmax}\left(\boldsymbol{q}^T \boldsymbol{K} / \sqrt{\sigma}\right) \odot \boldsymbol{Z}\right] P(\boldsymbol{z}) \\ \mathbb{E}_{\boldsymbol{z}}\left[f_y(\boldsymbol{x}, \boldsymbol{z})\right]=\boldsymbol{W}_1 \boldsymbol{x}+\boldsymbol{W}_2 \cdot \mathbb{E}_{\boldsymbol{z}}\left[g_y(\boldsymbol{z})\right] \\ q=W3?y,K=W4?ZTEz?[gy?(z)]=z∑?[Softmax(qTK/σ?)⊙Z]P(z)Ez?[fy?(x,z)]=W1?x+W2??Ez?[gy?(z)] -
最后能讓訓練整個的特征提取器減少模型受這種這種 bias (共現的bias,位置的bias等)的干擾。
總的來說,實現上很有意思的,不知道是先有了因果的思考才有的實現思路,還是先有實現的方法再有的因果的角度hh。張老師組這幾年在因果學習上發表了相當多的文章,很多領域都有涉及,很有啟發性,值得學習。
總結
以上是生活随笔為你收集整理的Visual Commonsense R-CNN (CVPR2020)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android设备获取USB扫码枪扫描的
- 下一篇: PC端微信双开脚本