Day46 - 과제2(1). 22.11.01.화

류소리·2022년 11월 1일
0

데이터베이스

목록 보기
1/1

이미지 처리 딥러닝과 머신러닝의 차이

< 딥러닝과 머신러닝의 차이 >

딥 러닝은 동영상이나 음성, 이미지 데이터를 처리하는 데에 있어 특히 강력한 모습을 보인다.
머신 러닝은 복잡한 이미지를 잘 분간하지 못하는데, 딥 러닝은 고양이와 개를 꽤나 간단하고 쉽게 구분해낸다.
실제 영상 및 이미지 분석 툴들에 딥 러닝이 많이 활용되는 이유다.

기업들로서는 인스타그램에 올라와있는 이미지와 영상들을 쉽고 빠르게 분석해 소비자들의 정서와 동향을 파악할 수 있게 된다.

이로부터 영상 분석 기능을 추가시켜 쇼핑을 하는 사용자들이 사고자 하는 아이템을 카메라 앱으로 화면캡처만 해도 되도록 한다거나 하는 서비스를 제공할 수 있다.


이미지 처리 기초

여기에서는 이미지 데이터를 표현하는 방식과 이미지 데이터를 처리하기 위한 파이썬 패키지인 Pillow, Scikit-Image, OpenCV 패키지에 대해 설명한다.

이미지 파일 전처리에서 가장 중요한 것은

1) 색상을 맞춰준다.
2) 픽셀 크기를 맞춰준다.

픽셀

이미지 데이터는 픽셀(pixel)이라고 하는 작은 이미지를 직사각형 형태로 모은 것이다.
각 픽셀은 단색의 직사각형이다.
전체 이미지의 크기를 표현할 때는 (세로픽셀수 x 가로픽셀수) 형식으로 표현한다.

이미지 데이터를 저장할 때는 픽셀의 색을 표현하는 스칼라 값이나 벡터를 2차원 배열로 표현한다.
파이썬에서는 NumPy의 ndarray 클래스 배열로 표현한다.

색공간

픽셀의 색을 숫자로 표현하는 방식을 색공간(color space)라고 한다.
대표적인 색공간으로는

  • 그레이스케일(gray scale),
  • RGB(Red-Green-Blue),
  • HSV(Hue-Saturation-Value) 방식이 있다.

< 그레이스케일. Gray-scale >

그레이스케일에서는 모든 색이 흑백이다.
각 픽셀은 명도를 나타내는 숫자로 표현된다.
0은 검은색을 나타내고 숫자가 커질수록 명도가 증가하여 하얀색이 된다.
숫자는 보통 0~255의 8비트 부호없는 정수로 저장된다.

SciPy 패키지의 misc 서브 패지의 face 명령은 이미지 처리용 샘플 이미지를 제공한다.
인수로 gray=True를 입력하면 그레이스케일 이미지를 반환한다.
이미지의 크기는 배열의 shape 속성으로 볼 수 있다.

import scipy as sp

img_gray = sp.misc.face(gray=True)
img_gray.shape

->
(768, 1024)   ## 데이터는 768x1024 크기의 uint8 자료형 2차원 배열이다. 
import matplotlib.pylab as plt
import seaborn as sns

sns.heatmap(img_gray[:15, :15], annot=True, fmt="d", cmap=plt.cm.bone)
plt.axis("off")
plt.show()

< RGB >

RGB 색공간에서 색은 적(Red), 녹(Green), 청(Blue)의 3가지 색의 명도를 뜻하는 숫자 3개가 합쳐진 벡터로 표현된다.
8비트 부호없는 정수를 사용하는 경우

  • (255, 0, 0)은 빨간색,
  • (0, 255, 0)은 녹색,
  • (0, 0, 255)는 파란색이다.

픽셀 데이터가 스칼라가 아닌 벡터이므로 이미지 데이터는 (세로픽셀수 x 가로픽셀수) 형태의 2차원 배열로 표현하지 못하고 (세로픽셀수 x 가로픽셀수 x 색채널) 형태의 3차원 배열로 저장한다.
세번째 축을 색채널(channel)이라고 부른다.

from sklearn.datasets import load_sample_images

