AI創造營~AnimeGAN一鍵生成日系動漫Vlog

AI創造營~AnimeGAN一鍵生成日系動漫Vlog

引子

作為日本動漫的愛好者,特別是對宮崎駿、新海誠的童鞋們有福了。

本項目基於 PaddleHub 的動漫風格的轉換模型,可以一鍵將視頻轉動漫哦!——>{日系風Vlog就在這}。

PaddleHub已將定製打造的街景動漫化模型animegan_v2_hayao_99animegan_v2_shinkai_53animegan_v2_paprika_98等多個優質模型開源。可以自行切換轉換風格!

效果展示圖

//www.bilibili.com/video/BV195411A7GQ

動漫化結果

test_1.jpeg
test_2.jpeg

一、安裝相關的庫

!pip install paddlehub
!pip install paddlepaddle
!pip install moviepy

二、函數

import cv2
from PIL import Image
import numpy as np
import os
import paddlehub as hub
from moviepy.editor import *
from tqdm import tqdm

# Config
# 原始視頻地址
original_video_path = './1.mp4'
# 提取視頻圖像的存放地址
original_video_img_path = './original_video_img/'
# 合成視頻存放地址
img2video_path = './2.mp4'
# 添加聲音後的視頻最終輸出地址
output_video_path = './3.mp4'

# 從視頻提取圖片
def video2img(video_path, out_path):
    cap = cv2.VideoCapture(video_path)
    i=1
    while True:
        ret, frame = cap.read()
        if frame is None:
            break
        else:
            cv2.imwrite(out_path + str(i) + ".jpg", frame)
            i+=1
    return


# 把圖片轉動漫併合成視頻
def ani2video(img_path, org_video_path, out_path, model):
    # 獲取圖片總數
    file_list = os.listdir(img_path)
    img_num = len(file_list)

    # 查看原始視頻的參數
    cap = cv2.VideoCapture(org_video_path)
    ret, frame = cap.read()
    # 任選一張圖片查看高度和寬度
    result = model.style_transfer(images=[cv2.imread(os.path.join(img_path,file_list[0]))])
    height = result[0].shape[0]
    width = result[0].shape[1]

    fps = cap.get(cv2.CAP_PROP_FPS)  # 返回視頻的fps--幀率

    # 把參數用到我們要創建的視頻上
    video = cv2.VideoWriter(out_path, cv2.VideoWriter_fourcc('m', 'p', '4', 'v'), fps, (width, height))  # 創建視頻流對象
    """
    參數1 即將保存的文件路徑
    參數2 VideoWriter_fourcc為視頻編解碼器 cv2.VideoWriter_fourcc('m', 'p', '4', 'v') 文件名後綴為.mp4
    參數3 為幀播放速率
    參數4 (width,height)為視頻幀大小
    """
    for i in tqdm(range(img_num)):
        f_name = str(i + 1) + '.jpg'
        item = os.path.join(img_path, f_name)
        result = model.style_transfer(images=[cv2.imread(item)]) # 轉換動漫風格
        video.write(result[0])  # 把圖片寫進視頻
    video.release()  # 釋放

# 從原始視頻上提取聲音合成到新生成的視頻上
def sound2video(org_video_path, new_video_path, out_video_path):
    # 讀取原始視頻
    video_o = VideoFileClip(org_video_path)
    # 獲取原始視頻的音頻部分
    audio_o = video_o.audio

    # 讀取新生成視頻
    video_clip = VideoFileClip(new_video_path)
    # 指向新生成視頻的音頻部分
    video_clip2 = video_clip.set_audio(audio_o)
    # 修改音頻部分並輸出最終視頻
    video_clip2.write_videofile(out_video_path)

三、從視頻提取圖像

if not os.path.exists(original_video_img_path):
    os.mkdir(original_video_img_path)
video2img(video_path=original_video_path, out_path=original_video_img_path)

四、圖像轉換為動漫風格併合成新的視頻

# 根據自己喜好選擇風格:
## 今敏:'animegan_v2_paprika_98'
## 新海誠:'animegan_v2_shinkai_53'
## 宮崎駿:'animegan_v2_hayao_99'
model = hub.Module(name='animegan_v2_hayao_99', use_gpu=True) 
ani2video(img_path=original_video_img_path, org_video_path=original_video_path, out_path=img2video_path, model=model)

五、添加原始音頻

if not os.path.exists(output_video_path):
    sound2video(org_video_path=original_video_path, new_video_path=img2video_path, out_video_path=output_video_path)
else:
    print('最終視頻已存在,請查看輸出路徑')

六、更多內容

七、致謝