1. 程式人生 > >Python+OpenCV 十幾行程式碼模仿世界名畫

Python+OpenCV 十幾行程式碼模仿世界名畫

現在很多人都喜歡拍照(自拍)。有限的濾鏡和裝飾玩多了也會膩,所以就有 APP 提供了模仿名畫風格的功能,比如 prisma、versa 等,可以把你的照片變成 梵高、畢加索、蒙克 等大師的風格。

 

 

 

 

 

這種功能叫做“影象風格遷移”,幾乎都是基於 CVPR 2015 的論文《A Neural Algorithm of Artistic Style》和 ECCV 2016 的論文《Perceptual Losses for Real-Time Style Transfer and Super-Resolution

》中提出的演算法,以及後續相關研究的基礎上開發出來的。

通俗來講,就是藉助於神經網路,預先將名畫中的風格訓練成出模型,在將其應用在不同的照片上,生成新的風格化影象。

 

 

 

來自《A Neural Algorithm of Artistic Style》

而因為神經網路在計算機視覺方面的應用越來越廣,著名的視覺開發庫 OpenCV 在 3.3 版本中正式引入 DNN(深度神經網路),支援 Caffe、TensorFlow、Torch/PyTorch 等主流框架的模型,可用以實現影象的識別、檢測、分類、分割、著色等功能。

我最近才發現在 OpenCV 的 Sample 程式碼中就有影象風格遷移的 Python 示例(原諒我的後知後覺),是基於 ECCV 2016 論文中的網路模型實現。所以,即使作為人工智慧的菜鳥,也可以拿別人訓練好的模型來玩一玩,體會下神經網路的奇妙。

(相關程式碼和模型的獲取見文末)

OpenCV 官方程式碼地址:https://github.com/opencv/opencv/blob/3.4.0/samples/dnn/fast_neural_style.py

目錄下通過執行命令執行程式碼:

 
python fast_neural_style.py --model starry_night.t7 

model 引數是提供預先訓練好的模型檔案路徑,OpenCV 沒有提供下載,但給出的參考專案 https://github.com/jcjohnson/fast-neural-style 中可以找到

其他可設定引數有:

  • input 可以指定原始圖片/視訊,如果不提供就預設使用攝像頭實時採集。
  • width、height,調整處理影象的大小,設定小一點可以提高計算速度。在我自己的電腦上,300x200 的轉換視訊可以達到 15 幀/秒。
  • median_filter 中值濾波的視窗大小,用來對結果影象進行平滑處理,這個對結果影響不大。

執行後的效果(取自 jcjohnson/fast-neural-style):

 

 

 

原始影象

 

 

ECCV16 models

 

 

instance_norm models

核心程式碼其實很短,就是 載入模型 -> 讀取圖片 -> 進行計算 -> 輸出圖片,我在官方示例基礎上進一步簡化了一下:

 
import cv2 # 載入模型 net = cv2.dnn.readNetFromTorch('the_scream.t7') net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV); # 讀取圖片 image = cv2.imread('test.jpg') (h, w) = image.shape[:2] blob = cv2.dnn.blobFromImage(image, 1.0, (w, h), (103.939, 116.779, 123.680), swapRB=False, crop=False) # 進行計算 net.setInput(blob) out = net.forward() out = out.reshape(3, out.shape[2], out.shape[3]) out[0] += 103.939 out[1] += 116.779 out[2] += 123.68 out /= 255 out = out.transpose(1, 2, 0) # 輸出圖片 cv2.imshow('Styled image', out) cv2.waitKey(0) 

執行結果:

 

 

 

另外還改了個多效果實時對比的版本(計算量大了,很卡頓),也一併上傳在程式碼中。

 

 

 

PS:前兩天看趙雷演唱會的時候我還說:他演唱會的背景 MV 大量使用了 影象二值化、邊緣檢測 等操作,讓我想到以前數字影象處理課的大作業……現在影象風格遷移的效率達到了實時,想必以後也會經常被使用吧