基於神經網絡的顏色恆常性—Fully Convolutional Color Constancy with Confidence-weighted Pooling

 論文地址:html

http://openaccess.thecvf.com/content_cvpr_2017/papers/Hu_FC4_Fully_Convolutional_CVPR_2017_paper.pdfpython

源代碼(Python):git

https://github.com/yuanming-hu/fc4github

 

1、    任務描述網絡

網絡的主要目的是可以對偏色的圖片估計光源,從而移除偏色,恢復圖片真實顏色。爲知足此類網絡訓練要求,須要數據集中不只包括圖片且須要提供圖片的真實光源數據。架構

 

2、    數據集框架

解釋網絡原理前,先下載數據集並瞭解數據集,有助於後面原理的理解python2.7

數據集(Shi's Re-processing of Gehler's Raw Dataset):工具

http://www.cs.sfu.ca/~colour/data/shi_gehler/學習

下載的文件包括:

png_canon1d.zip

png_canon5d_1.zip

png_canon5d_2.zip

png_canon5d_3.zip

groundtruth_568.zip;

其中,前四個文件夾中是圖片,最後一個文件夾中包括對應圖片的光照數據。

下載後,將全部圖片放入一個文件夾中,一共有568張圖片

注:568張圖片是16位RAW圖像,電腦圖片查看工具通常是8位的,因此顯示純黑

 

利用Python代碼進行圖片格式轉換(訓練時中並不須要此步驟),能夠看到圖片真實效果(藉助下載文件中保存了真實光源文件real_illum_568.mat),效果以下圖(8D5U5525.png):

               

                 (16bit RAW原圖)                                                  (8bit 圖)

 代碼以下:

 

3、    網絡原理

  先看整個網絡的結構圖:

 

1) 網絡結構:

   論文使用全卷積網絡,代替了全鏈接層,能夠接受任意圖像尺寸的輸入 ,固然,訓練時,輸入仍是須要歸一化到大體至關的尺寸,保持統一尺度。同時,代碼中使用SqueezeNet網絡代替AlexNet網絡,相較於AlexNet網絡,SqueezeNet更輕量級,在保持同等分類精準率的前提下,模型參數縮小了50部。

 

2)輸入圖片

    從上述網絡框架圖中看到輸入圖片‘input image’的w和h,並非原始圖片的大小,在此項目中w*h=512*512,即一個patch。

而512*512輸入圖片的產生原理:選擇邊長比例爲【0.1~1】範圍內隨機值乘以原始圖像的較短邊,以此大小生成正方形裁剪框;以【-30°~+30°】範圍內隨機的角度值旋轉原始圖像,接着,從上述旋轉操做結束後獲得的圖像中隨機選擇一點做爲該方形裁剪框的左上角並開始裁剪,調整裁剪下來的圖片大小到512*512。爲了加強數據效果,512*512的圖片可進行隨機的上、下和左、右翻轉,且,利用【0.6~1.4】中隨機值調整圖片RGB值及其光照信息(基於原始光照ground truth值),這樣即完成了數據預處理工做,獲得輸入圖片。

注:上述中涉及的數值都可在源代碼文件config.py中進行動態設置

 

3)架構解析

   首先,能夠在ImageNet上預訓練SqueezeNet,而對於分類做用的SqueezeNet網絡提取到的是圖片的語義信息,且光照不敏感的;論文中對網絡結構進行改造,使用SqueezeNet的前5層卷積層,即輸入的結構是:512*512*3,通過SqueezeNet的5層卷積層後獲得的結構是:15*15*512;而語義信息會做爲區分不一樣照度的置信權重,語義信息越多的,可認爲其權重越大,越能影響決定最終光照。

  接着,通過conv6和conv7兩個卷積層降維後,結構變成:15*15*4;假設這樣規定:通過conv7後獲得的4通道數據中包括照明估計的三個顏色通道,第四通道爲置信度權重c.

  至此,能夠看出FC4採用了一種選擇機制,選擇圖像中的哪些色塊用於估計,避免語義不明確的色塊影響照度估計;網絡中採用更大的帶有更多的語義patch(以往論文中大可能是32*32大小的patch),利用FC網絡共享特性將局部估計結合到全局中,同時,利用置信度權重,能夠將監督信號僅派發給訓練期間具備語義的區域;簡單來講:就是先估計全部局部區域的光源,接着聚合全部局部區域的光源信息造成最終結果。注:局部區域並非一個patch,是其子集

  若是但願預測的精度越高,則能夠提供更多的patch,其覆蓋率越高,精度天然也會更高,但效率會變低。

 

4)損失值計算

首先,先看下如何計算網絡獲得光源估計值,參照論文中的公式:

     

      patch的照度估計值   

     :Ri區域的權重值

    :Ri區域的照度估計值

補充,基於上述公式的特色,源代碼中conv7提供了兩種結構方案:

①    conv7:1*1*3,直接只輸出非標準化的R,G,B,並簡單地取和和歸一化,使用長度進行加權計算。

②    conv7:1*1*4,輸出歸一化的RGB顏色通道和權重通道,如同上面公式中進行加權求和。

    若是假設真實光照值,則計算損失值的公式以下:

  

 

經過不斷地迭代訓練,優化損失值,得出最終照度估計值,做用於輸入圖片上,即完成了網絡的目的,獲得‘去偏色’圖片。

 

4、    網絡復現

1) 復現SqueezeNet

做者提供了SqueezeNet在ImageNet上預訓練的模型文件model.pkl,版本是python2.7的,若是您的環境也是如此,則不須要復現SqueezeNet,若是不是,能夠按照下面步驟進行復現

Github: https://github.com/DeepScale/SqueezeNet

SqueezeNet網絡Caffe版本的地址,能夠下載進行訓練,其復現方式能夠參考https://www.cnblogs.com/wangyong/p/8616939.html,這裏就省略具體過程了。

訓練結束後,能夠獲得後綴爲.caffemodel的模型文件,依據源代碼中需求將.caffemodel文件轉換爲.pkl文件,python代碼以下:

將生成的squeeze_net.pkl替換源代碼中的data/squeeze_net文件夾下的model.pkl

 

2)   圖片預處理

數據集是一共568張RAW格式的圖片,附帶每張圖片的真實光源信息,同時,在下載的源代碼中,還有每張圖片中的Macbeth Color Checker(顏色檢查器)的座標信息文件。

做者將568張圖片分紅了三批,以進行三重交叉驗證,加強網絡訓練效果,其中:

第一批:189張圖片

第二批:191張圖片

第三批:188張圖片

由於FCN網絡會學習到圖片中的顏色信息做爲語義來影響照度估計,因此,須要將圖片中顏色豐富的color checker去掉以避免干擾結果,做者的作法是根據color checker的座標信息,將其位置處像素置黑,去除干擾。

最後,生成三個後綴爲.pkl的文件,關於細節能夠參看源代碼文件datasets.py

 

3) 訓練和測試網絡

依據做者在Github上的說明,能夠按照其步驟進行訓練和測試;下面是我測試出來的圖片效果,復現了僅有三個輸出類別的SuqeezeNet網絡

 

做爲一枚技術小白,寫這篇筆記的時候參考了不少博客論文,在這裏表示感謝,同時,轉載請註明出處......

相關文章
相關標籤/搜索