Data_Augumentation.py 3.08 KB
"""
    부족한 데이터를 증강
    frequncy를 나타내는 mel-spectrogram에서 데이터 증강(뒤틀림, 뒤집기)을 사용하면
    학습이 더 안될 것 같아서 실제로 사용은 안 함
    @FUNCTION data_augumentation : 데이터를 증강하는 함수
    @FUNCTION save_into_folder : 증강된 데이터들을 이름에 맞게 폴더별로 정리하는 함
"""
import os
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img


"""
    Data Augmentation
    @brief : 모델이 적은 이미지에서 최대한 많은 정보를 뽑아내서 학습할 수 있도록
            데이터를 증강시킴
    @param dataset_path(str) : dog_sounds converted into mel_spectrogram
"""
def data_augumentation(dataset_path):
    datagen = ImageDataGenerator(
        rotation_range=40,          # 이미지 회전 범위(degree)
        width_shift_range=0.2,      # 이미지를수 수평 또는 수직으로 랜덤하게 평행 이동
        height_shift_range=0.2,
        rescale=1./225,             # 0-1범위로 변환
        shear_range=0.2,            # 임의 전단 변환(shearing transformation) 범위
        zoom_range=0.2,             # 임의 확대/축소 범위
        horizontal_flip=False,      # 소리에 대한 이미지이기 때문에 뒤집지 않음
        fill_mode='nearest')        # 이미지를 회전 이동하거나 축소할 때 생기는 공간을 채움
    
    for i, (dirpath, dirnames, filenames) in enumerate(os.walk(dataset_path)):
        
        if dirpath is not dataset_path:
            
            for f in filenames:
                
                file_path = os.path.join(dirpath, f)
                img = load_img(file_path)   # PIL 이미지
                i = 0
                x = img_to_array(img)       # (x, x, 3) 크기의 Numpy 배열
                x=x.reshape((1,)+x.shape)   # (1, x, x, 3) 크기의 Numpy 배열
                
                # 임의 변환된 이미지를 배치 단위로 생성해서
                # 이미지 20장을 생성하고 마침
                for batch in datagen.flow(x, batch_size=1, save_to_dir="C:/Users/nokh9/Desktop/dog_sound_train", save_prefix=f, save_format='.jpg'):
                    print("{}, data_augument:{}".format(file_path, i))
                    i += 1
                    if i > 10:
                        break

"""
    split categories
    @brief 증강된 이미지를 카테고리 별로 나누어서 저장
    @param dataset_path(str) : dog_sound argumented
"""
def save_into_folder(dataset_path):
    
    num = 1
    
    for filename in os.listdir(dataset_path):
        find_category = filename.split('_')[0]
        des_path = os.path.join(dataset_path, find_category)
        if not os.path.exists(des_path):
            os.makedirs(des_path)
            num = 1
        os.rename(dataset_path+filename, des_path + '/' + find_category + str(num) + '.jpg')
        num += 1
    
# 메인 함수    
if __name__ == "__main__":
    data_augumentation("C:/Users/nokh9/Desktop/dog_sound_mel")
    save_into_folder("C:/Users/nokh9/Desktop/dog_sound_train/")