데이터 꿈나무

[데이터 청년 캠퍼스] 딥러닝 VGG16 모델 구현 이미지 전처리 with Python 본문

Activity/데이터 청년 캠퍼스

[데이터 청년 캠퍼스] 딥러닝 VGG16 모델 구현 이미지 전처리 with Python

ye_ju 2022. 12. 23. 18:47

안녕하세요~ 데이터 청년 캠퍼스를 수료한지 벌써 4개월이 지나가는데요, 개강을 하고 바쁜 현생을 살아가느라 아직 데청캠에서 했던 활동 포스팅을 마무리를 못했네요ㅠㅠ 대학교 사망년은 참 바쁜 삶인 거 같아요,,

자자 근황 토크는 그만하고 오늘 포스팅 내용을 소개해드릴게요!

이번 포스팅은 딥러닝 모델인 CNN의 VGG16 모델로 이미지 분류 모델을 만들기 전, 이미지 전처리하는 과정을 설명해드리려고 해요~

 

이미지는 저번 포스팅에서 크롤링을 통해 수집했던 것들을 사용할 것인데요, 

크롤링으로 이미지를 수집하는 방법이 궁금하시다면 아래의 포스팅을 참고해주세요:)

 

 

[데이터 청년 캠퍼스] 구글 이미지 자동 스크롤 웹크롤링 with Python

안녕하세요 여러분~! 저번 시간에는 네이버 자동 스크롤 이미지 크롤링을 했었는데요, 이번 포스팅은 구글 이미지 크롤링을 해볼까 합니다!! 네이버 자동 스크롤 이미지 크롤링이 궁금하신 분들

risingdata.tistory.com

 

[데이터 청년 캠퍼스] 네이버 자동 스크롤 이미지 크롤링 with 파이썬(Python)

안녕하세요~! 저번 방학 때 대외활동 '데이터 청년 캠퍼스'에서 팀원들과 프로젝트를 하면서 네이버 자동 스르롤 이미지 크롤링을 해봤었는데요, 그때 작성한 코드 공유해드리려고 해요~ 제가

risingdata.tistory.com

 

우선, CNN이 무엇인지 간단히 설명하고 시작할게요!

 


CNN이 무엇일까?

 

CNN은 Convolutional Neural Network의 약자로,

딥러닝에서 주로 이미지나 영상 데이터를 처리할 때 쓰이며, Convolution이라는 전처리 작업이 들어가는 신경망 모델입니다.

또한, 기존의 Deep Neural Network에서 이미지나 영상과 같은 데이터를 처리할 때 생기는 문제점들을 보완한 방법입니다.

 

CNN 구조

입력 이미지를 Convolution과 Max-Pooling을 통해 깊이를 깊게하고 size를 줄여준 후 4x4xn2의 데이터를 1차원의 데이터로 flattened 해줍니다. 

이렇게 1차원으로 만든 데이터를 DNN 네트워크를 통해 최종 output을 출력합니다. 


 

이제 본격적으로 CNN의 VGG16 모델의 이미지 세팅을 진행해보도록 할게요!

저는 구글 코랩으로 모델을 구현했기 때문에 이미지와 파일들을 불러오기 위해,  먼저 드라이브 마운팅을 해주었습니다.

저와 같이 구글 코랩으로 사용하시는 분들은 참고해주시면 될 것 같습니다.

 

드라이브 마운팅

 

from google.colab import drive

drive.mount("/content/drive")
# 마운팅이 잘 되었는지 확인
import os

os.listdir("/content/drive/MyDrive/데이터청년캠퍼스_4팀/")

마운팅이 잘 되었다면 드라이브에 있는 파일들이 리스트로 출력될 것입니다.

 

이미지 세팅(Image Setting)

 

file_path = "/content/drive/MyDrive/데이터청년캠퍼스_4팀/스타벅스_이미지_분류모델/top_10_all"
file_names = os.listdir(file_path)

file_names

스타벅스의 top10 음료 메뉴들로 모델링을 할 것이기 때문에 음료 이미지들이 들어있는 폴더를 os.listdir 함수를 통해 불러주었습니다.

 

  • 이미지 이름 변경
