拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STYLE2PAINTS V1 入门指南:基于 Keras + Chainer 的线稿自动上色服务器部署与原理解析

STYLE2PAINTS V1 入门指南:基于 Keras + Chainer 的线稿自动上色服务器部署与原理解析
  • 人工智能
  • 计算机视觉
  • 媒体生成
  • 深度学习

【免费下载链接】style2paints

sketch + style = paints :art: (TOG2018/SIGGRAPH2018ASIA)

项目地址:https://gitcode.com/gh_mirrors/st/style2paints
点击查看免费下载

本指南以 V1/README.md 为主线,完整梳理 STYLE2PAINTS 第一版(V1)的部署方式、模型构成与训练数据来源,并结合作业仓库中 V1/server/server.py 的源码,深入解析其"草图 + 指定色风格 → 成品插画"的服务端工作流与核心参数。读完你将掌握:如何用 CPU 或 GPU 搭建一个可交互的线稿上色服务、version/denoise等参数对渲染质量的实际影响,以及 Keras(TensorFlow)与 Chainer 两套框架在推理管线中各自承担的角色。

项目定位与核心能力

STYLE2PAINTS 是"sketch + style = paints"理念的开源实现(对应仓库 README.md 的项目描述)。根据 V1/README.md 的定义,V1 版本具备两项核心能力:

  • 按给定色彩风格为线稿上色(paint on a sketch):用户提交一张线稿(sketch)和一张参考图(reference),AI 依据参考图的色彩风格与局部提示(hint)完成上色;
  • 插画风格迁移(transfer illustrations' style):在线稿上色的基础上,将参考插画的风格迁移到内容之上。仓库另附 V1/AnimeStyleTransfer.md 专门讲解风格迁移的使用手法(详见本文第五节)。

从目录结构看,V1 由三部分构成:images/(测试样例)、page/(演示与截图素材)、server/(可运行的完整 Web 服务)。其中server/是一个 Cocos2d-JS 构建的 Canvas 前端(V1/server/game/index.html)+ Python 推理后端(V1/server/server.py)的组合,前端负责交互绘制,后端负责模型推理。

环境准备与依赖安装

V1/README.md 将部署分为两类场景,均以pip方式安装依赖。以下命令按原文档原样整理,并标注各依赖在源码中的实际用途。

CPU 服务器(适合入门体验)

原文档明确要求python 3 环境,依次执行:

pip install tensorflow pip install keras pip install chainer pip install bottle pip install gevent pip install h5py pip install opencv-python

GPU 服务器(适合研究用途)

原文档要求CUDA python 3.6 环境,并在 CPU 依赖基础上将tensorflow替换为tensorflow_gpu、追加cupy:

pip install tensorflow_gpu pip install keras pip install chainer pip install cupy pip install bottle pip install gevent pip install h5py pip install opencv-python

各依赖在服务端源码中的对应作用

对照 V1/server/server.py 的导入语句,可以确认每项依赖都不是可选项:

依赖源码用途
tensorflow/tensorflow_gpuimport tensorflow as tf创建 Session、占位符并执行base_generator/style2paints两个 Keras 模型的前向计算(L111-L166、L322-L354)
kerasfrom keras.models import load_model加载.net模型权重,并设置推理阶段K.set_learning_phase(0)(L15-L19)
chainerimport chainer,定义并运行 GoogLeNet 特征提取器google_net(L29-L104)
cupyGPU 模式下 Chainer 依赖 CuPy 完成chainer.cuda的显存数据搬运(L107、L291、L325)
bottle提供 HTTP 路由:@route('/paint')接收前端 POST 请求,@route('/<filename:path>')托管game/静态资源(L168-L176)
geventfrom gevent import monkey; monkey.patch_all()将服务协程化,并由run(..., server='gevent')作为 WSGI 服务器启动(L8、L434)
h5pyKeras 模型文件.net(HDF5 容器)的底层读写依赖
opencv-python图像解码、缩放、颜色空间转换、imwrite落盘等全部图像处理(L190、L280、L386)

获取仓库与预训练模型

原文档给出的获取步骤为:

git clone https://github.com/lllyasviel/style2paints.git # 从 release 页面下载全部预训练模型,放入 style2paints/server 目录 cd style2paints/server python server.py cpu # CPU 模式

其中"下载全部预训练模型并放入 server 目录"是启动前必须完成的步骤。仓库中 V1/server/put_all_models_nearby.txt 正是对这一要求的占位记录;而 V1/server/server.py 在启动阶段会直接从当前目录加载三个模型文件:

chainer.serializers.load_npz('google_net.net', google_net) # L104 base_generator = load_model('base_generator.net') # L124 style2paints = load_model('style2paints.net') # L125

关于模型权重,V1/README.md 的 "Model" 一节给出了版权归属说明(截至 2018.12.1 记录):

  1. base_generator.net—— 版权归 2017 style2paints 所有;
  2. style2paints.net—— 版权归 2017 style2paints 所有;
  3. google_net.net—— 源自 nico-opendata 数据集训练的模型。

由于这些权重文件未随仓库分发,实际部署时需要从项目 release 页面自行获取。CPU 模式下请将python server.py cpu的cpu参数视为"禁用 GPU"的标志——源码通过is_GPU = (len(sys.argv) == 1)(L5)判断:不带参数即 GPU 模式,带cpu参数则走 CPU 推理分支(见 L111-L118、L287-L296、L321-L354 的两套分支)。

模型架构与双框架推理管线

GoogLeNet 参考图特征提取(Chainer)

参考图先被缩放到 224×224(V1/server/server.py L280),然后送入 Chainer 实现的 GoogLeNet。从源码中的网络定义(L32-L62)可以看到这是一个完整的 Inception 结构:conv1(3→64, stride=2)→conv2(64→192)→ 8 个InceptionBN模块(inc3a~inc5b)→ 三个输出分支out_tag/out_a_tag/out_b_tag,每个分支输出维度均为 3000。

网络前向(L64-L102)在每一层后通过全局平均池化提取"色彩风格提示向量",共 12 个不同尺度/通道数的特征:

特征向量维度提取位置
hint_s57c64_064conv1 输出(57×57)
hint_s29c192_0192conv2 输出(29×29)
hint_s29c256_0/hint_s29c320_0256 / 320inc3a / inc3b
hint_s15c576_0~hint_s15c576_4576×5inc3c~inc4d
hint_s8c1024_0~hint_s8c1024_21024×3inc4e~inc5b

这 12 个向量随后被逐一填入 TensorFlow 侧 Keras 模型的对应tf.placeholder(L133-L144),作为色彩风格的"全局条件"驱动上色网络。GPU 模式下推理位于chainer.no_backprop_mode()与using_config('train', False)上下文内(L288-L291),关闭了梯度计算与训练开关,仅做前向特征提取。

Keras 双阶段上色生成(TensorFlow)

生成侧由两个 Keras 模型串成两阶段管线:

  1. 第一段base_generator:输入为线稿单通道图(sketch_ref_input_448)、局部颜色提示图(local_hint_input_448)以及上述 12 个风格向量,输出local_drag_output/global_drag_output/paint_output三个分支(L146-L161)。paint_output即最终上色结果;
  2. 第二段style2paints:将第一段输出与线稿 concat 后送入(combined_input_448 = tf.concat([sketch_ref_input_448, local_hint_input_448], axis=3),L130),在高分辨率阶段做二次精修,得到带清晰线稿约束的最终画面。

整个推理过程在session.run(...)中以 feed_dict 注入所有输入完成(L322-L354)。模型的 TensorFlow Session 配置(L111-L113)只对 GPU 模式生效,将可见设备限定为tensorflow_GPU_ID,并通过per_process_gpu_memory_fraction=k_between_tf_and_chainer(默认 0.8)限制显存占用,为 Chainer 侧保留显存空间。

输入预处理与归一化

  • 线稿:先由from_png_to_jpg(L394-L399)把带透明通道的 PNG 合成到白底,再转灰度、按长边缩放到 512 内(L261-L271);norm_sketch(L420-L432)以 64×64 缩略图的 min/max 做全局归一化,denoise == 'true'时额外除以 0.9 提亮线稿,最后做二次幂增强并映射回 0-255;
  • 参考图:直接缩放到 224×224 并归一化到 [0,1](L280-L283);
  • 局部提示(hint):RGBA 四通道输入(L300),RGB 色值先转到 HSV 空间乘以shifter增强饱和度(L303-L307),随后local_hint = (hint - 127) / 128映射到 [-1,1],并按 alpha 通道逐通道加权(L311-L317),实现"颜色只在用户涂抹过的区域生效"。

后处理与输出落盘

生成结果先反归一化(加回均值[103.939, 116.779, 123.68]并 BGR→RGB 翻转,L359-L361),高分辨率模式下再经style2paints精修(L365-L377),最终在 HSV 空间把饱和度除以 0.9 提升色彩浓度(L381-L384),缩放回原始线稿尺寸后同时写入record/与game/results/两个目录(L387-L389),前端通过results/路径拉取结果图。

前端交互与 /paint 接口协议

前端由 Cocos2d-JS 构建,入口为 V1/server/game/index.html(加载src/settings.js与main.js),核心交互逻辑在 V1/server/game/src/project.js 的Controller组件中:

  • 上传线稿:通过隐藏的<input type="file">(fileInputForSketch)触发,线稿被缩放显示在画布上,最多 1024 像素(project.js中tempDivSketch的 onload 逻辑);
  • 上传参考图:fileInputForReferene触发,参考图先按 224 像素等比缩放用于特征提取、再按 200 像素等比缩放用于界面色板取色;
  • 画笔与橡皮:onPenClicked/onEraserClicked切换涂色/擦除,handlePainter中笔刷半径6 - B随版本号B变化(V1 半径 5、V4 半径 2),涂色采用半透明笔触(alpha 0.618)便于反复叠色;
  • 取色器:点击参考图区域即可吸取该处颜色作为当前画笔色(handleColorPicker);
  • 提交上色:onColorizeClicked将线稿(sketch)、参考图(reference)、涂抹提示(hint)以 dataURL 编码,连同version、denoise、sketchID、referenceID通过XMLHttpRequestPOST 到/paint(i.open("POST","/paint",!0))。

服务端 V1/server/server.py 的/paint路由(L178-L391)与前端一一对应:sketchID/referenceID为new时首次上传并落盘到record/,后续请求可直接复用已保存的线稿与参考图;每个交互会话都会在record/留下.sketch.png、.reference.png、.hint.png、.fin.jpg四类过程文件。响应体为dstr + '*' + referenceID格式,前端以*分割后拼接出results/下的结果图 URL(project.js中d函数)。

version 参数:四档渲染精度的语义

/paint请求中的version字段直接映射 V1/server/server.py L226-L256 的四组超参数,前端版本选择按钮onV1~onV4对应B = 1~4:

versionlow_level_scaleshifterup_level插值方式高分辨率尺度
1161.3TrueINTER_AREA32
2(默认)281.2TrueINTER_AREA32
3481.1TrueINTER_LANCZOS464
4641.0FalseINTER_LANCZOS464

其中low_level_scale/high_level_scale通过unet_resize(L402-L417)控制送入 U-Net 的分辨率基数(短边基准,且对齐到 64 的倍数);shifter控制提示色在 HSV 空间的饱和度增强倍数;up_level决定是否启用第二阶段style2paints高分辨率精修。可以看出V4 是最大分辨率 + 不降采样精修的配置,代价是显存与耗时更高。

denoise 参数:线稿提亮开关

denoise为'true'时,norm_sketch在归一化后额外执行sketch /= 0.9(L428-L429),等效于把线稿整体提亮约 11%,适合线条较淡、噪声较多的草图;设为'false'则保持原始对比度。

附:V1 中的插画风格迁移用法

V1/AnimeStyleTransfer.md 补充了同仓库内风格迁移的交互要点:在网页中点击upSketch上传内容图(建议 720p 以上高清图)、点击upReference上传风格图,并务必开启 V4(部分情况 V3)与 SX 开关——对应version=4(或 3)的高分辨率渲染路径与饱和风格增强选项。仓库V1/images_in_style_transfer/目录提供了 8 组内容/风格/结果示例(contents 与 styles 子目录为输入,results 为输出),可复现该流程。

训练数据集建议(面向研究者)

如需自行训练,V1/README.md 给出的两条官方建议:

  1. 插画数据集:推荐 nico-opendata 的 40 万张插画图片;
  2. 线稿数据集:推荐使用 sketchKeras 工具从插画中提取线稿。

常见问题与部署提示

  • 模型缺失:启动时load_model/load_npz找不到.net文件会直接报错,务必按 V1/server/put_all_models_nearby.txt 的提示把三个模型放在V1/server/目录下再执行python server.py;
  • GPU/CPU 切换:以python server.py(无参数)启动为 GPU 模式,以python server.py cpu启动为 CPU 模式(V1/server/server.py L5 的is_GPU判定),CPU 模式下 Chainer 与 TensorFlow 均使用纯 CPU 计算,无需 CuPy;
  • 显存分配:GPU 模式下 TensorFlow 默认占用 80% 显存(k_between_tf_and_chainer = 0.8),若显存不足可调整该常量,并为 Chainer 预留足够空间;
  • 端口与访问:服务默认监听0.0.0.0:8000(L434),启动后浏览器访问http://localhost:8000即可进入 Canvas 交互界面。
  • 人工智能
  • 计算机视觉
  • 媒体生成
  • 深度学习

【免费下载链接】style2paints

sketch + style = paints :art: (TOG2018/SIGGRAPH2018ASIA)

项目地址:https://gitcode.com/gh_mirrors/st/style2paints
点击查看免费下载
上一篇:QMK 固件 ALF X2 键盘矩阵图解析:从 Matrix Diagram 到引脚、布局与键位映射
下一篇:IDENTITY and PURPOSE

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表