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

Albumentations增强图像噪声过度及YOLOv8药片检测优化求助

问题描述

我正在开展基于YOLOv8的药片检测项目,使用Albumentations做数据增强,但部分增强图像出现噪声过多或失真问题。

预期目标

  • 应用真实感增强(旋转、亮度调整、噪声等)
  • 确保药片清晰可识别

遇到的问题

  • 部分图像噪声过大甚至无法识别,疑似和GaussNoise或色彩空间处理有关
  • 生成图像存在过度缩放情况

已尝试的排查步骤

  • ✅ 降低GaussNoise的var_limit,但仍有噪声问题
  • ✅ 检查cv2色彩空间处理是否有误
  • ✅ 降低Blur强度

我的代码

import cv2
import os
import albumentations as A

# Set input and output directories
INPUT_DIR = r"C:\Users\...\pills\01_01"
OUTPUT_DIR = INPUT_DIR
TARGET_COUNT = 350  

# Define Augmentations
transform = A.Compose([
    A.RandomBrightnessContrast(p=0.3),
    A.HorizontalFlip(p=0.5),
    A.VerticalFlip(p=0.2),
    A.Rotate(limit=25, p=0.5),
    A.Blur(blur_limit=2, p=0.2),
    A.GaussNoise(var_limit=(5.0, 10.0), p=0.2),  # Might be too strong?
    A.RandomCrop(height=256, width=256, p=0.1),
    A.HueSaturationValue(p=0.3)
])

# Process images
image_files = [f for f in os.listdir(INPUT_DIR) if f.endswith(('.jpg', '.png', '.jpeg'))]

for i in range(1, TARGET_COUNT + 1):
    img_name = image_files[i % len(image_files)]
    img_path = os.path.join(INPUT_DIR, img_name)

    image = cv2.imread(img_path)
    if image is None:
        continue
    
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # Convert to RGB
    augmented = transform(image=image)['image']
    augmented = cv2.cvtColor(augmented, cv2.COLOR_RGB2BGR)  # Convert back before saving

    new_filename = f"01_{i}.jpg"
    cv2.imwrite(os.path.join(OUTPUT_DIR, new_filename), augmented)

print(f"Saved augmented images in {OUTPUT_DIR}")

疑问

  1. 如何在保留有效增强的同时解决过度噪声问题?
  2. 针对药片检测,有没有更合适的增强设置?
  3. 在YOLOv8中,是否有更好的方法保证标注的正确性?

解决方案

一、解决过度噪声问题

  1. 调整噪声增强的参数与类型
    • 把GaussNoise的var_limit进一步降低到(1.0, 3.0),同时把触发概率p降到0.1,减少噪声增强的触发频率和强度;或者直接替换为MultiplicativeNoise,它生成的噪声更贴近真实拍摄的颗粒感,参数设为multiplier=(0.95, 1.05), p=0.15,避免均匀高斯噪声导致的失真。
    • 在增强链末尾添加轻度去噪兜底:A.MedianBlur(blur_limit=3, p=0.1),只对噪声过重的图像做轻微修正,不影响正常增强效果。
  2. 修复色彩空间转换的数值溢出
    Albumentations处理RGB图像时,部分增强会导致像素值超出[0,255]范围,保存前手动钳制数值,避免伪色和噪声感:
    augmented = cv2.convertScaleAbs(augmented)
    

二、适合药片检测的增强设置

药片属于刚性物体,增强要贴合真实拍摄场景,推荐调整后的增强链:

transform = A.Compose([
    # 几何增强(模拟真实摆放角度)
    A.HorizontalFlip(p=0.5),
    A.VerticalFlip(p=0.2),
    A.Rotate(limit=30, p=0.6),
    A.ShiftScaleRotate(shift_limit=0.05, scale_limit=0.1, rotate_limit=0, p=0.3),  # 限制缩放范围,避免过度拉伸
    # 光照色彩增强(模拟不同拍摄环境)
    A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.15, p=0.4),
    A.HueSaturationValue(hue_shift_limit=10, sat_shift_limit=15, val_shift_limit=10, p=0.3),
    A.RandomGamma(gamma_limit=(80, 120), p=0.2),
    # 轻微噪声与模糊(模拟拍摄瑕疵)
    A.MultiplicativeNoise(multiplier=(0.95, 1.05), p=0.15),
    A.GaussianBlur(blur_limit=3, p=0.1),
    # 裁剪修正(保留药片主体比例)
    A.RandomResizedCrop(height=256, width=256, scale=(0.8, 1.0), ratio=(0.9, 1.1), p=0.2)
])

核心优化点:

  • 用ShiftScaleRotate替代单独缩放,限制缩放范围在±10%以内,避免过度缩放;
  • 用RandomResizedCrop替代RandomCrop,保证裁剪后药片比例正常,不会被过度拉伸;
  • 优先使用贴近真实拍摄的噪声类型,降低触发概率。

三、YOLOv8中保证标注正确性的方法

  1. 使用带标注的增强链
    Albumentations支持同时增强图像和标注框,修改代码时传入bbox参数,避免增强后标注偏移:
    # 适配YOLO格式标注(x_center, y_center, width, height, class)
    transform = A.Compose([
        # 增强步骤...
    ], bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))
    
    # 处理时传入bbox和标签
    augmented = transform(image=image, bboxes=bboxes, class_labels=labels)
    
  2. 适配YOLOv8内置增强
    YOLOv8自带数据增强(在data.yaml中配置),可以和Albumentations配合使用:
    • 关闭YOLOv8中与Albumentations重复的增强项(比如hsv_h、hsv_s),避免叠加增强导致失真;
    • 开启perspective=True,模拟轻微透视变换,更贴合真实拍摄角度。
  3. 增强后标注校验
    编写脚本随机抽取增强后的图像和标注,用YOLOv8的可视化工具检查匹配度:
    from ultralytics import YOLO
    
    model = YOLO('yolov8n.pt')
    model.val(data='data.yaml', visualize=True)
    
  4. 工具辅助修正
    使用LabelStudio或CVAT等工具批量检查增强后的标注,对失真或标注偏移的图像手动修正,避免错误标注进入训练集。

内容的提问来源于stack exchange,提问作者Knight Owl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:29:52