- 人工智能
- 计算机视觉
- 媒体生成
- 深度学习
【免费下载链接】style2paints
sketch + style = paints :art: (TOG2018/SIGGRAPH2018ASIA)
本指南以 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-pythonGPU 服务器(适合研究用途)
原文档要求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_gpu | import tensorflow as tf创建 Session、占位符并执行base_generator/style2paints两个 Keras 模型的前向计算(L111-L166、L322-L354) |
keras | from keras.models import load_model加载.net模型权重,并设置推理阶段K.set_learning_phase(0)(L15-L19) |
chainer | import chainer,定义并运行 GoogLeNet 特征提取器google_net(L29-L104) |
cupy | GPU 模式下 Chainer 依赖 CuPy 完成chainer.cuda的显存数据搬运(L107、L291、L325) |
bottle | 提供 HTTP 路由:@route('/paint')接收前端 POST 请求,@route('/<filename:path>')托管game/静态资源(L168-L176) |
gevent | from gevent import monkey; monkey.patch_all()将服务协程化,并由run(..., server='gevent')作为 WSGI 服务器启动(L8、L434) |
h5py | Keras 模型文件.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 记录):
base_generator.net—— 版权归 2017 style2paints 所有;style2paints.net—— 版权归 2017 style2paints 所有;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_0 | 64 | conv1 输出(57×57) |
hint_s29c192_0 | 192 | conv2 输出(29×29) |
hint_s29c256_0/hint_s29c320_0 | 256 / 320 | inc3a / inc3b |
hint_s15c576_0~hint_s15c576_4 | 576×5 | inc3c~inc4d |
hint_s8c1024_0~hint_s8c1024_2 | 1024×3 | inc4e~inc5b |
这 12 个向量随后被逐一填入 TensorFlow 侧 Keras 模型的对应tf.placeholder(L133-L144),作为色彩风格的"全局条件"驱动上色网络。GPU 模式下推理位于chainer.no_backprop_mode()与using_config('train', False)上下文内(L288-L291),关闭了梯度计算与训练开关,仅做前向特征提取。
Keras 双阶段上色生成(TensorFlow)
生成侧由两个 Keras 模型串成两阶段管线:
- 第一段
base_generator:输入为线稿单通道图(sketch_ref_input_448)、局部颜色提示图(local_hint_input_448)以及上述 12 个风格向量,输出local_drag_output/global_drag_output/paint_output三个分支(L146-L161)。paint_output即最终上色结果; - 第二段
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:
| version | low_level_scale | shifter | up_level | 插值方式 | 高分辨率尺度 |
|---|---|---|---|---|---|
| 1 | 16 | 1.3 | True | INTER_AREA | 32 |
| 2(默认) | 28 | 1.2 | True | INTER_AREA | 32 |
| 3 | 48 | 1.1 | True | INTER_LANCZOS4 | 64 |
| 4 | 64 | 1.0 | False | INTER_LANCZOS4 | 64 |
其中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 给出的两条官方建议:
- 插画数据集:推荐 nico-opendata 的 40 万张插画图片;
- 线稿数据集:推荐使用 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)
相关推荐
Hasura Event Triggers 实战:使用 Google Cloud Functions(Node.js 6)编写 echo 云函数解析事件负载
Hasura Event Triggers 实战:使用 Google Cloud Functions(Node.js 6)编写 echo 云函数解析事件负载 导
人工智能计算机视觉媒体生成深度学习推荐开源项目:Paints Chainer — 线稿自动上色神器
推荐开源项目:Paints Chainer — 线稿自动上色神器 在数字绘画的世界中,从黑白线稿到色彩斑斓的成品总是一个费时费力的过程。但是,有了 Paints
LangSmith Client SDK与LangChain无缝集成教程:提升AI应用可观测性
LangSmith Client SDK与LangChain无缝集成教程:提升AI应用可观测性 LangSmith Client SDK是专为AI应用开发者设计
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考