無需GPU,只用OpenCV和Python實現圖像和視頻的風格遷移

2022-01-05 論智

編者按:在這篇教程中,作者Adrian Rosebrock將教你如何用OpenCV、Python和深度學習技術對圖像和實時視頻進行神經風格遷移。

2015年,Gatsys等人在論文A Neural Algorithm of Artistic Style中提出了最初的神經風格遷移算法。2016年,Johnson等人發表了Perceptual Losses for Real-Time Style Transfer and Super-Resolutioin一文,將神經網絡遷移作為用感知損失處理超解析度問題的框架。結果表明該算法比Gatys等人的方法快了三倍。接下來,我將介紹如何在自己的圖像和視頻流中應用神經風格遷移。

首先說明的一點是,今天討論的方法在一個CPU上可以達到近乎實時的效果,如果在GPU上則完全可以實現實時效果。

首先我們會簡單塔倫下什麼是神經風格遷移,以及它是如何運作的。之後我們會用OpenCV和Python動手操作。

從左至右:我們的內容圖像;風格圖像;輸出的風格遷移圖像

神經風格遷移主要有兩個過程:

上圖就是將梵谷著名的畫作《星夜》的風格應用到普通的生活照上,我們保留了原照片中的山、人物和啤酒等所有內容,但全部替換成了梵谷的油畫風格。

問題就是,我們應該如何定義一個神經網絡,讓它執行神經風格遷移呢?


在Gatys等人提出的首篇論文中,神經風格遷移算法不需要新的架構。相反,我們可以用一個預訓練網絡(通常在ImageNet上進行的預訓練),並且定義一個損失函數,能讓我們達到風格遷移的目標,然後對損失函數不斷優化。

那麼,這裡的問題就不是「該用什麼神經網絡」了,而是「該用什麼損失函數」。

答案包括:內容損失、風格損失和總變差損失。每個部分都是單獨計算,然後在一個元損失函數中結合。通過將元損失函數最小化,我們將依次對內容、風格和總變差損失進行優化。

雖然Gatys等人的方法能生成不錯的神經風格遷移結果,但是它的速度非常慢。2016年,Johnson等人在Gatys的基礎上提出的全新算法速度快了三倍,但同時也存在著缺點,即用戶不能隨機選擇想要應用的風格圖像。用戶首先要訓練一個網絡,生成你想要的風格。網絡訓練好後,你可以將它應用到任意內容圖像上。

然而到了2017年,Ulyanov等人發表了Instance Normalization: The Missing Ingredient for Fast Stylization一文,他們表示將batch normalization替換成instance normalization(然後在訓練和測試時都應用instance normalization),可以達到更快的效果,並且藝術效果也更好。

在開始今天的教程前,請先下載我提供的資料(點擊文末原文地址獲取資料)。準備好了腳本、模型和圖像後,你可以用tree指令檢查項目的結構:

如果你從下載了.zip文件,就無需上網找其他素材了。我在其中提供了很多測試用的圖像和模型。同時還有三種Python腳本。

接下來讓我們用OpenCV和Python進行神經風格遷移的實踐。

首先打開neural_style_transfer.py文件,插入如下代碼:

首先,我們導入所需的包並解析命令行參數。

導入的有:

該腳本下需要兩個命令行:

你不需要改變命令行代碼,參數會在運行過程中進行處理。如果你不熟悉這一過程,可以閱讀我另一篇文章:www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/

接下來的部分比較有趣,我們要下載圖像和模型,然後計算神經風格遷移:

在這部分代碼中,我們進行了:

接下來,重要的是對輸出圖像進行後處理:

最後一步是將輸出圖像顯示在屏幕上:

當你下載好文件後,打開終端執行以下命令:

現在,對命令行參數做簡單改變,然後用《侏羅紀公園》中的截圖作為內容圖像,進行風格遷移:

另一個例子:

這是我最喜歡的案例,感覺都能當做酒吧的裝飾畫了。

上面我們講了如何在單一圖像上應用風格遷移,現在我們要把這一過程放在視頻上。

大致流程和圖像處理差不多,在這一腳本中,我們將:

利用一個特殊的Python迭代器,它可以讓我們在模型路徑中循環使用所有可用的神經風格遷移模型。

