<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          深度學(xué)習(xí)論文精讀[1]:FCN全卷積網(wǎng)絡(luò)

          共 4857字,需瀏覽 10分鐘

           ·

          2022-07-05 00:30

          筆者最近在集中時(shí)間撰寫深度學(xué)習(xí)圖像分割一書,需要對語義分割眾多經(jīng)典論文進(jìn)行回顧和精讀。目前在寫第五章:基于U形結(jié)構(gòu)的網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì),從語義分割的開山之作FCN開始,重啟精讀之路。


          隨著CNN在圖像識別中取得巨大成功,一些經(jīng)典的圖像分類網(wǎng)絡(luò)(AlexNet、VGG、GoogLeNet、ResNet)也逐漸被應(yīng)用于更加細(xì)分的視覺任務(wù)中。很多研究者也在探索如何將分類網(wǎng)絡(luò)進(jìn)行改造后用于語義分割的密集預(yù)測問題(dense predictions)。在更高效的語義分割網(wǎng)絡(luò)提出之前,學(xué)術(shù)界用于密集預(yù)測任務(wù)的模型主要有以下幾個(gè)特點(diǎn):

          (1)小模型。早期的網(wǎng)絡(luò)結(jié)構(gòu)受限于數(shù)據(jù)量和高性能的計(jì)算資源,在設(shè)計(jì)上一般不會(huì)使用過大的模型。

          (2)分塊訓(xùn)練。分塊訓(xùn)練(patchwise training)在當(dāng)時(shí)是圖像訓(xùn)練的普遍做法,但該方法對于全卷積網(wǎng)絡(luò)的訓(xùn)練會(huì)顯得相對低效,但分塊訓(xùn)練的優(yōu)點(diǎn)在于能夠規(guī)避類別不均衡問題,并且能夠緩解密集分塊的空間相關(guān)性問題。

          (3)輸入移位與輸出交錯(cuò)。該方法可以視為一種輸入與輸出的變換方法,在OverFeat等結(jié)構(gòu)中被廣泛使用。

          (4)后處理。對于神經(jīng)網(wǎng)絡(luò)輸出質(zhì)量不高的問題,對輸出加后處理也是常見做法,常用的后處理方法包括超像素投影(superpixel projection)、隨機(jī)場正則化(random field regularization)和圖像濾波處理等。

          可以看到,早期用于目標(biāo)檢測、關(guān)鍵點(diǎn)預(yù)測和語義分割等密集預(yù)測問題整體來看有兩個(gè)缺陷,一是無法實(shí)現(xiàn)端到端(end-to-end)的流程,模型整體效率不佳;第二個(gè)則是不能做到真正的密集預(yù)測的特征:像素到像素(pixels-to-pixels)的預(yù)測。

          全卷積網(wǎng)絡(luò)(Fully Convolutional Networks, FCN)的提出,正好可以解決早期網(wǎng)絡(luò)結(jié)構(gòu)普遍存在的上述兩個(gè)缺陷。FCN在2015年的一篇論文Fully Convolutional Networks for Semantic Segmentation中提出,其主要思路在于用卷積層代替此前分類網(wǎng)絡(luò)中的全連接層,將全連接層的語義標(biāo)簽輸出改為卷積層的語義熱圖(heatmap)輸出,再結(jié)合上采樣技術(shù)實(shí)現(xiàn)像素到像素的密集預(yù)測。如下圖所示,上圖為常見分類網(wǎng)絡(luò)的流程,在五層卷積網(wǎng)絡(luò)之后有三層全連接網(wǎng)絡(luò),最后輸出一個(gè)包含類別語義信息的輸出概率;下圖為FCN網(wǎng)絡(luò)流程,在上圖分類網(wǎng)絡(luò)的基礎(chǔ)上,將最后三層全連接層改為卷積層,輸出也相應(yīng)的變?yōu)榉诸愵A(yù)測的熱圖,這樣就為了最后的像素級的密集預(yù)測提供了基礎(chǔ)。

          所以,F(xiàn)CN實(shí)現(xiàn)密集預(yù)測的關(guān)鍵在于修改全連接層為卷積層,那么具體是如何修改的呢?先來詳細(xì)分析一下的卷積層和全連接層的特征。卷積層與全連接層最大的區(qū)別在于卷積層每次計(jì)算時(shí)只與輸入圖像中一個(gè)具體的局部做運(yùn)算,但二者都是做點(diǎn)積計(jì)算,其函數(shù)形式是類似的。假設(shè)給定在指定網(wǎng)絡(luò)層任意坐標(biāo)點(diǎn)(i,j)的數(shù)據(jù)向量Xij,而下一層對應(yīng)坐標(biāo)點(diǎn)的數(shù)據(jù)向量為Yij,有:

          其中為卷積核大小或者權(quán)重向量長度,s為步長(stride),而f_ks則表示當(dāng)前層到下一層的映射函數(shù),f_ks既可以表示為卷積層又可以表示為全連接層,所以二者之間的轉(zhuǎn)換是有理論基礎(chǔ)的。將全連接層修改為卷積層,從實(shí)際操作上來看是容易的,以VGG16中第一個(gè)全連接層25088x4096尺寸為例,現(xiàn)將其轉(zhuǎn)化為512x7x7x4096大小的卷積層,即輸入大小為7x7x512,卷積核為512個(gè)77大小的卷積核,通道數(shù)為4096,相應(yīng)的輸出大小為1x1x4096。在PyTorch中測試全連接層與卷積層的轉(zhuǎn)換,如下代碼所示。

          # 導(dǎo)入PyTorch庫import torchfrom torch import nn# 指定輸入向量x = torch.rand(25088,)# 定義全連接層fc = nn.Linear(25088, 4096)# 定義卷積層conv2d = nn.Conv2d(512, 4096, 7)# 輸出全連接層計(jì)算fc_output = fc(x)print(fc_output.size())# 輸入向量變換x = torch.reshape(x, (1, 512, 7, 7))# 數(shù)據(jù)卷積層計(jì)算conv_output = conv2d(x)print(conv_output.size())

          輸出為:

          torch.Size([4096])torch.Size([1, 4096, 1, 1])

          代碼中分別創(chuàng)建了一個(gè)具有轉(zhuǎn)換關(guān)系的全連接層和卷積層,在給定同樣輸入大小的條件下,二者的輸出大小是一致的。

          FCN分別在AlexNet、VGG和GoogLeNet上進(jìn)行了全連接層轉(zhuǎn)卷積層的修改,通過實(shí)驗(yàn)發(fā)現(xiàn)以VGG16作為主干網(wǎng)絡(luò)效果最好,完整的FCN結(jié)構(gòu)如下圖所示,第一行最左邊為原始輸入圖像,圖像尺寸為32x32,conv為卷積層,pool為池化層,可以注意到conv6-7是最后的卷積層,此時(shí)得到的密集預(yù)測熱圖尺寸為輸入圖像的1/32,為了實(shí)現(xiàn)像素到像素的預(yù)測,還需要對熱圖進(jìn)行上采樣,F(xiàn)CN采用雙線性插值(bilinear interpolation)進(jìn)行上采樣,所以這里需要將熱圖上采樣32倍來恢復(fù)到原始圖像的尺寸,因而第一行的網(wǎng)絡(luò)結(jié)構(gòu)也叫FCN-32s。直接進(jìn)行32倍上采樣得到的輸出無疑是較為粗糙的,為了提高像素預(yù)測質(zhì)量,F(xiàn)CN又分別有FCN-16s和FCN-8s的改進(jìn)版本。圖中第二行即為FCN-16s,主要區(qū)別在于先將conv7(1x1)的輸出熱圖進(jìn)行2倍上采樣,然后將其與pool4(2x2)進(jìn)行融合,最后對融合后的結(jié)果進(jìn)行16倍上采樣得到最終預(yù)測結(jié)果,同理FCN-8s將pool3(4x4)、2倍上采樣后的pool4(4x4)以及4倍上采樣的conv7(4x4)進(jìn)行融合,最后再進(jìn)行8倍的上采樣得到語義分割圖像。

          所以,從FCN-32s到FCN-8s,其實(shí)一種粗分割到精細(xì)分割的演變過程,F(xiàn)CN通過融合淺層圖像特征和深層卷積熱圖的方式來得到當(dāng)時(shí)的SOTA(State of the art)水平的語義分割模型。下圖是FCN-32s、FCN-16s和FCN-8s在同一張圖像上的分割效果,與分割的標(biāo)準(zhǔn)圖像(Ground truth)相比,可以看到三個(gè)模型的分割精度是在不斷優(yōu)化的。


          下方代碼給出FCN-8s的一個(gè)PyTorch簡略實(shí)現(xiàn)方式,便于讀者加深對FCN的理解。代碼中對于卷積下采樣使用了VGG16的預(yù)訓(xùn)練權(quán)重,分別構(gòu)建了四個(gè)特征提取模塊、一個(gè)卷積塊和三個(gè)獨(dú)立的卷積層。在前向傳播流程中,將conv7、pool3和pool4進(jìn)行融合,最后再做8倍的雙線性插值上采樣。

          # 導(dǎo)入PyTorch相關(guān)模塊import torchimport torch.nn as nnimport torch.nn.functional as Ffrom torchvision import models
          ### 定義FCN-8s模型類class FCN8(nn.Module): def __init__(self, num_classes): super().__init__() # 提取VGG16預(yù)訓(xùn)練權(quán)重作為特征 feats =list(models.vgg16(pretrained=True).features.children()) # 取前9層為第一特征模塊 self.feat1 = nn.Sequential(*feats[0:9]) # 取第10-15層為第二特征模塊 self.feat2 = nn.Sequential(*feats[10:16]) # 取第16-22層為第三特征模塊 self.feat3 = nn.Sequential(*feats[17:23]) # 取后6層為第四特征模塊 self.feat4 = nn.Sequential(*feats[24:30]) # 卷積層權(quán)重不參與訓(xùn)練更新 for m in self.modules(): if isinstance(m, nn.Conv2d): m.requires_grad = False # 定義卷積塊 self.conv_blocks = nn.Sequential( nn.Conv2d(512, 4096, 7), nn.ReLU(inplace=True), nn.Dropout(), nn.Conv2d(4096, 4096, 1), nn.ReLU(inplace=True), nn.Dropout(), ) # 改最后三層的全連接層為卷積層 self.conv1 = nn.Conv2d(256, num_classes, 1) self.conv2 = nn.Conv2d(512, num_classes, 1) self.conv3 = nn.Conv2d(4096, num_classes, 1)
          ### 定義前向計(jì)算流程 def forward(self, x): feat1 = self.feat1(x) feat2 = self.feat2(feat1) feat3 = self.feat3(feat2) feat4 = self.feat4(feat3) conv_blocks = self.conv_blocks(feat4)
          conv1 = self.conv1(feat2) conv2 = self.conv2(feat3) conv3 = self.conv3(conv_blocks) outputs = F.upsample_bilinear(conv_blocks, conv2.size()[2:]) # 第一次融合 outputs += conv2 outputs = F.upsample_bilinear(outputs, conv1.size()[2:]) # 第二次融合 outputs += conv1        return F.upsample_bilinear(outputs, x.size()[2:]) 


          FCN是深度學(xué)習(xí)語義分割網(wǎng)絡(luò)的開山之作,在結(jié)構(gòu)設(shè)計(jì)上率先將全卷積網(wǎng)絡(luò)用于深度學(xué)習(xí)語義分割任務(wù),在經(jīng)典分類網(wǎng)絡(luò)的基礎(chǔ)上實(shí)現(xiàn)了像素到像素和端到端的分割。FCN整體上已具備編解碼架構(gòu)的U形網(wǎng)絡(luò)雛形,為后續(xù)的網(wǎng)絡(luò)設(shè)計(jì)開創(chuàng)了堅(jiān)實(shí)的基礎(chǔ)。

          往期精彩:

           講解視頻來了!機(jī)器學(xué)習(xí) 公式推導(dǎo)與代碼實(shí)現(xiàn)開錄!

           完結(jié)!《機(jī)器學(xué)習(xí) 公式推導(dǎo)與代碼實(shí)現(xiàn)》全書1-26章PPT下載

          《機(jī)器學(xué)習(xí) 公式推導(dǎo)與代碼實(shí)現(xiàn)》隨書PPT示例

           時(shí)隔一年!深度學(xué)習(xí)語義分割理論與代碼實(shí)踐指南.pdf第二版來了!

           新書首發(fā) | 《機(jī)器學(xué)習(xí) 公式推導(dǎo)與代碼實(shí)現(xiàn)》正式出版!


          瀏覽 94
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久免费三级片网站 | 欧美一级黄色丝袜大片免费 | AV天堂9 | 你懂的在线网站 | 国产三级电影久久 |