小伙伴們應該在別的自媒體平台上看到過,關於老照片修復的文章或短視頻,而這項技術目前在用戶群體中很受歡迎,目前作為服務早早已經在各大電商平台售賣了
作為一個技術號主,今天給大家介紹一個老照片修復相關的 Github 項目,並手把手教學,帶大家將這個項目跑起來,
學會了之后可以把項目應用到自己收集的圖片上,有想法的讀者也可以借助這個項目幫別人修復照片賺點零花錢,豈不美滋滋~
Github 項目叫 Bringing-Old-Photos-Back-to-Life,是微軟公司把去年發表在 CVPR 上的一篇期刊的源碼,項目地址 https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life
名稱就代表了項目用途:對老照片進行修復,恢復它原有的樣貌;下面是官方公布的一些修復前后對比效果圖,看上去是不是很贊 ~
根據上面給定的樣例,如果對項目的功能細分的話可分為以下三類
- 1,舊照片全景修復;
- 2,照片折痕識別、修復;
- 3,照片人臉識別、人臉部分增強;
上面對項目一個簡單介紹以后,下面開始正式介紹它的用法,先交代一下本次的測試環境:
- OS: Windows 10,
- Python :python 3.7.6,
- IDE : Pycharm;
- torch : 1.6.0+cpu
- torchvision : 0.7.0+cpu
1,下載項目,克隆到本地
項目下載方式有兩種,Download Zip
或 git 命令(需借助 Git 工具) ;Download Zip
通過瀏覽器來下載,得到的是個解壓包,下載到本地之后解壓即可
解壓后的目錄如下:
2,配置環境
該項目是基於深度學習訓練得到的,但官方已經提供了訓練好的權重文件,可以直接下載下來供我們使用(網絡當然也可以重新訓練,但極其不建議,因為耗時、耗錢並且最終權重精度遠不如官方),一共需要配置 3 部分權重文件
2.1 Global 權重配置
該權重是用於圖片全局修復,下載地址
https://facevc.blob.core.windows.net/zhanbo/old_photo/pretrain/Global/checkpoints.zip
下載后把文件加壓至 ./Global
文件目錄下
2.2 Face_Detection 權重
在前面項目介紹中,提到過該項目除了可以照片修復之外,還可以進行人臉增強,簡單理解就是把模糊的人臉圖像清晰化
人臉增強 首先需要解決的是人臉識別問題,項目中借助的是一個Python庫 dlib,關於 dlib 使用可以參考之前我寫的一篇文章
dlib 庫安裝也可以通過 pip 工具,但需要注意兩個點 :
- 1, pip 安裝 dlib 之前,需提前安裝好 Cmake ,
pip install Cmake
,否則會安裝失敗; - **2,用 dlib 進行人臉識別需要一個權重文件 **
dlib 權重文件下載地址如下,下載完之后將權重文件解壓至 文件夾 ./Face_Detection/
中
http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
2.3 Face_Enhancement 權重
Face_Enhancement 權重用於人臉部位增強,下載后權重文件解壓至 ./Face_Enhancement
,下載地址如下
https://facevc.blob.core.windows.net/zhanbo/old_photo/pretrain/Face_Enhancement/checkpoints.zip
2.4 Synchronized-BatchNorm-PyTorch
這是 Pytorch 框架的一個 同步BatchNorm 一個分支倉庫,此項目中用到了這個模塊;倉庫地址
https://github.com/vacancy/Synchronized-BatchNorm-PyTorch
將倉庫克隆到本地,解壓后目錄如下:
項目中兩處地方用到了 sync_batchnorm
文件夾,這里需要注意下一下
1,將 sync_batchnorm
復制到 Face_Enhancement/models/network
文件夾下,還需要改動一點項目中的代碼部分,找到 Face_Enhancement/models/network/normalize.py
腳本,更改第 8 行代碼,將
from models.networks.sync_batchnorm import SynchronizedBatchNorm2d
改為
from models.networks.sync_batchnorm.batchnorm import SynchronizedBatchNorm2d
2,將 sync_batchnorm
復制到 Global/detection_models
,找到 Global/detection_models/network.py
腳本,更改第 7 行代碼,將
from detection_models.sync_batchnorm import DataParallelWithCallback
改為
from detection_models.sync_batchnorm.replicate import DataParallelWithCallback
2.5 安裝依賴項
在終端輸入下面命令,安裝項目中所需的第三方程序包
pip install -r requirements.txt
3,運行,修復自己收集的圖片
上面環境配置好之后,下面就可以正常使用了;在項目中官方給的有測試圖片,存放在 test_images, 分為兩類
- old 老照片,沒有折痕的照片;
- old_w_scratch ,有折痕的照片
3.1 修復不帶折痕的照片
對於不帶折痕的照片,終端輸入時需要三個參數,
-
--input_folder
,存放需要修復圖片的文件路徑,不指定時默認為./test_images/old
; -
--output_folder
,存放修復后圖片的文件路徑,不指定時默認為./output/
-
--GPU
,指定用到的 GPU 編號,可設定為0
、0,1
或0,1,2
,沒有 GPU 配置時 設為-1
表示運行時只用 CPU ; 設定 GPU 時需要確保配置的 Pytorch 是 GPU 版本,相對 CPU 的話,GPU 測試時間會更短;
測試時,啟動命令如下,這里 --input_folder、--output_folder
參數都為默認,所以命令中加這兩個參數,電腦比較渣沒有 GPU 所以設為 -1;
python run.py --GPU -1
3.2 修復帶折痕的照片
與不帶折痕相比,修復帶折痕照片要多加入一個參數 --with_scratch
,還有一點不同的是存放原照片默認路徑更改為為 ./test_images/old_w_scratch
,其它參數設置見 3.1
終端中輸入的測試命令如下:
python run.py --GPU -1 --with_scratch
最終的運行結果
官方在 ./test_images/old
和 ./test_images/old_w_scratch
文件夾下提供的有測試圖片,讀者們想要測試自己收集的圖片時,有兩種方法
- 1,把自己圖片放入默認
--input_folder
文件夾中,運行時無需指定--input_folder
參數 - 2,運行命令指定
--input_folder
參數,后跟自己存放照片的文件路徑;
關於此項目的使用方法,基本就這些了,最后在這里貼幾張我運行得到的幾張修復圖
不帶折痕的圖像修復
圖一
圖二
圖三
圖四
上面這張圖大致一看沒什么變化,是因為原圖像本身就很清晰,但如果把圖片放大的話就明顯看到兩者之間的差距
放大后的左圖
放大后的右圖
帶有折痕的圖片修復
圖一
圖二
圖三
項目源碼獲取
為了方便起見,我已經把配置好的項目文件打包成一個解壓包,解壓后只需安裝項目中的所需依賴項即可,無需再配置權重文件;
pip install -r requirements.txt
項目源碼獲取方式,關注微信公號:小張Python,后台回復關鍵字 210404 即可
小結
關於本項目中圖像修復技術原理,這里並沒有特別介紹,如果只是想用一下這項技術的話,這篇文章已經足夠能幫到你了;當然如果有讀者想深入了解一下這項技術的背后原理,可以閱讀一下原 Paper《Bringing Old Photos Back to Life》
好了,以上就是本篇文章的全部內容了,最后感謝大家的閱讀,我們下期見~