可作画机械臂:现场人像速绘系统

面向展会与商业活动的机械臂自动作画系统:拍照后自动生成风格化头像并完成实体绘制,单张约 2 分钟。

画像机器人小组

技术优势

面向展会与商业活动的机械臂自动作画系统:拍照后自动生成风格化头像并完成实体绘制,单张约 2 分钟。

复现文档

材料清单

| 物料 | 关键规格 | 数量 | 来源 / 价格 |

| --- | --- | --- | --- |

| UR5 / UR3 协作机械臂 | 仓库驱动脚本 robo_draw/ur5_draw_r45.py 按 UR5 写,通过 python-urx 以 IP 连接;UR3 同协议可小改 | 1 台 | — |

| 弹簧柔顺笔架 | 关键部件。3D 打印笔套 + 圆珠笔弹簧预压,让笔尖有 3–5mm 浮动量,吸收桌面高度误差 | 1 个 | 自制 |

| 圆珠笔 / 记号笔 | 笔尖出墨稳定即可 | 若干 | — |

| 画板 + 画纸 | 固定在桌面,确保平整;论文装置四角贴 ArUco 标记做视觉定位,开源代码走手动标定路线不依赖相机 | 1 套 | — |

| 法兰夹具 | 把笔架装到 UR5 末端法兰 | 1 个 | 自制 |

| (替代)AxiDraw / corexy 写字机 / 3D 打印机 | 无 UR 系时的替代执行器,需自行把笔画序列转 G-code | 1 台 | — |

仪器与环境

三档路线按需选择:路线 A 软件链路验证(无硬件,估计 1–2 周);路线 B 在 A 基础上自训 AvatarGAN(估计再加 1–2 周,因权重缺失这是完整复现的必经之路);路线 C 在 B 基础上接真机绘制。

真机所需:UR5 / UR3 协作机械臂(仓库驱动脚本按 UR5 写,UR3 同协议可小改);弹簧柔顺笔架(关键部件,刚性夹笔对桌面高度误差零容忍,±1mm 就会断线或戳破纸);固定平整的画板画纸;把笔架装到法兰的夹具。

没有 UR5 的替代方案:绘制本质是二维笔画执行,AxiDraw 写字机、开源 corexy 写字机、甚至 3D 打印机(笔架替换热端)都能承接。改造点只有一个——把笔画序列翻译成 G-code(G0 空移 / G1 画线 / z 轴抬落笔),几十行 Python 即可,算法验证效果等价。

软件环境

# 基于 TensorFlow 1.13.1(2019 年环境,与现代软硬件有兼容断层)

conda create -n robocodraw python=3.6 -y # TF1.13 要求 Python 3.5–3.7,不支持 3.8+

conda activate robocodraw

pip install tensorflow==1.13.1 numpy==1.17.1 scipy==1.3.1 \

Pillow==6.1.0 scikit-image==0.16.2 opencv-python==4.1.2.30 \

deap==1.3.0 protobuf==3.19.6

pip install urx # 仅真机绘制需要

# GPU 约束:TF1.13 需 CUDA 10.0 + cuDNN 7.4,RTX 30 系及更新的卡不支持。

# 1) 推理走 CPU(推荐起步)——单张 256×256 推理几秒到几十秒,验证链路够用

# 2) 训练用 NVIDIA 官方 TF1 容器 nvcr.io/nvidia/tensorflow:xx.xx-tf1-py3

# 3) 移植到 TF2(tf.compat.v1)——工作量不小,不建议

# 坑:TF1.13 对 protobuf 敏感,钉死 3.x

开始之前

复现 AAAI 2020 论文 RoboCoDraw(arXiv:1912.05099)的完整系统:输入一张人脸照片,生成卡通头像,由机械臂在纸面上画出来。本指南基于对官方开源仓库代码与文件的实际核查写成;标注「估计」的数字为经验推断。注意:官方仓库 checkpoint/combine3_256/ 只有 .index 和 .meta,缺存放实际参数的 .data 文件,训练数据集 README 标注 not available yet —— 所以 AvatarGAN 权重需要自己训,这是复现的核心工作量。

环境准备(最容易翻车的一步)

*预计耗时:0.5–2 天*

按上方 software_md 建 Python 3.6 环境。TF1.13 与新显卡的 CUDA 不兼容,起步阶段直接用 CPU 版推理,不要硬装 CUDA 10。

克隆仓库,跑通不依赖 GAN 权重的环节

*预计耗时:1 天*

git clone 后执行 python run_RoboCoDraw.py --filename=CFD/gray1.jpg --opt_algo=rkgaLK(去掉 --robot_drawing 即不接机器人)。主脚本依次执行:缩放裁剪 → 背景去除 → 灰度化 → AvatarGAN 推理 → FDoG 线条提取 → 笔画序列化 → 路径优化,每步在 static/ 留中间图并打印耗时。预期在 AvatarGAN 一步报 restore checkpoint 失败——这是正常的,此时你已验证预处理与背景去除可用(bgrm 和 facedetect 权重是完整的)。

并行推进:先绕过 GAN 打通后半段

