神工鬼斧惟肖惟妙,M1 mac系统深度学习框架Pytorch的二次元动漫动画风格迁移滤镜AnimeGANv2+Ffmpeg(图片+视频)快速实践

简介: 前段时间,业界鼎鼎有名的动漫风格转化滤镜库AnimeGAN发布了最新的v2版本,一时间街谈巷议,风头无两。提起二次元,目前国内用户基数最大的无疑是抖音客户端,其内置的一款动画转换滤镜“变身漫画”,能够让用户在直播中,把自己的实际外貌转换为二次元“画风”。对于二次元粉丝来说,“打破次元壁,变身纸片人”这种自娱自乐方式可谓屡试不爽

前段时间,业界鼎鼎有名的动漫风格转化滤镜库AnimeGAN发布了最新的v2版本,一时间街谈巷议,风头无两。提起二次元,目前国内用户基数最大的无疑是抖音客户端,其内置的一款动画转换滤镜“变身漫画”,能够让用户在直播中,把自己的实际外貌转换为二次元“画风”。对于二次元粉丝来说,“打破次元壁,变身纸片人”这种自娱自乐方式可谓屡试不爽:

但是看多了就难免有些审美疲劳,千人一面的“锥子脸”,一成不变的“卡姿兰”式大眼睛,让人多少有点味同嚼蜡的感觉,未免过犹不及,失之现实。

而基于CartoonGan的AnimeGAN动漫风格滤镜则能够在保留原图特点的同时,兼具二次元的炫酷和三次元的写实,颇有些刚柔并济、举重若轻的感觉:

并且AnimeGAN项目组业已在线上发布demo接口,可以直接运行模型效果:https://huggingface.co/spaces/akhaliq/AnimeGANv2 但是受限于带宽以及线上资源瓶颈,线上迁移队列经常会处于排队的状态,同时一些原图的上传也可能造成个人隐私的外泄。

所以本次我们在M1芯片的Mac os Monterey基于Pytorch深度学习框架,本地搭建AnimeGANV2版本的静态图片以及动态视频的转化服务。

我们知道,目前Pytorch的cpu版本在M1芯片mac上的支持版本是Python3.8,在之前的一篇文章中:金玉良缘易配而木石前盟难得|M1 Mac os(Apple Silicon)天生一对Python3开发环境搭建(集成深度学习框架Tensorflow/Pytorch),曾经使用condaforge来构建Pytorch的开发环境,这次我们使用原生的安装包进行安装,首先进入Python官网,下载 Python3.8.10 universal2 稳定版 :https://www.python.org/downloads/release/python-3810/

双击安装即可,随后进入终端键入命令安装Pytorch:

pip3.8 install torch torchvision torchaudio

这里我们默认安装最新的稳定版1.10,随后进入Python3.8命令行,导入torch库:

(base) ➜  video git:(main) ✗ python3.8  
Python 3.8.10 (v3.8.10:3d8993a744, May  3 2021, 09:09:08)   
[Clang 12.0.5 (clang-1205.0.22.9)] on darwin  
Type "help", "copyright", "credits" or "license" for more information.  
>>> import torch  
>>>

确定Pytorch可以使用之后,将官方项目克隆下来:

git clone https://github.com/bryandlee/animegan2-pytorch.git

AnimeGAN也是基于生成对抗网络(Generative adversarial network),原理就是我们手上有一定量的原图,我们可以称之为三次元图片,真实的图片特征会存在一个分布,比如:正态分布,均匀分布,或者更为复杂的分布形式,那么GAN的目的是通过生成器来生成一批与真实分布接近的数据。这些数据可以理解为二次元的优化,但是会保留三次元的一些特征,比如说眼睛变大、脸型更接近滤镜模型的画风等等,在我们的处理中,这个生成器趋向于使用神经网络,因为它能表示更为复杂的数据分布情况。

下载成功之后,可以在weights文件夹下看到四种不同的权重模型,其中celeba\_distill.pt和paprika.pt是用来转化风景图片的,而face\_paint\_512\_v1.pt和face\_paint\_512\_v2.pt则更注重于肖像的转化。

首先安装图像处理库Pillow:

pip3.8 install Pillow

随后新建test\_img.py文件:

`from PIL import Image  
import torch  
import ssl  
ssl._create_default_https_context = ssl._create_unverified_context  
  
model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="celeba_distill")  
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v1")  
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v2")  
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="paprika")  
  
  
face2paint = torch.hub.load("bryandlee/animegan2-pytorch:main", "face2paint", size=512)  
  
img = Image.open("Arc.jpg").convert("RGB")``out = face2paint(model, img)  
  
out.show()`