啟動網絡攝像頭視頻流,我們會(近乎)實時處理攝像頭的幀。對於某些較大的模型,系統可能會慢一些。

在每一幀上應用風格遷移,對輸出進行後處理,並將結果顯示在屏幕上。

如果用戶按下「n」鍵,我們將把迭代器循環運用到下一個神經風格遷移模型上,不用重啟腳本。

首先,打開neural_style_transfer_video.py文件,插入以下代碼:

之後,創建模型路徑迭代器:

一旦我們開始在while循環中處理幀,「n」按鍵就會在迭代器中下載「下一個」模型。

為了創建模型迭代器,我們:

讓我們開始下載第一個模型並對視頻進行處理:

在32行,我們讀取了第一個模型利用的路徑。在36和37行,啟動了視頻,從攝像頭中採集幀。

之後在幀與幀之間進行循環:

接著進行後處理並將輸出圖像展示出來:

對按鍵的處理:

兩種不同的按鍵會對腳本運行產生不同的影響:

執行以下命令就可以在視頻上運用風格遷移啦:

可以看到,只需要按一個按鍵就能輕鬆地進行循環。下面是我自己做的demo視頻:

今天的教程是教大家如何用OpenCV和Python在圖片和視頻上運用神經風格遷移。具體來說,我們用的模型是Johnson等人於2016年提出的,你可以在我提供的連結中下載。希望這篇教程對你有用!

譯者註:如需下載原始碼,請點擊閱讀原文進行相應下載。

原文地址:www.pyimagesearch.com/2018/08/27/neural-style-transfer-with-opencv/

