数据增强神器:imgaug库的使用教程

问题:目前许多深度领域由于数据难采集、难标注等问题造成了数据量不够多的情况,这就导致深度学习模型的性能和泛化能力较差。
解决方案:因此数据增强主能够增加训练数据的多样性和丰富性,以提高模型性能和泛化能力
因此imgaug库就是针对以上问题提出的,简化了个人编写数据增强方法的过程,极大提高了编码速度

imgaug简介

imgaug库是一个基于torchvision的数据增强工具包,可用于增加图像数据的多样性、改善模型性能、克服数据稀缺问题,以及为机器学习和计算机视觉任务提供更丰富的数据。
imgaug库能够在图片包含了对图片的几何变换颜色变换、对比度和亮度调整、模糊和锐化、噪声、模拟雨/雾效果、关键点(Keypoints)等。并可以将多个增强方法组合在一起,以获得更丰富的数据增强效果。

数据增强的示例(含标签label)

图片示例

以下是一个使用imgaug库进行图像增强的示例代码。这个示例将应用几种典型的图像增强操作,包括旋转、翻转、亮度和对比度调整以及高斯噪声。请确保您已经安装了imgaug库。
iaa.Sequential类似于nn.Sequential,里边顺序执行增强操作,代码示例如下:

import imgaug.augmenters as iaa
import imageio
import matplotlib.pyplot as plt

# 读取图像
image = imageio.imread("path_to_your_image.jpg")

# 创建增强序列
seq = iaa.Sequential([
    iaa.Affine(rotate=(-45, 45)),  # 随机旋转角度
    iaa.Fliplr(0.5),  # 随机水平翻转
    iaa.Flipud(0.2),  # 随机垂直翻转
    iaa.Multiply((0.8, 1.2), per_channel=0.2),  # 随机调整亮度
    iaa.ContrastNormalization((0.8, 1.2)),  # 随机调整对比度
    iaa.AdditiveGaussianNoise(scale=(0, 0.1*255))  # 添加高斯噪声
])

# 应用图像增强
augmented_image = seq.augment_image(image)
# 显示原始图像和增强后的图像
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("Original Image")
plt.subplot(1, 2, 2)
plt.imshow(augmented_image)
plt.title("Augmented Image")
plt.show()

实验结果
image.png

点标签

除了对图片增强外,imgaug还提供对点标签增强的方法
不过对于点标签增强需要将np.array数据或list数据转换为KeypointsOnImage,才能进行相应操作,之后需要再将KeypointsOnImage转换为对应的np.array数据或list数据,代码如下:

import scipy.io,imgaug
import imgaug.augmenters as iaa
from imgaug.augmentables.kps import KeypointsOnImage
import numpy as np
import imageio
import matplotlib.pyplot as plt

def read_mat(path='GT_IMG_286.mat'):
    # 使用scipy.io.loadmat()加载MATLAB文件
    mat_data = scipy.io.loadmat(path)
    # mat_data是一个字典,包含了MATLAB文件中的各个变量和数据
    # print(mat_data)
    # 从字典中获取特定变量的值
    point_data = mat_data['image_info'][0][0][0][0]
    return point_data

def return_process_point(path="IMG_286.jpg"):
    # 读取图像与标签
    image = imageio.imread("IMG_286.jpg")
    label_array = read_mat()[0]

    # 从label_array中提取关键点坐标
    # 假设label_array是一个Nx2的numpy数组,每行包含一个关键点的(x, y)坐标
    # for point in label_array:
    #     print(point)
    keypoints = [imgaug.Keypoint(x=point[0], y=point[1]) for point in label_array]

    # 创建KeypointsOnImage对象
    keypoints_on_image = KeypointsOnImage(keypoints, shape=image.shape)

    # 创建增强序列
    seq = iaa.Sequential([
        iaa.Affine(rotate=(-45, 45)),  # 随机旋转
        iaa.Affine(translate_px={"x": (-20, 20), "y": (-20, 20)}),  # 随机平移
    ])

    # 应用图像增强
    augmented_image, augmented_keypoints = seq(image=image, keypoints=keypoints_on_image)

    # 提取增强后的关键点坐标
    augmented_keypoint_coords = augmented_keypoints.keypoints

    # 显示增强前后的图像和关键点
    image_before = keypoints_on_image.draw_on_image(image, color=(0, 255, 0), size=7)
    image_after = augmented_keypoints.draw_on_image(augmented_image, color=(0, 255, 0), size=7)

    plt.subplot(1, 2, 1)
    plt.imshow(image_before)
    plt.title("Original Image with Keypoints")

    plt.subplot(1, 2, 2)
    plt.imshow(image_after)
    plt.title("Augmented Image with Keypoints")
    plt.show()

    # 提取增强后的关键点坐标为numpy数组
    augmented_keypoint_coords = augmented_keypoints.to_xy_array()
    # augmented_keypoint_coords 是一个包含增强后关键点坐标的numpy数组
    return augmented_keypoint_coords

