日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Faster RCNN总结

發布時間:2024/9/21 编程问答 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Faster RCNN总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

faster RCNN選自2015年 NIPS, Faster R-CNN: Towards Real-Time Object Detection withRegion Proposal Networks



正如上圖所示,檢測不同尺度(scale),不同長寬比(aspect ratios)的目標物通常的3種做法。

(a)Pyramids of images,縮放圖像來達到不同的scale,傳統機器學習常用的方法

(b)Pyramids of filters,也就是sliding window的思想,也是傳統機器學習常用的方法

(c)Pyramids of anchors,fast rcnn提出,Faster rcnn正式命名為RPN(region proposal network),并且從fast rcnn的cpu移植到了fasterrcnn的gpu上。可以實現不同不同scale和不同aspect ratios的檢測,使得檢測效果更佳準確完美啊。


整個網絡結構如上圖的左圖所示,分為2個網絡結構,一個RPN網絡和一個FastRCNN網絡,兩個網絡共享了特征圖這一層。由于是2個網絡結構,訓練過程也有點不一樣,作者論文中給出了3個訓練的方法,

(1)Alternating training,先從pretrained VGG16中導入初始參數,然后有了參數后,先訓練RPN,然后RPN將結果送給Fast RCNN,在訓練一把Fast RCNN訓練完畢后更新卷積層,然后,RPN在從卷基層提取數據,如此不斷循環往復。開源的matlab版本就是這種訓練方法。

(2)Approximate joint training,就是2個網絡一起訓練,但是該方法忽略了wrt導數,開源的python版本就是這么訓練的,可以減少25-50%的訓練時間。為什么呢?因為caffe中所有層都是c++實現的,所以python_layer就沒有進行back_ward,當然訓練的時候必須顯式指定loss_weight:1。

(3)Non-approximate joint training,作者沒有實現。

?

上圖中的右圖詳細說明了RPN的實現細節。

首先,作者提出了Anchor這個概念,其實就是feature map上的一個像素,以該Anchor為中心,可以生成k種 anchor boxes,簡單理解就是不同大小和尺度的滑動框,例如本文中的k為9,則生成3個scales和1:1,1:2,2:1,3種aspect ratios。然后使用不同的anchor boxes進行滑動,整個feature map中IOU最高的和每個anchor中,IOU>0.7的將被激活,置為1,IOU<0.3的將被置為0,從而實現了hard negative mining,滑動完畢后將生成256維的向量,然后分別經過2個1*1的卷基層(classification layer,regression layer),分別生成2k scores(是物體,不是物體)和4k coordinates(x,y,w,h)。從而實現了物體的檢測,最后經過softmax,實現物體的分類。


安裝步驟:

