6회차 - (2) 이미지 크기 조절 및 자르기
- 현재 모아놓은 훈련 데이터 이미지는 (960X540), 1채널의 흑백 이미지이다. 픽셀 수는 약 51만개로, 이 정도 데이터의 크기로 딥러닝 학습을 할 경우 시간이 매우 오래 걸린다고 판단하였다. 또한 현재 프로젝트의 모태가 되는 NVIDIA DAVE 2에서는 실제 도로 이미지를 사용하는 데에도 (200X66), 3채널의 컬러 이미지를 사용하였다. 컬러 이미지라 하더라도 픽셀 수가 4만개가 되지 않는다. 즉, 프로젝트 수준에 비해 너무 과한 시스템을 다루고 있는 것이다.
- 따라서 현재의 이미지 크기를 줄이고, 도로를 제외한 차량이나 배경 화면 등은 자르기로 결정하였다. 크기는 NVIDIA DAVE 2와 유사한 수준의 이미지 크기로 줄이기로 결정하였다. 따라서 현재의 이미지 크기를 가로 세로 모두 3등분 하여, (320X180)의 크기로 축소하였다. 이미지를 줄이는 데에는 훈련 데이터를 모을 때와 같이 OpenCV의 resize() 함수를 사용하였다.
import os import numpy as np import cv2 from PIL import Image
original_path = '~/Training Data/' resized_path = '~/Resized Training Image/'
file_list = os.listdir(original_path) img_list = []
for item in file_list : if item.find('.PNG') is not -1 : img_list.append(item)
total_image = len(img_list) index = 0
for name in img_list :
img = Image.open('%s%s'%(original_path, name)) img_array = np.array(img) img_resize = cv2.resize(img_array, (320,180), interpolation = cv2.INTER_AREA) img = Image.fromarray(img_resize) img.save('%s%s.PNG'%(resized_path, name))
print(name + ' ' + str(index) + '/' + str(total_image)) index = index + 1
|
- 훈련 데이터가 저장된 폴더로부터 파일 리스트를 받아와서, PNG 확장자로 된 이미지 리스트만 따로 저장을 한다. 그 이미지 리스트에서 반복문을 수행하면서 리스트 내의 이름으로 된 이미지를 열고, 배열로 바꾼 다음 OpenCV의 resize() 함수를 통해 (320X180)의 크기로 줄인다. 줄인 다음 다시 이미지 파일로 바꾸고, 다른 경로에다 저장을 해준다.
- 크기를 줄인 이미지는 도로만이 있는 것이 아니라, 운전하는 차량의 모습, 하늘과 같은 배경까지 함께 나와있다. 따라서 이것을 잘라내어 도로의 형상만 담긴 이미지를 만들면, 기존의 이미지에 비해 그 크기는 훨씬 줄어들 것이 자명하다.
import os from PIL import Image
resized_path = '~/Resized Training Image/' cutted_path = '~/Cutted Training Image/'
img_list = os.listdir(resized_path) total_image = len(img_list) index = 1
for name in img_list :
img = Image.open('%s%s'%(resized_path,name)) cutted_img = img.crop((20,70,300,140)) cutted_img.save('%s%s.PNG'%(cutted_path, name))
print(name + ' ' + str(index) + '/' + str(total_image)) index = index + 1
|
- 이미지를 잘라내는 데에는 파이썬 내장 라이브러리인 PIL의 Image 모듈을 사용한다. 먼저 앞서 크기를 줄인 이미지가 들어있는 경로에서 이미지의 파일 리스트를 받아오고, 그 파일 리스트 속의 이미지를 반복문을 통해 하나씩 오픈한다. 그리고 Image 모듈의 crop() 함수를 통해 원하는 부분만을 잘라내어 다른 경로에 저장한다. crop() 함수 내에는 픽셀의 시작점 위치(좌측 위)와 끝나는 픽셀의 위치(우측 아래)를 넣어준다. 모든 작업이 완료되면 위와 같은 이미지가 나오게 된다.