相關焦點

  • 手把手教你用OpenCV和Python實現圖像和視頻神經風格遷移(代碼)
    首先說明的一點是,今天討論的方法在一個CPU上可以達到近乎實時的效果,如果在GPU上則完全可以實現實時效果。首先我們會簡單塔倫下什麼是神經風格遷移,以及它是如何運作的。之後我們會用OpenCV和Python動手操作。
  • OpenCV基礎 | 1.python3.6+OpenCV4.0環境配置
    接下來的一個系列會更新圖像處理的一些基本知識。學習視頻可參見python+opencv3.3視頻教學 基礎入門[1]今天寫的是python3.6+OpenCV4.0環境的配置環境的配置是基於Anaconda的,沒有下載的小夥伴可以自行下載,附一個anaconda下載教程怎麼安裝
  • Python+OpenCV的基礎圖像處理操作匯總
    圖像處理是對圖像進行的技術操作與分析,比如為了得到增強的圖像或提取一些有用的信息而進行的一系列操作。隨著我們的發展,許多應用程式使用圖像/幀/視頻作為輸入,對它們進行預處理,並將其輸入到設備或軟體或腳本中。圖像處理也可以是娛樂性的,可以用於許多應用。
  • Python 圖像處理 OpenCV (1):入門
    安裝OpenCV 在 Python 中有兩個類庫,一個是 opencv-python ,另一個是 opencv-contrib-python 。opencv-python 是只包含了主要模塊的包,而 opencv-contrib-python 包含了主要模塊以及一些擴展模塊,帶一些收費或者專利的算法,還有一些比較新的算法的高級版本。
  • 使用Python+OpenCV實現圖像數據採集
    在Anaconda或命令提示符中鍵入conda create -n opencv python=3.6這將在Python版本3.6中創建一個名為opencv的新環境,可以用正在使用的任何版本替換它。下一步,輸入pip install opencv-python你已經成功安裝了cv2! 現在你可以開始拍照了。
  • OpenCV-Python,計算機視覺開發利器
    簡單來說,就是將圖像信息轉化為計算機可以處理的數字信息,從而讓計算機能「看得見」。這個信息不僅僅是二維的圖片,也包括三維場景、視頻序列等。基本上所有需要用到攝像頭、圖片、視頻的應用場景,都離不開計算機視覺的支持。因此,這也是人工智慧領域中比較熱門的一個方向。
  • 「Python+cv2」Python安裝opencv及圖像的基本操作
    檢查python環境上面可以看出python版本是3.7。3、安裝opencvpython環境下opencv的安裝:pip3 install opencv-pythonpython opencv安裝因為我已經安裝,所以會出現安裝位置的提示。
  • 使用Python+OpenCV實現神經網絡預處理人臉圖像的快速指南
    注意:本文中使用的所有靜態圖像都來自 https://imgflip.com/memetemplates圖片載入我們將使用imread()函數加載圖像,指定文件的路徑和mode,第二個參數對於動態運行通道和像素轉換非常重要。
  • 基於Python+OpenCV+Google colaboratory實現在自定義數據集上使用遷移學習訓練StyleGAN
    它是一組神經網絡,以兩人零和博弈的形式相互對抗。博弈論(一個人的勝利就是另一個人的損失)。它是用於無監督學習的生成模型的一種形式。這裡有一個生成器(用於從潛在空間中的某個點在數據上生成新實例)和鑑別器(用於將生成器生成的數據與實際或真實數據值區分開)。最初,生成器生成虛假或偽造的數據,鑑別器可以將其分類為偽造,但是隨著訓練的繼續,生成器開始學習真實數據的分布並開始生成真實的數據。
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上,使用起來十分方便,把它與PyQt結合起來,就可以順利的操作視頻、圖像了。具體安裝請自行百度,這裡介紹使用方法。
  • 用OpenCV和Python模糊和匿名化人臉
    在這裡,我們將討論用OpenCV和Python模糊人臉的四步方法。然後,我們將回顧我們的項目結構,並使用OpenCV實現兩種面部模糊方法:使用高斯模糊對圖像和視頻流中的人臉進行匿名化將「像素模糊」效果應用於圖像和視頻中的匿名人臉考慮到我們的兩個實現,我們將創建Python腳本來將這些面部模糊方法應用於圖像和視頻。
  • OpenCV-Python速查表:從導入圖像到人臉檢測
    ——本文對圖像裁剪、調整大小、旋轉、閾值、模糊、在圖像上繪圖和書寫、人臉檢測和使用輪廓圖像檢測對象都進行了解釋。
  • python利用opencv實現證件照換底
    opencv今天就給大家介紹一下python利用opencv庫進行藍底換紅底或者白底照片的操作。1.強大的opencv庫說到圖像處理,不得不提opencv庫。它是一個跨平臺的計算機視覺庫,可以運行在不同作業系統上,它由一些列c函數和少量c++函數組成,並提供python,matlab等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。我們這裡用的opencv-python 就是opencv的python API接口。
  • opencv-python獲取圖像:面向對象與面向過程
    關於圖片的來源:1973年6月,美國南加州大學的信號圖像處理研究所的一個助理教授和他的一個研究生打算為了一個學術會議找一張數字照片,而他們對於手頭現有成堆"無聊"照片感到厭煩。事實上他們需要的是一個人臉照片,同時又能讓人眼前一亮。這時正好有人走進實驗室,手上帶著一本當時的花花公子雜誌,結果故事發生了……而限於當時實驗室設備和測試圖片的需要,lenna的圖片只摳到了原圖的肩膀部分。
  • OpenCV使用CUDA處理圖像的教程與實戰
    = cv.cuda_GpuMat()screenshot = cv.imread('media/drip.png')gpu_frame.upload(screenshot)gpu_frame.download()概述在單張圖像上使用我們需要創建GPU空間(GPU_frame)來保存圖像(就像相框保存圖片一樣),然後才能將圖像上傳到
  • OpenCV4.0 Mask RCNN 實例分割示例 C++/Python實現
    點擊我愛計算機視覺標星,更快獲取CVML新技術前幾天OpenCV4.0-Alpha發布,其中新增實例分割Mask RCNN模型是這次發布的亮點之一
  • 教程 | 如何使用Docker、TensorFlow目標檢測API和OpenCV實現實時目標檢測和視頻處理
    》(https://towardsdatascience.com/building-a-real-time-object-recognition-app-with-tensorflow-and-opencv-b7a2b4ebdc32)開始探索實時目標檢測問題,這促使我研究 Python 多進程庫,使用這篇文章(https://www.pyimagesearch.com/2015/12/21/increasing-webcam-fps-with-python-and-opencv
  • opencv-python快速入門篇【數字圖像處理系列一】
    本系列python版本:python3.5.4 本系列opencv-python版本:opencv-python3.4.2.17
  • 基於opencv 的圖像處理入門教程
    前言雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。