Convolution Neural Network : 컴퓨터 비전 및 인공지능 이미지 인식의 핵심 기술
스마트폰의 안면 인식, 자율주행 차량의 카메라 센서, 공장 불량품 검사 장비처럼 "엄청나게 빠른 속도(Real-time)로 기기 자체(Edge)에서 돌아가야 하는 환경"에 사용
초고속 실시간 처리, 인프라 비용 절감, 짧은 문장의 패턴 분류가 목적인 텍스트 분류 시에도 CNN 사용 (by Gemini)
정교한 긴 글 문맥 파악과 최고 수준의 정확도가 필요하다면 👉 Transformer(BERT 등)나 LLM이 유리
1.1 개요
Convolution 용어 정리
합성곱
컨볼루션
길쌈부호(통신공학)
과거에는 이미지를 입력할 때 모든 데이터를 한 줄로 쭉 펴서 연결하는 FC(Fully Connected, 완전 연결) 네트워크를 주로 사용
공간적 특성을 무시한다는 단점
고양이 뇌의 시각 세포 전체가 한 번에 반응하는 것이 아니라, 특정 형태나 특정 부분의 그림에만 반응하는 뉴런들이 따로 있다는 것을 발견
"이미지 전체를 통째로 보지 말고 부분 부분 나누어서 특징을 추출하자"
1.2 CNN
Conv layer
이미지 위를 훑으며 선이나 면 같은 핵심 '특징을 추출'
ReLU
데이터에 '비선형성을 추가'해 특징을 더욱 도드라지게 만듬
Pooling
불필요한 부분은 버려지고 핵심만 압축
Fully connected layer
뽑아낸 특징 데이터들은 일렬로 길게 펼쳐져 최종 '분류 결정'을 내리게 됨
Softmax
뒤죽박죽인 점수들을 0과 1 사이의 '확률 값'으로 변환
1.2.1 Convolutional layer
컨볼루셔널 레이어
컴퓨터에게 컬러 이미지는 32x32 크기라고 할 때, RGB(Red, Green, Blue) 세 가지 색상 채널이 합쳐진 32x32x3 형태의 3차원 데이터(벡터)로 인식
고양이의 시각 인식 예시처럼 부분 인식을 위해 5x5 크기의 필터를 쓴다면, 색상 채널 3을 포함해 5x5x3 크기의 영역만 떼어서 한 번에 살펴보게 됨.
5x5 필터 영역에 있는 여러 개의 픽셀 값들을 입력(x)으로 받아서, 'Wx + b' 공식을 적용해 딱 '하나의 숫자'로 요약해 내는 것
W(Weight, 가중치)
필터가 가진 고유의 값
W와 이미지의 픽셀 값(x)을 곱함
b(bias, 편향)
결국 복잡한 이미지의 일부분이 Wx+b 연산을 하는 필터를 거치면 필터의 특징을 담은 점 하나로 압축
1.2.2 ReLU
f(x) = max(0, x)
입력값이 0보다 작으면 0으로 만들고, 0보다 크면 입력값 그대로 통과시키는 단순한 함수
특징 맵(Feature Map)의 모든 원소에 개별적으로 적용되는 원소별(Element-wise) 연산이기 때문에, 입력된 데이터의 가로, 세로, 채널 크기(차원)를 절대 변경하지 않음
인공신경망이 복잡한 데이터(이미지 등)를 학습하려면 수학적인 '비선형성(Non-linearity)'이 필수적이기 때문에 들어가는 필수
하나의 점을 뽑아냈다면 필터를 옆으로, 그리고 아래로 이동시키며 전체 이미지를 훑어야 함
스트라이드(Stride)
필터가 한 번에 몇 칸 씩 이동할 지
출력 크기
(입력 크기 - 필터 크기) / 스트라이드 + 1
필터를 적용하면 결과물이 점점 작아지면서 모서리 부분의 정보를 잃어버리는 문제 발생
패딩
원본 이미지 테두리에 0이라는 가상의 픽셀을 둘러주는 것
입력과 출력 이미지의 크기를 동일하게 유지
이미지 모서리(테두리) 인식
사진에는 윤곽선, 질감 등 여러 특징이 숨어있으므로 한 개의 필터만 쓰지 않음
각기 다른 가중치(W)를 가진 필터를 여러 개 동시에 적용
6개의 다른 필터를 사용했다면, 똑같은 이미지를 훑었더라도 결과물은 6개의 각기 다른 특징을 담은 맵이 생성되어 두께(Depth)가 6이 됨
필터 안의 가중치(Variable)들은 사람이 일일이 정해주는 것이 아님
처음에는 무작위(Random) 값으로 초기화
수많은 데이터 학습하면서 스스로 정교한 값을 찾아감
1.2.3 Pooling
컨볼루션을 거친 데이터는 여전히 크기가 큼
풀링
데이터의 가로, 세로 사이즈를 작게 줄여주는 과정
일종의 샘플링(Sampling)
데이터의 공간적 크기를 줄여 연산량을 감소시키는 실질적인 '차원 축소' 과정
맥스 풀링
가장 큰 값만 고르는 방법으로 가장 널리 사용되는 방법
평균을 내거나 제일 작은 값을 고르는 것 보다 효과적
서브샘플링(하위 샘플링)
"전체 데이터 중에서 일부만 골라내어 크기를 줄이는 행위"를 뜻하는 데이터 처리 용어
초고해상도 사진을 웹사이트 업로드용으로 작게 줄일 때(Resize), 픽셀을 듬성듬성 솎아내어 크기를 줄이는 것을 이미지 처리 학문에서 '서브샘플링' 혹은 '다운샘플링'이라고 부름
맥스풀링은 그 서브샘플링을 구현하는 구체적인 방법 중 하나
cf> '샘플링'이란 전체 중에서 일부를 뽑아내는 행동
ReLU와 Pooling의 차이
1.2.4 Fully Connected layer
특징을 찾는 Conv(컨볼루션)
음수를 0으로 만들어 수학적 비선형성을 부여하는 ReLU(Rectified Linear Unit, 렐루)
크기를 압축하는 Pooling(풀링)
입체적인 데이터를 1차원 배열로 길게 폄 (Flatten)
이 1차원 데이터를 우리가 흔히 아는 기본 인공신경망인 FC(Fully Connected, 완전 연결) 레이어에 입력
FC 레이어는 각각의 이미지 클래스(예: 개, 고양이, 자동차)에 대해 "내가 보기에 고양이일 점수는 150점, 강아지일 점수는 -20점이야"라는 형태의 가공되지 않은 원시 점수(Logit, 로짓)를 계산
1.2.5 Softmax
이 뒤죽박죽인 점수들을 전부 합쳤을 때 딱 1(100%)이 되도록, 아름다운 '확률 값'으로 변환해 주는 역할
1.3 CNN case study
알파고는 바둑판의 상태를 하나의 '이미지'처럼 인식하여 다음 장소에 돌을 둘 확률을 계산해 냄
1.3.1 알파고의 CNN 적용 사례
바둑판의 크기인 19 * 19 공간에, 돌의 위치 정보(돌이 있는지 없는지 등)를 담은 48개 채널이 겹겹이 쌓여 있는 형태
CONV1
패딩 :23 × 23 크기로 늘림
필터 연산:5 × 5인 필터를 stride 1로 설정하여 컨볼루션 연산을 수행. 대국 버전 알파고에서는 192개의 필터 사용
활성화 함수: 연산 후 ReLU(Rectifier Nonlinearity)를 적용하여 비선형성 확보
출력 크기:19 × 19 × 192
CONV2~12
반복 구조: 2번째부터 12번째 레이어까지 총 11개의 은닉층이 동일한 패턴을 반복하며 이미지의 깊은 특징을 추출합니다.
패딩: 이전 레이어의 출력을 제로 패딩하여 21 × 21 크기로 만듭니다.
필터 연산: 크기 3 × 3 필터 192개를 스트라이드 1로 연산한 후, ReLU 사용
출력 크기:19 × 19 × 192
최종출력층 CONV
필터 연산: 마지막 레이어에서는 크기 1 × 1인 필터 단 1개만 사용해 스트라이드 1 사용. 이때 바둑판의 각 위치마다 서로 다른 바이어스(Bias) 값을 적용합니다.
확률 변환: 최종적으로 소프트맥스(Softmax) 함수를 적용합니다.
출력 크기:19 × 19
의미: 바둑판의 각 좌표마다 '여기에 돌을 두면 승리할 확률이 얼마나 되는지'를 나타내는 다음 수에 대한 확률 지도(Probability map of promising moves)를 완성
Pooling 미사용
19 * 19 바둑판 전체 좌표 단위 확률 정보를 최대한 유지하기 위해
2. CNN 텐서플로우 예시
2.1 텐서플로우 기본 API
손글씨(MNIST) 3 이라는 이미지 로딩
28 * 28 size
cf> MNIST MNIST는 Modified National Institute of Standards and Technology (수정된 미국 국립표준기술연구소)의 약자입니다. 기계 학습(Machine Learning) 및 컴퓨터 비전(Computer Vision) 분야에서 모델 학습의 성능을 평가하기 위해 널리 사용되는 대표적인 손글씨 숫자 데이터베이스 입니다.
3*3 filter 5개 사용
padding SAME 설정으로 제로 패딩 사용
stride 2 설정으로 output size 4분의 1 사이즈인 14*14로 축소됨
총 5장의 서브 샘플링된 이미지
stride 2로 설정하여 7 * 7 size로 축소됨
2.2 Simple CNN 예시
Conv1
28 * 28 size 32개가 max pooling시 stride 2로 14 * 14 size 32개로 변경
Conv2
7 * 7 size 64개
총 3136개 (7*7*64)로 FC layer 처리 총 10개의 output
Simple CNN으로 98.85% 정확도
2.3 Deep CNN 예시
CNN을 중첩 시킴 99.38%로 정확도 향상
2.3 텐서 플로우 class 사용
class, layer 사용해 보다 간단히 사용하는 API
class Model과 layer 사용해 보다 쉽게 CNN 설정 가능
3. CNN 실습
영상에서 소개된 버전은 old version 제미나이에 문의해보니 텐서 플로우 코드 짜줌.