Pytorch復現Faster-RCNN


5月的最后一天,需要寫點什么。

通過前幾篇博客對Faster-RCNN算是有了一個比較全面的認識,接下來的半個月斷斷續續寫了一些代碼,基本上復現了論文。利用torchvision的VGG16預訓練權重,在VOC02007trainval訓練13個epoch,最后VOC2007test的map在0.69左右。當然利用caffe預訓練的權重結果略好一些。

關於復現過程:起初只是對目標檢測方向突然有了興趣,想玩一玩,但是只跑跑代碼看看結果帶給人的新奇感僅僅持續了幾分鍾,所以找了份代碼深究了一下,最后結合chainer的實現方案自己成功復現。

關於代碼部分:需要加速的部分主要有RoI-Pooling和NMS。也簡單看了看Cython,實現了C擴展。可是為了進一步加速需要cuda,這方面沒有深究,所以代碼可以利用自己實現的C擴展版本,也可以利用別人寫好的cuda加速的版本,在調試代碼的過程中,為了方便,直接利用法二。剩余其他部分都是自己完成。

關於心態方面:心血來潮想要實現Faster,可是直到實現的時候才發現有些細節根本難以顧及,斷斷續續寫了一些子函數模塊后,感覺想要放棄..可想了想以后萬一需要再次接觸Faster豈不又得重頭看起,所以又是斷斷續續硬着頭皮擼。代碼大約不到一周寫完了,痛苦的事情才剛剛開始,那就是調試。先是一些低級錯誤,比如類型匹配問題、路徑問題等等。然后是邏輯錯誤,這是最難調試的,初步調試方法是眼瞅,強行瞅出一些基本的邏輯問題,然后是ipdb一行一行的過...前幾天每次都能找出一些錯誤更正后將代碼跑通然后回去睡覺,第二天滿懷希望來了卻發現損失不降,要不就是map太低...每晚都是帶着希望回去,第二天發現還是不行...  列幾個那幾天陸續找出來的隱藏錯誤:

  • PIL讀進來的圖像,size函數的順序是(w,h)。而代碼默認需要的順序是(c, h, w)。
  • IOU計算錯誤。這個是自己的算法錯誤...
  • 損失函數計算錯誤,(n,c,h,w)應該先轉換成(n,h,w,c)再reshape為(n,h×w,c)。
  • chainer中的roi_pooling函數需要的roi坐標為(xmin, ymin,xmax,ymax),而代碼里默認的順序為(ymin, xmin, ymax, xmax)...
  • RPN網絡的兩個卷積函數沒加激活函數...

最初的目標是5月底之前實現Faster,當解決了所有bug之后,map終於正常了,也實現了既定的目標。故作文以記之...突然發現帶給我的新奇感又沒有了...

 

來張自己跑出來的測試圖吧,紀念平平淡淡的五月,馬上就迎來兒童節了...

然后明天就是總決賽了,詹姆斯撐住,撐住...騎士靠你了...頭像是科比只是為了好玩...

    

知乎的兩張圖..

 

另外偶然發現了一個很棒的repo,實現了vgg和resnet兩種結構,還有幾種不同的roi pooling,以及多batch、多GPU,值得多多研究。

注:resnet直接用效果不升反降(當輸入的圖像尺寸比較小的時候,直接把vgg換成resnet效果反而會下降,但是如果提高輸入圖像的尺度的話,把vgg替換成resnet-101效果會更好,對於resnet這樣非常深的網絡,需要更大的尺度輸入來讓深層的feature map仍然保持空間信息),所以實現細節值得從代碼里好好研究下,另外kaiming有一篇論文(Object Detection Networks on Convolutional Feature Maps)試驗了rcnn系列目標檢測中深層分類與深層特征的設計,以及對Network on Conv feature map (NoC)設計的方法。涉及對不同網絡的設計方法,非常值得參考。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM