笔者有幸参加:
百度深度学习7日入门-CV疫情特辑
今天遇到数据图片分布不均匀的问题,所以要进行数据增广,直到所有图片数量差不多为止
直接上代码,代码很简单,注释很详细:
import os
import numpy as np
import matplotlib.image as mpimg
# import matplotlib.pyplot as plt
import cv2
import string
# 当前文件夹下,有很多个类别的文件夹,每个文件夹中有若干张图片
# 存放类别文件夹的列表
dir_list = []
# 存放每个类别文件下有多少照片
dir_meta_num = []
# 获得当前工作文件夹名字
cwd = os.getcwd()
# 后面产生型图片需要名字
# 随机产生名字
get_random_name = lambda x:''.join(np.random.choice(list(string.ascii_uppercase + string.digits)) for _ in range(x))
# 若不了解 string.ascii_uppercase 是啥,则打印看看, 是个字符串
# 若不了解 string.digits 是啥,则打印看看, 是个字符串
# 开始在类别文件夹中迭代
for dir_path in os.listdir():
# 检测是否是文件夹
if os.path.isdir(dir_path):
# 将目录文件的数量添加到 dir_meta_num
dir_meta_num.append( len(os.listdir(dir_path)) )
# 将目录文件的数量添加到 dir_list
dir_list.append(os.path.join(cwd, dir_path))
# 将其转换为 ndarray, 以方便操作
dir_array = np.array(dir_list)
dir_meta_num_array = np.array(dir_meta_num)
# 图片少的界定,后面少于这个值将进行数据增广
threshold = 300
# 选出数据少的dir
new_dir_array = dir_array[dir_meta_num_array < threshold]
dir_meta_num_array = dir_meta_num_array[dir_meta_num_array < threshold]
# 在缺数据的目录中迭代
for i, dir_path in enumerate(new_dir_array):
# 选择某一个类型目录,获取其文件夹中的img列表
img_dir = os.listdir(dir_path)
# 增广图片开始
for j in range(threshold - dir_meta_num_array[i]):
# 随机获得一张图片
img_path_random = np.random.choice(img_dir)
# 获得该图片的绝对路径
img_path_random = os.path.join(dir_path, img_path_random)
# 将图片归一化
img = mpimg.imread(img_path_random)/255
# 产生噪声
noise = np.random.normal(scale=2/255, size=img.shape)
# 将噪声和原图叠加
img = cv2.add(img, noise)
# 随机获得图片的名字
img_name = os.path.join(dir_path,
get_random_name(np.random.randint(10, 20))
)+'.jpg'
# 将图片以灰度形式保存,你看你是彩色图片还是啥,彩色就不用写cmap
mpimg.imsave(img_name, img, cmap='gray')
在最后附上文件的组织形式:
该句用于在shell
中查看文件数:
# 查看文件数量
ls /home/aistudio/data/yun/ -l |grep ^-|wc -l