一个牛X小编,用Python将普通视频变成动漫,这也太厉害了吧

Posted 彳余大胆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个牛X小编,用Python将普通视频变成动漫,这也太厉害了吧相关的知识,希望对你有一定的参考价值。

前言

最近几个月,毒教材被曝光引发争议,那些编写度教材的人着实可恶。咱程序员也没有手绘插画能力,但咱可以借助强大的深度学习模型将视频转动漫。所以今天的目标是让任何具有python语言基本能力的程序员,实现短视频转动漫效果。

效果展示

一、思路流程

读取视频帧
将每一帧图像转为动漫帧
将转换后的动漫帧转为视频
难点在于如何将图像转为动漫效果。这里我们使用基于深度学习的动漫效果转换模型,考虑到许多读者对这块不了解,因此我这边准备好了源码和模型,直接调用即可。

二、图像转动漫

为了让大家不关心深度学习模型,已经为大家准备好了转换后的onnx类型模型。接下来按顺序介绍运行onnx模型流程。

安装onnxruntime库

pip install onnxruntime

如果想要用GPU加速,可以安装GPU版本的onnxruntime:

pip install onnxruntime-gpu

需要注意的是:

onnxruntime-gpu的版本跟CUDA有关联,具体对应关系如下:


当然,如果用CPU运行,那就不需要考虑那么多了。考虑到通用性,本文全部以CPU版本onnxruntime。

运行模型

先导入onnxruntime库,创建InferenceSession对象,调用run函数。

如下所示

import onnxruntime as rt 
sess = rt.InferenceSession(MODEL_PATH)
inp_name = sess.get_inputs()[0].name
out = sess.run(None, inp_name: inp_image)

具体到我们这里的动漫效果,实现细节如下:

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函数确保输入图像的宽高是8的整数倍。这里主要是因为考虑到深度学习模型有下采样,确保每次下采样能被2整除。

单帧效果展示



三、视频帧读取与视频帧写入

这里使用Opencv库,提取视频中每一帧并调用回调函数将视频帧回传。在将图片转视频过程中,通过定义VideoWriter类型变量WRITE确保唯一性。具体实现代码如下:

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

用Python做词云可视化带你分析海贼王火影和死神三大经典动漫

对于动漫爱好者来说,海贼王、火影、死神三大动漫神作你肯定肯定不陌生了。小编身边很多的同事仍然深爱着这些经典神作,可见“中毒”至深。今天小编利用Python大法带大家分析一下这些神作,看看这些神作到底在讲些神马。

Python大佬用词云可视化带你分析海贼王、火影和死神三大经典动漫

人生苦短,我用Python。小编利用Python网络爬虫爬取了豆瓣网,将网站上关于这三部动漫的评论全部抓取下来,之后通过Python的第三方库jieba分词进行词频统计和分析,最后通过matplotlib库和wordcloud库将关键词制作成词云进行可视化展示。

词云是神魔?"词云"这个概念由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登(Rich Gordon)于近日提出。"词云"就是对网络文本中出现频率较高的"关键词"予以视觉上的突出,形成"关键词云层"或"关键词渲染",从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。

话不多说,直接上图,下图是《海贼王》的豆瓣评论词云可视化展示图。

Python大佬用词云可视化带你分析海贼王、火影和死神三大经典动漫

《海贼王》豆瓣评论词云

对于《海贼王》来说,世界,梦想,搞笑,感动,冒险,自由等关键词是大家对这部热血动漫的评价。在人物展现了,路飞、索隆和艾斯榜上有名。路飞这个贯穿这个海贼王的名字毫无疑问出现的次数最多,接下来是大剑豪索隆和死去的艾斯。

路飞是草帽海贼团船长,由于他的标志性特征是一顶草帽,因此常被直接称呼为草帽小子或草帽路飞,他的梦想是找到传说中的One Piece,成为海贼王。

Python大佬用词云可视化带你分析海贼王、火影和死神三大经典动漫

《海贼王》人物---路飞

索隆是草帽海贼团第一位伙伴,职位是剑士,团内三主力之一,11位超新星的其中一人,悬赏金额在香波第诸岛排行第10名,特征是绿色头发(短发)、黑色的头巾(大多缠在左手臂上)、绿色的腰带(肚兜)和左耳配戴了三个耳环。

Python大佬用词云可视化带你分析海贼王、火影和死神三大经典动漫

《海贼王》人物---索隆

艾斯是日本动漫《海贼王》里的虚构人物,统称为“火拳”,是主角蒙奇·D·路飞的义兄,已逝。他的形象是黑发,常戴着一顶橘色的帽子,在帽子上有奸笑和难过这两种表情图案,而且帽子的绳子绑着一个骷髅头的牌子,是白胡子海贼团第二队队长,实力不凡。曾被一度邀请加入七武海。后被黑胡子击败,并且交与海军,关押在海底大监狱。后因为保护路飞用身体去挡海军大将赤犬的岩浆拳,结果被贯穿了身体。内脏也被烧伤,船医通过检查发现其内脏已被烧坏无法医治,因伤势过重死亡。