这里以凯旋门的照片为例子,分别使用celeba\_distill和paprika滤镜查看效果,注意本地请求需要关闭ssl证书检测,同时首次运行需要下载线上模型参数:

这里图像尺寸参数指的是宽高通道的总数,接下来就是人物肖像动漫风格转化了,调整导入的模型生成器类型,输入图片改成人物肖像:

from PIL import Image  
import torch  
import ssl  
ssl._create_default_https_context = ssl._create_unverified_context  
  
import numpy as np  
  
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="celeba_distill")  
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v1")  
model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v2")  
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="paprika")  
  
  
face2paint = torch.hub.load("bryandlee/animegan2-pytorch:main", "face2paint", size=512)  
  
img = Image.open("11.png").convert("RGB")  
  
out = face2paint(model, img)  
  
  
out.show()

可以看到,v1滤镜相对风格化更强烈一些,而v2在风格化的基础上相对保留了原图的特征,源于三次元又不拘泥于体验,架空却又不流于虚浮,比抖音的漫画滤镜不知道高到哪里去了。

下面我们来看看动态视频的动漫滤镜转换,视频从广义上来讲,就是多张图片的连拍播放,只不过取决于视频帧的速率问题,帧速率也称为FPS(Frames PerSecond)的缩写——帧/秒,是指每秒钟刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。 越高的帧速率可以得到更流畅、更逼真的动画,每秒钟帧数(FPS)越多,所显示的动作就会越流畅。

这里可以通过第三方软件将连贯的视频转换为以FPS为单位的图片,在m1 mac os系统中,推荐使用著名的视频处理软件:Ffmpeg

使用arm架构的Homebrew进行安装:

brew install ffmpeg

安装成功后,在终端键入ffmpeg命令查看版本:

(base) ➜  animegan2-pytorch git:(main) ✗ ffmpeg     
ffmpeg version 4.4.1 Copyright (c) 2000-2021 the FFmpeg developers  
  built with Apple clang version 13.0.0 (clang-1300.0.29.3)  
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/4.4.1_3 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox

安装没有问题,随后准备一个视频文件,新建 video\_img.py:

import os  
  
# 视频转图片  
os.system("ffmpeg -i ./视频.mp4 -r 15 -s 1280,720 -ss 00:00:20 -to 00:00:22 ./myvideo/%03d.png")

这里我们使用Python3内置的os模块直接运行ffmpeg命令,针对当前目录的视频,以每秒15帧的速率进行转化,-s参数代表视频解析度,-ss参数可以控制视频的开始位置和结束位置,最后是导出图片的目录。

运行脚本之后,进入myvideo目录:

(base) ➜  animegan2-pytorch git:(main) ✗ cd myvideo   
(base) ➜  myvideo git:(main) ✗ ls  
001.png    004.png    007.png    010.png    013.png    016.png    019.png    022.png    025.png    028.png     
002.png    005.png    008.png    011.png    014.png    017.png    020.png    023.png    026.png    029.png     
003.png    006.png    009.png    012.png    015.png    018.png    021.png    024.png    027.png    030.png     
(base) ➜  myvideo git:(main) ✗

可以看到,图片按照帧数作为下标文件名已经转换完毕。

接着需要利用AnimeGAN滤镜对图片进行批量转换:

from PIL import Image  
import torch  
import ssl  
ssl._create_default_https_context = ssl._create_unverified_context  
  
import numpy as np  
  
import os  
  
img_list = os.listdir("./myvideo/")  
  
  
# model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="celeba_distill")  
# model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v1")  
model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v2")  
# #model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="paprika")  
  
face2paint = torch.hub.load("bryandlee/animegan2-pytorch:main", "face2paint", size=512)  
  
for x in img_list:  
  
    if os.path.splitext(x)[-1] == ".png":  
  
        print(x)  
  
        img = Image.open("./myvideo/"+x).convert("RGB")  
  
        out = face2paint(model, img)  
  
        out.show()  
        out.save("./myimg/"+x)  
  
        # exit(-1)

每一次转换都将原图保留并且滤镜转化后的图片存放在相对目录myimg里面,随后新建img\_video.py将其重新转换为视频:

import os  
  
# 图片转视频  
os.system("ffmpeg -y -r 15 -i  ./myimg/%03d.png -vcodec libx264 ./myvideo/test.mp4")