*预计耗时:1–2 天*

仓库 static/ 自带若干 _avatar.jpg 中间结果,临时改脚本从现成 avatar 图起步,把线条提取与路径优化先跑通,与训练并行。同时值得给作者发邮件索取权重(README 留有 Tianying 与 Wei Qi 的邮箱),拿到就能把路线 B 降级成 A。

构建 AvatarGAN 训练数据集

*预计耗时:3–5 天*

需要两个「堆」、不需要配对:域 A 真人脸取自 Chicago Face Dataset(chicagofaces.org 免费申请科研授权);域 B 卡通头像用 Avataaars 开源参数化头像库批量随机采样数千张,注意保持正脸、灰度、风格一致;CUHK CUFS 素描库可选作补充。预处理对齐仓库样本规格:人脸检测(可直接用仓库 checkpoint/facedetect/ 的 OpenCV DNN 模型)→ 裁剪对齐 → 256×256 → 灰度化,参考 GAN/avatar_data/testA/ 确认最终规格。数据量参考:CycleGAN 类模型每域 1000–3000 张通常够用(估计值)。

训练 AvatarGAN

*预计耗时:3–7 天*

数据按 CycleGAN 惯例放 datasets/<name>/trainA(真人脸)、trainB(卡通)、testA、testB。cd GAN && python main.py 训练,tensorboard --logdir=./logs 监控损失,python main.py --phase=test 测试。训练时长估计:256×256 分辨率、1080Ti/2080Ti 量级单卡数天;用 NVIDIA TF1 容器 + 现代显卡明显更快。训完把 checkpoint 放进 checkpoint/combine3_256/ 并对齐仓库现存的 cyclegan.model-17xxxx.* 命名,主脚本即可加载。

路径优化算法对比实验

*预计耗时:1–2 天*

--opt_algo 支持 greedy / greedy2opt / greedyLK / rkga2opt / rkgaLK 五种。同一张线稿分别跑,记录三列:优化计算耗时、优化后总路径长度、(有真机后)实际绘制耗时。这是论文的核心贡献点,也是复现中最容易出成果的部分。预期结论方向:rkgaLK 路径质量最好但计算稍慢,greedy 最快但路径最长。

真机连接与标定

*预计耗时:0.5–1 天*

UR5 与电脑接同一网段,python-urx 通过 IP 连接。标定桌面高度 --table_surface_z:代码默认 -0.1095 是作者环境的值,必须重标——手动点动机械臂让笔尖轻触纸面读出 z 值。执行前把装好笔的末端移到画板左下角,程序以此为绘制原点。--drawing_size 设成品边长(米),0.25 即 25cm。

真机绘制与安全规程

*预计耗时:1–2 天*

python run_RoboCoDraw.py --filename=CFD/gray1.jpg --opt_algo=rkgaLK --drawing_size=0.25 --table_surface_z=<你标定的值> --robot_drawing。安全:首次运行把 table_surface_z 抬高 5cm 做空中彩排确认轨迹无误,再落到真实高度;示教器把 TCP 速度限到低档;全程手在急停旁;真人围观演示前先独立跑通 ≥10 次。

复现成功标志

### 头像像本人

> ✅ 用 testA 或自己拍的照片批量推理,做小规模盲测:给 ≥10 位参与者看一张头像 + 若干候选真人照,让其指认头像对应谁,统计辨认率。通过线:辨认率明显高于随机水平。有条件用同一数据训一个 vanilla CycleGAN 做对比——这是复现报告里最有说服力的一张对比图。

### 路径优化确实省时

> ✅ 五种算法对比表已产出,RKGA 系相对 greedy 的总路径长度显著缩短。

### 现场可用

> ✅ 端到端计时:从拍照到画完在数分钟量级,且连续 10 次无故障。

常见坑

### TF 1.13 装不上

> Python 必须 3.5–3.7,3.8+ 无对应 wheel;protobuf 钉死 3.x,新版会报错。

### GAN checkpoint 恢复失败

> 正常现象,不是你配错了——官方仓库 checkpoint/combine3_256/ 缺 .data 权重文件,只有 .index 和 .meta。要么找作者要,要么自己训。

### 新显卡跑不了训练

> TF1.13 需 CUDA 10.0,RTX 30 系及更新的卡不支持。用 NVIDIA 官方 TF1 容器,别硬装 CUDA 10。

### python-urx 连不上机械臂

> urx 对较新的 UR 固件(e-Series / PolyScope 5.x)支持不佳。连不上时改用 RTDE 接口,或找台老固件的机器先测通。

### 画到一半戳破纸或悬空划水

> table_surface_z 标定错,或纸面不平。上弹簧柔顺笔架,让笔尖有 3–5mm 浮动量吸收误差。

### CFD 人脸图不能放上网

> Chicago Face Dataset 许可证禁止再分发。公开展示一律换成自己拍的照片,仓库里的 CFD 图仅供本地测试。

### 生成头像五官跑偏

> 检查两域数据是否都做了对齐裁剪;域 B 卡通风格是否统一;训练轮数是否足够(看 tensorboard 的循环一致性损失是否收敛)。