選自GitHub
作者:Jason Antic
機器之心編譯
參與:路、張倩
本文介紹了一個舊照片著色&修復神器DeOldify,包括修復效果、技術細節等。
項目地址:https://github.com/jantic/DeOldify/blob/master/README.md
該項目的目的是為舊照片著色並將其修復。本文將簡要介紹技術細節。首先,先來看一下 DeOldify 對舊照片的修復效果!(大部分原圖像來自 r/TheWayWeWere subreddit。)
和人體骨骼一起拍照的醫學生(約 1890 年)
Whirling Horse(1898)
19 世紀 80 年代的巴黎
20 世紀 20 年代的愛丁堡俯瞰
倫敦滑鐵盧車站人們第一次看到電視機(1936)
抽鴉片的大清子民(1880)
非常舊和質量差的照片也能修復得很好:
南達科他州枯木鎮(1877)
家庭合照(1877)
但,模型效果並不總是完美的。下圖中紅手讓人抓狂:
塞內卡原住民(1908)
該模型還能對黑白線稿進行著色:
技術細節
這是一個基於深度學習的模型。具體來說,我所做的是將以下方法組合在一起:
帶自注意力機制的生成對抗網絡。生成器是一個預訓練 Unet,我將它修改為具有光譜歸一化和自注意力。這是一個非常簡單的轉換過程。不過,之前我拼命地嘗試用 Wasserstein GAN,但效果並不好,直到用上這個版本,一切都變了。我喜歡 Wasserstein GAN 的理念,但它在實踐中並沒有成功。我愛上了帶自注意力的 GAN。
受 GAN Progressive Growing 的啟發(參見《Progressive Growing of GANs for Improved Quality, Stability, and Variation》)設計出的訓練結構。不同之處在於層數保持不變——我只是不斷改變輸入的尺寸並調整學習率,以確保尺寸之間的轉換順利進行。似乎基本最終結果是相同的——訓練更快、更穩定,且泛化效果更好。兩個時間尺度上的更新規則(參見《GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium》)。這個也非常簡單,只是一個一對一生成器/critic 迭代及較高級別的 critic 學習率。生成器損失分為兩個部分:一部分是基於 VGG16 的基本感知損失(或特徵損失)——這只是偏向生成器模型來複製輸入圖像。另一部分是來自 critic 的損失分數。感知損失本身不足以產生好的結果,只會帶來大量的棕色/綠色/藍色填充——測試的時候作弊可是神經網絡的強項!這裡要理解的重點是:GAN 本質上是在為你學習損失函數——這實際上是朝著我們在機器學習中追求的理想邁進了一大步。當然,讓機器學習你以前手工編碼的東西通常會得到更好的結果。在這個例子中就是這樣。
該模型的美妙之處在於,它可能適用於所有類型的圖像修復,效果也應該很好。上文展示了很多模型結果,但這只是我想開發的流程的一個組件。
接下來,我想做的是「defade」模型。我已經做了一些初步努力,截至本文寫作時,它還在訓練階段。大體上,是訓練同樣的模型用於重建使用過分的對比度/亮度調整後的圖像。我已經看到了一些還不錯的試驗結果:
關於該項目
該項目的重點是:我想利用 GAN 使舊照片變得好看,更重要的是,做一個有用的項目。我對視頻很感興趣,但是首先我需要先解決如何處理模型和內存的關係。如果該模型在 1080TI 上的訓練時間不用花費兩三天就太棒了(然而 GAN 通常需要這麼長時間……)我將積極更新和改進代碼,並嘗試使該項目對用戶友好。
開始操作
該項目基於 Fast.AI 庫構建。不過,我使用的是舊版本庫,即將更新為新版本。構建該項目的先決條件是:
舊版本 Fast.AI 庫。埋頭該項目兩個月後,我有點疑惑,因為標註為「old」的舊版本 Fast.AI 庫和我用的庫不一樣。因此建議使用這裡的庫:https://github.com/jantic/fastai。不管 Fast.AI 的依賴項是什麼,總有方便的 requirements.txt 和 environment.yml。Pytorch 0.4.1(需要 spectral_norm,因此需要最新的穩定版本)。Jupyter LabTensorboard(即安裝 Tensorflow)和 TensorboardX (https://github.com/lanpa/tensorboardX)。ImageNet:很棒的訓練數據集。強大的 GPU:我想要比 GeForce 1080TI (11GB) 更大內存的 GPU。內存越少花費時間就會越多。Unet 和 Critic 非常大,但是它們規模越大,獲得的結果也會越好。
至於想要立刻開始轉換自己的圖像的人:如果要立刻開始使用自己的圖像而不訓練模型的話,你需要我上傳預訓練權重。我正在做這件事。做好之後,你可以在可視化 notebook 中看到。我將使用 ColorizationVisualization.ipynb。你需要設置 colorizer_path = IMAGENET.parent/('bwc_rc_gen_192.h5')。我上傳的權重文件用於生成器(著色器)。
然後你就可以把想轉換的任意圖像放在/test_images/文件夾,然後在 notebook 內部看到結果:
vis.plot_transformed_image("test_images/derp.jpg", netG, md.val_ds, tfms=x_tfms, sz=500)
我把圖像大小設置為 500px 左右,你需要在足夠內存的 GPU 上運行(比如 11 GB GeForce 1080Ti)。如果內存過少,你需要將圖像調小或者嘗試在 CPU 上運行模型。我試過後一種方法,非常慢……我還沒有研究具體原因。
本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。