syndata-generation
ICCV论文配套代码:将孤立物体图+背景图自动合成带标注的目标检测训练数据集
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
ICCV论文配套代码:将孤立物体图+背景图自动合成带标注的目标检测训练数据集
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
如果你做过目标检测(Object Detection)方向的科研或工程,一定有这个体会:训练一个能用的检测模型,最费劲的不是调网络结构,而是——标注数据。你得找一堆图片,用 LabelImg 或 CVAT 框出每个目标的位置,再打上类别标签。一张图还好说,当你要训练一个能识别 20 类物品的模型时,往往需要成千上万张图。
更头疼的是跨域问题:你用室内场景训练的模型,换到室外就拉胯;用白天图片训练的,夜里直接瞎火。传统解法是"多场景多批次标注",成本直接爆炸。
2017年,ICCV 会议上出现了一篇听起来很"野"的论文——《Cut, Paste and Learn: Surprisingly Easy Synthesis for Instance Detection》。作者是来自卡内基梅隆大学的 Debidatta Dwibedi,核心思想就一句话:与其辛苦标注真实图片,不如让AI自己"造"训练数据。
这个 GitHub 仓库,就是这篇论文的数据生成代码。
整个数据生成流程分为三个阶段,技术细节如下:
第一步:物体提取(剪切)
用户需要提供两类原始素材:孤立物体图片(前景)和背景场景图片。物体图片要求附带像素级 Mask(即每个像素标记为"属于物体"或"属于背景")。Mask 的生成可以使用论文推荐的 Pixel Objectness with Bilinear Pooling 自动分割,也可用 OpenCV 的 GrabCut 算法手动标注。
代码中的 get_annotation_from_mask_file() 函数从 Mask 文件中计算边界框(Bounding Box),get_mask_file() 则负责将图片路径映射到对应的 Mask 路径(默认规则:.jpg → .pbm)。
第二步:场景合成(粘贴)
create_image_anno() 函数是合成引擎的核心。它从背景图库中随机选取一张背景图,然后按照 defaults.py 中的配置参数,随机决定:
每个物体的放置位置需要通过 overlap() 函数做 IOU 检测,确保与已放置物体不发生严重重叠(IOU 阈值 0.75)。
第三步:视觉融合(Blend)
简单粘贴的物体会有明显的"PS痕迹"。代码实现了五种融合策略来解决这个问题:
| 融合模式 | 原理 | 视觉效果 |
|---|---|---|
none | 直接粘贴,无融合 | 明显的边缘锯齿 |
gaussian | 用高斯模糊羽化边缘 | 边缘柔和 |
box | 用方框模糊过渡 | 过渡较生硬 |
motion | 运动模糊模拟 | 动感模糊效果 |
poisson | 泊松融合(需额外依赖) | 最佳融合,物体与背景光照自然过渡 |
每次合成会同时生成这 5 种版本的图片,输出到同一个实验目录,方便对比哪种融合策略最适合你的场景。
distractor(干扰物)机制:代码还支持在场景中添加"不需要标注"的干扰物,这些物体来自独立的干扰物列表,它们的存在让模型学会忽略无关物体——这是真实场景中非常重要的泛化能力。
代码依赖两个关键外部库,配置稍复杂:
defaults.py 中需要设置 POISSON_BLENDING_DIR 指向安装目录。依赖列表:OpenCV(图像处理)、Pillow(图像读写)、NumPy(数组运算)、SciPy(科学计算)、multiprocessing.Pool(多进程加速,默认 4 workers)。
合成结束后,dataset_generator.py 会生成三类文件:
images/ 目录,包含 5 种融合版本的图片annotations/ 目录,每张图片对应一个 Pascal VOC 格式的 XML 文件,记录每个物体的类别名和边界框坐标train.txt 每行格式为 图片路径 标注路径,labels.txt 列出所有类别这套格式直接兼容 Faster R-CNN、Caffe 等经典目标检测框架,无需额外转换。
最大坑:Python 2.7 语法
代码大量使用 xrange()(而非 range())、print 语句(而非 print() 函数),是典型的 Python 2 遗留写法。在 Python 3 环境下直接运行会报错。需要用 Python 2.7 或自行替换为 Python 3 兼容写法。
Poisson Blending 配置繁琐
泊松融合是效果最好的融合方式,但需要手动安装 yskmt/pb 并配置路径,对新用户不友好。defaults.py 中的 POISSON_BLENDING_DIR 必须指向正确的安装目录。
Mask 必须预先准备好
代码本身不生成 Mask,需要借助外部工具(如 Pixel Objectness 或 GrabCut)预先处理。Mask 质量直接影响合成效果和最终模型性能。
无容器化,无 Web UI
纯命令行工具,没有 Docker 支持,没有图形界面,参数调整全靠改 defaults.py 文件,调试成本较高。
这篇论文的核心贡献不是代码,而是"合成数据+少量真实数据"的训练范式。论文实验表明:在跨域场景下,90% 的合成数据 + 10% 真实数据,训练效果可以和 100% 真实数据相当。
这一思路对以下场景极具价值:
项目 starred 300 次,forked 71 次,被多篇后续研究引用,是合成数据生成领域的重要开源基线。
debidatta/syndata-generation 实现了从"孤立物体图+背景图"到"带标注合成数据集"的完整流水线,核心价值在于提供了一个可复现的合成数据生成基线。代码轻量、逻辑清晰,但依赖配置繁琐、Python 2 遗留写法给迁移带来障碍。适合有目标检测经验的开发者使用,新手劝退成本较高。
推荐指数(5星):★★★☆☆(扣在配置复杂度和Python 2兼容性上)