圖像着色 使用 OpenCV ,深度學習 進行 黑白圖像着色

原文鏈接 圖像着色 使用 OpenCV ,深度學習 進行 黑白圖像着色

在 2019年7月23日 上張貼 由 hotdog發表回覆

圖像着色 使用OpenCV,深學習進行黑白 圖像着色

在本教程中,您將學習如何使用OpenCV,深度學習和Python對黑白圖像進行着色。
圖像着色是獲取輸入灰度(黑白)圖像然後產生輸出彩色圖像的過程,該輸出彩色圖像表示輸入的語義顏色和色調(例如,在晴朗的晴天,海洋必須是合理的“藍色”) – 它不能被模型着色爲“粉紅色”。
以前的 圖像着色 方法有:

  1. 依賴於重要的人際互動和註釋
  2. 產生去飽和着色

我們今天在這裏使用的新方法取決於深度學習。我們將利用能夠爲黑白圖像着色的卷積神經網絡,其結果甚至可以“愚弄”人類!
要了解如何使用OpenCV執行黑白 圖像着色,請繼續閱讀!
尋找這篇文章的源代碼?
跳到下載部分。
OpenCV和深度學習的黑白 圖像着色
在本教程的第一部分中,我們將討論如何利用深度學習來着色黑白圖像。
從那裏我們將利用OpenCV爲以下兩者着色黑白圖像:

  1. 圖片
  2. 視頻

然後,我們將探討我們工作的一些示例和演示。
我們如何通過深度學習爲黑白圖像着色?

圖1: Zhang等人的深度學習黑白圖像着色的體系結構。
我們今天要介紹的技術來自Zhang等人的2016年ECCV論文“ 彩色圖像着色”
以前的黑白圖像着色方法依賴於手動人體註釋,並且經常產生不可稱爲真正着色的去飽和結果。
張等人。決定通過使用卷積神經網絡“幻覺化”輸入灰度圖像在着色時的樣子來解決 圖像着色 問題。
培訓網絡張等人。從ImageNet數據集開始,將 所有圖像從RGB顏色空間轉換爲Lab顏色空間。
與RGB顏色空間類似,Lab顏色空間有三個通道。但 RGB顏色空間不同,Lab對顏色信息進行了不同的編碼:

  • L通道 編碼僅亮度強度
  • a通道 編碼綠色-紅色。
  • b通道編碼藍黃色

實驗室顏色空間的完整評論超出了本文的範圍( 有關實驗室的更多信息,請參閱本指南),但這裏的要點是實驗室可以更好地代表人類如何看待顏色。
由於L通道僅對強度進行編碼,因此我們可以使用L通道作爲網絡的灰度輸入。
從那裏,網絡必須學會預測ab通道。 給定輸入L通道預測的ab通道,我們可以形成最終的輸出圖像。
整個(簡化)過程可歸納爲:

  1. 將所有訓練圖像從RGB顏色空間轉換爲Lab顏色空間。
  2. 使用L通道作爲網絡的輸入並訓練網絡預測ab通道。
  3. 將輸入L通道與預測的ab通道組合。
  4. 將Lab圖像轉換回RGB。

爲了產生更合理的黑白圖像着色,作者還利用了一些額外的技術,包括平均退火和用於顏色再平衡的專用損失函數(兩者都超出了本文的範圍)。
有關圖像着色算法和深度學習模型的更多詳細信息,請務必參考Zhang等人的官方出版物。
項目結構
繼續使用本文的下載部分下載源代碼,模型和示例圖像 。
解壓縮後,您應該導航到項目目錄。
從那裏,讓我們使用 tree 命令檢查項目結構

我們在images / 目錄中有四個黑白圖像樣本 。
我們的Caffe模型和prototxt 與集羣點NumPy文件一起位於 model /目錄中。
我們今天將審查兩個腳本:

  • bw2color_image .py
  • bw2color_video .py

圖像腳本可以處理任何黑色和白色(也稱爲灰度)圖像你通過。
我們的視頻腳本將使用您的網絡攝像頭或接受輸入視頻文件,然後執行着色。
使用OpenCV着色黑白圖像
讓我們繼續使用OpenCV實現黑白圖像着色腳本。
打開 bw2color_image .py

我們的colorizer腳本只需要三個導入:NumPy,OpenCV和 argparse 。
讓我們繼續 href="https://www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/">使用argparse 解析命令行參數。此腳本要求將這四個參數直接從終端傳遞給腳本:

  • – image :輸入黑/白圖像的路徑。
  • – prototxt :我們的Caffe原型文件路徑。
  • – model 。我們通往Caffe預訓練模型的途徑。
  • – points :NumPy羣集中心點文件的路徑。

