Bringing-Old-Photos-Back-to-Life
Bringing-Old-Photos-Back-to-Life項目簡介
最近在公衆號看到有關Bringing-Old-Photos-Back-to-Life的內容,以爲頗有意思,能夠將模糊的,褶皺的照片相應的還原,
重拾舊時光的回憶,因此本身嘗試一下。
python
這個開源的項目在github上能夠找到,這裏給出項目地址Bringing-Old-Photos-Back-to-Life。這個項目是有關於模糊,褶皺照片的修復的算法,是基於2020微軟最新的一篇CPVR的文章,原理簡單來講就是用變分自動編碼機(VAE)將圖像變換到隱藏空間,並在隱空間進行圖像恢復操做
。
git
Bringing-Old-Photos-Back-to-Life項目資源下載與配置
該項目包含了測試訓練集和資源包,因此先下載該項目,項目地址
https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life
項目也依賴於Synchronized-BatchNorm-PyTorch,文章中也給出了咱們配置教程,因此按照教程來配置便可。
github
第一步,克隆項目,即下載壓縮包並解壓算法
git clone https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life.git
第二步,配置環境,進入項目的目錄下
windows
cd Face_Enhancement/models/networks git clone https://github.com/vacancy/Synchronized-BatchNorm-PyTorch cp -rf Synchronized-BatchNorm-PyTorch/sync_batchnorm . cd ../../../
cd Global/detection_models git clone https://github.com/vacancy/Synchronized-BatchNorm-PyTorch cp -rf Synchronized-BatchNorm-PyTorch/sync_batchnorm . cd ../../
而後下載相應的組件函數
cd Face_Detection/ wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 bzip2 -d shape_predictor_68_face_landmarks.dat.bz2 cd ../
cd Face_Enhancement/ wget https://facevc.blob.core.windows.net/zhanbo/old_photo/pretrain/Face_Enhancement/checkpoints.zip unzip checkpoints.zip cd ../
cd Global/ wget https://facevc.blob.core.windows.net/zhanbo/old_photo/pretrain/Global/checkpoints.zip unzip checkpoints.zip cd ../
安裝依賴項測試
pip install -r requirements.txt
更詳細的教程能夠查看Colab中的內容。
ui
Bringing-Old-Photos-Back-to-Life的使用和相關問題的解決
對於沒有裂痕的圖片的修復能夠是用這個代碼,進入項目文件的目錄下編碼
python run.py --input_folder [test_image_folder_path] \ --output_folder [output_path] \ --GPU 0
其中[test_image_folder_path]是想要修復的圖片的目錄地址,[output_path]是結果存放的地址,同時這些地址路徑要是絕對路徑。spa
若是是有裂痕的圖片,代碼有所不一樣
python run.py --input_folder [test_image_folder_path] \ --output_folder [output_path] \ --GPU 0 \ --with_scratch
固然文章中給出的代碼我在實際運行的狀況中仍是會出現問題的,這裏我對我遇到的問題和相應簡單的解決辦法進行介紹:
在對沒有裂痕的圖片進行修復的時候出現
這裏咱們能夠將Face_Enhancement \ test_face.py中的第40行的代碼img_name = img_path[b].split("/")[-1]
改成img_name = os.path.split(img_path[b])[-1]
問題能夠解決。
該算法的運行實現對GPU的內存很挺高的要求,對於處理高像素的圖片,我出現過Skip當前圖片的提示,還有CUDA out of memory. Tried to allocate 78.00 MiB (GPU 0; 7.43 GiB total capacity; 6.42 GiB already allocated; 88.94 MiB free; 6.75 GiB reserved in total by PyTorch)
這樣的報錯,主要問題仍是內存處理不夠,GPU同時處理不了這些操做,爲了簡單方便,因此我就從輸入上,將要處理的圖片的像素都先縮放至我電腦能夠處理的像素要求,這樣可使算法相應的工做。
對於處理沒有裂痕的圖片的操做,咱們能夠將Global \ test.py中的data_transforms函數中的
h = int(round(oh / 4)*4) w = int(round(ow / 4)*4)
直接修改成咱們想要輸入的圖片縮放成能處理的像素大小,好比我這裏就修改成
w = 450 h = 450
將原始輸入圖片縮放爲450 x 450的像素,便可以正常運行(雖然結果會有點不太好看)。
對於處理有裂痕的圖片,咱們能夠將Global \ detection.py中ata_transforms函數中if full_size == "full_size"
中的
h = int(round(oh / 16) * 16) w = int(round(ow / 16) * 16)
改成
h = 256 w = 256
這樣縮放爲256 x 256像素的圖片。
處理完問題後,咱們能夠來測試一下,咱們先對項目給出的圖片進行測試。
對於沒有裂痕的圖片的處理(這裏僅放出部分)
修復前
修復後
修復前
修復後
修復前
修復後
因爲調整了像素,因此與原圖有所出入,可是圖片的清晰程度增長了,咱們也能夠試試本身的圖片,我在網上找了幾張圖:
修復前
修復後
修復前
修復後
對於有裂痕的圖片的處理
修復前
修復後
修復前
修復後
修復前
修復後
修復前
修復後
一樣,咱們能夠將本身的圖片的進行修復,好比我找到的一張:
修復前
修復後
總結: 怎麼樣,是否是以爲這個算法頗有意思,那就找出那些照片來修復,重拾那些美好的舊時光,同時,有條件的夥伴能夠提升電腦的配置,來修復更高像素的圖片。