畢慧敏,金鑫,周子寅,李忠蘭
(北京電子科技學院,北京 100070)
近年來,利用計算機神經網(wǎng)絡進行深度學習,將歷史灰度圖像和視頻進行著色還原,成為當下人工智能和神經網(wǎng)絡領域研究的熱點之一。國內外有關自動著色的研究和應用發(fā)展迅速。例如,Richard Zhang等[1]提出采用卷積神經網(wǎng)絡(Convolutional Neural Networks,CNN),把著色的回歸任務變成一個分類任務以處理著色時顏色空間的對應關系;Patricia Vitoria等[2]提出了采用生成對抗網(wǎng)絡(GAN)模型并結合圖像的語義信息對抗學習著色方法;2018年新華社聯(lián)合百度AI人工智能團隊開發(fā)了“給舊時光上色”的應用程序,用戶上傳灰度圖像可返回智能著色后的結果。2020年,百度AI開放平臺整合了圖像特效技術,將圖像著色以C++、Python、PHP等編程語言接口的形式向開發(fā)者提供,將各類圖像處理技術如灰度圖像著色、圖像風格轉換、圖像增強等以接口調用形式免費提供給用戶使用。但該程序對于上傳圖像的分辨率、大小和格式有著嚴格限制,在用戶使用時仍存在局限性。
針對灰度圖像和灰度視頻在當下的實際應用需求,本文采用了HistoryNet網(wǎng)絡結構進行進一步設計,實現(xiàn)了圖像與視頻智能著色模型的微信小程序前端,后端數(shù)據(jù)庫和接口編程,利用后端進行算法遠程調用,并將后端數(shù)據(jù)庫進行遠程部署,最終制作出基于深度學習的歷史灰度圖像、視頻自動著色系統(tǒng),前端、后端與算法分別部署,有效降低系統(tǒng)耦合,提高各個部分的內聚度,便于之后系統(tǒng)的擴展。該系統(tǒng)在灰度圖像、灰度視頻著色領域,歷史檔案研究和管理領域和藝術與審美等領域有較大價值。
著色是將合理、正確的顏色信息添加到灰度圖像或灰度視頻的過程。以前的黑白圖像著色方法依賴于人的手工注釋,并且經常產生不可稱為真正著色的去飽和結果。深度學習的著色方法是利用網(wǎng)絡中的生成器網(wǎng)絡和判別器網(wǎng)絡進行圖像著色的“博弈”。生成器用于生成著色圖像,判別器用于判定該著色圖像是否真實,即是否符合人的一般認識。最終生成器進行著色生成的圖像使得判別器無法區(qū)分其真實性時,即獲得了一個圖像著色的模型,使用該著色模型即可完成圖像著色。對于灰度視頻來說,可以看作是對多張連續(xù)的灰度圖像著色過程,即多次灰度圖像著色,因此掌握了灰度圖像的著色原理,利用視頻分幀和幀合成技術,就能實現(xiàn)灰度視頻的著色。如何讓計算機根據(jù)輸入灰度圖像對不同區(qū)域著色并返回正確結果,是深度學習自動著色領域研究的重點之一。
在過去的十多年中,根據(jù)對神經網(wǎng)絡的研究和改進,人們提出了幾種著色技術,可分為以下三類:基于涂鴉的方法、基于參考的方法和基于深度學習的方法。其中,前兩類基于用戶指導,第三個基于機器學習。對于基于涂鴉的方法,需要在待著色的灰度圖像上通過手工提供大量的涂鴉,費時費力;對于基于參考的方法來說,Deep Exemplar-based Colorization[3]論文第一次提出該方法,對比基于涂鴉的方法,該方法減少了人為干預的工作量,可以根據(jù)選擇的不同參考圖像對灰度圖像進行著色。然而著色質量很大程度上受到參考圖像影響,著色的結構一致性和可控性[4]把握度不強,因此在選擇一幅質量較差的參考圖像作為樣例的時候,著色效果明顯不好。若需要提高著色正確率,則需要列出參考樣例可能的所有結果,必須使用海量的樣例數(shù)據(jù),這樣就限制了該方法的著色效果。隨著深度學習的進步,許多研究使用CNN或GAN[5]來提取灰度圖片的信息以用于著色,這些方法往往實現(xiàn)了自然顏色匹配,但忽略了顏色分布的客觀事實。
本設計以HistoryNet神經網(wǎng)絡架構[6]實現(xiàn)圖像和視頻的著色功能,該網(wǎng)絡包含分類、細粒度語義解析和著色三個子網(wǎng)絡,其中分類子網(wǎng)絡負責將圖像按照年代、民族、服裝類型等進行分類;語義解析子網(wǎng)絡負責解析圖像中的人物輪廓、服裝和背景,生成語義分割幫助服裝和人物更準確地著色,并有效防止顏色溢出;在訓練過程中,將分類和語義解析融入到顏色生成網(wǎng)絡中,以此改善著色效果。結果顯示了該方法能夠實現(xiàn)逼真的圖像著色,尤其在一些語義信息比較明確的圖像,特別是軍裝和歷史圖像上,該網(wǎng)絡的處理效果是比較好的,顏色更加接近人們的常規(guī)認知。通過相關的定性和定量實驗比較,本文方法在PSNR、SSIM等方面都是效果最先進的著色網(wǎng)絡。
對于一幅圖像的著色來說,評價其著色好壞的標準可以分為定性評價和定量評價兩方面。
定性評價,可以看作一種主觀評價,是一種從人的認知角度對彩色圖像的評價。定量評價[7],指的是利用著色領域內常用的指標對圖像進行打分評價,主要通過PSNR(Peak Signal to Noise Ratio,峰值信噪比)和SSIM(Structural Similarity Index Measure,結構相似性)判斷著色效果的好壞。
(1)PSNR是一個工程術語,表示信號最大可能功率(峰值信號)與影響其表示精度的破壞性噪聲功率之比。由于許多信號都有非常廣的動態(tài)范圍,計算數(shù)值很大。故峰值信噪比通常取對數(shù),用分貝(dB)來表示。
計算方法如下:
MAXI表示單個圖像點顏色數(shù)量的最大值。MSE是真實值與預測值之差的平方再求算術平均值,根據(jù)上式,MSE越小,則表示預測值與真實值越接近,此時PSNR值越大;MSE越大則表示預測值與真實值差距越大,此時PSNR值越小。故判斷著色方法的好壞時,可以將原有的彩色圖像經過灰度化之后對其進行著色,著色圖與原彩色圖計算PSNR值,值越大表示效果越好,著色更理想。根據(jù)統(tǒng)計分析列出PSNR值對應的圖像著色好壞的判斷指標,如表1所示:
表1 PSNR值與圖像質量評價對應關系
(2)SSIM:SSIM[8]是一種衡量兩幅圖像相似度的指標。SSIM的度量方式:從亮度(Luminous)、對比度(Contrast)和結構(Structure)三方面度量圖像相似性。
在圖像對(X,Y)中,μX和μY分別表示圖像X和Y的均值,σX和σY分別表示圖像X和Y的方差,σXY表示圖像X和Y的協(xié)方差(圖像的數(shù)字特征計算以全圖像素點為對象整體進行計算)。
SSIM值越接近1,表示圖像相似程度越高,即著色圖像跟原圖之間的差距越小,相應的著色效果也越好,反之則越差。
結合上述著色評價指標,對于歷史人物照進行著色評價,圖1中人物圖像是算法測試樣例中綜合PSNR值和SSIM值,評價最高的一組圖像。直覺上看出右邊的著色圖和左邊原圖差距非常小,本文算法對人物軍裝和皮膚的著色非常逼真,符合歷史時期的真實狀況。
圖1 著色示意圖
如圖2所示,前端為用戶操作的微信小程序,設計常用的按鈕、界面;后端為用戶“不可見”的數(shù)據(jù)庫管理和路由管理部分,需要設計與前端以及著色算法處理相關的路由API和控制器方法,設計數(shù)據(jù)庫并能夠將數(shù)據(jù)通過接口以json格式返回并顯示;算法部分除了需要完成相應的圖像著色,還需要根據(jù)視頻著色需求做出適當調整,完成資源下載、上傳等。
圖2 系統(tǒng)示意圖
如圖3所示,前端部分主要采用首頁歡迎頁面、圖像著色頁面、視頻著色頁面,其中包括圖像、文字、按鈕等編排設計和顯示。
圖3 前端小程序頁面示意圖
歡迎頁面做出適當設計,以輪播圖展示作為小特效,同時在下方作為上傳圖像的顯示頁面。輪播圖部分采用圖像滾動播放,間隔為2s一張,其中的圖像左右拼接而成,左邊為灰度圖像,右邊為彩色圖像。
該部分使用GET方法,需要后端提供接口從數(shù)據(jù)庫中以json格式讀出作為圖像路徑地址在前端進行顯示。顯示時候將回傳的json格式數(shù)據(jù)中url字段單獨提取出來,可以通過IP地址、端口號和該url字段拼接為完整的圖像訪問地址,在界面部分即可顯示出來。同時顯示的圖像加入點擊跳轉功能,即點擊上傳的灰度圖像后,進入新頁面展示。在其中go(image_id)方法中增加了參數(shù)傳遞功能。將圖像id作為參數(shù)傳遞給跳轉到的頁面,即跳轉到的頁面是固定的,在跳轉頁面上顯示的內容需要根據(jù)點擊的圖像不同進行不同的顯示。在跳轉到的頁面中使用uni.request方法向數(shù)據(jù)庫發(fā)送get請求,得到圖像url并顯示,方法中的data部分對應的是上述go方法中傳遞參數(shù)的接收端,接收點擊跳轉傳遞的參數(shù)供顯示上傳的原圖和著色圖像。
其中,封裝好的uni.request方法參數(shù)設置如下表2所示:
表2 uni.request方法參數(shù)名及類型設置
3.3.1 數(shù)據(jù)庫設計
根據(jù)實際需求,設計中采用了MySQL數(shù)據(jù)庫,現(xiàn)階段暫時只需要兩張表分別存儲圖像和視頻信息,兩張表字段類似,在這里選擇圖像表image_info進行闡述,具體字段設置如表3所示:
表3 圖像著色數(shù)據(jù)庫字段設置
其中,上傳圖像后在數(shù)據(jù)庫中新建一行,圖像ID作為主碼定義一個圖像在數(shù)據(jù)庫中作為一行信息保存,存儲其上傳路徑供Python算法調用著色,同時設置圖像Is_color字段為“0”表示此時未著色,著色完成后需要將著色圖像保存,其路徑保存在據(jù)庫,路徑根據(jù)原圖像的主碼定位到數(shù)據(jù)庫其中一行,執(zhí)行插入操作將著色完成的圖像路徑插入到Image_color_url字段中。其余字段可以根據(jù)需求添加。
3.3.2 前端?后端接口設計
后端接口主要包括路由設計和控制器設計。在使用PHP的Laravel框架設計中,路由文件在routes目錄下給出,以PHP類的形式呈現(xiàn)給用戶,包括api、channels、console和web四類路由。后端過程中,web的路由由于需要進行CSRF保護檢查,對于前端連接和算法的連接非常不友好,甚至無法傳遞數(shù)據(jù)。故最后選擇api路由實現(xiàn)路由編寫。
如圖4所示,共設計8個路由,圖像視頻各4個,對應每一個操作分為圖像(Image)和視頻(Video)兩類,根據(jù)上傳資源是圖像還是視頻對應不同的路由,其中每一類路由完成操作基本相同??刂破魍酚膳涮资褂?,使用控制器類函數(shù)方法作為路由請求、路由處理和路由控制等行為??刂破髂軌驅⑾嚓P邏輯組成一個單獨的類??刂破鞅淮娣旁赼pp/Http/Controllers目錄下。下面將以圖像對應的路由和控制器為例說明各路由設計思路:
圖4 后端接口API設計示意圖
(1)ImageUpload路由:小程序端實現(xiàn)灰度圖像的上傳功能,使用POST請求,POST請求用于將數(shù)據(jù)發(fā)送到服務器來創(chuàng)建或更新資源,由于POST請求對數(shù)據(jù)長度和數(shù)據(jù)類型無限制,參數(shù)不會被保存在瀏覽器歷史或web服務器日志中,數(shù)據(jù)也不會顯示在URL中,因此POST適用于作為資源的上傳。路由為http://IP:port//api/uploadimage??刂破鞔a分為兩部分,一是獲取上傳文件,二是根據(jù)上傳的操作需要將獲取文件的相關字段存入數(shù)據(jù)庫中。利用PHP自帶的預定義數(shù)組$_FILES獲取通過POST方法上傳的文件并設定了存入數(shù)據(jù)庫的相關字段。例如圖像主碼為上傳名字和時間戳的MD5算法加密值,時間戳精確到秒。確保了每一次進行MD5算法加密后的字符串完全不同,確保了主碼的唯一性。
(2)ImageListController路由:顯示所有上傳的圖像使用GET請求實現(xiàn)將所有上傳圖像顯示的操作,GET請求是用于從指定資源請求數(shù)據(jù),即請求指定的頁面信息,并返回實體主體。路由地址為http://IP:port/api/imagelist??刂破鞑糠譃楹唵蔚臄?shù)據(jù)庫查詢操作,將內容以json格式顯示在頁面上供前端查詢使用即可。
(3)ImageListUncolorController路由:顯示所有未著色圖像,使用GET請求實現(xiàn)查詢尚未著色圖像操作,路由地址為http://IP:port/api/imagelist/uncolor,這里只需要使用is_color字段,查詢其中值為0部分即可。
3.3.3 后端算法交互
使用Python語言編寫同后端數(shù)據(jù)庫交互的請求函數(shù),然后從后端獲取圖像路徑,將圖像下載到指定文件夾,調用著色函數(shù)完成圖像著色,著色完成后將著色圖像上傳回服務器。
(1)獲取圖像路徑:后端已經編寫好負責傳遞未著色圖像的API接口,此時若存在未著色的圖像,應該是剛剛上傳上來的一張新圖像。利用Python中request包下面的request.get方法訪問上面的API接口,將request.get返回的json數(shù)據(jù)解碼為Python對應的utf-8格式。
(2)圖像下載:利用寫入文件函數(shù)file.write(),將圖像在服務器中的路徑、圖像名和后綴名提取出并寫入著色函數(shù)取得圖像的路徑。
(3)調用著色函數(shù)完成著色:調用Python與操作系統(tǒng)相關的庫os.system,將所給的字符串轉換為指令形式在機器上運行,即可以觸發(fā)指定位置的文件執(zhí)行。
(4)圖像上傳:上傳操作利用Python.request庫中包含的POST方法。給出上傳文件結構,包括文件路徑和打開方式(以二進制只讀方式打開),后端給出上傳接口即可完成上傳,并在后端接收到上傳文件。
算法感知后端動態(tài)變化:算法部分需要自動判斷是否有新的圖像上傳,采用最基本也是最簡單的輪詢(Polling)操作實現(xiàn)。即使用一個“死循環(huán)”while操作不斷判斷后端接口是否有新圖像上傳,若存在則進入上述的下載—著色—上傳操作,若無新圖像則一直等待即可。
3.4.1 圖像著色流程
如圖5所示,著色算法設計結構中,輸入和輸出部分設計為讀取文件夾中形式。在程序中,設算法讀取DATA文件夾下所有圖像,并將其作為輸入進行著色完成后輸出至OUT文件夾。因此設計自動著色方案時,特別增加了對文件和文件夾的操作,每一次下載一張圖像,著色完成后立即將其移動到TEMP文件夾下,確保每一次著色的時候,DATA文件夾里面有且只有此時上傳的圖像。若不進行移動操作,程序將會對DATA文件夾下所有文件進行著色,此操作可避免浪費系統(tǒng)資源。
圖5 圖像著色算法流程圖
3.4.2 視頻著色流程
如圖6所示,視頻著色原理[9]同圖像著色大同小異,即視頻著色相當于連續(xù)的圖像著色。通過對視頻進行分幀后再進行圖像的著色,隨后再將這些著色后圖像進行合成,本文合成視頻的時候進行了視頻幀之間顏色和內容的一致性處理,同時添加原音軌,確保音頻和視頻同步播放。
圖6 視頻著色算法流程圖
在圖像上傳頁面,選擇需要著色的圖片進行上傳,如圖7所示,上圖古代女子演奏樂器時的圖像,下圖為勞動人民工作后的休息場面,通過對真實歷史影像的著色對比后可以看出,本設計對歷史人物著色效果理想,能夠很好的還原人物皮膚和衣物、建筑的顏色。
圖7 圖像著色測試樣例(左:著色前,右:著色后)
(1)視頻分幀操作:讀取視頻并獲取視頻幀數(shù),按照一幀截圖一張的操作,將每一張圖像保存重命名并利用cv2.write函數(shù)寫入指定文件夾。根據(jù)視頻時長進行循環(huán)操作,需要將圖像按照數(shù)字順序保存,同時為了便于后面著色以及合成處理,圖像命名時統(tǒng)一按照6位數(shù)字命名,不足補零。即000001.jpg,000002.jpg……以此類推。根據(jù)計算機性能不同,處理一份24幀,時長3分鐘左右的視頻需要裁剪大概4000~5000張圖像,裁剪時間在3分鐘左右。
(2)控制臺顯示著色過程:調用模塊、計算本次著色圖像數(shù)量之后開始著色。如圖8所示,將視頻切分為連續(xù)幀進行著色,可以看到連續(xù)著色效果較穩(wěn)定,能夠較好還原歷史影像的狀態(tài)。
圖8 視頻連續(xù)幀著色測試樣例(上:著色前,下:著色后)
(3)視頻合成操作:由于分幀、著色過程對所有圖像不改變其長寬,故上述處理后所有圖像大小完全相同且在文件夾中圖像按照命名格式以序號排序,確保合成后的前后幀同原來相同。首先讀取第一張圖像作為第一幀,獲取圖像的長寬信息作為視頻的長寬,指定編碼格式(一般指定為mp4即可),根據(jù)分幀前原視頻的幀數(shù)確定合成時的幀數(shù),最后讀取文件夾下所有圖像,按照先后順序將圖像寫入創(chuàng)建好的視頻文件中即完成視頻合成。
分幀著色過程中,若不考慮幀與幀之間的關系,只對單幀進行著色,合成視頻后可能會出現(xiàn)由于丟失運動信息造成一定的閃爍情況,影響視頻的連貫性和一致性。為此,我們在視頻合成時進行幀間一致性處理[10],優(yōu)化合成視頻,使得著色后視頻在時間穩(wěn)定性和與處理幀的感知相似性之間取得平衡,提高著色后視頻的連貫性和完整性。
(4)視頻編碼與格式轉換:測試中,調用的視頻編碼模塊,編碼為內置的mpeg4文件,屬性如圖9所示:
圖9 mpeg4編碼結果
由于小程序調用HTML5頁面的video插件,該內置解碼器解碼得到的.mp4盡管可以在本地使用播放器播放,但是不支持HTML5頁面播放,故在小程序端無法播放視頻。經過詳細研究之后,使用Linux服務器端的FFmpeg函數(shù)操作對文件進行重新編碼[11],即生成的.mp4文件重新編碼,結果仍然為mp4文件,但是由于使用的編碼器不同,輸出的新文件可以在HTML頁面播放。編碼轉換后屬性如圖10所示。
圖10 H264編碼轉換后結果
(5)視頻與音頻合成:在分幀后,原視頻只留下單幀的若干張圖像,音頻部分(音軌)丟失。進行幀合成[12]的時候需要拼接出視頻音軌。方法是在分幀前將原視頻的音頻部分保存,合成幀的時候按照等幀率合成為著色后的視頻并將原來保存下來的音頻與合成后的視頻拼接成為完整的視頻文件,最后根據(jù)需要再調用視頻與音頻合成:在分幀后,原視頻只留下單幀的若干張圖像,音頻部分(音軌)丟失。進行幀合成的時候需要拼接出視頻音軌。方法是在分幀前將原視頻的音頻部分保存,合成幀的時候按照等幀率合成為著色后的視頻并將原來保存下來的音頻與合成后的視頻拼接成為完整的視頻文件,最后根據(jù)需要再調用。
本文利用HistoryNet算法作為歷史灰度圖像和視頻的著色算法,在此基礎上進一步設計了歷史圖像視頻著色的系統(tǒng),完成了一次全棧式開發(fā)。前端利用uni-app和微信小程序編寫顯示頁面供用戶交互,后端進行接口路由和API的編寫、后端數(shù)據(jù)庫設置和完善,再到前后端和算法之間利用接口進行通信連接,形成了前端、后端、算法之間接口的封裝。對前端、后端、算法分別進行部署,前端和后端運行在本機,算法部署在局域網(wǎng)下的服務器,利用網(wǎng)絡進行有效快速的通信以完成整個著色過程。實驗測試結果表明,本文系統(tǒng)實現(xiàn)了圖像和視頻的自動著色功能,前端界面設計對用戶操作要求低,使用便捷;前后端及算法的部署方式有利于降低系統(tǒng)耦合,提高各個部分的內聚度,有利于后續(xù)系統(tǒng)的擴展。