原文转载自「刘悦的技术博客」https://v3u.cn/a_id_201
前段时间,业界鼎鼎有名的动漫格调转化滤镜库AnimeGAN公布了最新的v2版本,一时间街谈巷议,风头无两。提起二次元,目前国内用户基数最大的无疑是抖音客户端,其内置的一款动画转换滤镜“变身漫画”,可能让用户在直播中,把本人的理论外貌转换为二次元“画风”。对于二次元粉丝来说,“突破次元壁,变身纸片人”这种自娱自乐形式堪称屡试不爽:
然而看多了就不免有些审美疲劳,千人一面的“锥子脸”,变化无穷的“卡姿兰”式大眼睛,让人多少有点百读不厌的感觉,未免过犹不及,失之事实。
而基于CartoonGan的AnimeGAN动漫格调滤镜则可能在保留原图特点的同时,兼具二次元的炫酷和三次元的写实,颇有些刚柔并济、举重若轻的感觉:
并且AnimeGAN项目组业已在线上公布demo接口,能够间接运行模型成果:https://huggingface.co/spaces... 然而受限于带宽以及线上资源瓶颈,线上迁徙队列常常会处于排队的状态,同时一些原图的上传也可能造成个人隐私的外泄。
所以本次咱们在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/downlo...
双击装置即可,随后进入终端键入命令装置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向世界发表,中国人只能制作药丸补剂的历史曾经一去不复返了。
原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_201