albumentations的compose必须显式实例化并调用,不能当装饰器;需注意rgb通道对齐、normalize位置与参数、bbox_params声明及a.lambda封装自定义函数。

Albumentations 的 Compose 必须显式调用,不能当装饰器用
很多人写完一堆 A.HorizontalFlip()、A.RandomBrightnessContrast() 就直接往模型里塞,结果报错 TypeError: 'Compose' object is not callable——这是因为 Compose 是个可调用对象,但必须先实例化再传入图像,不是语法糖或装饰器。
实操建议:
- 必须用
transform = A.Compose([...])构造,再用transform(image=img)调用(注意参数名是image,不是img或x) - 如果还传了
mask或bboxes,要同步加进字典里:transform(image=img, mask=mask, bboxes=bboxes) - 别在
Dataset.__getitem__里每次重新Compose,会拖慢数据加载;提前定义好self.transform
RGB 通道顺序和归一化必须手动对齐 PyTorch
Albumentations 默认按 uint8 [0–255] 处理图像,而 torchvision.transforms 常默认输入是 float32 [0–1];更隐蔽的是:它内部始终按 HWC(高×宽×通道)和 RGB 顺序操作,但 OpenCV 读图是 BGR,PIL 是 RGB——混用就导致颜色发绿或增强失效。
实操建议:
- 用
cv2.imread()后立刻加cv2.cvtColor(img, cv2.COLOR_BGR2RGB) - 别在 Albumentations 后接
transforms.ToTensor(),它会把uint8错误地除以 255 再转float;改用A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) -
A.Normalize必须放在Compose最后,且 mean/std 要和你模型预训练时一致(比如ResNet用 ImageNet 统计值)
带 bbox 的增强必须声明 bbox_params,否则坐标全乱
不做声明时,A.HorizontalFlip() 之类操作只改图,不碰 bboxes;即使传了 bboxes=...,也会被静默忽略,最终训练时 bbox 和目标完全错位。
实操建议:
- 必须显式传
bbox_params=A.BboxParams(format='pascal_voc', label_fields=['labels']) -
format要和你的标注格式严格对应:'pascal_voc'(xyxy)、'coco'(xywh)、'yolo'(center_x, center_y, w, h,归一化) -
label_fields是列表,里面变量名要和你传入字典的 key 完全一致,比如你传labels=cls_ids,这里就得写['cls_ids'] - 某些变换如
A.Crop可能导致 bbox 被裁出界,加filter_lost_elements=True自动丢弃无效框(但记得同步删掉对应labels)
自定义函数要用 A.Lambda 包一层,别直接塞 lambda
想加个直方图均衡化或 CLAHE?直接写 lambda x: cv2.createCLAHE(...).apply(x) 会报错 TypeError: expected str, bytes or os.PathLike object——因为 Albumentations 对 callable 的签名校验很严,裸 lambda 不满足其内部接口约定。
实操建议:
- 一律用
A.Lambda(image=your_func),其中your_func是完整函数,接受image参数并返回处理后图像 - 如果还要处理
mask或bboxes,得同时定义mask=...和bboxes=...参数(哪怕只是lambda x: x) - 别在
A.Lambda里做耗时操作(如读文件、网络请求),它在数据加载线程里执行,会卡死DataLoader
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











