厲旭杰, 王怡婷
(溫州大學計算機與人工智能學院,浙江溫州325035)
圖像重新著色方法是指調整和修改圖像的顏色外觀的處理過程[1-2]。Photoshop軟件專門提供了一個“顏色替換”工具用于圖像重新著色,但是該方法需要用戶手工設置“顏色容差”參數來選取需要重新著色的區域,因此用戶通常需要不斷調整“顏色容差”參數,這種方法消耗大量的時間。為了提高計算機輔助設計的效率,減少設計師的勞動時間,改善重新著色技術的效果,Reinhard等[3]提出了一種基于色彩遷移的圖像重新著色方法,該方法在目標圖像和參考圖像之間建立一種映射關系,從而把目標圖像重新著色成和參考圖像具有相似的顏色外觀,但該方法的效果嚴重依賴于參考圖像的選取。Huang等[4]提出了一種數據驅動的方法,從數據庫中自動尋找匹配的參考圖像,用于自動對照片進行重新著色,以增強照片的外觀或改變觀眾對照片的情緒反應。對于一個新的輸入圖像,該方法可以生成多個重新著色的結果供用戶選擇,但是該方法需要和數據庫中的圖片逐一進行特征匹配,消耗大量的時間。Li等[5]利用用戶輸入著色線條,提出了基于最優化模型的圖像重新著色方法,該方法根據提出的特征相量查找每個像素的最近鄰域,通過鄰域像素把著色線條的顏色值擴散到整個圖像。該方法很好地加入了用戶的交互,同時能獲得高質量的圖像重新著色效果,但是該方法需要求解大型的稀疏矩陣,因此需要消耗大量的內存。當圖像尺寸達到一定程度,該方法甚至不能獲得想要的圖像重新著色效果,而且這類方法通常比較耗時。最近幾年,基于神經網絡的圖像編輯方法被大量的研究,特別是卷積神經網絡得到了廣泛的使用[6-9]。文獻[10-11]中利用卷積神經網絡,自動進行圖像重新著色,但是目前這類方法均采用圖像級的樣本作為卷積神經網絡的訓練樣本,而訓練神經網絡通常需要消耗幾小時甚至幾天的時間。本文提出了一種基于全連接神經網絡(FNN)的單個圖像重新著色方法。該方法提取著色線條所在區域的像素RGB顏色特征值和相應的著色線條分類為數據集,該方法把FNN作為一個像素級的多分類神經網絡,避免了神經網絡在訓練階段需要大規模的訓練樣本的弊端,且能夠達到近實時的交互性能,同時用戶只需要輸入少量的用戶著色線條,就能獲得高質量的圖像重新著色效果。
FNN模型見圖1。圖像重新著色分類全連接神經網絡除了輸入層和輸出層外,中間還有3個隱藏層。輸入層的輸入為著色線條所在區域的像素的RGB顏色值,隱藏層1為第1個全連接層,隱藏層1的神經元個數為64,將輸入層a0乘以權重W1并加上偏置b1,然后加上ReLU激活函數,得到a1;同理,隱藏層2和隱藏層3為第2個全連接層和第3個全連接層,隱藏層2和隱藏層3的神經元個數均為128,得到隱藏層2的輸出a2和隱藏層3的輸出a3,用公式表示為:

圖1 用于圖像重新著色的全連接神經網絡模型

式中:W1∈R3×64;W2∈R64×128;W1∈R128×128;b1∈R64;b2∈R128;b3∈R128。
最后一層輸出層也為全連接層,不同的是激活函數采用softmax函數,得到:

式中:W4∈R128×K;b4∈RK;K 為著色線條的種類。
提取著色線條所在區域的像素RGB顏色值和相應的涂色線條分類為數據集,為了減少神經網絡的訓練時間,對數據集進行隨機采樣。本文中把FNN作為一個像素級的分類神經網絡,把色線條所在區域的像素RGB顏色值作為神經網絡的輸入,用FNN來做分類,輸出每個像素點屬于哪類著色線條的分類。
訓練樣本經過FNN的輸出和真實的訓練樣本輸出之間的損失函數如下:

式中:i,k為索引值;M為訓練樣本的數量;K為著色線條的種類數量;L為交叉熵損失函數;ai為第i個訓練樣本在softmax層的未激活的輸出;yi為訓練集中第i個訓練樣本的分類向量,向量中目標分類yik等于1,其他分類yik等于0;y′ik為softmax的輸出,計算了第i個訓練樣本預測為屬于分類k的似然概率,

