原創(chuàng) | RoI Pooling 系列方法介紹(文末附源碼)
作者簡(jiǎn)介
CW,廣東深圳人,畢業(yè)于中山大學(xué)(SYSU)數(shù)據(jù)科學(xué)與計(jì)算機(jī)學(xué)院,畢業(yè)后就業(yè)于騰訊計(jì)算機(jī)系統(tǒng)有限公司技術(shù)工程與事業(yè)群(TEG)從事Devops工作,期間在AI LAB實(shí)習(xí)過(guò),實(shí)操過(guò)道路交通元素與醫(yī)療病例圖像分割、視頻實(shí)時(shí)人臉檢測(cè)與表情識(shí)別、OCR等項(xiàng)目。
目前也有在一些自媒體平臺(tái)上參與外包項(xiàng)目的研發(fā)工作,項(xiàng)目專注于CV領(lǐng)域(傳統(tǒng)圖像處理與深度學(xué)習(xí)方向均有)。
前言
RoI Pooling 是目標(biāo)檢測(cè)任務(wù)中的常見(jiàn)手段,最早在 Faster R-CNN 中提出,作用是將一系列大小不同的 RoI 投影至特征圖上,然后通過(guò)池化操作將它們處理為一致大小,從而方便后面的網(wǎng)絡(luò)層進(jìn)行處理(歷史原因,以前的網(wǎng)絡(luò)結(jié)構(gòu)中最后幾層往往是全連接層,因此需要固定的輸入尺寸),同時(shí)起到了加速計(jì)算的作用。
本文先對(duì) RoI Pooling 進(jìn)行介紹,該方法由于量化誤差而帶來(lái)了精度上的損失,后來(lái)有大神基于該方法提出了 RoI Align 和 Precise RoI Pooling,本文后半部分會(huì)讓大伙瞧瞧這倆個(gè)家伙的玩法。
文末會(huì)附上以上三部分相應(yīng)的源碼鏈接,其中 RoI Pooling 和 RoI Align 是自己手寫的純 py 實(shí)現(xiàn),作為學(xué)習(xí)參考使用;Precise RoI Pooling 是作者的原版,基于 cuda 編寫,在使用時(shí)需要編譯。
本文框架
01.RoI Pooling -- 將不同的尺寸變?yōu)橐恢?/strong>
02.RoI Align -- 沒(méi)有量化誤差
03.Precise RoI Pooling -- 無(wú)需超參,每個(gè)像素點(diǎn)均有梯度貢獻(xiàn)
(以下為正文內(nèi)容,可點(diǎn)贊加關(guān)注;原創(chuàng)來(lái)之不易,大家的支持是我們輸出高質(zhì)內(nèi)容的動(dòng)力)

一、Rol?Pooling——將不同的尺寸變?yōu)橐恢?/strong>
先來(lái)概述下 RoI Pooling 的操作:
i). RoI 的尺寸通常是對(duì)應(yīng)輸入圖像的,特征圖是輸入圖像經(jīng)過(guò)一系列卷積層后的輸出,因此,首先將 RoI 映射到特征圖上的對(duì)應(yīng)區(qū)域位置;
ii). 最終需要將尺寸不一的 RoI 變?yōu)楣潭ǖ?n x n 大小,于是將 RoI 平均劃分為 n x n 個(gè)區(qū)域;
iii). 取每個(gè)劃分而來(lái)的區(qū)域的最大像素值,相當(dāng)于對(duì)每個(gè)區(qū)域做 max pooling 操作,作為每個(gè)區(qū)域的“代表”,這樣每個(gè) RoI 經(jīng)過(guò)操作后就變?yōu)?n x n 大小。
結(jié)合一個(gè)例子說(shuō)明下 RoI Pooling 帶來(lái)的量化誤差:
如下圖,假設(shè)輸入圖像經(jīng)過(guò)一系列卷積層下采樣32倍后輸出的特征圖大小為8x8,現(xiàn)有一 RoI 的左上角和右下角坐標(biāo)(x, y 形式)分別為(0, 100) 和 (198, 224),映射至特征圖上后坐標(biāo)變?yōu)椋?, 100 / 32)和(198 / 32,224 / 32),由于像素點(diǎn)是離散的,因此向下取整后最終坐標(biāo)為(0, 3)和(6, 7),這里產(chǎn)生了第一次量化誤差。
假設(shè)最終需要將 RoI 變?yōu)楣潭ǖ?x2大小,那么將 RoI 平均劃分為2x2個(gè)區(qū)域,每個(gè)區(qū)域長(zhǎng)寬分別為 (6 - 0 + 1) / 2 和 (7 - 3 + 1) / 2 即 3.5 和 2.5,同樣,由于像素點(diǎn)是離散的,因此有些區(qū)域的長(zhǎng)取3,另一些取4,而有些區(qū)域的寬取2,另一些取3,這里產(chǎn)生了第二次量化誤差。