Python大佬用词云可视化带你分析海贼王、火影和死神三大经典动漫

《海贼王》人物---艾斯

下图是《火影忍者》的豆瓣评论词云可视化展示图。

Python大佬用词云可视化带你分析海贼王、火影和死神三大经典动漫

《火影忍者》豆瓣评论词云

毋庸置疑,喜欢《火影忍者》的人不枚胜举,大家对这部动漫的喜爱度和评价也较高。从词云可视化来看,原创、剧情、拖沓、越来越、太长等相对负面的词有蛮多的。究其原因,那就是剧情拖沓,到后面有让人看不下去的感觉,甚至给人一种烂尾的感觉。但是总体上来说,小伙伴们对该剧的评价还是偏向于喜欢的~~~

在人物方面,主人公鸣人和他的好基友佐助很明显的出现在词云中。鸣人是日本动漫《火影忍者》的主角。火之国木叶隐村的忍者,四代目火影波风水门和二代九尾人柱力漩涡玖辛奈之子,六道仙人次子阿修罗转世。最后他成功控制了体内的九尾查克拉,并在第四次忍界大战中与佐助携手抗敌,成为了拯救世界的英雄。最后,鸣人终于实现自己的梦想,成为了火影。

Python大佬用词云可视化带你分析海贼王、火影和死神三大经典动漫

《火影忍者》人物---鸣人

佐助是日本动漫《火影忍者》中的第二男主角。火之国木叶隐村宇智波一族的天才忍者,六道仙人长子因陀罗的转世。后来战争结束后,佐助因使世界和平的道路和鸣人不同,而在终结之谷与鸣人进行了宿命的一战,两败俱伤 。佐助最终被鸣人所感动,认同了鸣人使世界和平的道路,并重新成为木叶的一员。之后为了更加看清现在的世界开始了独自一人的赎罪之旅。

Python大佬用词云可视化带你分析海贼王、火影和死神三大经典动漫

《火影忍者》人物---佐助

下图是《死神》的豆瓣评论词云可视化展示图。

Python大佬用词云可视化带你分析海贼王、火影和死神三大经典动漫

《死神》豆瓣评论词云

《死神》,看到这个名字都觉得毛骨悚然,好怕怕的赶脚。死神是日本心理悬疑推理漫画《Death Note》(《死亡笔记》)中的角色。死神拥有死亡笔记,名字被写在这本笔记上的人就会死。从词云可视化上来看,剧情、动画、漫画、热血、原创、完结、蓝染、尸魂界等元素强调的比较多。

在人物方面,蓝染鹤立鸡群。蓝染是死神当中幕后最大的BOSS,拥有很强的力量,想成为改变整个世界的至高无上的神,不相信任何人,除了银。因为他认为银跟他一样,只有银才了解他。他想拥有力量,更强的力量。他和市丸银既是知己,又是唯一了解彼此的人,市丸银跟随他也是有目的的。只不过起初蓝染不知道罢了 不过,蓝染的死跟市丸银是没有关系的,但也不能说是绝对没有关系的,因为只有银比任何人都了解蓝染的,蓝染目前在TV版动画中还没有死亡。在漫画连载中仅仅只是被封印了,也没有死亡。

Python大佬用词云可视化带你分析海贼王、火影和死神三大经典动漫

《死神》人物---蓝染

通过上面的词云可视化展示,小编相信你肯定知道了《海贼王》、《火影忍者》和《死神》三步巨作想表达的主旨了。不难发现,这三部动漫巨著都是热血动漫,从评论中关于热血的认同度占有很大的比重。果不其然,在我们观看这三部神剧的时候,也确实感受到了热血,里面的人物一言不合就干架,正所谓不热血,不少年~~~

以上的分析仅代表小编个人的看法,欢迎小伙伴们拍砖~~~
想学习更多Python网络爬虫与数据挖掘知识,可前往专业网站:http://pdcfighting.com/

以上是关于一个牛X小编,用Python将普通视频变成动漫,这也太厉害了吧的主要内容,如果未能解决你的问题,请参考以下文章

用Python做词云可视化带你分析海贼王火影和死神三大经典动漫

用Python做词云可视化带你分析海贼王火影和死神三大经典动漫

用 Python 制作可视化 GUI 界面,一键实现多种风格的照片处理

用 Python 制作可视化 GUI 界面,一键实现将头像转成动漫风!

动漫制作技巧如何制作动漫视频

Python爬虫爬取腾讯视频动漫专区的动漫及其描述