在计算机视觉项目中,数据质量直接决定模型效果。我做过一个自动驾驶项目,最初用晴天数据训练的模型,遇到雨天就"瞎"了——识别准确率直接掉30%。这就是典型的数据分布不均衡问题。
真实世界的天气千变万化,但采集所有天气条件下的数据成本极高。想象一下要雇人专门在暴雪天开车采集数据,这既不现实也不安全。imgaug库的价值就在这里:用代码模拟各种恶劣天气,零成本扩充数据集。
实测发现,加入合成天气数据后:
新手最容易卡在环境安装,我整理了最稳的安装方案:
bash复制# 创建纯净虚拟环境(避免包冲突)
conda create -n imgaug_env python=3.8
conda activate imgaug_env
# 核心库安装(指定版本更稳定)
pip install imgaug==0.4.0 opencv-python==4.5.5.64
# 可选但重要的依赖
pip install shapely==1.8.0 # 处理多边形增强时必需
遇到过的问题及解决方案:
sudo apt-get install libgeos-dev--no-cache-dir参数减少内存占用用这个测试脚本检查所有功能是否正常:
python复制import imgaug as ia
from imgaug import augmenters as iaa
# 基础变换测试
seq = iaa.Sequential([iaa.GaussianBlur(sigma=(0, 3.0))])
print("环境验证通过!可正常导入库")
真实雨痕有三大特征:水滴形状、动态模糊、环境光反射。这个配置最接近真实:
python复制rain = iaa.Rain(
drop_size=(0.1, 0.15), # 水滴大小
speed=(0.1, 0.3), # 下落速度
angle=30, # 风吹角度
blur_sigma_fraction=0.7 # 运动模糊强度
)
参数调优技巧:
雪景难点在于既要保留物体轮廓,又要添加积雪质感。推荐组合方案:
python复制snow = iaa.Sequential([
iaa.Snowflakes(
flake_size=(0.2, 0.7),
density=(0.005, 0.075)
),
iaa.FastSnowyLandscape(
lightness_threshold=[100, 200],
lightness_multiplier=(1.5, 2.5)
)
])
效果对比:
雾的物理特性是距离越远越模糊。这个参数组合符合大气散射模型:
python复制fog = iaa.Fog(
density=(0.05, 0.3), # 雾浓度
density_uniformity=0.8, # 不均匀度
density_multiplier=0.9 # 距离衰减系数
)
调试要点:
iaa.Clouds()可产生更复杂的云雾效果真实场景往往是多天气叠加。这个组合模拟暴风雪天气:
python复制blizzard = iaa.SomeOf((2, 3), [
iaa.Rain(speed=(0.3, 0.5)),
iaa.Snowflakes(flake_size=(0.5, 0.8)),
iaa.Fog(density=0.2),
iaa.Clouds()
], random_order=True)
注意事项:
Sometimes(0.7, ...)控制出现概率更自然这套生产级代码支持:
python复制from concurrent.futures import ThreadPoolExecutor
def process_image(img_path):
try:
img = cv2.imread(img_path)
augmented = seq.augment_image(img)
cv2.imwrite(f"output/{os.path.basename(img_path)}", augmented)
except Exception as e:
print(f"处理失败 {img_path}: {str(e)}")
with ThreadPoolExecutor(max_workers=8) as executor:
executor.map(process_image, glob.glob("input/*.jpg"))
用这个脚本检查增强效果是否合理:
python复制def evaluate_augmentation(original, augmented):
# 结构相似性评估
ssim = compare_ssim(original, augmented, multichannel=True)
# 关键点偏移检测
kp_diff = detect_keypoint_displacement(original, augmented)
# 语义分割一致性
iou = calculate_mask_iou(original, augmented)
return ssim > 0.6 and kp_diff < 15 and iou > 0.7
评估标准:
处理已标注数据时,需要同步增强标注框:
python复制import json
def augment_annotations(img, bboxes):
seq_det = seq.to_deterministic()
aug_img = seq_det.augment_image(img)
aug_boxes = seq_det.augment_bounding_boxes(bboxes)
return aug_img, aug_boxes
注意事项:
to_deterministic()保证图像和标注同步变换在智慧交通项目中,我们通过以下策略提升效果:
典型错误修正案例:
flake_size=(0.7, 0.9)导致雪花太大像纸片最终采用的黄金参数组合:
python复制optimal_seq = iaa.Sequential([
iaa.Sometimes(0.3, iaa.Fog(density=(0.1, 0.2))),
iaa.Sometimes(0.7, iaa.Rain(
drop_size=(0.08, 0.12),
speed=(0.15, 0.25),
angle=(20, 40)
)),
iaa.Sometimes(0.5, iaa.Snowflakes(
flake_size=(0.15, 0.4),
density=(0.01, 0.05)
))
], random_order=True)