dataset = load_sample_images()   
img_rgb = dataset.images[1]
img_rgb.shape
->
(427, 640, 3)  ## 3차원 배열로 저장한다

< HSV >

HSV(Hue, Saturation, Value) 색공간에서는 색이 다음 세가지 값으로 표현된다.

  • 색상(Hue): 색상값 H는 가시광선 스펙트럼을 주파수 별로 고리모양으로 배치했을 때의 각도이다. 0°~360°의 범위를 갖고 360°와 0°는 빨강을 가리킨다.

  • 채도(Saturation): 채도값 S는 특정한 색상의 진함의 정도를 나타낸다.
    가장 진한 상태를 100%이고 0%는 같은 명도의 무채색이다.

  • 명도(Value): 명도값 V는 밝은 정도를 나타낸다.
    순수한 흰색, 빨간색은 100%이고 검은색은 0%이다.

matplotlib 패키지의 rgb_to_hsv, hsv_to_rgb 명령을 사용하면 RGB 색공간 표현과 HSV 색공간 표현을 상호변환할 수 있다.

HSV 색공간으로 표현된 파일은 imshow 명령으로 바로 볼 수 없다.
이외에도 RGB, HSV 색공간에 투명도(transparency)를 표현하는 A(Alpha) 채널이 추가된 RGBA, HSVA 등의 색공간도 있다.


이미지 파일 형식

.bmp 확장자를 가지는 비트맵(bitmap) 파일은 지금까지 설명한 다차원 배열정보를 그대로 담고있다.
하지만 비트맵 파일은 파일 용량이 크기 때문에 압축을 통해 용량을 줄인 JPG, GIF, PNG 등의 압축 파일 형식도 많이 사용한다.

  • JPEG : JPEG는 Joint Picture Experts Group의 약자로 이미지 압축 기술자 모임인 JPEG 위원회에서 개발한 이미지 파일 형식이다.

    JPEG 파일은 웹상 및 멀티미디어 환경에서 가장 널리 사용되고 있는 포맷이다.
    JPG라는 확장자도 같이 사용된다.

    • 장점

      1. RGB모드와 CMYK모드를 둘 다 지원한다.
      2. RGB 이미지의 모든 컬러 정보를 유지한다.
      3. 이미지를 만드는 사람이 이미지의 질과 파일의 크기를 손실압축방식을 통해 조정할 수 있다.
    • 단점

      1. 투명 이미지를 지원하지 않는다.
      2. 압축율을 높일 수록 이미지의 질이 손상된다.
      3. 레이어와 알파채널을 지원하지 않는다.
  • GIF : GIF는 Graphics Interchange Format의 약자로 1987년 미국의 통신업체인 컴퓨서브(Compuserve)에서 개발한 포맷이다.

    • 장점
      1. 하나의 파일에 여러 비트맵을 저장하여 다중 프레임 애니메이션을 구현 할 수 있다.
      2. 투명 이미지를 지원한다.
      3. 애니메이션을 특별한 플러그인 없이 여러 환경에서 쉽게 적용할 수 있다.
    • 단점
      1. 8비트 256 컬러로 제한된다.
  • png : PNG는 Potable Network Graphics의 약자이다. GIF 포맷을 대체하기 위해 개발된 파일 포맷이다.

    • PNG의 장점
      1. 비손실 압축방식으로 원본에 손상 없이 파일의 크기를 줄여준다.
      2. 이미지의 모든 컬러정보와 알파 채널을 보존하고 있으므로 포토샵에서 활용하기 용이하다.
      3. 문자 혹은 날카로운 경계가 있는 이미지인 경우 JPG보다 PNG가 효과적이다.
    • PNG의 단점
      1. 애니메이션을 만들 수 없다.
      2. JPG 와 GIF보다 용량이 크다.

<Pillow를 이용한 이미지 처리 >

가장 먼저 소개할 파이썬 이미지 처리 패키지는 Pillow이다.
Pillow는 이전에 사용되던 PIL(Python Imaging Library)패키지를 대체하기 위한 것이다.
JPEG, BPM, GIF, PNG, PPM, TIFF 등의 다양한 포맷을 지원하고 초보자가 다루기 쉽다는 장점이 있다.
여기에서는 Pillow 버전 5.2를 기준으로 설명한다.
PIL 패키지의 대체이므로 임포트 이름이 PIL 패키지와 같다.

