faster_rcnn_pytorch中的roi_pooling源碼解析

源碼來自于https://github.com/longcw/faster_rcnn_pytorch
這次只看了roi_pooling文件夾下的代碼,其他的需要編譯的文件跟這個類似。

roi_pooling目錄

roi_pooling目錄

-src文件夾下是c和cuda版本的源碼堰怨,其中roi_pooling的操作的foward是c和cuda版本都有的碉碉,而backward僅寫了cuda版本的代碼试幽。
-functions文件夾下的roi_pool.py是繼承了torch.autograd.Function類,實現(xiàn)RoI層的foward和backward函數(shù)锄列。
-modules文件夾下的roi_pool.py是繼承了torch.nn.Modules類,實現(xiàn)了對RoI層的封裝惯悠,此時RoI層就跟ReLU層一樣的使用了邻邮。
-_ext文件夾下還有個roi_pooling文件夾,這個文件夾是存儲src中c克婶,cuda編譯過后的文件的筒严,編譯過后就可以被funcitons中的roi_pool.py調(diào)用了丹泉。

functions/roi_pool.py

# -*- coding:utf8 -*-
import torch
from torch.autograd import Function
from .._ext import roi_pooling
import pdb

# 重寫函數(shù)實現(xiàn)RoI層的正向傳播和反向傳播 modules中的roi_pool實現(xiàn)層的封裝

class RoIPoolFunction(Function):
    def __init__(ctx, pooled_height, pooled_width, spatial_scale):
        ctx.pooled_width = pooled_width
        ctx.pooled_height = pooled_height
        ctx.spatial_scale = spatial_scale
        ctx.feature_size = None

    def forward(ctx, features, rois): 
        ctx.feature_size = features.size()           
        batch_size, num_channels, data_height, data_width = ctx.feature_size
        num_rois = rois.size(0)
        output = features.new(num_rois, num_channels, ctx.pooled_height, ctx.pooled_width).zero_() #new是torch.tensor的方法
        ctx.argmax = features.new(num_rois, num_channels, ctx.pooled_height, ctx.pooled_width).zero_().int()
        ctx.rois = rois
        if not features.is_cuda:
            _features = features.permute(0, 2, 3, 1)  # permute = transform 也是torch.tensor的方法
            roi_pooling.roi_pooling_forward(ctx.pooled_height, ctx.pooled_width, ctx.spatial_scale,
                                            _features, rois, output) #調(diào)用_ext下的編譯好的cpu版本函數(shù)
        else:
            roi_pooling.roi_pooling_forward_cuda(ctx.pooled_height, ctx.pooled_width, ctx.spatial_scale,
                                                 features, rois, output, ctx.argmax) #調(diào)用_ext下的編譯好的gpu版本函數(shù)

        return output

    def backward(ctx, grad_output):
        assert(ctx.feature_size is not None and grad_output.is_cuda)
        batch_size, num_channels, data_height, data_width = ctx.feature_size
        grad_input = grad_output.new(batch_size, num_channels, data_height, data_width).zero_()

        roi_pooling.roi_pooling_backward_cuda(ctx.pooled_height, ctx.pooled_width, ctx.spatial_scale,
                                              grad_output, ctx.rois, grad_input, ctx.argmax) #這個地方就只有g(shù)pu版本的了

        return grad_input, None


modules\roi_pool.py

# -*- coding:utf8 -*-

from torch.nn.modules.module import Module
from ..functions.roi_pool import RoIPoolFunction

# 對roi_pooling層的封裝,就是ROI Pooling Layer了
class _RoIPooling(Module):
    def __init__(self, pooled_height, pooled_width, spatial_scale):
        super(_RoIPooling, self).__init__()

        self.pooled_width = int(pooled_width)
        self.pooled_height = int(pooled_height)
        self.spatial_scale = float(spatial_scale)

    def forward(self, features, rois):
        return RoIPoolFunction(self.pooled_height, self.pooled_width, self.spatial_scale)(features, rois)
               # 直接調(diào)用了functions中的函數(shù)鸭蛙,此時已經(jīng)實現(xiàn)了foward摹恨,backward操作

剩下的src,_ext文件的代碼就可以自己讀讀了规惰,就是用c睬塌,cuda對roi_pooling實現(xiàn)了foward和backward,目的就是為了讓python可以調(diào)用歇万。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揩晴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贪磺,更是在濱河造成了極大的恐慌硫兰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寒锚,死亡現(xiàn)場離奇詭異劫映,居然都是意外死亡,警方通過查閱死者的電腦和手機刹前,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門泳赋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喇喉,你說我怎么就攤上這事祖今。” “怎么了拣技?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵千诬,是天一觀的道長。 經(jīng)常有香客問我膏斤,道長徐绑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任莫辨,我火速辦了婚禮傲茄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衔掸。我一直安慰自己烫幕,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布敞映。 她就那樣靜靜地躺著较曼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪振愿。 梳的紋絲不亂的頭發(fā)上捷犹,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天弛饭,我揣著相機與錄音,去河邊找鬼萍歉。 笑死侣颂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的枪孩。 我是一名探鬼主播憔晒,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔑舞!你這毒婦竟也來了拒担?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤攻询,失蹤者是張志新(化名)和其女友劉穎从撼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钧栖,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡低零,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拯杠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掏婶。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖潭陪,靈堂內(nèi)的尸體忽然破棺而出气堕,到底是詐尸還是另有隱情,我是刑警寧澤畔咧,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站揖膜,受9級特大地震影響誓沸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜壹粟,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一拜隧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趁仙,春花似錦洪添、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盏袄,卻和暖如春忿峻,著一層夾襖步出監(jiān)牢的瞬間薄啥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工逛尚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垄惧,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓绰寞,卻偏偏與公主長得像到逊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子滤钱,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容