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

news2025/1/13 6:33:25

前言

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/49894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot实现excel数据导入导出

目录 1.一些关于excel的常识 2.使用Apache POI操作excel 3.使用easyexcel操作excel 4.结合mybatis-plus批量导入excel数据到数据库 1.一些关于excel的常识 首先关于excel的文件格式,分为xls和xlsx,分别对应03版本和07以后的版本。 03版本的excel最大…

基于云边协同架构的五大应用场景革新

从概念到场景落地,边缘云加速革新,颠覆体验,拟造丰沛生态。边缘云的概念自明确以来已有四个多年头。 什么是边缘云? 边缘云,即把公共云的能力放在离数据发生端和消费端最近的地方,提升数据的处理效率&…

143.如何个性化推荐系统设计-3

143.1 算法介绍 协同过滤算法 协同过滤(Collaborative filtering, CF)算法是目前个性化推荐系统比较流行的算法之一。协同算法分为两个基本算法:基于用户的协同过滤(UserCF)和基于项目的协同过滤(ItemCF)。 基于属性…

m基于GA遗传优化的BP神经网络时间序列预测算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 将遗传算法(GA)与BP神经网络相结合,使用GA优化BP神经网络的主要参数。然后将影响输出响应值的多个特征因素作为GA-BP神经网络模型的输入神经元, 输出响应值作为…

[附源码]计算机毕业设计springboot绿色生鲜

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

nfs实现共享目录对于集群高可用风险,nfs客户端容易卡死

目录 背景说明 解决办法 执行步骤 数据移动 取消挂载 停nfs服务(客户端) 卸载nfs(客户端) 重启主机(客户端) 卸载nfs(服务端) 背景说明 nfs可以完成集群多个主机之间共享目…

感知算法工程师面试===目标检测===YOLO v3

引言 因为找工作的原因,面试中经常遇到目标检测的问题,在2022年的现在,大多是对单步目标检测算法YOLO家族系列展开一系列追问,比如Yolov3、Yolov4、Yolov5、Yolox算法。 另一部分就是Faster RCNN为代表的两阶段目标检测网络。 而…

[附源码]计算机毕业设计JAVA小区宠物管理系统

[附源码]计算机毕业设计JAVA小区宠物管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

blender UV基础

文章目录进入UV界面导出UV布局图拆分UV清除现有UV展开UV不同UV展开方式智能UV投射缝合边进入UV界面 1 选中一个物体,选择最上方UVEditing即可进入UV界面 2 注意进入UV界面后,舞台也会自动进入编辑模式 3 只有在编辑模式里才能操作UV 4 选择一个面来单独…

Linux学习-61-Linux系统服务管理

14 Linux系统服务管理 系统服务:服务是在后台运行的应用程序,并且可以提供一些本地系统或网络的功能。Linux 中常见的服务有那些,这些服务怎么分类,服务如何启动,服务如何自启动,服务如何查看?…

Codeforces Round #725 (Div. 3) F. Interesting Function

翻译&#xff1a; 给出两个整数&#x1d459;和&#x1d45f;&#xff0c;其中&#x1d459;<&#x1d45f;。我们将在&#x1d459;上加1&#xff0c;直到结果等于&#x1d45f;。因此&#xff0c;执行的添加恰好是&#x1d45f;−&#x1d459;。对于每一个这样的加法&am…

pytest文档84 - 把收集的 yaml 文件转成pytest 模块和用例

前言 前面实现了一个基础的读取yaml文件内容&#xff0c;当成用例去执行。虽然入门简单&#xff0c;但需要扩展功能&#xff0c;比如在 yaml 用例实现参数化&#xff0c;就不好扩展了。 因为它并不是一个真正的pytest的模块和用例&#xff0c;无法被钩子函数探测到。所以这篇会…

CV攻城狮入门VIT(vision transformer)之旅——VIT原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;CV攻城狮入门VIT(vision transformer)之旅——近年超火的Transformer你再不了解就晚了&#xff01; &#x1f34a;近期目标&#xff1a;写好专栏的每一篇…

Linux centos7.6 安装elasticsearch8.x (es8) 教程

系列-Linux centos7.6 安装elasticsearch8.x (es8) 教程 Linux centos7.6 安装elasticsearch8.x (es8) 教程_言之有李LAX的博客-CSDN博客 系列-linux安装elasticsearch-head &#xff08;es可视化界面&#xff09; linux安装elasticsearch-head &#xff08;es可视化界面&am…

隆重推出 Incredibuild 10

变更可能来的很快&#xff0c;也可能来的很慢。但有时候&#xff0c;它真的值得我们等待。您并非每天都能目睹一个很棒的平台进一步发展成为一个不可思议&#xff08;Incredible&#xff09;的平台。今天&#xff0c;我们将正式发布最新版本——Incredibuild 10&#xff01;经过…

SIMetrix导入MOS管参数的另一种方法

问题的提出 在采用SIMetrix 8.3软件进行E类放大器的仿真过程中&#xff0c;用到了NEXPERIA公司的NMOS管器件PMH550UNE, 但在SIMetrix 8.3的库中没有该器件&#xff0c;因此需要导入第三方库文件. 通常的办法是从生产该器件的公司网站上下载器件库文件&#xff0c;导入到SIMet…

《QDebug 2022年11月》

一、Qt Widgets 问题交流 二、Qt Quick 问题交流 1.QtQuick.Dialogs 1.x 中的 MessageDialog 触发两次 accepted 、rejected [QTBUG-94126] If inherit QApplication, the MessageDialog accepted signal is emitted twice. - Qt Bug Tracker 当使用 QApplication 而不是 Q…

React 中ref 的使用(类组件和函数组件)以及forwardRef 与 useImperativeHandle 详解

前言 在一个父组件中&#xff0c;我们想要获取到其中的节点元素或者子组件实例&#xff0c;从而直接调用其上面的方法。Class 类组件和函数组件是两种不同的写法。 1. Class 组件中使用ref 在 React 的 Class 组件中&#xff0c;我们通过 createRef 创建 ref class Parent …

传统制造企业进行数字化转型,是翻身还是翻船?

数实融合正在从可选项&#xff0c;变成每个行业都要面对的必选项&#xff0c;制造企业也从野蛮生长逐渐步入有序的数字化世界。 出品|产业家 2022年&#xff0c;疫情及经济环境全面淬炼了各行各业&#xff0c;大多数能有效应用数字化持续经营的企业成为幸存者&#xff0c;数字…

信号与进程间通信

目录结束进程结束后台进程结束前台进程信号基本概念接收信号发送信号代码演示接收信号函数&#xff08;signal&#xff09;SIG_IGNSIG_DFL自定义函数发送信号&#xff08;kill&#xff09;接收信号解决僵尸进程结束进程 结束后台进程 终端1&#xff1a;./main killed 终端2&a…