이미지 읽고 쓰기

  • 이미지 데이터 처리를 위해 Image 클래스 객체를 NumPy 배열로 변환할 때는 np.array 함수를 사용한다.
    NumPy 배열이 되면 matplotlib의 imshow 명령으로 볼 수 있다.

  • 반대로 NumPy 배열을 Image 객체로 바꿀 때는 fromarray 클래스 메서드를 사용한다.

이미지 크기 변환: resize

  • 이미지의 크기를 확대 또는 축소하려면 resize 메서드를 사용한다.
    인수로는 새로운 사이즈의 튜플을 입력한다

-썸네일(thumbnail) 이미지를 만들고 싶다면 Image객체의 thumbnail 메서드를 사용한다.
resize 메서드는 원래 객체는 그대로 유지한 채 변환된 이미지를 반환하지만 thumbnail 메서드는 원래 객체 자체를 바꾸는 인플레이스(in-place) 메소드이므로 주의하여 사용한다.

이미지 회전: rotate

  • 이미지를 회전하기 위해서는 rotate 메서드를 호출한다.
    인수로는 도(degree) 단위의 각도를 입력한다.
    입력 각도만큼 반시계 방향으로 회전한다.

이미지 잘라내기: crop

  • crop 메서드를 사용하면 이미지에서 우리가 관심이 있는 특정 부분(ROI: region of interest)만 추출 할 수 있다.
    인수로 ROI의 좌-상의 좌표, 우-하의 좌표를 받는다.
    아래의 코드는 파이썬 로고이미지에서 파이썬의 마크만 잘라낸 것이다.

다양한 신경망 - 이미지 처리를 위한 전처리, 딥러닝 모델

  • 😁1. 이미지에 있는 어떤 동물인지 분류하고자 할 때, 컴퓨터에게 이미지는 각 픽셀 값을 가진 숫자 배열로 인식하게 합니다.

  • 😁2. 이미지 전 처리
    모두 같은 크기를 갖는 이미지로 통일

      1) 가로 세로 픽셀 사이즈를 표현하는 해상도 통일
      2) 색을 표현하는 방식 통일(RGB, HSV, Gray-scale, Binary, ...)

    1. 이미지 처리 딥러닝 모델
      1) 기존 다층 퍼셉트론 기반 신경망의 이미지 처리 방식
    • 극도로 많은 수의 파라미터가 필요하다.

      😁2) 합성곱 신경망(Convolution Neural Network)

    • 작은 필터를 순환시키는 방식

    • 이미지의 패턴이 아닌 특징을 중점으로 인식

    1. 피쳐맵의 크기 변형
    • Padding : 원본 이미지의 상하좌우에 한 줄씩 추가
    • String : 필터를 이동시키는 거리 설정(ex) 1칸씩 이동)
    1. Pooling Layer(풀링층) : 이미지의 왜곡의 영향(노이즈)를 축소하는 과정.
    • 최대풀링 : 가장 큰 값만 나오는 과정
    • 평균풀링 : 4개의 숫자의 평균 값으로 축소하는 과정
    1. Fully Connected Layer(완전연결층) : 추출된 특징을 사용하여 이미지를 분류.
    1. 분류를 위한 Softmax활성화함수
    1. 정리
    • Convolution Layer는 특징을 찾아내고, PoolingLayer는 처리할 맵(이미지) 크기를 줄여준다. 이를 N번 반복한다.
    • 반복할 때마다 줄어든 영역에서의 특징을 찾게 되고, 영역의 크기는 작아졌기 때문에 빠른 학습이 가능해진다

CNN은 크게 이미지의 특징을 추출하는 부분과 클래스를 분류하는 부분으로 나뉩니다.
특징 추출 영역은 합성곱층(Convolution layer)과 풀링층(Pooling layer)을 여러 겹 쌓는 형태(Conv+Maxpool)로 구성되어 있습니다.
그리고 이미지의 클래스를 분류하는 부분은 Fully connected(FC) 학습 방식으로 이미지 분류를 합니다.


출처:

profile
새싹 빅테이터 개발자

0개의 댓글