使用上述四個標誌和相應的參數,腳本將能夠使用不同的輸入運行而無需更改任何代碼。
讓我們繼續將模型和集羣中心加載到內存中

第21行直接從命令行參數值加載我們的Caffe模型。OpenCV可以通過cv2讀取Caffe模型 。dnn 。readNetFromCaffe 函數。
然後,第22行將聚類中心點直接從命令行參數路徑加載到點文件。這個文件是NumPy格式,所以我們使用的是 np 。加載 。
從那裏, 第25-29行:

  • 用於重新平衡的ab信道量化的加載中心。
  • 將每個點視爲1×1卷積並將它們添加到模型中。

現在讓我們加載,縮放和轉換我們的圖像

要從文件路徑加載輸入圖像,我們使用 cv2 。imread 在34行
預處理步驟包括:

  • 將像素強度縮放到[0,1]範圍(第35行)。
  • 從BGR轉換爲Lab顏色空間(第36行)。

讓我們繼續我們的預處理

我們將繼續將輸入圖像調整爲22 4×2 24(第41行),這是網絡所需的輸入尺寸。
然後我們只抓取 L 通道(即輸入)並執行平均減法(第42和43行)。
現在我們可以通過網絡傳遞輸入L通道來 預測 ab通道

L 通道通過網絡的正向 傳輸發生在 第48和49行 (如果需要,這是="https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/">OpenCV的blobFromImage複習)。
請注意,我們調用 net.forward後 。在同一行,我們說幹就幹,提取的預測 AB 卷。我在這裏看起來很容易,但請參考張等人。 如果您想了解更多詳細信息,請參閱GitHub上的文檔和演示
從那裏,我們將預測的ab 體積調整爲 與輸入圖像相同的尺寸(第53行)。
現在是時候進行後期處理了。請留在這裏,因爲我們基本上反過來執行以前的一些步驟

後期處理包括:

  • 抓取 L 通道原始輸入圖像(58行)和連接所述原始 L 信道和預測 AB 渠道一起形成 着色 (59線)。
  • 將 彩色 圖像從Lab顏色空間轉換爲RGB(第63行)。
  • 剪切超出範圍[0,1]的任何像素強度(第64行)。
  • 將像素強度恢復到[0,255]範圍內(第69行)。在預處理步驟(第35行)中,我們除以255 ,現在我們乘以 255 。我還發現這種擴展和 “uint8” 轉換不是必需的,但它有助於代碼在OpenCV 3.4.x4.x版本之間工作。

最後,我們的原始 圖像 和 彩色 圖像都顯示在屏幕上!
圖像着色結果
現在我們已經實現了圖像着色腳本,讓我們試一試。
確保您已使用此博客文章的下載部分下載源代碼,着色模型和示例圖像。
從那裏打開終端,導航到下載源代碼的位置,然後執行以下命令


$ python bw2color_image.py \ 
--prototxt model/colorization_deploy_v2.prototxt \ 
--model model/colorization_release_v2.caffemodel \ 
--points model/pts_in_hull.npy \
--image images/robin_williams.jpg

左邊,你可以看到羅賓·威廉姆斯的原始輸入圖像,這位着名的演員和喜劇演員在5年前去世了。
右側,您可以看到黑白着色模型的輸出。
讓我們嘗試另一個圖像,這是阿爾伯特愛因斯坦的一個


$ python bw2color_image.py \ 
--prototxt model/colorization_deploy_v2.prototxt \
--model model/colorization_release_v2.caffemodel \ 
--points model/pts_in_hull.npy \
--image images/albert_einstein.jpg

這種圖像着色給我留下了特別深刻的印象。
注意水是如何適當的藍色陰影,而愛因斯坦的襯衫是白色的,他的褲子是卡其色 – 所有這些都是合理的顏色。
這是另一個示例圖像,這是我最喜歡的作者之一馬克吐溫:


$ python bw2color_image.py \ 
--prototxt model/colorization_deploy_v2.prototxt \ 
--model model/colorization_release_v2.caffemodel \ 
--points model/pts_in_hull.npy \
--image images/mark_twain.jpg

在這裏,我們可以看到草和樹葉正確地着色爲綠色,儘管你可以看到這些綠色混合成Twain的鞋子和手。
最終的圖像展示了使用OpenCV的不太好的黑白圖像着色