依然是每秒15帧的速率,和原视频相同。

如果原视频带有音轨,可以先将音轨进行分离操作:

# 抽离音频  
import os  
os.system("ffmpeg -y -i ./lisa.mp4 -ss 00:00:20 -to 00:00:22 -vn -y -acodec copy ./myvideo/3.aac")

进行动漫滤镜转换之后,将转换后的视频和原视频的音轨进行合并操作:

# 合并音视频  
  
os.system("ffmpeg -y -i ./myvideo/test.mp4 -i ./myvideo/3.aac -vcodec copy -acodec copy ./myvideo/output.mp4")

原视频的测试用例:

转换后效果:

在m1芯片的加持下,基于cpu版本的Pytorch跑起来效率还是不错的,不过令人遗憾的是适配m1芯片的gpu版本的Pytorch我们还需要等待一段时间,在上个月,Pytorch项目组成员soumith给出过这样的回应:

So, here's an update.

We plan to get the M1 GPU supported. @albanD, @ezyang and a few core-devs have been looking into it. I can't confirm/deny the involvement of any other folks right now.

So, what we have so far is that we had a prototype that was just about okay. We took the wrong approach (more graph-matching-ish), and the user-experience wasn't great -- some operations were really fast, some were really slow, there wasn't a smooth experience overall. One had to guess-work which of their workflows would be fast.

So, we're completely re-writing it using a new approach, which I think is a lot closer to your good ole PyTorch, but it is going to take some time. I don't think we're going to hit a public alpha in the next ~4 months.

We will open up development of this backend as soon as we can.

可以看出来,项目组应该是彻底为m1芯片重构Pytorch底层,公开测试版也不会在近期推出,也许明年的下半年会放出来,还是非常值得期待的。

结语:无论是清华大学的CartoonGAN,还是基于CartoonGAN的AnimeGANv2,毫无疑问,它们都是业界的翘楚,是顶峰中的顶峰,就算是放在世界人工智能的范围上,摆在PyTorch-GAN这样的项目旁边,也是毫不逊色的,在人工智能领域,AnimeGANv2向世界宣布,中国人只能制造药丸补剂的历史已经一去不复返了。

相关文章
|
14天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
72 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
1月前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
287 55
|
18天前
|
机器学习/深度学习 运维 监控
利用深度学习进行系统健康监控:智能运维的新纪元
利用深度学习进行系统健康监控:智能运维的新纪元
81 30
|
1月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
190 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
11天前
|
机器学习/深度学习 算法 前端开发
基于Python深度学习果蔬识别系统实现
本项目基于Python和TensorFlow,使用ResNet卷积神经网络模型,对12种常见果蔬(如土豆、苹果等)的图像数据集进行训练,构建了一个高精度的果蔬识别系统。系统通过Django框架搭建Web端可视化界面,用户可上传图片并自动识别果蔬种类。该项目旨在提高农业生产效率,广泛应用于食品安全、智能农业等领域。CNN凭借其强大的特征提取能力,在图像分类任务中表现出色,为实现高效的自动化果蔬识别提供了技术支持。
基于Python深度学习果蔬识别系统实现
|
1月前
|
机器学习/深度学习 算法 前端开发
基于Python深度学习的果蔬识别系统实现
果蔬识别系统,主要开发语言为Python,基于TensorFlow搭建ResNet卷积神经网络算法模型,通过对12种常见的果蔬('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜')图像数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django框架搭建Web网页端可视化操作界面,以下为项目实现介绍。
52 4
基于Python深度学习的果蔬识别系统实现
|
2月前
|
机器学习/深度学习 人工智能 TensorFlow
探索深度学习与计算机视觉的融合:构建高效图像识别系统
探索深度学习与计算机视觉的融合:构建高效图像识别系统
67 0
|
3月前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
341 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
3月前
|
编解码 语音技术 内存技术
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
《FFmpeg开发实战:从零基础到短视频上线》一书中的“5.1.2 把音频流保存为PCM文件”章节介绍了将媒体文件中的音频流转换为原始PCM音频的方法。示例代码直接保存解码后的PCM数据,保留了原始音频的采样频率、声道数量和采样位数。但在实际应用中,有时需要特定规格的PCM音频。例如,某些语音识别引擎仅接受16位PCM数据,而标准MP3音频通常采用32位采样,因此需将32位MP3音频转换为16位PCM音频。
117 0
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
|
3月前
|
XML 开发工具 Android开发
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
241 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频