對損失函數E進行優化求最小化的極值,可以獲得FNN的參數,本方法采用mini-batch Adam優化算法來訓練深度學習神經網絡。
用chainer深度學習框架實現全連接網絡模型的算法如下:
class colormodel(Chain):
def__init__(self,K,channel=3):
super(colormodel,self).__init__()
with self.init_scope():
self.l1color = L.Linear(channel,64)
self.l2color = L.Linear(64,128)
self.l3color = L.Linear(128,128)
self.lf = L.Linear(128,K)
def forward(self,x,c,xc):
hcolor = F.relu(self.l1color(c))
hcolor = F.relu(self.l2color(hcolor))
hcolor = F.relu(self.l3color(hcolor))
y = self.lf(hcolor)
return y
神經網絡的softmax層輸出了每個樣本屬于著色線條的似然概率,最終的圖像重新著色結果計算如下:

式中:i為像素索引值;K為著色線條的種類數量;P′ik為第i個樣本預測為屬于分類k的似然概率;Sk為第k種著色線條的顏色值,當著色線條為特殊白色著色線條時,Sk的值為著色線條覆蓋像素下圖像原來的顏色值;C為最終的圖像重新著色結果。
本算法使用python 3.7和chainer 5.3.0庫實現了基于神經網絡的單個圖像重新著色方法,所有實驗都是在NVIDIA GeForce RTX 2080 Ti GPU和Intel I9-7900X CPU的機器上進行的。采用著色線條所在區域的像素為訓練樣本,但是訓練神經網絡仍然需要十幾s,為了減少訓練時間,獲得近實時的效果,對訓練數據進行了隨機采樣,采樣率為β。本文研究了采樣率和神經網絡的迭代次數t對圖像重新著色效果的影響。圖2比較了β和迭代次數t對圖像重新著色效果的影響,當β=0.1,t=2時,圖像重新著色效果幾乎收斂。較高的β和t不會產生明顯更好的重新著色效果。實驗中,通常10%的用戶筆畫像素β=0.1足以訓練本文的神經網絡用于圖像重新著色。因此,本文算法設置β =0.1,t=2。

圖2 采樣率β和迭代次數t對圖像重新著色效果的影響

圖3 本方法與目前主流的圖像重新著色方法效果對比圖
圖3比較了本方法與主流的重新著色方法DeepProp[12]、全局最優化方法[13]和局部最優化方法[14]效果對比結果,白色筆畫表示圖像重新著色后該區域顏色應保持不變,而其他顏色筆畫表示圖像重新著色后的最終顏色。從圖中可以看出,局部最優化和全局最優化方法都有各自的局限性。局部最優化方法只考慮局部窗口內的局部空間鄰域傳播。局部圖像方法為用戶提供了良好的局部控制,但當對提供的顏色約束進行相對較遠的重新著色時,這種方法的性能較差。因此,他們的方法需要加入更多的用戶交互來實現高質量的結果。全局最優化方法可以實現全局顏色傳播,用戶只需要輸入少量的著色線條就可以產生高質量的圖像重新著色效果,但是該方法需要消耗很大的內存,當圖像達到一定的尺寸,甚至無法產生正確的結果。DeepProp采用卷積神經神經網絡來產生圖像重新著色效果,但是由于使用圖像補丁作為特征向量,DeepProp在重新著色的邊緣附近會失去精度[15],需要采用邊緣保持濾波器[16]對圖像重新著色的結果進行進一步完善,以提高圖像重新著色的質量。本方法只需要輸入少量的用戶重新著色線條就可以產生高質量的圖像重新著色效果,后期無需進行完善步驟;同時由于只提取了著色線條所在區域的像素RGB顏色特征值和相應的著色線條分類為數據集,并提出了一種有效的采樣策略,使得神經網絡的訓練達到了近實時的性能,采用mini-batch批量訓練,對內存的消耗也很小。
為了測試本方法的運行效率,表1顯示了圖3中3組圖像的運行時間,第2列顯示了著色線條像素點個數,第4列顯示了本方法運行時間。從表1中可以看出,因為本方法僅僅利用涂色線條所在區域的像素RGB顏色特征值和相應的涂色線條分類為訓練集,并采用了有效的采樣策略;從而大大減少了神經網絡訓練的時間和內存要求,只需要1~2 s的時間就能完成圖像重新著色。

表1 本方法運行效率(β =0.1,t=2)
本文提出了一種基于FNN的單個圖像重新著色方法。該方法僅需要用戶在待重新著色圖像上輸入少量的著色線條,然后提取著色線條所在區域的像素RGB顏色特征值和相應的著色線條分類為數據集,避免了神經網絡在訓練階段需要大規模的訓練樣本的弊端,從而能達到近實時的交互性能,同時用戶只需要輸入少量的用戶著色線條,就能獲得高質量的圖像重新著色效果。本文提出的算法簡單,可以達到近實時的交互性能,特別適合應用在人工智能相關課程中。