探索AnimeGANv2:将真实世界转化为新海诚风格的动漫景象
AnimeGANv2是一种引人注目的深度学习模型,它能将真实世界的图片或视频转换成特定的动漫风格。这种模型不仅为动漫爱好者提供了一个独特的玩具,还为视觉艺术家和内容创作者开辟了新的创意途径。本文将介绍AnimeGANv2的使用ONNX权重将图片转换成著名动漫导演新海诚的风格。AnimeGANv2 Github地址
AnimeGANv2简介
AnimeGANv2是AnimeGAN的升级版本,旨在通过深度学习技术,捕捉并模仿特定动漫导演的风格,如宫崎骏、新海诚和今敏。它通过分析这些导演电影中的视频帧,学习如何将普通图片转化为具有相似艺术风格的动漫图像。这一过程不仅涉及颜色和纹理的转换,还包括细节和轮廓的调整,以达到高度逼真的动漫效果。
数据集
AnimeGANv2的数据集包含6656张真实风景图片和3种动漫风格,宫崎骏(Hayao)、新海诚(Shinkai)、今敏(Paprika),每种风格都通过分析这些导演作品中的视频帧来生成。这种方法确保了生成的动漫风格图像不仅在色彩上,而且在艺术风格上都尽可能地接近原作,每种风格的数据都是通过对应导演的电影中视频帧的随机裁剪生成的,确保了模型可以学习到各自独特的视觉特征。(下面示例权重是基于Shinkai风格数据集训练)
环境配置
在详细描述环境配置和安装步骤之前,请确保您的系统已经安装了Python和pip。
1. 安装必要的Python库
pip install onnxruntime-gpu==1.13.1 opencv-python==4.7.0.68 numpy==1.24.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/
如果您没有GPU或者不打算使用GPU,可以安装onnxruntime
而不是onnxruntime-gpu
:
pip install onnxruntime==1.13.1 opencv-python==4.7.0.68 numpy==1.24.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/
2. 验证安装
安装完成后,您可以通过运行Python并尝试导入安装的包来验证是否成功安装了所有必要的库:
import onnxruntime
import cv2
import numpy
如果上述命令没有引发任何错误,那么恭喜您,您已成功配置了运行环境。
小贴士
- 如果您在安装过程中遇到任何问题,可能需要更新pip到最新版本:
pip install --upgrade pip
。 - 对于使用NVIDIA GPU的用户,确保您的系统已安装CUDA和cuDNN。
onnxruntime-gpu
要求系统预装这些NVIDIA库以利用GPU加速。
按照这些步骤,您应该能够成功配置环境并运行AnimeGANv2动漫风格转换项目了。
使用指南
-
获取模型权重:首先,你需要从百度网盘下载AnimeGANv2的模型权重。
·权重链接:https://pan.baidu.com/s/1WfeZVWn7CfX4VEOFsd8Gbw,
·提取码:pv60。 -
模型加载与推理:使用
onnxruntime
库加载ONNX模型,并进行图像处理和推理。下面的代码示例展示了如何将一张图片转换为新海诚风格:
# 导入onnxruntime库用于执行ONNX模型
import onnxruntime as ort
# 导入time库用于计时,cv2库用于图像处理
import time, cv2
# 导入numpy库,用于处理数组和进行数学运算
import numpy as np
# 定义process_image函数,用于处理图像,可选择是否将图像大小调整为32的倍数
def process_image(img, x32=True):
# 获取图像的高度和宽度
h, w = img.shape[:2]
# 如果启用x32,将图像大小调整为32的倍数
if x32:
# 内部函数to_32s,用于计算大于等于256且为32的倍数的尺寸
def to_32s(x):
return 256 if x < 256 else x - x % 32
# 调整图像大小
img = cv2.resize(img, (to_32s(w), to_32s(h)))
# 将图像颜色空间从BGR转换为RGB,转换为float32类型,并进行归一化
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32) / 127.5 - 1.0
return img
# 定义load_test_data函数,用于加载测试数据,接受图像和大小参数
def load_test_data(img0, size):
# 调用process_image函数处理图像
img = process_image(img0, size)
# 增加一个新的维度,用于模型输入
img = np.expand_dims(img, axis=0)
return img, img0.shape
# 定义show_images函数,用于显示图像,接受图像和大小参数
def show_images(images, size):
# 对图像进行反归一化操作,并确保像素值在0到255之间
images = (np.squeeze(images) + 1.) / 2 * 255
images = np.clip(images, 0, 255).astype(np.uint8)
# 调整图像大小并将颜色空间从RGB转换回BGR
images = cv2.resize(images, size)
images = cv2.cvtColor(images, cv2.COLOR_RGB2BGR)
return images
# 当脚本作为主程序运行时执行以下代码
if __name__ == '__main__':
# 指定ONNX模型文件路径
onnx_file = 'Shinkai_53.onnx'
# 创建一个ONNX运行时会话,指定使用CUDA和CPU作为后端
session = ort.InferenceSession(onnx_file, providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
# 获取模型的输入和输出节点的名称
x = session.get_inputs()[0].name
y = session.get_outputs()[0].name
# 设置运行模式,1为图像处理,2为视频流处理
mode = 1
# 如果模式为1,处理单个图像
if mode == 1:
# 指定要处理的图像路径
image_path = "AE86.jpg"
# 读取图像文件
image = cv2.imread(image_path)
# 加载测试数据,并获取图像的原始尺寸
sample_image, shape = load_test_data(image, size=[256, 256])
# 使用模型进行推断
fake_img = session.run(None, {x: sample_image})
# 显示处理后的图像
output_image = show_images(fake_img[0], (shape[1], shape[0]))
print("图片转换完成")
# 显示和保存处理后的图像
cv2.imshow("animeGanv2", output_image)
cv2.imwrite('AE86_Shinkai.jpg', output_image)
# 等待用户按键后关闭显示窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
# 如果模式为2,通过摄像头实时处理视频流
elif mode == 2:
# 打开默认摄像头
cap = cv2.VideoCapture(0)
# 记录开始时间用于计算FPS
start_time = time.time()
counter = 0
while True:
# 从摄像头读取一帧
ret, frame = cap.read()
# 处理读取的帧
sample_image, shape = load_test_data(frame, size=[256, 256])
# 使用模型进行推断
fake_img = session.run(None, {x: sample_image})
# 显示处理后的帧
output_image = show_images(fake_img[0], (shape[1], shape[0]))
# 计数器加1
counter += 1
# 每秒计算并显示FPS
if (time.time() - start_time) > 0:
fps = counter / (time.time() - start_time)
cv2.putText(output_image, "FPS:{0}".format(float('%.1f' % fps)), (5, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 255, 255), 1)
cv2.imshow('animeGanv2', output_image)
# 如果用户按下'q'键,则退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头资源并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
elif mode == 3:
# 输入视频路径
input_video_path = 'kun.mp4'
# 输出视频路径
output_video_path = 'kunShinkai_animeGanv2.mp4'
# 打开视频文件
cap = cv2.VideoCapture(input_video_path)
# 检查视频是否成功打开
if not cap.isOpened():
print("Error: Could not open video.")
exit()
# 读取视频的基本信息
frame_width = int(cap.get(3)) # 获取视频宽度
frame_height = int(cap.get(4)) # 获取视频高度
fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频帧率
# 定义视频编码器和创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 根据文件扩展名选择正确的编码器
out = cv2.VideoWriter(output_video_path, fourcc, fps, (frame_width, frame_height)) # 创建视频写入对象
# 初始化帧数计数器和起始时间
frame_count = 0
start_time = time.time()
while True:
ret, frame = cap.read() # 读取一帧视频
if not ret:
print("Info: End of video file.") # 视频结束
break
sample_image, shape = load_test_data(frame, size=[256, 256]) # 处理读取的帧
fake_img = session.run(None, {x: sample_image}) # 使用模型进行推断
output_image = show_images(fake_img[0], (shape[1], shape[0])) # 获取输出图像
# 计算并打印帧速率
frame_count += 1
end_time = time.time()
elapsed_time = end_time - start_time
if elapsed_time > 0:
fps = frame_count / elapsed_time
print(f"FPS: {fps:.2f}")
out.write(output_image) # 将处理后的帧写入输出视频
# 实时显示处理后的视频帧(可选)
cv2.imshow("Output Video", output_image)
if cv2.waitKey(1) & 0xFF == ord('q'): # 按'q'退出
break
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
print(f"视频转换完成: {output_video_path}")
else:
print("输入错误,请检查mode的赋值")
这段代码首先加载一个AnimeGANv2模型的onnx权重,然后读取一张待转换的图片,通过模型进行风格转换,并显示结果。通过上述代码中的mode参数,你可控制摄像头,视频等不同模式下的图片风格转换。
结果展示
推理完成后,您可以查看处理后的图像,如下所示:
-
原始图片:
-
转换图片:
结论
AnimeGANv2提供了一个强大的工具,可以将真实世界的视觉内容转换为具有特定动漫风格的艺术作品。它为动漫爱好者、艺术家和视觉内容创作者打开了一扇创新之门,使他们能够探索和实现独特的视觉表达。无论是用于个人项目、艺术创作还是商业用途,AnimeGANv2都展示了深度学习在艺术创作领域的潜力和多样性。