코딩헤딩

Deep learning[딥러닝] CNN 이미지 증식 본문

카테고리 없음

Deep learning[딥러닝] CNN 이미지 증식

멈머이 2024. 1. 11. 23:31
728x90

 

 * 이미지 증식을 하는 이유????
   - 이미지를 이용하여 모델 훈련 시 데이터 확보가 어려운 경우 수행
   - 기존 이미지 훈련모델의 성능이 낮은 경우에 데이터를 증가시키고자 할 때 사용
   - 이미지 증식은 하나의 원본 이미지의 형태를 랜덤 하게 변형시켜 많은 양의 이미지를 생성 가능


* 사용할 라이브러리 정의

### 이미지 증식에 사용되는 라이브러리
from keras.preprocessing.image import ImageDataGenerator

### numpy배열을 이미지로 변환하는 라이브러리
from keras.preprocessing.image import array_to_img

### 이미지를 numpy 배열로 변환하는 라이브러리
from keras.preprocessing.image import img_to_array

### 이미지 읽어들이는 라이브러리
from keras.preprocessing.image import load_img

### 시각화
import matplotlib.pyplot as plt

 

* 이미지 증식 객체 생성하기

imgGen = ImageDataGenerator(
    # 이미지 데이터를 0과 1 사이의 값으로 정규화 하기
    rescale=1./255,
    # 이미지 회전 시키기, 0~90 사이로 랜덤하게 회전
    rotation_range=15,
    # 수평이동 시키기, 0~1사이의 비율ㄹ에 따라 랜덤하게 이동
    # - 0.1 = 10%, 10%의 비율로 좌/우 랜덤하게 이동
    width_shift_range=0.1,
    # 수직이동 시키기
    height_shift_range=0.1,
    # 이미지 혀애 변형(반시꼐방향)
    shear_range=0.5,
    # 이미지 확대 / 축소(0.8~2 사이의 범위 값으로 랜덤하게 확대 / 축소)
    zoom_range=[0.8, 0.2],
    # 수직방향으로 뒤집기 여부
    vertical_flip=True,
    # 이미지 변형 시 발생하는 빈 공간의 픽셀값 처리 방법 지정
    # - nearest : 가까운 곳의 픽셀값으로 채우기(기본값, default, 생략가능)(주로 사용됨)
    # - reflect : 빈공간 만큼의 영역을 근처 공간의 반전된 픽셀값으로 채우기
    # - wrap : 빈공간을 이동하면서 잘려나간 이미지로 채우기
    # - cosntant : 빈공간을 검정 또는 흰색으로 채우기
    fill_mode="nearest"
)

imgGen

결과 : <keras.preprocessing.image.ImageDataGenerator at 0x2742e716670>

 

* 원본 이미지 불러오기

img = load_img("[이미지 경로]")
img

 

* 이미지 데이터화 시키기

img_array = img_to_array(img)
print(img_array.shape)
img_array

결과 :

(168, 300, 3)
array([[[ 70., 197., 238.],
        [ 74., 201., 242.],
        [ 84., 212., 255.],                                               이미지를 array 배열 데이터로 변환하기
        ...,
        [  1., 162., 234.],                                                          - 3차원 데이터로 반환됨
        [  1., 162., 234.],
        [  1., 162., 234.]],

                    .

                    .

                    .

 

* 이미지 증식을 위한 데이터는 4차원 데이터

img_array = img_array.reshape((1,) + img_array.shape)
img_array

결과 :

array([[[[ 70., 197., 238.],
         [ 74., 201., 242.],
         [ 84., 212., 255.],
         ...,
         [  1., 162., 234.],
         [  1., 162., 234.],
         [  1., 162., 234.]],

                     .

                     .

                     .

 

* 이미지 증식하기

### 반복을 종료하기 위한 count값으로 사용
i = 0

### 생성할 이미지 갯수
cnt = 100

### 이미지를 반복해서 생성
# flow() : imGen객체를 이용해서 랜덤하게 만들어진 이미지를 저장시키는 함수
# save_to_dir : 저장할 폴더 위치
# save_prefix : 저장할 파일명에 사용할 이니셜
#             : 이니셜 뒤에 자동으로 이름이 부여된다.
# save_format : 저장할 파일의 모멧, 파일명 뒤에 확장자 정
for new_img in imgGen.flow(
                            img_array,
                            save_to_dir="./yolo/new_img/new",
                            save_prefix="train",
                            save_format="png"
                             ):
    ### 생성할 이미지 갯수까지만 반복시키고 반복을 종료시키기
    if i > cnt :
        break

    ### 생성된 이미지 출력하기
    plt.imshow(new_img[0])
    ### 그래프 x, y축 숨기기
    plt.axis("off")
    # 반복하면서 이미지를 보여주는 경우에는 show()를 사용해야 한다
    #  - 그렇지 않으면 1개의 이미지만 보이게 된다.
    #  - show()이미지를 보여주고, 자원을 반환하는 역할도 같이 수행됨
    #  - 차원이 반환되야 다음 이지지를 plt를 통해서 사용가능
    plt.show()

    ### 반복을 위한 count값 증가
    i += 1

print(">>>>>>>>>>>>>>>>>>>>>>이미지 증식 종료>>>>>>>>>>>>>>>>>>>>>>>>>>")


   

728x90