for i in file_names:
  # 각 카페 메뉴에 대한 경로 만들기
  path_of_menu = os.path.join(file_path, i)

  # 해당 카페 메뉴의 저장된 사진 이름들 불러오기
  names_of_menu = os.listdir(path_of_menu)

  number = 1
  for j in names_of_menu:
    # 본래 메뉴 이미지의 경로
    original_name_with_path = os.path.join(path_of_menu, j)

    # 바꾸고자 하는 이미지의 이름
    change_name = str(i) + "_" + str(number) + '.jpg'

    # 바꾸려는 이미지의 이름을 포함한 경로
    change_name_with_path = os.path.join(path_of_menu, change_name)

    # 이름을 새로 변경
    os.rename(original_name_with_path, change_name_with_path)

    number += 1

다음으로,  for 반복문을 통해서 위에서 저장해준 file_names 변수에 있는 이름들을 i에 넣도록 해주었습니다.

각  음료 메뉴에 대한 경로를 os.path.join을 통해 만들어 준 후, path_of_menu에 저장해줍니다.

 

해당 음료 메뉴에 저장된 사진, 이름들을 불러옵니다. 그것을 names_of_menu에 저장해줍니다.

 

본래의 이미지 경로를 변수에 저장 후, 바꾸고자 하는 이미지의 이름도 변수에 저장해줍니다. 그리고 바꾸려는 이미지의 이름을 포함한 경로를 변수에 저장해줍니다.

 

마지막으로 os.rename을 통해 이름을 새로 변경해줍니다. 

 

 


이미지 사이즈 전처리 (Padding 기법 사용)

사전 학습 모델마다 입력받는 이미지의 형태가 다릅니다. VGG16은 224x224 형태의 컬러 이미지를 입력받기 때문에 이에 맞춰서 학습할 이미지 크기를 변환해야 합니다. 

대부분의 사전 학습 모델은 정사작형 이미지 형태를 입력받습니다. 이미지를 정사각형으로 만드는 방법은 다음과 같습니다. 

이미지 크기 변경 방법 3가지

  1.  Cropping : 정사각형 형태로 가운데를 중심으로 자르기
  2. Warping : 가로 세로 비율이 다른 이미지를 확대 또는 축소해서 변경하는 방법 -> 이미지의 왜곡 발생
  3. Padding : 이미지 일부를 특정 색상으로 채우는 방법. 주로 검정색(0인 값)으로 채우는 zero padding이 자주 사용된다.

 

import tensorflow as tf
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.image import pad_to_bounding_box  # Padding 기법
from tensorflow.image import central_crop   # Cropping 기법
from tensorflow.image import resize   # Wrapping 기법

 

  • 이미지 불러오기
# 이미지 불러오기
menu_img = image.load_img(change_name_with_path)
img_vector = np.asarray(image.img_to_array(menu_img))
img_vector = img_vector/255

# 이미지 형태 확인
img_vector.shape

# 출력
(319, 207, 3)
# 이미지 확인
plt.imshow(img_vector)
plt.show()

 

  • Padding : 가장자리 채우기
target_height = 512
target_width = 512


source_height = img_vector.shape[0]
source_width = img_vector.shape[1]

img_vector_pad = pad_to_bounding_box(img_vector,
                                     int((target_height - source_height) / 2),
                                     int((target_width - source_width) / 2),
                                     target_height,
                                     target_width)

img_vector_pad.shape

 

  • 결과
plt.imshow(img_vector_pad)
plt.show()

Padding 기법으로 가장자리를 검은색으로 채운 결과


여기까지 모델 구현을 하기 위한 이미지 사이즈 전처리 과정을 살펴보았는데요, 어떠셨나요? 흥미롭지 않나요?

Padding 외에도 Cropping, Wrapping 두 가지 방법이 더 있었는데요, 저는 Padding 기법을 사용해서 딥러닝 모델 구현을 진행했기 때문에 제가 한 방법을 소개해드렸어요~ 

다른 방법도 궁금하신 분들은 따로 검색해보시는 것을 추천드립니다..!

 

다음 포스팅에서는 본격적으로 CNN을 이용한 VGG16 모델링을 진행해 볼 텐데요,

낯설고 어렵긴 하지만 하면 할수록 흥미가 생기더라고요ㅎㅎ 여러분들도 저와 같은 흥미가 생기시길 바라면서 다음 포스팅에서 뵙겠습니다! 오늘도 긴 글 읽어주셔서 감사합니다~!

 

Comments