用python把視頻渲染成國畫風格,學會了再也不用找濾鏡!

現在愛豆都靠直拍圈粉,直拍越炫酷,就越能圈粉,怎麼把視頻加個我們自己想要的風格濾鏡,用AE?找個會剪輯視頻的?

作爲一個工具人,想着能不能創造一個工具,通過我上傳一張圖片,比如一下面這張圖片屬於國畫風格
在這裏插入圖片描述

然後上傳我需要加這個風格濾鏡的視頻,比如安崎小甜心的主題曲直拍視頻,然後把這個視頻搞上面的國畫風格


在這裏插入圖片描述

前面看過我前幾章的朋友,可能知道我之前就在倒騰PaddleHub,不熟悉的朋友朋友指路:
各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(一):爬蟲選手信息

各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(二):統計並展示數據

各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(三):看圖像識選手

各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(四):AI分析誰最容易出道

回到正題,如何實現我上面說的將視頻風格轉成一張圖片的風格,PaddleHub提供了一個有趣的模型
stylepro_artistic

風格遷移模型介紹

藝術風格遷移模型可以將給定的圖像轉換爲任意的藝術風格。本模型StyleProNet整體採用全卷積神經網絡架構(FCNs),通過encoder-decoder重建藝術風格圖片。StyleProNet的核心是無參數化的內容-風格融合算法Style Projection,模型規模小,響應速度快。模型訓練的損失函數包含style loss、content perceptual loss以及content KL loss,確保模型高保真還原內容圖片的語義細節信息與風格圖片的風格信息。預訓練數據集採用MS-COCO數據集作爲內容端圖像,WikiArt數據集作爲風格端圖像。

具體原理圖:
在這裏插入圖片描述
利用這個模型就能實現我們視頻風格遷移了。是不是很牛逼?

效果視頻提前披露

效果絕了!
在這裏插入圖片描述

還有帥氣的
在這裏插入圖片描述

具體思路

實現視頻風格遷移的具體思路如下:

  1. 將視頻逐幀讀取成圖片;
  2. 處理圖片干擾數據,比如燈光之類的;
  3. 調用stylepro_artistic模型實現風格遷移
  4. 重新將圖片合成視頻
  5. 將原視頻的音頻輸出並整合到新視頻

全程只使用python代碼編寫,不需要藉助外部視頻編輯工具

環境準備

下載相關庫,這裏需要使用paddlepaddle最新版,得upgrade一下。

pip install --upgrade paddlepaddle
pip install --upgrade paddlehub
#相關庫的導入
import os
import cv2
import paddlehub as hub
from moviepy.editor import *
from matplotlib import pyplot as plt
import numpy as np  
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
from PIL import ImageFont, ImageDraw, Image
import requests


下載模型
終端輸入以下命令

hub install stylepro_artistic
hub install deeplabv3p_xception65_humanseg

引入模型

stylepro_artistic = hub.Module(name="stylepro_artistic")
humanseg = hub.Module(name="deeplabv3p_xception65_humanseg")

處理視頻

處理視頻主要實現將視頻逐幀讀取成圖片集合並存儲

具體實現如下:

def CutVideo2Image(video_path, img_path):
    "讀取視頻,獲取每幀畫面,輸出爲圖片"
    "video_path:輸入視頻路徑"
    "img_path:輸出圖片路徑"
    cap = cv2.VideoCapture(video_path)
    index = 0
    global size_y ,size_x
    while(True):
        ret,frame = cap.read() 
        if ret and index < 2000:
            cv2.imwrite(img_path + '%d.jpg' % index, frame)
            index += 1
        else:
            break
        size_x = frame.shape[0]
        size_y = frame.shape[1]
    cap.release()
    print('Video cut finish, all %d frame' % index)
    print("imge size:x is {1},y is {0}".format(size_x,size_y))

去除圖片干擾因素

喜歡背景的可以跳過這一步,主要我這邊的視頻燈光太強了,我需要摳圖。
摳圖主要使用deeplabv3p_xception65_humanseg模型

DeepLabv3+ 是Google DeepLab語義分割系列網絡的最新作,其前作有 DeepLabv1,DeepLabv2, DeepLabv3。在最新作中,作者通過encoder-decoder進行多尺度信息的融合,同時保留了原來的空洞卷積和ASSP層, 其骨幹網絡使用了Xception模型,提高了語義分割的健壯性和運行速率,在 PASCAL VOC 2012 dataset取得新的state-of-art performance。該PaddleHub Module使用百度自建數據集進行訓練,可用於人像分割,支持任意大小的圖片輸入。

import os

# 摳圖
def delete_bg(path):
    "摳圖去除多餘背景"
    "path:需要摳圖的圖片目錄"
    img_list= [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]
    num=100 #定義每組包含的元素個數
    for i in range(0,len(img_list),num):
        humanseg.segmentation(data={"image":img_list[i:i+num]},output_dir='h_out/')