if __name__ == '__main__':
    augmented_keypoint_coords=return_process_point()
    print(np.array(augmented_keypoint_coords))

运行结果图片:
image.png

框标签

最后是框标签,与点标签的方法类似,给出相应的代码:

import imgaug.augmenters as iaa
from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage
import numpy as np

# 创建示例的框标签数据
bbs = BoundingBoxesOnImage([
    BoundingBox(x1=100, y1=100, x2=200, y2=200),
    BoundingBox(x1=250, y1=250, x2=350, y2=350)
], shape=(500, 500))  # 假设图像大小为500x500

# 创建增强序列
seq = iaa.Sequential([
    iaa.Affine(rotate=(-45, 45)),
    iaa.Affine(translate_px={"x": (-20, 20), "y": (-20, 20)})
])

# 应用框标签增强
augmented_bbs = seq.augment(bbs)

# 提取增强后的框标签数据为numpy数组
augmented_bbs_coords = augmented_bbs.to_xyxy_array()

# augmented_bbs_coords 是一个包含增强后框标签数据的numpy数组
print(augmented_bbs_coords)

在示例代码中,我们首先创建了一个BoundingBoxesOnImage对象,其中包含了示例的框标签数据。然后,我们创建了一个增强序列并应用框标签增强。最后,使用augmented_bbs.to_xyxy_array()将增强后的框标签数据转换为numpy数组。

数据增强的方法

  1. Geometric Augmentations(几何变换)
    • iaa.Affine:进行仿射变换,如旋转、缩放、平移。
    • iaa.Crop:裁剪图像的一部分。
    • iaa.PerspectiveTransform:进行透视变换。
  2. Color Augmentations(颜色变换)
    • iaa.AdditiveGaussianNoise:添加高斯噪声。
    • iaa.Multiply:对像素进行乘法操作,调整亮度。
    • iaa.Add:对像素进行加法操作,调整亮度。
    • iaa.Grayscale:将图像转换为灰度图像。
    • iaa.Sometimes:有一定概率应用其他增强。
  3. Contrast and Brightness Adjustments(对比度和亮度调整)
    • iaa.GammaContrast:进行伽马对比度调整。
    • iaa.LogContrast:进行对数对比度调整。
    • iaa.LinearContrast:进行线性对比度调整。
  4. Blurring and Sharpening(模糊和锐化)
    • iaa.GaussianBlur:应用高斯模糊。
    • iaa.Sharpen:进行图像锐化。
  5. Noise(噪声)
    • iaa.SaltAndPepper:添加椒盐噪声。
    • iaa.CoarseSaltAndPepper:添加粗粒度椒盐噪声。
  6. Segmentation Maps and Superpixels(分割图和超像素)
    • iaa.Superpixels:生成超像素。
    • iaa.SegmentationMapOnImage:将分割图应用到图像上。
  7. Custom Augmentations(自定义增强)
    • iaa.Lambda:应用自定义函数进行增强。
  8. 特殊效果(Special Effects)
    • iaa.Rain:模拟雨效果。
    • iaa.Fog:模拟雾效果。
  9. 关键点(Keypoints)
    • iaa.Keypoint:对关键点进行增强。
    • iaa.KeypointsOnImage:对一组关键点进行增强。
