目标检测多边形标注场景下的数据增强实现方法咨询
适配多边形标注的数据增强实现方案
核心逻辑非常明确:多边形标注本质是有序的坐标点集合,你需要的resize、shear、scale、zoom都属于仿射变换类操作,只要对多边形的每个坐标点执行和图像完全一致的变换矩阵映射即可,不需要单独适配多边形的形状逻辑。
第一步:解析VGG Annotator的JSON标注
VGG导出的JSON文件中,每张图像对应的regions字段下的shape_attributes就存储了多边形的原始坐标:
- 直接读取
all_points_x和all_points_y两个数组,拼接成[[x1,y1], [x2,y2], ..., [xn,yn]]格式的点集即可 - 注意将坐标转成浮点型存储,避免后续变换出现精度丢失
第二步:直接调用成熟增强库实现同步变换
不要手写变换矩阵,很容易出现坐标偏移问题,目前主流的CV增强库都原生支持多边形标注的同步变换,完全覆盖你需要的所有增强操作,推荐直接用albumentations库:
- 安装命令:
pip install albumentations - 示例代码如下:
import albumentations as A import json import cv2 # 定义增强管线,所有操作会自动同步作用于图像和多边形 transform = A.Compose([ A.Resize(height=512, width=512), # 按你需要的尺寸调整 A.Affine(scale=(0.8, 1.2), shear=(-10, 10), zoom=(0.9, 1.1)), # 集成你要的scale、shear、zoom增强,参数范围可以自己调整 ], polygon_params={'label_fields': ['category_id']}) # 开启多边形变换支持,绑定类别字段 # 读取原图和对应标注 img = cv2.imread("你的图像路径.jpg") img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 替换为你从JSON里解析出的当前图像的多边形坐标和对应类别ID polygons = [ [[10, 20], [30, 40], [50, 60], [20, 70]], # 示例多边形1 [[100, 200], [120, 220], [140, 180]] # 示例多边形2 ] category_ids = [0, 1] # 和上面的多边形一一对应 # 执行增强 augmented_res = transform(image=img, polygons=polygons, category_id=category_ids) # 输出结果可以直接使用 augmented_img = augmented_res['image'] # 增强后的图像 augmented_polygons = augmented_res['polygons'] # 同步变换后的多边形坐标 augmented_categories = augmented_res['category_id'] # 和变换后的多边形一一对应
注意:输入的多边形坐标用原图的绝对坐标即可,不需要提前做归一化,库会自动根据图像尺寸做对应映射,输出的坐标也是对应增强后图像的绝对坐标
第三步:标注校验
增强完成后建议加两道校验逻辑避免脏数据:
- 过滤掉变换后所有坐标点都落在图像外的无效多边形
- 随机抽取10-20张增强结果,把多边形画在图像上叠加校验对齐效果,确认没有坐标偏移问题
第四步:适配Mask RCNN输入
你用Mask RCNN做训练的话,变换后的多边形可以直接用来生成对应尺寸的实例mask,不需要转矩形标注,直接把增强后的图像、多边形坐标、类别ID按你用的框架要求的格式传入dataloader即可。
如果你的训练算力不算充裕,也可以提前把2700张图的增强结果和对应标注预处理成新的数据集,不用在训练时做实时增强,能减少训练阶段的CPU负载。
内容的提问来源于stack exchange,提问作者Vedant Modi
相关产品推荐
相关产品推荐