輸出結果如下,這是一張png圖片
在這裏插入圖片描述
png圖片對於後面轉視頻處理不友好(就是不行的意思)在這裏插入圖片描述,因此我們得加個白底給他,這裏涉及圖象合成技術,圖象合成代碼實現如下:

from PIL import Image 

# 合成圖片
## base_image_path:背景路徑
## fore_image_path:前景路徑
## save_path: 輸出圖片路徑
## is_resize 是否大小統一
def composition_img(base_image_path,fore_image_path,save_path,is_resize):
    base_image = Image.open(base_image_path).convert('RGB')
    if is_resize== True:
        fore_image = Image.open(fore_image_path).resize(base_image.size)
    else:
        fore_image = Image.open(fore_image_path)
        # 圖片加權合成
    scope_map = np.array(fore_image)[:,:,-1] / 255
    scope_map = scope_map[:,:,np.newaxis]
    scope_map = np.repeat(scope_map, repeats=3, axis=2)#表示將矩陣沿着每個元素複製3次
    res_image = np.multiply(scope_map, np.array(fore_image)[:,:,:3]) + np.multiply((1-scope_map), np.array(base_image))
        
    #保存圖片
    res_image = Image.fromarray(np.uint8(res_image))
    res_image.save(save_path)

添加白色背景轉成JPG格式圖片具體實現如下:


# 添加白色背景轉成jpg
def add_white_bg(path,bgout_path,output_path):
    
    num = os.listdir(path)

    for i in range(0,len(num)-1):
        img_black = np.zeros((size_x,size_y,3), np.uint8)
        img_black.fill(255)
        img_black_path =bgout_path + str(i) + ".jpg"
        cv2.imwrite(img_black_path,img_black)

    for i in range(0,len(num)-1):
        # 合成圖片
        composition_img(img_black_path,path+str(i)+'.png',output_path+str(i)+'.jpg',True)
 

# add_white_bg('h_out/','data/img/bgout/','data/img/bgres/')

風格遷移

利用模型實現風格遷移,老簡單了在這裏插入圖片描述
客官且看

def change_style(img_list,output_dir):
    """
    調用模型進行風格轉換
    img_list: 需要轉換的圖片對象集合
    output_dir:圖片輸出目錄
    """
    print(img_list)

    result = stylepro_artistic.style_transfer(
            paths=img_list,
            # use_gpu=True,
            visualization=True,
            output_dir=output_dir,
            alpha=0.5
        )     
    



def get_img_list(frame_path):
    """
    組裝轉換風格imglist
    frame_path:需要轉換風格的原圖目錄
    """
    num = os.listdir(frame_path)
    img_list=[]
    for i in range(0,len(num)-1):
        img_path =frame_path + str(i) + ".jpg"
        img={}
        styles=['work/style/timg3.jpg']
        img['styles']=styles
        img['content']=img_path
        img_list.append(img)
    return img_list



視頻合成

將我們轉換好風格的圖片轉成視頻

def comp_video(comb_path):
    """
    視頻合成
    comb_path: 合成圖片所在目錄
    """
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    video_tmp_name = comb_path.split("/")[2]
    video_name = "video/" + str(video_tmp_name) + ".mp4"
    files = os.listdir(comb_path)
    out = cv2.VideoWriter(video_name,fourcc,30.0,(size_y, size_x))
    # 排序
    files = sorted(files, key=lambda x: os.path.getmtime(os.path.join(comb_path, x)))
    print("一共有{}幀圖片要合成".format(len(files)))
    for i in range(len(files)):
        img = cv2.imread(comb_path+files[i])
        out.write(img)    # 保存幀
    out.release()

視頻音頻合成

將新生成的視頻合成原視頻的音頻,使得視頻更加完整
主要是通過提取原視頻的音頻,然後合併到video裏面
具體實現



def getMusic(video_name):

    """

    獲取指定視頻的音頻

    """

    # 讀取視頻文件

    video = VideoFileClip(video_name)

    # 返回音頻

    return video.audio


def addMusic(video_name, audio,output_video):

    """實現混流,給video_name添加音頻"""

    # 讀取視頻

    video = VideoFileClip(video_name)

    # 設置視頻的音頻

    video = video.set_audio(audio)

    # 保存新的視頻文件

    video.write_videofile(output_video)
    

調用方式

說好的超巨簡單就超巨簡單

# 算上我註釋,加起來5行代碼調用,簡單不簡單
if __name__ == "__main__":
    change_style(get_img_list('work/aq/bgres/'),'work/aq/style_img/')
    comp_video('work/aq/style_img/')
    addMusic('video/style_img.mp4',getMusic('video/aq_base4.mp4'),'video/voice_frame2.mp4')

在這裏插入圖片描述

參考

https://www.paddlepaddle.org.cn/hubdetail

源碼

https://github.com/llzz9595/qcyn

項目地址

https://aistudio.baidu.com/aistudio/projectdetail/449477

NEXT

用python寫個程序,也能跟Lisa老師一樣評估選手舞蹈實力?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章