數據增廣:隨機增加灰度值 Python輪子實現

筆者有幸參加:
百度深度學習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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章