[plain] view plaincopy
  • git?clone??--recursive?https://github.com/ShaoqingRen/faster_rcnn.git??
  • cd?./faster-rcnn/external/caffe??
  • make?-j8&&make?matcaffe??
  • faster_rcnn_build.m??
  • startup.m??
  • fetch_data/fetch_faster_rcnn_final_model.m??(這一步我下載失敗,可以去作者github做下面的百度網盤下載,下載Final?RPN+FastRCNN?models就可以了)??
  • experiments/script_faster_rcnn_demo.m??

  • 測試:

    下面測試顯卡為TitanX

    使用VGG16的測試,


    使用ZFnet的測試,




    windows c++版本

    ?

    這里所使用的windows caffe為https://github.com/Microsoft/caffe,

    可以參考http://blog.csdn.net/qq_14845119/article/details/52415090這篇文章進行編譯。

    一個注意事項,在編譯之前,在libcaffe下面的cu,include,src下面分別添加,roi_pooling_layer.cu,roi_pooling_layer.hpp,roi_pooling_layer.cpp。

    ?

    這里的程序為根據matlab版本的faster-rcnn改寫。

    ?

    運行效果:

    pets數據集上運行效果如下,1050Ti下運行時間為100ms的樣子




    這里分析一下,目標檢測的框架為什么faster-RCNN要比SSD對小目標更好,而RFCN又比faster-RCNN更好些呢?

    ?

    首先看一下,幾個框架讀取圖片傳進網絡前做的處理,

    ?

    faster-RCNN的處理:

    ???????? faster-RCNN對讀取的圖片進行了scale處理,首先假設,im_size原始圖片大小,target_size為目標圖片大小,max_size為目標圖片最長邊允許的最大長度。

    那么在縮放的過程中,首先,定義scale大小為( target_size ) / im_size_min,如果這個scale的時候,長邊的長度超過max_size,就將scale定義為( target_size) / im_size_min,否則就還是用原來的scale。這樣做的好處就是輸入的圖片相對SSD300*300,SSD500*500都大點,最終對小目標也許效果就會更好,當然這樣做的話也會使得運行速度變慢,顯存使用增加,對于不同ratio(長寬比)的圖片運行時間也有差別。使用作者的原始參數,target_size=600 ,max_size=1000也許是對精度,速度,顯存占用的一個很好的折中吧。

    ???????? 這里為什么faster-RCNN可以輸入Blob不同ratio的數據,這就是RPN網絡的亮點,全卷基層的設計,當然不受ratio的影響。

    [plain] view plaincopy
  • function?im_scale?=?prep_im_for_blob_size?(?im_size?,target_size?,max_size?)??
  • im_size_min?=?min(im_size?(?1?:?2?)?)?;??
  • im_size_max?=?max(im_size?(?1?:?2?)?)?;??
  • im_scale?=?double?(?target_size?)?/?im_size_min?;??
  • %Prevent?the?biggest?axis?from?being?more?than?MAX_SIZE??
  • if?round?(im_scale???im_size_max?)?>?max?size??
  • ????im_scale?=?double?(max_size?)?/?double?(im_size_max)?;??
  • end??
  • end??

  • SSD的處理:

    直接進行縮放處理,這樣做雖然會使圖像變形,但是保證了輸入的整個圖像都是有效的像素。

    [plain] view plaincopy
  • cv::Mat?sample_resized;??
  • if?(sample.size()?!=?input_geometry_)??
  • ??cv::resize(sample,?sample_resized,?input_geometry_);??
  • else??
  • ??sample_resized?=?sample;??

  • YOLOV2的處理:

    YOLO的處理也保證了圖片的ratio,比如tiny-yolo的輸入尺寸為416*416,在對圖片進行保證ratio的縮放后,對其他區域進行127像素的填充,這樣做的好處就是保證了ratio,不足之處就是當輸入圖片的ratio比較大的時候,就會填充好多無效的127像素,一個圖中,無效區域比有效區域還大,當然對小目標的檢測就還不如SSD奏效了。

    [plain] view plaincopy
  • static?image_t?ipl_to_image(IplImage*?src)??
  • ????{??
  • ????????unsigned?char?*data?=?(unsigned?char?*)src->imageData;??
  • ????????int?h?=?src->height;??
  • ????????int?w?=?src->width;??
  • ????????int?c?=?src->nChannels;??
  • ????????int?step?=?src->widthStep;??
  • ????????image_t?out?=?make_image_custom(w,?h,?c);??
  • ????????int?i,?j,?k,?count?=?0;;??
  • ??
  • ????????for?(k?=?0;?k?<?c;?++k)?{??
  • ????????????for?(i?=?0;?i?<?h;?++i)?{??
  • ????????????????for?(j?=?0;?j?<?w;?++j)?{??
  • ????????????????????out.data[count++]?=?data[i*step?+?j*c?+?k]?/?255.;??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????????return?out;??
  • ????}??
  • ??
  • static?void?rgbgr_image(image_t?im)??
  • ????{??
  • ????????int?i;??
  • ????????for?(i?=?0;?i?<?im.w*im.h;?++i)?{??
  • ????????????float?swap?=?im.data[i];??
  • ????????????im.data[i]?=?im.data[i?+?im.w*im.h?*?2];??
  • ????????????im.data[i?+?im.w*im.h?*?2]?=?swap;??
  • ????????}??
  • ????}??


  • RFCN的處理:

    ???????? RFCN的處理主要是在網絡卷積參數的設計上,引入了dilation參數,也就是所謂的hole algorithms,可以有效的增大map,提高對小目標的檢測。

    ???????? 如下圖所示,假設第一個為原始的map(3*3),第二個為dilation: 2時得到的map(7*7),第三個為在第二個的基礎上,dilation: 4得到的map(15*15)。


    [plain] view plaincopy
  • layer?{??
  • ????bottom:?"res5a_branch2a"??
  • ????top:?"res5a_branch2b"??
  • ????name:?"res5a_branch2b"??
  • ????type:?"Convolution"??
  • ????convolution_param?{??
  • ????????num_output:?512??
  • ????????kernel_size:?3??
  • ????????dilation:?2??
  • ????????pad:?2??
  • ????????stride:?1??
  • ????????bias_term:?false??
  • ????}??
  • ????param?{??
  • ????????lr_mult:?1.0??
  • ????}??

  • 這里用KITTI的一張圖片進行測試說明,


    The End!

    總結

    以上是生活随笔為你收集整理的Faster RCNN总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。