筆者有幸參加:
百度深度學習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