1. 程式人生 > >Fully Convolutional Color Constancy with Confidence-weighted Pooling—基於置信度加權池的全卷積顏色恒常性

Fully Convolutional Color Constancy with Confidence-weighted Pooling—基於置信度加權池的全卷積顏色恒常性

像素 ces squeeze 博客 旋轉 驗證 長度 類別 說明

論文地址:

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

源代碼(Python):

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

一、 任務描述

網絡的主要目的是能夠對偏色的圖片估計光源,從而移除偏色,恢復圖片真實顏色。為滿足此類網絡訓練要求,需要數據集中不僅包括圖片且需要提供圖片的真實光源數據。

二、 數據集

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

數據集(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 圖)

代碼如下:

技術分享圖片

三、 網絡原理

先看整個網絡的結構圖:

技術分享圖片

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顏色通道和權重通道,如同上面公式中進行加權求和。

如果假設真實光照值技術分享圖片,則計算損失值的公式如下:

技術分享圖片

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

四、 網絡復現

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網絡

技術分享圖片

技術分享圖片

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

Fully Convolutional Color Constancy with Confidence-weighted Pooling—基於置信度加權池的全卷積顏色恒常性