面向展会与商业活动的机械臂自动作画系统:拍照后自动生成风格化头像并完成实体绘制,单张约 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。
*预计耗时:1 天*
git clone 后执行 python run_RoboCoDraw.py --filename=CFD/gray1.jpg --opt_algo=rkgaLK(去掉 --robot_drawing 即不接机器人)。主脚本依次执行:缩放裁剪 → 背景去除 → 灰度化 → AvatarGAN 推理 → FDoG 线条提取 → 笔画序列化 → 路径优化,每步在 static/ 留中间图并打印耗时。预期在 AvatarGAN 一步报 restore checkpoint 失败——这是正常的,此时你已验证预处理与背景去除可用(bgrm 和 facedetect 权重是完整的)。
*预计耗时:1–2 天*
仓库 static/ 自带若干 _avatar.jpg 中间结果,临时改脚本从现成 avatar 图起步,把线条提取与路径优化先跑通,与训练并行。同时值得给作者发邮件索取权重(README 留有 Tianying 与 Wei Qi 的邮箱),拿到就能把路线 B 降级成 A。
*预计耗时: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 张通常够用(估计值)。
*预计耗时: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 的循环一致性损失是否收敛)。