딥러닝(텐서플로우)

이미지 (영상) 딥러닝 CNN

Dean83 2023. 3. 30. 08:53

이미지(영상) 데이터를 딥러닝 하기 위해선 CNN을 보통 사용한다. 

물론 FNN 으로도 사용할 수 있으나 학습률이 좋지 못하다.


FNN으로 처리하는 과정을 설명하자면, Flatten 을 이용하여 
이미지의 X, Y 의 2차원 정보를 1차원인 배열로 변경한 후 일반 분류데이터 처럼 은닉층을 통해 학습을 시킨다.

별도로 쓰지는 않고, CNN 계산 후 Flatten 을 이용하여 최종 완성 한다.

 

1. keras,layers.Flatten
    - 인자값으로  input_shape=(숫자, 숫자) 를 입력받는다
    - 해당 인자값은 , 인풋으로 받을 이미지의 x,y 크기 이다. 

    keras.layers.Flatten(input_shape=(x축 이미지 크기, y축 이미지 크기)),
    keras.layers.Dense(은닉층 개수, activation='relu'),
    keras.layers.Dense(출력층 개수, activation='softmax')

 

 

CNN은 인간의 시각정보를 알고리즘 화 한 것이다. 다양한 기법들이 존재한다.
CNN 의 경우, 여러층을 쌓아 구성하고 학습을 진행하는데, 한 층은 다수의 FNN 층과 동일하다.
즉, 다수의 FNN 층이 n개 있는것이 CNN 이다. CNN으로 처리 한 후 최종적으로 FNN 을 수행하여 이미지 딥러닝을

구성한다. 

기본적으로 원본 이미지 데이터를 압축하여 추상화 하고, 이를 학습 한다. 원본 이미지 데이터를 압축하는 기법은 여러가지 이다. 일단 이게 뭔지 부터 살펴보자.

 

1. 합성곱 
    - 원본이미지 데이터와 필터행렬의 행렬곱 연산을 하고, 모든 값을 다 더한다.
    - 계산결과, 원본이미지보다 사이즈가 줄어들게 된다.
(예 : 3X3 행렬 곱을 한 계산의 결과를 모두 더하게 되면,  숫자값 1개가 출력되고, 이는 원본 데이터 3X3 이 1로 축소 된것)


2. 필터 (또는 필터 행렬) 이란

    - 원본데이터를 변형하고자 할때 사용한다. 
    - 변형의 목적은, 원본 이미지 데이터에서 내가 원하는 데이터만 추출하고자 할 때 사용한다.     
    - 학습을 통해 이 값을 계속 수정하게 된다. 
      예를들어, 이미지의 경계면을 인식하고 싶은 경우, 필터 행렬이 경계면을 잘 인식하는 값으로 구성이 되어 있다면,

      원본이미지 데이터와 행렬 곱을 통해 원본이미지의 경계면만 취득 할 수 있다. 


3. 계산 동작

    - 원본이미지 데이터 전체는 너무 크므로 한번에 계산할 수 없다.
    - 좌상단부터 일정 크기의 행렬만큼 계산하고, 우측으로 이동, 이후 아랫줄도 똑같이 이동하면서 전체 이미지를
      스캐닝 하여 계산한다.


4. Zero padding

   - Convolution 계산 과정에서 필연적으로 데이터 크기가 줄어들게 된다. (압축이 됨) 그러나 경우에 따라선 크기를
      줄이고 싶지 않을 때가 있다. 
   - 이때 원본 이미지 데이터의 계산할 행렬 부분 겉에 0으로 데이터를 채우게 되면, 이미지 사이즈를 임의로 키운 후
      압축을 하게 되므로 결과적으로 데이터 크기가 동일하게 된다. 

 

5. Pooling layer
    - 데이터 압축의 다른 기법. 

5.1 Max pooling
      - 해당 영역 (행렬 사이즈) 에서 가장 큰 값을 대표값으로 추출하여 압축

5.2. Average Pooling
       - 해당 영역 (행렬 사이즈) 의 평균값을 대표값으로 추출하여 압축

 

6. Batch normalization

    - 이미지 딥러닝의 성능을 높히기 위한 기법. 

 

 

CNN 구성 예제

keras.Sequential([
keras.layers.Conv2D(레이어 층 개수,(행렬 사이즈 숫자, 행렬 사이즈 숫자)),
keras.layers.BatchNormalization(),
keras.layers.MaxPooling3D((행렬 사이즈 숫자,행렬 사이즈 숫자)),
keras.layers.ReLu(),
...

//위의 구성이 CNN의 한 층이다.  이를 여러개 쌓아 올린후, 
//CNN을 수행하기 위해 FNN, CNN 을 구성한다

keras.layers.Flatten(),
keras.layers.Dense(입력층 숫자값, activation='relu'),
keras.layers.Dense(출력층 숫자값, activation='softmax')])

 

 

7. keras.layers.Conv2D
     - 2차원 layer 를 갖는 convulution.  이미지는 2차원 배열이다. 

     - 이미지 관련 학습을 할때 사용 된다, 
     - padding 인자값 : 원본 input 주변에 zero padding을 얼마나 씌울것인지. 

     - Strid : 필터가 한번에 몇칸씩 이동하여 계산하는지.

     - 필터를 통해 계산되면서 원본 이미지보다 작아지는 down sampling 효과가 있음, (패딩값을 통해 유지도 가능)

 

8. keras.layers.Conv2DTranspose
     - 원본과 동일한 형태로 복원 해주는 함수. (Upsampling)

     - Deconv 의 경우 원본값으로 되돌려 주지만, Transpose 는 그 형식만 원본으로 맞춰줄 뿐, 실제 데이터를 원본으로

       돌리는 것은 아니다. 

     - 즉, 이미지 처리 과정에서 사이즈를 줄인 후 학습한 경우, 그 값을 원본 크기로 다시 복원 할때 사용된다. 
     - 인자값
         - 1번째 인자값 filter : 출력되는 결과물의 사이즈

         - 2번째 인자값 kernel_size : 필터 사이즈 (튜플, 리스트)

         - strid : 위에 명시

         - padding : valid 나 same 의 문자열을 입력값으로 한다.
                           valid : 패딩 없음
                           same : 아웃풋이 동일한 크기가 될 만큼의 패딩을 넣는다.
         - use_bias : true 또는 false 로, bias 벡터 사용유무.
                             bias란, 뉴런에 입력된 가중합에 값을 더 하는 상수로서, 최종적으로 출력되는 결과값을 조절하는 역할.
                             성향에 따라 값을 더하고 빼는 역할임.

keras.layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False),