单张图片经imgaug处理触发ValueError,BoundingBox相关问题求助
嘿,我看了你遇到的这个imgaug的ValueError问题,其实核心是两个小错误导致的——图片输入格式不对,还有Bounding Boxes和图片数量不匹配,我来给你拆解一下并解决:
问题根源
图片维度误解:
cv2.imread()返回的是单张图片的3维数组(形状为(高度, 宽度, 通道数)),但imgaug的增强器期望接收的是图片列表(或者4维数组(图片数量, 高度, 宽度, 通道数))。当你直接传入这张3维数组时,imgaug会错误地把第一维度(比如你的图片高度是4160)当成图片数量,误以为你传入了4160张图,但你的bbs只对应2张图,数量不匹配就触发了报错。Bounding Boxes结构错误:你的
bbs是包含两个子列表的结构,这对应两张图片的标注,但你实际只有一张图片,结构完全不对应。另外,imgaug官方更推荐用BoundingBoxesOnImage类来包装单张图片的所有bbox,这样能彻底避免解析歧义。
修正后的完整代码
import numpy as np import imgaug as ia import imgaug.augmenters as iaa import cv2 # 读取单张图片,并包装成列表(符合imgaug的批量输入要求) image = cv2.imread("meter0008.jpg") images = [image] # 把单张图放进列表,让imgaug识别为1张图的批量 # 为单张图片定义Bounding Boxes,用BoundingBoxesOnImage包装(官方推荐方式) bbs = [ ia.BoundingBoxesOnImage([ ia.BoundingBox(x1=10.5, y1=15.5, x2=30.5, y2=50.5), ia.BoundingBox(x1=10.5, y1=20.5, x2=50.5, y2=50.5), ia.BoundingBox(x1=40.5, y1=75.5, x2=70.5, y2=100.5) ], shape=image.shape) # 必须传入图片的shape,明确bbox的坐标范围 ] # 定义增强序列 seq = iaa.Sequential([ iaa.AdditiveGaussianNoise(scale=0.05*255), iaa.Affine(translate_px={"x": (1, 5)}) ]) # 执行增强 images_aug, bbs_aug = seq(images=images, bounding_boxes=bbs) # 保存增强后的图片(取列表第一个元素,因为只有一张图) cv2.imwrite("hi.jpg", images_aug[0]) # 可选:打印增强后的bbox信息,验证效果 print("增强后的Bounding Boxes:") for bbox in bbs_aug[0].bounding_boxes: print(f"x1: {bbox.x1:.2f}, y1: {bbox.y1:.2f}, x2: {bbox.x2:.2f}, y2: {bbox.y2:.2f}")
关键修改点
- 图片包装:把单张图放进列表
[image],确保imgaug正确识别为1张图片的批量输入,不会把图片的高度/宽度当成图片数量。 - Bounding Boxes规范化:用
BoundingBoxesOnImage包裹单张图的所有bbox,并传入图片的shape,明确告诉imgaug这些bbox属于当前图片,彻底避免解析歧义。 - 输出处理:增强后的
images_aug是列表格式,取第一个元素就是我们需要的增强后单张图片。
这样修改后,就能顺利运行啦!
内容的提问来源于stack exchange,提问作者pink puffles
相关产品推荐
相关产品推荐

