編者按:在這篇教程中,作者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等人的方法快了三倍。接下來,我將介紹如何在自己的圖像和視頻流中應用神經風格遷移。
用OpenCV進行神經風格遷移
首先說明的一點是,今天討論的方法在一個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文件,插入如下代碼:
首先,我們導入所需的包并解析命令行參數。
導入的有:
imutils:這個包可以通過pip install --upgrade imutils安裝。最近我發布了imutils==0.5.1,所以不要忘記更新!
OpenCV:你需要一個OpenCV 3.4或者更高版本。
該腳本下需要兩個命令行:
--model:神經風格遷移的模型路徑。在“下載”區中,我加入了11中經過與訓練的模型。
--image:需要進行風格遷移的圖像(輸入圖像)。在其中我放入了四張圖片。
你不需要改變命令行代碼,參數會在運行過程中進行處理。如果你不熟悉這一過程,可以閱讀我另一篇文章:www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/
接下來的部分比較有趣,我們要下載圖像和模型,然后計算神經風格遷移:
在這部分代碼中,我們進行了:
將下載的預訓練神經風格遷移模型稱為net(第17行);
下載輸入圖像并調整尺寸(21和22行);
用均值減法創建blob(27和28行);
執行forward,獲取output圖像(31行)。
接下來,重要的是對輸出圖像進行后處理:
最后一步是將輸出圖像顯示在屏幕上:
神經風格遷移結果
當你下載好文件后,打開終端執行以下命令:
現在,對命令行參數做簡單改變,然后用《侏羅紀公園》中的截圖作為內容圖像,進行風格遷移:
另一個例子:
這是我最喜歡的案例,感覺都能當做酒吧的裝飾畫了。
實時神經風格遷移
上面我們講了如何在單一圖像上應用風格遷移,現在我們要把這一過程放在視頻上。
大致流程和圖像處理差不多,在這一腳本中,我們將:
利用一個特殊的Python迭代器,它可以讓我們在模型路徑中循環使用所有可用的神經風格遷移模型。
啟動網絡攝像頭視頻流,我們會(近乎)實時處理攝像頭的幀。對于某些較大的模型,系統可能會慢一些。
在每一幀上應用風格遷移,對輸出進行后處理,并將結果顯示在屏幕上。
如果用戶按下“n”鍵,我們將把迭代器循環運用到下一個神經風格遷移模型上,不用重啟腳本。
首先,打開neural_style_transfer_video.py文件,插入以下代碼:
之后,創建模型路徑迭代器:
一旦我們開始在while循環中處理幀,“n”按鍵就會在迭代器中下載“下一個”模型。
為了創建模型迭代器,我們:
搜集所有神經風格遷移模型并分類(18和19行)
為每種模型分配ID(23行)
利用itertools和cycle創建迭代器(27行)。
讓我們開始下載第一個模型并對視頻進行處理:
在32行,我們讀取了第一個模型利用的路徑。在36和37行,啟動了視頻,從攝像頭中采集幀。
之后在幀與幀之間進行循環:
接著進行后處理并將輸出圖像展示出來:
對按鍵的處理:
兩種不同的按鍵會對腳本運行產生不同的影響:
“n”:抓取下一個模型的路徑和ID,并進行下載。如果我們已經獲取上一個模型,迭代器就會從頭開始循環。
“q”:按下q會退出while循環。
實時風格遷移的結果
執行以下命令就可以在視頻上運用風格遷移啦:
可以看到,只需要按一個按鍵就能輕松地進行循環。
-
cpu
+關注
關注
68文章
10901瀏覽量
212717 -
圖像
+關注
關注
2文章
1089瀏覽量
40541 -
深度學習
+關注
關注
73文章
5512瀏覽量
121430
原文標題:無需GPU,只用OpenCV和Python實現圖像和視頻的風格遷移
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論