업데이트:

카테고리: ,

깃허브에서 zip 파일을 다운로드한다. 이제 Linux에서 anaconda를 사용할 것이므로 linux - conda를 기준으로 설명하겠다.

  1. conda 가상 환경 열기
  2.   conda activate {자신의 project name}
    
  3. conda 내에서 imgaug를 설치
  conda config --add channels conda-forge
  conda install imgaug
  1. 예제 따라하기

링크에 들어가 basic 예제를 따라도 된다.

나는 간단한 파이썬 예제를 올리고 설명하겠다. 코드에 주석을 달아 설명을 써놨다.. 실행할 때는 다음과 같이 parent폴더 안에 “데이터가 있는 image 폴더” 와 “imgaug_example.py”를 같이 두고 실행하면 된다.

parent_folder
    |
    |
    |ㅡㅡㅡ image ( aumentation할 original data가 들어있는 폴더이다.)
    |
    |
    |ㅡㅡㅡ imgaug_example.py 

예제를 실행하기 전에, 혹시라도 opencv를 conda에 설치하지 않은 사람은 아래 명령어를 통해 conda 가상 환경에 설치하도록 하자.

conda install -c conda-forge/label/cf202003 opencv

위 명령어를 통해 conda에 최신의 opencv를 설치하자. 만약 예전 버전이 필요한 사람은 홈페이지를 참고하면 될 것 같다.

imgaug_example.py의 코드는 다음과 같다.


import glob
import os
import numpy as np
import imgaug as ia
import imgaug.augmenters as iaa
from imgaug.augmentables.segmaps import SegmentationMapsOnImage
import cv2
from PIL import Image

#이미지를 저장하는 단순한 함수이므로 따로 설명은 안하겠다. 
def make_image(array, number):
    count = 1
    name_number = count + number
    aug_img = np.asarray(array)

    if name_number < 10:
        cv2.imwrite(save_dir + "train2020_0000000" + str(name_number) + ".jpg", aug_img)
    elif 10 <= name_number < 100:
        cv2.imwrite(save_dir + "train2020_000000" + str(name_number) + ".jpg", aug_img)
    elif 100 <= name_number < 1000:
        cv2.imwrite(save_dir + "train2020_00000" + str(name_number) + ".jpg", aug_img)
    elif 1000 <= name_number < 10000:
        cv2.imwrite(save_dir + "train2020_0000" + str(name_number) + ".jpg", aug_img)
    elif 10000 <= name_number < 100000:
        cv2.imwrite(save_dir + "train2020_000" + str(name_number) + ".jpg", aug_img)

    print("-----------------------------------------------------------------")
    print("image_number is {}".format(name_number))

    return name_number


def main():

    image_names = sorted(glob.glob(image_dir+"*.png"))
    image_name_number = len(image_names)

    for i in range(aug_number):

        for image_name in image_names:

            image = cv2.imread(image_name)

            # 이부분이 imgaug github or documentation을 읽고 자신이 imgaug를 쓰고싶은 것을 
            # 아래와 같이 iaa.@@@@(###), 이런 형태로 넣으면 된다. 이 때 가장 많이 하는 실수가
            # ,(쉼표)를 빼는 것이므로 주의하자. 
            seq = iaa.Sequential([
                iaa.Fliplr(0.5), 
                iaa.Crop(percent=(0, 0.1)),
                iaa.Affine(
                    scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},
                    translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)},
                    rotate=(-25, 25),
                    shear=(-8, 8)
                ) 
            ], random_order=True) 

            images_aug_i = seq(image=image)
            image_name_number = make_image(images_aug_i, image_name_number)

if __name__ == '__main__':

    #데이터가 있는 folder를 image_dir , 저장할 folder를 save_dir 로 설정했다.
    #각자의 상황에 맞게 이를 수정하면 될 것 같다. ex) 내 data폴더명이 "datafolder" 이면 
    #                                              image_dir = os.getcwd()+"/datafolder/" 이런식으로.
    #저장할 폴더는 만들 필요가 없다. 저장하고 싶은 곳을 바꾸고 싶으면 바꾸자.
    #확장자 명은 이미지에 확장자 명에 따라서 바꿔주면 된다.
    #데이터를 증가시키고 싶은 수를 aug_number = 1 에 적어주면 된다. 데이터의 증가 횟수는 
    #(총 데이터 양)*aug_number이다. original 데이터는 save 폴더에 포함되어 있지 않으므로 
    #추가하고 싶으면 직접 추가하면 될 것 같다. 
    image_dir = os.getcwd()+"/image/"
    save_dir = os.getcwd()+"/save_folder/"
    filename_extension = ".png"
    aug_number = 1

    #seed(number)에서 number가 같으면 sequential 순서가 같다.
    ia.seed(1)

    if os.path.isdir(save_dir) != True:
        os.mkdir(save_dir)

    main()

2 분 소요