前言
最近幾個月,毒教材被曝光引發(fā)爭議,那些編寫度教材的人著實(shí)可惡。咱程序員也沒有手繪插畫能力,但咱可以借助強(qiáng)大的深度學(xué)習(xí)模型將視頻轉(zhuǎn)動漫。所以今天的目標(biāo)是讓任何具有python語言基本能力的程序員,實(shí)現(xiàn)短視頻轉(zhuǎn)動漫效果。
效果展示
一、思路流程
讀取視頻幀
將每一幀圖像轉(zhuǎn)為動漫幀
將轉(zhuǎn)換后的動漫幀轉(zhuǎn)為視頻
難點(diǎn)在于如何將圖像轉(zhuǎn)為動漫效果。這里我們使用基于深度學(xué)習(xí)的動漫效果轉(zhuǎn)換模型,考慮到許多讀者對這塊不了解,因此我這邊準(zhǔn)備好了源碼和模型,直接調(diào)用即可。
二、圖像轉(zhuǎn)動漫
為了讓大家不關(guān)心深度學(xué)習(xí)模型,已經(jīng)為大家準(zhǔn)備好了轉(zhuǎn)換后的onnx類型模型。接下來按順序介紹運(yùn)行onnx模型流程。
安裝onnxruntime庫
pip install onnxruntime
如果想要用GPU加速,可以安裝GPU版本的onnxruntime:
pip install onnxruntime-gpu
需要注意的是:
onnxruntime-gpu的版本跟CUDA有關(guān)聯(lián),具體對應(yīng)關(guān)系如下:
當(dāng)然,如果用CPU運(yùn)行,那就不需要考慮那么多了??紤]到通用性,本文全部以CPU版本onnxruntime。
運(yùn)行模型
先導(dǎo)入onnxruntime庫,創(chuàng)建InferenceSession對象,調(diào)用run函數(shù)。
如下所示
import onnxruntime as rt
sess = rt.InferenceSession(MODEL_PATH)
inp_name = sess.get_inputs()[0].name
out = sess.run(None, {inp_name: inp_image})
具體到我們這里的動漫效果,實(shí)現(xiàn)細(xì)節(jié)如下:
import cv2
import numpy as np
import onnxruntime as rt
# MODEL = "models/anime_1.onnx"
MODEL = "models/anime_2.onnx"
sess = rt.InferenceSession(MODEL)
inp_name = sess.get_inputs()[0].name
def infer(rgb):
rgb = np.expand_dims(rgb, 0)
rgb = rgb * 2.0 / 255.0 - 1
rgb = rgb.astype(np.float32)
out = sess.run(None, {inp_name: rgb})
out = out[0][0]
out = (out+1)/2*255
out = np.clip(out, 0, 255).astype(np.uint8)
return out
def preprocess(rgb):
pad_w = 0
pad_h = 0
h,w,__ = rgb.shape
N = 2**3
if h%N!=0:
pad_h=(h//N+1)*N-h
if w%2!=0:
pad_w=(w//N+1)*N-w
# print(pad_w, pad_h, w, h)
rgb = np.pad(rgb, ((0,pad_h),(0, pad_w),(0,0)), "reflect")
return rgb, pad_w, pad_h
其中, preprocess函數(shù)確保輸入圖像的寬高是8的整數(shù)倍。這里主要是因?yàn)榭紤]到深度學(xué)習(xí)模型有下采樣,確保每次下采樣能被2整除。
單幀效果展示
文章來源:http://www.zghlxwxcb.cn/news/detail-414086.html
三、視頻幀讀取與視頻幀寫入
這里使用Opencv庫,提取視頻中每一幀并調(diào)用回調(diào)函數(shù)將視頻幀回傳。在將圖片轉(zhuǎn)視頻過程中,通過定義VideoWriter類型變量WRITE確保唯一性。具體實(shí)現(xiàn)代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-414086.html
import cv2
from tqdm import tqdm
WRITER = None
def write_frame(frame, out_path, fps=30):
global WRITER
if WRITER is None:
size = frame.shape[0:2][::-1]
WRITER = cv2.VideoWriter(
out_path,
cv2.VideoWriter_fourcc(*'mp4v'), # 編碼器
fps,
size)
WRITER.write(frame)
def extract_frames(video_path, callback):
video = cv2.VideoCapture(video_path)
num_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
for _ in tqdm(range(num_frames)):
_, frame = video.read()
if frame is not None:
callback(frame)
else:
break
到了這里,關(guān)于一個牛X小編,用Python將普通視頻變成動漫,這也太厲害了吧的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!