利用Python實(shí)現(xiàn)普通視頻變成動(dòng)漫視頻
容我廢話一下
最近幾個(gè)月,毒教材被曝光引發(fā)爭(zhēng)議,那些編寫度教材的人著實(shí)可惡。咱程序員也沒有手繪插畫能力,但咱可以借助強(qiáng)大的深度學(xué)習(xí)模型將視頻轉(zhuǎn)動(dòng)漫。所以今天的目標(biāo)是讓任何具有python語(yǔ)言基本能力的程序員,實(shí)現(xiàn)短視頻轉(zhuǎn)動(dòng)漫效果。
效果展示
一、思路流程
1.讀取視頻幀
2.將每一幀圖像轉(zhuǎn)為動(dòng)漫幀
3.將轉(zhuǎn)換后的動(dòng)漫幀轉(zhuǎn)為視頻
難點(diǎn)在于如何將圖像轉(zhuǎn)為動(dòng)漫效果。這里我們使用基于深度學(xué)習(xí)的動(dòng)漫效果轉(zhuǎn)換模型,考慮到許多讀者對(duì)這塊不了解,因此我這邊準(zhǔn)備好了源碼和模型,直接調(diào)用即可。
二、圖像轉(zhuǎn)動(dòng)漫
為了讓大家不關(guān)心深度學(xué)習(xí)模型,已經(jīng)為大家準(zhǔn)備好了轉(zhuǎn)換后的onnx類型模型。接下來(lái)按順序介紹運(yùn)行onnx模型流程。
安裝onnxruntime庫(kù)
pip install onnxruntime
如果想要用GPU加速,可以安裝GPU版本的onnxruntime:
pip install onnxruntime-gpu
需要注意的是:
onnxruntime-gpu的版本跟CUDA有關(guān)聯(lián),具體對(duì)應(yīng)關(guān)系如下:
當(dāng)然,如果用CPU運(yùn)行,那就不需要考慮那么多了??紤]到通用性,本文全部以CPU版本onnxruntime。
運(yùn)行模型
先導(dǎo)入onnxruntime庫(kù),創(chuàng)建InferenceSession對(duì)象,調(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})
具體到我們這里的動(dòng)漫效果,實(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整除。
單幀效果展示
三、視頻幀讀取與視頻幀寫入
這里使用Opencv庫(kù),提取視頻中每一幀并調(diào)用回調(diào)函數(shù)將視頻幀回傳。在將圖片轉(zhuǎn)視頻過(guò)程中,通過(guò)定義VideoWriter類型變量WRITE確保唯一性。具體實(shí)現(xiàn)代碼如下:
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)于利用Python實(shí)現(xiàn)普通視頻變成動(dòng)漫視頻的文章就介紹到這了,更多相關(guān)Python動(dòng)漫視頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pywinauto自動(dòng)化測(cè)試使用經(jīng)驗(yàn)
本文主要介紹了pywinauto自動(dòng)化測(cè)試使用經(jīng)驗(yàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-0310分鐘用python搭建一個(gè)超好用的CMDB系統(tǒng)
這篇文章主要介紹了10分鐘用python搭建一個(gè)超好用的CMDB系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python Unittest根據(jù)不同測(cè)試環(huán)境跳過(guò)用例的方法
這篇文章主要給大家介紹了關(guān)于Python Unittest如何根據(jù)不同測(cè)試環(huán)境跳過(guò)用例的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-12-12Python設(shè)計(jì)模式優(yōu)雅構(gòu)建代碼全面教程示例
Python作為一門多范式的編程語(yǔ)言,提供了豐富的設(shè)計(jì)模式應(yīng)用場(chǎng)景,在本文中,我們將詳細(xì)介紹 Python 中的各種設(shè)計(jì)模式,包括創(chuàng)建型、結(jié)構(gòu)型和行為型模式2023-11-11Python+Pygame實(shí)現(xiàn)之走四棋兒游戲的實(shí)現(xiàn)
大家以前應(yīng)該都聽說(shuō)過(guò)一個(gè)游戲:叫做走四棋兒。直接在家里的水泥地上用燒完的炭火灰畫出幾條線,擺上幾顆石頭子即可。當(dāng)時(shí)的火爆程度可謂是達(dá)到了一個(gè)新的高度。本文將利用Pygame實(shí)現(xiàn)這一游戲,需要的可以參考一下2022-07-07python3列表刪除大量重復(fù)元素remove()方法的問題詳解
這篇文章主要給大家介紹了關(guān)于python3列表刪除大量重復(fù)元素remove()方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01OpenCV停車場(chǎng)車位實(shí)時(shí)檢測(cè)項(xiàng)目實(shí)踐
本文主要介紹了OpenCV停車場(chǎng)車位實(shí)時(shí)檢測(cè)項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的并查集的示例代碼
本篇文章主要介紹了python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的并查集的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03如何使用 Python 中的功能和庫(kù)創(chuàng)建 n-gram的過(guò)程
在計(jì)算語(yǔ)言學(xué)中,n-gram 對(duì)于語(yǔ)言處理、上下文和語(yǔ)義分析非常重要,本文將討論如何使用 Python 中的功能和庫(kù)創(chuàng)建 n-gram,感興趣的朋友一起看看吧2023-09-09