You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AugLy增强高分辨率COCO标注图像时出现边界框验证错误的解决求助

AugLy增强高分辨率COCO标注图像时出现边界框验证错误的解决求助

大家好,我最近在处理高分辨率图像的COCO标注数据增强时遇到了一个棘手的问题,想请各位帮忙看看怎么解决。

具体情况是这样的:我有一张分辨率为8192x4230的图像,用标注工具完成标注后导出了COCO格式的注释文件。现在我想用AugLy库对这张图和对应的标注做数据增强,但运行过程中会随机抛出AssertionError,提示某个边界框无效或不符合COCO格式,而且这个错误的触发没有规律——有时候第一次增强就会出现,有时候跑20次循环才会报错。

以下是我遇到的错误栈:

Traceback (most recent call last):
  File "C:\Users\Admin\source\repos\augpy\aug.py", line 114, in apply_random_augmentation(input_path, output_path, count+1)
  File "C:\Users\Admin\source\repos\augpy\aug.py", line 72, in apply_random_augmentation
    img = aug_func(img, bboxes, metadata)
  File "C:\Users\Admin\source\repos\augpy\aug.py", line 16, in <lambda>
    lambda x, bboxes, meta: imaugs.random_noise(x, bboxes=bboxes, bbox_format='coco', metadata=meta),
  File "D:\Python39\lib\site-packages\augly\image\functional.py", line 1981, in random_noise
    imutils.get_metadata(
  File "D:\Python39\lib\site-packages\augly\image\utils\metadata.py", line 190, in get_metadata
    transform_bboxes(
  File "D:\Python39\lib\site-packages\augly\image\utils\metadata.py", line 128, in transform_bboxes
    norm_bboxes = validate_and_normalize_bboxes(dst_bboxes, bbox_format, src_w, src_h)
  File "D:\Python39\lib\site-packages\augly\image\utils\metadata.py", line 46, in validate_and_normalize_bboxes
    assert (
AssertionError: Bounding box [569.0, 2868.0, 207.0, 264.0] is invalid or is not in coco format

我自己写的代码如下:

定义增强函数列表

import os, random, copy, json
from PIL import Image
import augly.image.functional as imaugs
from pycocotools.coco import COCO

# List of augmentations
augmentations = [
    lambda x, bboxes, meta: imaugs.random_noise(x, bboxes=bboxes, bbox_format='coco', metadata=meta),
    lambda x, bboxes, meta: imaugs.blur(x, bboxes=bboxes, bbox_format='coco', metadata=meta, radius=random.uniform(0.5, 2.0)),
    lambda x, bboxes, meta: imaugs.brightness(x, bboxes=bboxes, bbox_format='coco', metadata=meta, factor=random.uniform(0.7, 1.3)),
    lambda x, bboxes, meta: imaugs.contrast(x, bboxes=bboxes, bbox_format='coco', metadata=meta, factor=random.uniform(0.7, 1.5)),
    lambda x, bboxes, meta: imaugs.hflip(x, bboxes=bboxes, bbox_format='coco', metadata=meta),
    lambda x, bboxes, meta: imaugs.vflip(x, bboxes=bboxes, bbox_format='coco', metadata=meta),
    lambda x, bboxes, meta: imaugs.rotate(x, bboxes=bboxes, bbox_format='coco', metadata=meta, degrees=random.randint(-30, 30)),
    lambda x, bboxes, meta: imaugs.saturation(x, bboxes=bboxes, bbox_format='coco', metadata=meta, factor=random.uniform(0.5, 1.5)),
    lambda x, bboxes, meta: imaugs.scale(x, bboxes=bboxes, bbox_format='coco', metadata=meta, factor=random.uniform(0.7, 1.3)),
    lambda x, bboxes, meta: imaugs.overlay_emoji(x, bboxes=bboxes, bbox_format='coco', metadata=meta, emoji_size=0.1),
    lambda x, bboxes, meta: imaugs.overlay_text(x, bboxes=bboxes, bbox_format='coco', metadata=meta, opacity=0.5),
]

COCO标注处理与增强逻辑

# Annotation ID
ann_id = 0

# Calculate segmentation from bbox
def bbox_to_segmentation(bbox):
    x, y, w, h = bbox
    segmentation = [
        [x, y, x + w, y, x + w, y + h, x, y + h]
    ]
    return segmentation

input_dir = "input_images"
output_dir = "augmented_images"
os.makedirs(output_dir, exist_ok=True)

annotation_file = input_dir + '/my_coco.json'
coco = COCO(annotation_file)
annotation_file_output = output_dir + '/my_coco.json'

coco_output = copy.deepcopy(coco.dataset)
annotation_template = copy.deepcopy(coco_output['annotations'][0])
img_template = copy.deepcopy(coco_output['images'][0])
coco_output['annotations'] = []
coco_output['images'] = []

image_id = 1 # Only one image
annotation_ids = coco.getAnnIds(imgIds=image_id)
annotations = coco.loadAnns(annotation_ids)
original_bboxes = [ann['bbox'] for ann in annotations]

input_images = [f for f in os.listdir(input_dir) if f.endswith(('.jpg', '.jpeg', '.png'))]
if not input_images:
    raise FileNotFoundError("No images in input_images!")

def apply_random_augmentation(image_path, output_path, img_num):
    global ann_id
    img = Image.open(image_path)
    num_augs = random.randint(1, 3)
    bboxes = [[float(num) for num in bbox] for bbox in copy.deepcopy(original_bboxes)]
    
    # Apply from 1 to 3 augs
    for _ in range(num_augs):
        aug_func = random.choice(augmentations)
        metadata = []
        img = aug_func(img, bboxes, metadata)
    
    new_bboxes = [[int(x) for x in bbox] for bbox in metadata[0]['dst_bboxes']]
    print(f'{img_num} {str(new_bboxes) == str(bboxes)}')
    
    # Fill in resulting annotation
    for bbox in new_bboxes:
        new_annotation = copy.deepcopy(annotation_template)
        new_annotation['area'] = bbox[2] * bbox[3]
        new_annotation['segmentation'] = bbox_to_segmentation(bbox)
        new_annotation['iscrowd'] = 0
        new_annotation['bbox'] = bbox
        new_annotation['id'] = ann_id + 1
        new_annotation['image_id'] = img_num
        new_annotation['category_id'] = coco.anns[(ann_id % len(coco.anns)) + 1]['category_id']
        coco_output['annotations'].append(new_annotation)
        ann_id+=1

我自己初步怀疑是不是高分辨率图像的浮点数精度问题,导致AugLy在转换边界框时出现了超出图像范围的情况?或者是我在传递bbox、处理metadata的方式有问题?

希望有经验的朋友能帮我排查一下问题所在,或者给我一些解决思路,非常感谢!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 09:50:28