<think>好的,我现在需要解决用户在Open3D中遇到的compute_harris_corners属性不存在的错误问题。首先,我需要理解用户的具体情况。用户提到在使用Open3D的CUDA pybind模块中的geometry.keypoint时,发现compute_harris_corners属性不存在。这可能是因为版本问题或者模块结构的调整。 首先,我应该确认Open3D的版本。不同版本的Open3D可能在API上有所变化。用户可能使用的是较新或较旧的版本,导致方法名变更或模块位置调整。例如,某些函数在版本升级后被重命名或移到了其他子模块中。 接下来,我需要检查Open3D的官方文档或更新日志,查看compute_harris_corners方法是否存在,或者是否有替代的方法。根据用户提供的引用[1],提到了Harris角点检测的相关内容,可能涉及到OpenCV的实现,但用户的问题是关于Open3D的,所以可能需要对比两者的不同。 另外,用户提到的错误是属性不存在,这可能意味着该函数在当前版本的Open3D中已被弃用或尚未实现。例如,Open3D的某些高级功能可能还在开发中,或者需要特定的编译选项才能启用。用户可能没有正确安装包含CUDA支持的Open3D版本,导致部分模块不可用。 然后,我应该考虑用户是否正确导入了相关模块。例如,是否从open3d.cuda.pybind.geometry中导入了Keypoint模块,或者是否需要使用其他子模块。有时候,函数可能存在于不同的命名空间下,需要正确的导入路径。 此外,用户可能混淆了Open3D和OpenCV的函数。根据引用[1]和引用[2],Harris角点检测在OpenCV中有详细实现,而Open3D可能没有直接对应的函数,或者实现方式不同。建议用户查看Open3D的官方示例或文档,确认是否存在该函数的具体用法。 如果Open3D确实没有提供compute_harris_corners方法,可能需要考虑替代方案,比如使用OpenCV来处理图像,提取角点后再将数据导入Open3D进行后续的三维处理。或者检查是否有第三方扩展提供了该功能。 最后,用户可能需要更新或重新安装Open3D,确保安装了支持CUDA的版本,并且所有依赖项都已正确配置。有时候,编译安装时的选项会影响可用模块的功能。 总结可能的解决步骤:1. 检查Open3D版本和文档;2. 确认函数是否存在或更名;3. 确保正确安装CUDA支持的版本;4. 考虑使用OpenCV作为替代方案;5. 查看社区或官方论坛是否有类似问题及解决方案。</think>针对Open3D中出现的`compute_harris_corners`属性不存在问题,以下是分步解决方案: ### 1. 确认Open3D版本与API兼容性 - **检查版本号**: 运行以下代码查看当前Open3D版本: ```python import open3d as o3d print(o3d.__version__) ``` 若版本低于`0.15.1`,Harris角点检测相关API可能未完全支持,建议升级至最新版本: ``` pip install --upgrade open3d ``` - **查阅官方文档**: Open3D的Harris角点检测功能目前(截至2023年)**主要面向3D点云**,而2D图像处理更推荐集成OpenCV[^1]。若需在3D数据中提取特征,可尝试`compute_harris_keypoints()`或`detect_harris_corners()`等替代函数。 ### 2. 验证模块导入路径 Open3D的CUDA加速模块需通过特定路径导入: ```python # CUDA加速版本的几何处理模块 from open3d.cuda.pybind.geometry import PointCloud from open3d.cuda.pybind.geometry.keypoint import detect_harris_corners # 示例函数名 ``` 若仍报错,可能表示当前编译版本未包含该功能,需重新编译支持CUDA的Open3D。 ### 3. 替代方案:结合OpenCV处理 若Open3D功能受限,可用OpenCV提取Harris角点后转换数据格式: ```python import cv2 import numpy as np import open3d as o3d # 用OpenCV读取图像并检测角点 img = cv2.imread("image.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) corners = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04) # 将角点坐标转换为Open3D点云 points = np.argwhere(corners > 0.01 * corners.max()) pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(np.hstack([points, np.zeros((len(points),1))])) ``` ### 4. 重新编译支持CUDA的Open3D 若需直接使用CUDA模块,需从源码编译: ```bash git clone --recursive https://github.com/isl-org/Open3D cd Open3D mkdir build && cd build cmake -DBUILD_CUDA_MODULE=ON .. make -j8 sudo make install ``` ### 5. 验证环境与依赖 - 确保CUDA驱动版本≥11.0,且与PyTorch/Cupy等版本兼容 - 检查Python环境是否混用多版本导致冲突 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值