图像增强(albumentations.Compose())
albumentations.Compose()
是 albumentations
库中的一个核心函数,用于将多个图像增强(augmentation)操作组合在一起,形成一个增强流水线(pipeline)。
1. 安装和导入
在使用 albumentations
之前,需要先安装该库。可以使用 pip
进行安装:
pip install albumentations
安装完成后,可以在 Python 脚本或 Jupyter Notebook 中导入:
import albumentations as A
2. 基本概念
- 增强流水线(Pipeline):一系列图像增强操作按顺序应用于输入图像。
- 变换(Transforms):具体的图像增强操作,如旋转、缩放、裁剪等。
- 概率(Probability):每个变换可以设置一个概率,决定是否应用该变换。
albumentations.Compose()
的主要作用是将多个变换组合成一个流水线,按指定的顺序和概率依次应用于图像。
3. Compose
的基本用法
Compose
接受一个变换列表(或字典列表),并按顺序应用这些变换。它还支持按随机顺序应用变换、保存额外的信息等功能。
transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
A.Rotate(limit=40, p=0.7),
])
在上面的例子中,Compose
将依次尝试水平翻转、随机亮度对比度调整和旋转,且每个变换都有各自的应用概率。
参数详解:
Compose
函数有多个参数,以下是主要参数的详细说明:
-
transforms (
list
):- 类型:列表
- 说明:要组合的变换列表。每个变换可以是一个
albumentations
的变换实例或字典。
-
bbox_params (
albumentations.BboxParams
, 可选):- 说明:如果数据集中包含边界框(如目标检测任务),需要指定如何处理边界框的参数。
- 主要参数:
format
:边界框的格式,如pascal_voc
、coco
等。label_fields
:与边界框对应的标签字段名称。
-
keypoint_params (
albumentations.KeypointParams
, 可选):- 说明:如果数据集中包含关键点(如人脸关键点检测),需要指定关键点的参数。
-
additional_targets (
dict
, 可选):- 说明:用于处理额外的输入,如多张图像或图像及掩码(mask)。
-
p (
float
, 默认1.0
):- 说明:整体变换的应用概率。如果设置为
0.5
,则整个流水线有 50% 的概率被应用。
- 说明:整体变换的应用概率。如果设置为
4. 常用的增强操作
albumentations
提供了丰富的图像增强操作,以下是一些常用的变换:https://blog.csdn.net/qq_27039891/article/details/100795846
-
几何变换:
HorizontalFlip
:水平翻转。VerticalFlip
:垂直翻转。Rotate
:旋转。RandomCrop
:随机裁剪。Resize
:调整大小。
-
颜色变换:
RandomBrightnessContrast
:随机调整亮度和对比度。HueSaturationValue
:调整色调、饱和度和值。RGBShift
:随机移动 RGB 通道。
-
噪声和模糊:
GaussNoise
:添加高斯噪声。Blur
:模糊。GaussBlur
:高斯模糊。
-
高级变换:
Cutout
:随机遮挡图像区域。ElasticTransform
:弹性变换。GridDistortion
:网格扭曲。
5. 示例代码
5.1 处理没有边界框的图像
以下是一个使用 albumentations.Compose()
的完整示例,展示了如何构建增强流水线并应用于图像:
import albumentations as A
from albumentations.pytorch import ToTensorV2
import cv2
import matplotlib.pyplot as plt
# 定义增强流水线
transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
A.Rotate(limit=40, p=0.7),
A.Resize(256, 256),
A.Normalize(mean=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225)),
ToTensorV2(),
])
# 读取图像
image = cv2.imread('path_to_image.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 应用增强
augmented = transform(image=image)
augmented_image = augmented['image']
# 显示增强后的图像
plt.imshow(augmented_image.permute(1, 2, 0))
plt.axis('off')
plt.show()
5.2 处理带有边界框的图像
如果任务涉及目标检测,需要同时处理图像和边界框:
transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
A.Rotate(limit=40, p=0.7),
A.Resize(256, 256),
], bbox_params=A.BboxParams(format='pascal_voc', label_fields=['labels']))
# 示例边界框和标签
bboxes = [[50, 30, 200, 180]]
labels = [1]
# 应用增强
augmented = transform(image=image, bboxes=bboxes, labels=labels)
augmented_image = augmented['image']
augmented_bboxes = augmented['bboxes']
augmented_labels = augmented['labels']
6. 高级用法
6.1 组合多个 Compose
可以嵌套使用 Compose
来构建更复杂的增强流水线。例如,针对训练和验证设置不同的增强策略:
train_transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.1, rotate_limit=15, p=0.5),
A.OneOf([
A.IAAAdditiveGaussianNoise(),
A.GaussNoise(),
], p=0.2),
A.OneOf([
A.MotionBlur(p=0.2),
A.MedianBlur(blur_limit=3, p=0.1),
A.Blur(blur_limit=3, p=0.1),
], p=0.2),
A.Normalize(mean=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225)),
ToTensorV2(),
])
valid_transform = A.Compose([
A.Resize(256, 256),
A.Normalize(mean=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225)),
ToTensorV2(),
])
6.2 处理多张图像或掩码
additional_targets
参数允许在同一个 Compose
中处理多张图像或图像及其对应的掩码:
transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.Rotate(limit=40, p=0.7),
], additional_targets={'mask': 'mask'})
# 示例掩码
mask = cv2.imread('path_to_mask.png', cv2.IMREAD_GRAYSCALE)
# 应用增强
augmented = transform(image=image, mask=mask)
augmented_image = augmented['image']
augmented_mask = augmented['mask']
6.3 使用自定义变换
自定义变换并将其集成到 Compose
中:
from albumentations.core.transforms_interface import ImageOnlyTransform
class AddGaussianBlur(ImageOnlyTransform):
def __init__(self, blur_limit=(3,7), always_apply=False, p=0.5):
super().__init__(always_apply, p)
self.blur_limit = blur_limit
def apply(self, image, **params):
return cv2.GaussianBlur(image, (self.blur_limit[0], self.blur_limit[1]), 0)
transform = A.Compose([
AddGaussianBlur(blur_limit=(5,5), p=1.0),
A.HorizontalFlip(p=0.5),
])
7. 注意事项
- 顺序重要:
Compose
中变换的顺序会影响最终效果。例如,先裁剪再调整大小与先调整大小再裁剪,结果可能不同。 - 边界框和关键点:如果处理带有边界框或关键点的图像,必须正确设置
bbox_params
或keypoint_params
,以确保变换后这些信息的准确性。 - 数据类型:
albumentations
支持 NumPy 数组作为输入。确保图像在传入Compose
之前已正确读取并转换为 RGB 格式(如使用cv2.cvtColor
)。 - 性能优化:
albumentations
以 C++ 实现,性能优越,但在大规模数据增强时,仍需注意内存和计算资源的使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2021-10-08 np.concatenate
2021-10-08 np.expand_dims