二、RoI Align——沒(méi)有量化誤差?
RoI Align 是在 Mask R-CNN 中提出來(lái)的,基本流程和 RoI Pooling 一致,但是沒(méi)有量化誤差,下面結(jié)合一個(gè)例子來(lái)說(shuō)明:

如上圖,輸入圖像分辨率為800x800,其中一個(gè) RoI 大小為 665x665,輸入圖像經(jīng)過(guò) VGG16 下采樣32倍后輸出分辨率為25x25的特征圖。
1). 將 RoI 映射至特征圖上,大小為 (665/32)x( 665/32) 即 20.78x20.78,注意這里不進(jìn)行取整;
2). 最終需要將 RoI 輸出為7x7大小,因此將 20.78x20.78大小的 RoI 均分為7x7個(gè)區(qū)域,每個(gè)區(qū)域大小為2.97x2.97,注意這里也沒(méi)有取整操作;
3). RoI Align 需要設(shè)置一個(gè)超參,代表每個(gè)區(qū)域的采樣點(diǎn)數(shù),即每個(gè)區(qū)域取幾個(gè)點(diǎn)來(lái)計(jì)算“代表”這個(gè)區(qū)域的值,通常為4;
4). 對(duì)每個(gè)劃分后的區(qū)域長(zhǎng)寬各劃分為一半,“十字交叉”變?yōu)?等份,取每份中心點(diǎn)位置作為其“代表”,中心點(diǎn)位置的像素值利用雙線性插值計(jì)算獲得,這樣就得到4個(gè)中心點(diǎn)像素值,采樣點(diǎn)數(shù)為4就是這個(gè)意思;

5).每個(gè)2.97x2.97的區(qū)域都有4個(gè)中心點(diǎn)像素值,它們分別取4個(gè)中心點(diǎn)像素值中的最大值作為其“代表”,這樣7x7個(gè)區(qū)域就產(chǎn)生7x7個(gè)值,最終將 RoI 變?yōu)榱?x7大小。
三、Precise RoI Pooling ——無(wú)需超參?????

oI Align 雖然沒(méi)有量化損失,但是卻需要設(shè)置超參,對(duì)于不同大小的特征圖和 RoI 而言這個(gè)超參的取值難以自適應(yīng),于是就有人提出 Precise RoI Pooling 來(lái)解決這一問(wèn)題,真是人才輩出吶!
Precise RoI Pooling 和 RoI Align 類似,將 RoI 映射到特征圖以及劃分區(qū)域時(shí)都沒(méi)有量化操作,不同的是,Precise RoI Pooling 沒(méi)有再次劃分子區(qū)域,而是對(duì)每個(gè)區(qū)域計(jì)算積分后取均值來(lái)“代表”每個(gè)區(qū)域,因而不需要進(jìn)行采樣。

另外,由上述公式可知,區(qū)域內(nèi)的每點(diǎn)在反向傳播中對(duì)梯度都是有貢獻(xiàn)的,而對(duì) RoI Align 和 RoI Pooling 來(lái)說(shuō),只有區(qū)域內(nèi)最大值那點(diǎn)才對(duì)梯度有貢獻(xiàn),相當(dāng)于“浪費(fèi)”了大部分的點(diǎn)。
四、總結(jié)
以上操作的原理不難理解,很多人看完后或許都有這樣的feel——咦,挺簡(jiǎn)單的嘛!但是如果試著從代碼層面去實(shí)現(xiàn)的話或許就會(huì)發(fā)現(xiàn)不是那么容易了,特別是,要能應(yīng)用到生活場(chǎng)景中。這里我手?jǐn)]的 RoI Pooling 和 RoI Align 也僅是基于原理去實(shí)現(xiàn)的,用作學(xué)習(xí)參考,真正業(yè)界上應(yīng)用的通常是用C或C++實(shí)現(xiàn)和編譯的,純 py 的版本通常由于性能原因難以落地到工程中。另外,這里附上的 Precise RoI Pooling 源碼是原作者的版本,但是我使用時(shí)一直出現(xiàn)編譯錯(cuò)誤,各位大俠可以試試,如果有類似問(wèn)題或者解決方案希望可以和我一起探討,謝謝!?
源碼參考
https://www.cnblogs.com/wangyong/p/8523814.html
https://blog.csdn.net/m_buddy/article/details/85110124

深藍(lán)學(xué)院(https://www.shenlanxueyuan.com/) 是專注人工智能的在線教育?平臺(tái),致力于構(gòu)建前沿科技課程培養(yǎng)體系的業(yè)界標(biāo)準(zhǔn),涵蓋人工智能基礎(chǔ)、機(jī)器學(xué)習(xí)、計(jì)算機(jī)視覺(jué)、自然語(yǔ)言處理、智能機(jī)器人等領(lǐng)域。