일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 선형회기모델
- pandas
- tensorflow
- 데이터
- keras
- 머신러닝
- 정확도
- 파이썬
- 딥러닝
- 데이터전처리
- python기초
- Database
- HeidiSQL
- 예측
- sklearn
- 크롤링(crawling)
- 훈련
- 데이터베이스
- python
- 데이터 수집
- 데이터 가공
- 해석
- Deep Learning
- MariaDB
- 시각화
- SQL예제
- 알고리즘기초
- 데이터 분석
- pythone
- 회귀모델
- Today
- Total
코딩헤딩
Deep learning[딥러닝] CNN 이미지 증식 본문
* 이미지 증식을 하는 이유????
- 이미지를 이용하여 모델 훈련 시 데이터 확보가 어려운 경우 수행
- 기존 이미지 훈련모델의 성능이 낮은 경우에 데이터를 증가시키고자 할 때 사용
- 이미지 증식은 하나의 원본 이미지의 형태를 랜덤 하게 변형시켜 많은 양의 이미지를 생성 가능
* 사용할 라이브러리 정의
### 이미지 증식에 사용되는 라이브러리
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(">>>>>>>>>>>>>>>>>>>>>>이미지 증식 종료>>>>>>>>>>>>>>>>>>>>>>>>>>")