$ python bw2color_image.py \
--prototxt model/colorization_deploy_v2.prototxt \ 
--model model/colorization_release_v2.caffemodel \ 
--points model/pts_in_hull.npy \
--image images/adrian_and_janie.png

這張照片是幾周前在暴風雪中我自己和我的小獵犬小狗Janie拍的。
在這裏你可以看到,雖然雪,Janie,我的夾克,甚至背景中的涼亭都是正確的顏色,我的藍色牛仔褲實際上是紅色的。
並非所有的圖像着色都是完美的,但今天的結果確實證明了Zhang等人的合理性。做法。
使用OpenCV進行實時黑白視頻着色
我們已經看到了如何將黑白圖像着色應用於圖像 – 但是我們可以對視頻流做同樣的事情嗎?
該腳本遵循與上述相同的過程,除了我們將處理視頻流的幀。我將更詳細地回顧它,並專注於幀抓取和處理方面。
打開 bw2color_video .py

我們的視頻腳本需要另外兩個導入:

  • VideoStream 允許我們從網絡攝像頭或視頻文件中抓取幀
  • time 將用於暫停以允許網絡攝像頭預熱

我們 現在初始化我們的 VideoStream

根據我們是否使用 網絡攝像頭 或視頻文件,我們將 在此處創建我們的 vs(即“視頻流”)對象。
從那裏,我們將加載着色器深度學習模型和聚類中心(與我們之前的腳本中的方式相同)

現在,我們將開始一個無限 while 循環 環比數據幀。我們將直接在循環中處理幀

來自我們vs的每一幀都 被第55和56行抓住 。檢查 None 類型 幀 – 當發生這種情況時,我們已經到達視頻文件的末尾(如果我們正在處理視頻文件),我們可以 從循環中斷開(第60和61行)。
預處理(與以前一樣)在第66-75行進行 。這是我們調整大小,縮放和轉換爲Lab的地方。然後我們抓住 L 通道,並執行平均減法。
現在讓我們應用深度學習着色並對結果進行後處理

我們 通過網絡的L深度學習前向傳遞 導致預測的 ab 信道。
然後我們將結果後處理到我們的 彩色 圖像(第86-95行)。這是我們調整大小,抓住原始 L ,並連接我們預測的 ab的地方 。從那裏,我們將Lab轉換爲RGB,剪輯和縮放。
如果你緊跟在上面,你會記得我們接下來要做的就是顯示結果

我們的原始網絡攝像頭 框架 與我們的灰度圖像和 彩色 結果一起顯示。
如果 按下“q” 鍵,我們將從 循環和清理中斷開。
視頻着色結果
讓我們繼續,嘗試我們的視頻黑白色彩腳本。
確保使用本教程的下載部分下載源代碼和着色模型。
從那裏,打開一個終端並執行以下命令,讓您的網絡攝像頭上運行着色器


$ python bw2color_video.py \ 
--prototxt model/colorization_deploy_v2.prototxt \ 
--model model/colorization_release_v2.caffemodel \
--points model/pts_in_hull.npy

如果要在視頻文件上運行着色器,可以使用以下命令


$ python bw2color_video.py \
--prototxt model/colorization_deploy_v2.prototxt \
--model model/colorization_release_v2.caffemodel \
--points model/pts_in_hull.npy \
--input video/jurassic_park_intro.mp4Credits::

這款機型在我的3Ghz Intel Xeon W上接近實時運行。
使用GPU,當然可以獲得實時性能; 但是,請記住,對OpenCV的“dnn”模塊的GPU支持目前有點受限,遺憾的是,它還不支持NVIDIA GPU。
摘要
在今天的教程中,您學習瞭如何使用OpenCV和深度學習爲黑白圖像着色。
我們今天使用的圖像着色模型首先由Zhang等人介紹。在他們的2016年出版物,彩色圖像着色
使用這個模型,我們能夠將兩者着色:

  1. 黑白圖像
  2. 黑白視頻

我們的結果雖然不完美,但展示了自動着色黑白圖像和視頻的合理性。
根據張等人的說法,他們的方法能夠在32%的機率裏“愚弄”人類!
我希望你喜歡今天的帖子


代碼下載
源代碼下載

原文鏈接 圖像着色 使用 OpenCV ,深度學習 進行 黑白圖像着色


文章轉自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/Black and white image colorization with OpenCV and Deep Learning/,2009年7月23日訪問
相關文章

 

張貼在技術博客opencv標籤:opencv深度學習圖像着色編輯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章