imgaug 방법
업데이트:
깃허브에서 zip 파일을 다운로드한다. 이제 Linux에서 anaconda를 사용할 것이므로 linux - conda를 기준으로 설명하겠다.
- conda 가상 환경 열기
-
conda activate {자신의 project name}
- conda 내에서 imgaug를 설치
conda config --add channels conda-forge
conda install imgaug
- 예제 따라하기
링크에 들어가 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()