深度学习图片数量较少扩充数据集的方法

最近在自学深度学习图像识别,在进行深度学习数据训练的时候,发现自己的数据量太少,就参考网上代码进行数据集扩充,这里把代码放出来,并给出遇到的错误和解决方案,供大家交流学习。

import cv2
import os
import numpy as np
from imgaug import augmenters as iaa

sometimes = lambda aug: iaa.Sometimes(0.5, aug) #建立lambda表达式,
                                                #这里定义sometimes意味有时候做的操作
                                                # 实际上在深度学习的模型训练中,数据增强不能喧宾夺主,
                                                # 如果对每一张图片都加入高斯模糊的话实际上是毁坏了原来数据的特征,
                                                # 因此,我们需要“有时候”做,给这个操作加一个概率。

# 定义一组变换方法.
seq = iaa.Sequential([
    # 选择0到5种方法做变换
    iaa.SomeOf((0, 5),[
        iaa.Fliplr(0.5),  # 对50%的图片进行水平镜像翻转
        iaa.Flipud(0.5),  # 对50%的图片进行垂直镜像翻转

        #将一些图像转换为它们的超像素表示,每幅图像采样20到200个超像素,
        # 但是不要用它们的平均值替换所有的超像素,
        # 只替换其中的一些(p_replace)。
        sometimes(
                    iaa.Superpixels(
                        p_replace=(0, 1.0),
                        n_segments=(20, 200)
                                    )
                 ),
        #用高斯模糊,均值模糊,中值模糊中的一种增强。注意OneOf的用法
        iaa.OneOf([
                    iaa.GaussianBlur((0, 3.0)),
                    iaa.AverageBlur(k=(2, 7)), # 核大小2~7之间,k=((5, 7), (1, 3))时,核高度5~7,宽度1~3
                    iaa.MedianBlur(k=(3, 11)),
                ]),

        sometimes(iaa.Affine(                          #对一部分图像做仿射变换
            scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},#图像缩放为80%到120%之间
            translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)}, #平移±20%之间
            rotate=(-45, 45),   #旋转±45度之间
            shear=(-16, 16),    #剪切变换±16度,(矩形变平行四边形)
        )),
                    ]  ,  random_order=True)
                    ]  ,  random_order=True)
# 图片文件相关路径
path = 'D:\\火狐\\火狐下载\\test_pic\\'
y = os.path.exists('D:\\火狐\\火狐下载\\exp_pic\\')
if y == 1:
    savedpath = 'D:\\火狐\\火狐下载\\exp_pic\\'
else:
    os.mkdir('D:\\火狐\\火狐下载\\exp_pic\\')
    savedpath = 'D:\\火狐\\火狐下载\\exp_pic\\'
imglist=[]
filelist = os.listdir(path)  #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。
# 遍历要增强的文件夹,把所有的图片保存在imglist中
for item in filelist:
    img = cv2.imdecode(np.fromfile(path+item,dtype=np.uint8),-1)

    # print('item is ', item)
    # print('img is ',img.shape)
    imglist.append(img)
    # print('imglist is ' ,imglist)
print('all the picture have been appent to imglist')

#对文件夹中的图片进行增强操作,循环5次
for count in range(5):
    images_aug = seq.augment_images(imglist)
    for index in range(len(images_aug)):
        filename = str(count) + str(index) + '.jpg'
        # 保存图片
        # cv2.imwrite(savedpath + filename, images_aug[index])
        cv2.imencode(".jpg", images_aug[index])[1].tofile(savedpath+filename)
        # '.jpg'表示把当前图片img按照jpg格式编码,按照不同格式编码的结果不一样
        print('image of count%s index%s has been writen' % (count, index))
  1. 遇到的问题
    在读取图片和保存图片的时候,会有这样几个错误

1.1 路径的问题:

windows系统下路径使用双斜线“\”分割,Linux系统使用但斜线“\”。

1.2 cv2不支持中文路径

如果是中文路径的话,OpenCV 函数cv2.imread()、cv2.imwrite()在读取含有中文路径及以中文命名的文件时,会报错,主要原因是因为cv2.imread()、cv2.imwrite()不支持中文。.
在这里插入图片描述此时不会报错但是只返回None
解决方法就是先用先用np.fromfile()读取为np.uint8格式,再使用cv2.imdecode()解码在这里插入图片描述
保存的时候也要修改
在这里插入图片描述

第一次修改

后面在操作的过程出现了这样的错误:
Corrupt JPEG data: 131072 extraneous bytes before marker 0xe2
AttributeError: ‘NoneType’ object has no attribute ‘ndim’
这两个其实属于共同的原因,都是因为这里

img = cv2.imdecode(np.fromfile(path+item,dtype=np.uint8),-1)

返回值为None,因为图片格式出错或者图片有损失导致。 因此在下面加上判断语句,将这样的图片给删除了就好了。其他的不用变

if img is None:
    os.remove(path+item)
    continue
发布了16 篇原创文章 · 获赞 3 · 访问量 1085

猜你喜欢

转载自blog.csdn.net/weixin_42233120/article/details/100134096