1. Overview
- Classification : 이미지가 어떤 것인지 확인한다. 이미지 분류
- Classification + Localization : single object Detection이지만 사실 object detection을 싱글로 사용 할 일이 없다. 따라서 사용 안됨.
- Object Detection : Computation Cost가 가장 적게 든다. 시장가치성이 높은 기술, 가성비가 좋아 군사 목적 등 다양한 곳에서 많이 사용
- Segmentation : 픽셀에 대한 카테고리 구분.
- Computer Vision에서 가장 대표적인 Task :: Classification, Semantic Segmentation, Object Detection, GAN
- 종류
> Semantic Segmentation : 각 영역의 픽셀 값. 어느 영역에 해당하는지 찾는다.
> Instance Segmentation : Obejct Detection 사용하면 된다.
> Semantic Segmentation vs Instance Sementation
- Semantic은 개체 인식이 안된다. Instance는 다른 개체인지까지도 파악.
- Instance Segmentation은 Computation cost가 가장 많이 든다.
- FPS : 1초 안에 몇 개의 프레임을 처리 및 감지할 수 있는가.
> FPS가 높을 수록 Computation Cost 어찌 되는가??. 1초 안에 처리가능한 이미지가 많다.
> 즉, 1초마다 처리하는데 걸리는 시간이 짧다. 이를 위해 모델이 가벼워야한다.
> layer가 적고, weight가 적고, 데이터 전처리 및 후처리가 적어야한다. ==> 이는 즉 Computation Cost가 적어야한다!!
> FPS를 높이는 것은 속도와 연결되며 속도와 정확도는 반비례관계이다.
* Low And Model : 속도가 빠르고 성능은 떨어지는 모델 | High And Model : 성능이 좋은데 다소 느린 모델
2. Classification
- FCN(Computation Cost가 매우 높다는 단점) → CNN(종류가 여러개. 작게 추출. 작은 연산들이 모여 진행됨, Computation cost 작다)
- CNN + FCN + SoftMax ==> Classification ex) VGG, GoogleNEt, ResNet, DenseNet, UNet
3. Semantic Segmentation
1) Overview of Semantic Segmentation
- 사이즈는 동일하게 두기 위해 padding과 stride를 1로 두고 CNN을 실시
- 많은 속성으로 출력하여 Channel수를 늘리고 일차원적으로 보았을 때 하나의 픽셀의 대표값을 설정하여 그 값을 argmax를 적용해 어느 카테고리에 속하는지 확인하는 원리
- Computation Cost는 이미지의 사이즈와 직결되는 문제이다. Channel수는 Computation Cost에 큰 영향을 미치지 않는다.
- 사이즈를 줄인다는 것은 Channel을 줄이는 것 보다 훨씬 적은 연산을 가능하게한다. 가로, 세로를 1/2로 줄인다면 전체 사이즈는 1/4가 되기 때문이다.
- 이미지의 사이즈를 줄이지 않아 연산 사이즈가 방대하므로 CNN기술만을 사용하여 Segmentation을 실시하기에는 Computation Cost가 너무 크다.
- 따라서 H, W 사이즈를 서서히 줄였다가 다시 원래 이미지 사이즈와 동일한 사이즈로 늘리는 것이 Semantic Segmentation의 원리
2) Upsampling & Convolutions
- 사이즈를 줄이고 필터 개수를 늘리는 과정은 Convolution 연산을 적용(Downsampling) - Encoder(압축)
- 사이즈를 늘리고 필터 개수를 줄이는 과정은 Deconvolution 연산 적용(Upsampling, Transpose Convolution) - Decoder(압축해제)
- Convolution으로 사이즈를 절반으로 줄이는 방법 : stride=2와 padding=1 적용 or maxpooling 적용.. 최근에는 stride와 padding을 주는 방법을 주로 사용
- Batch Normailzation을 하지 않으면 이상치를 제외한 나머지 값은 의미없는 값이 됨. 이상치가 나머지 값을 압도하기 때문이다.. 이는 학습효과를 크게 줄인다. 따라서 layer마다 batch normalization이 필수이다.
- UpSampling 방법
- 의미 없는 0값으로 모두 채운다.
- Interpolation : 보간법(Nearest Neighbor).. 가장 근사치 값으로 채워넣는 방법, 무작정 0으로 채울 때 보다 훨씬 학습 성능이 좋지만 학습되는건 아니다.
- Transpose Convolution : Deconvolution..
> weight 값이 학습되는 방법이다. 숫자가 겹쳐지는 일정한 pattern이 생긴다.
3) U-Net : Segmentation의 Network모델
Encoder | 연산 | size | channel수 |
input | 572*572 | 1 | |
1 | conv3*3, Relu | 570*570 | 64 |
2 | conv3*3, Relu | 568*568 | 64 |
3 | Maxpool 2*2 | 284*284 | 64 |
4 | conv3*3, Relu | 282*282 | 128 |
5 | conv3*3, Relu | 280*280 | 128 |
6 | Maxpool 2*2 | 140*140 | 128 |
7 | conv3*3, Relu | 138*138 | 256 |
8 | conv3*3, Relu | 136*136 | 256 |
9 | Maxpool 2*2 | 68*68 | 256 |
10 | conv3*3, Relu | 66*66 | 512 |
11 | conv3*3, Relu | 64*64 | 512 |
12 | Maxpool 2*2 | 32*32 | 512 |
13 | conv3*3, Relu | 30*30 | 1024 |
14 | conv3*3, Relu | 28*28 | 1024 |
Decoder | 연산 | size | channel수 |
15 | up-conv 2*2 | 56*56 | 512 |
a | copy and crop | 56*56 | 512+512 = 1024 |
16 | conv3*3, Relu | 54*54 | 512 |
17 | conv3*3, Relu | 52*52 | 512 |
18 | up-conv 2*2 | 104*104 | 256 |
b | copy and crop | 104*104 | 256+256 = 512 |
19 | conv3*3, Relu | 102*102 | 256 |
20 | conv3*3, Relu | 100*100 | 256 |
21 | up-conv 2*2 | 200*200 | 128 |
c | copy and crop | 200*200 | 128+128 = 256 |
22 | conv3*3, Relu | 198*198 | 128 |
23 | conv3*3, Relu | 196*196 | 128 |
24 | up-conv 2*2 | 392*392 | 64 |
d | copy and crop | 392*392 | 64+64 = 128 |
25 | conv3*3, Relu | 390*390 | 64 |
26 | conv3*3, Relu | 388*388 | 64 |
27 | conv1*1 | 388*388 | 2 |
- Copy and crop 사이즈가 동일해야하는데 대치 되지 않아 crop 적용후 copy
- DownSampling 과 UpSampling이 합쳐진 모델
- 마지막에 1x1을 사용했으므로 이미지 사이즈가 줄지 않는다.
- 14번까지 진행 후, 28*28*1024의 segmentation map이 생성됨. 그 후, 15번을 거치며 56*56*512의 sementation map이 생성되었는데 이 때, a과정에서 copy and crop이 진행되어 결과적으로 채널 수가 1024가 되는 것이다... 하지만 뭐 코드 짜기 나름.. 채널이 두배가되었다는것만 잘 기억해두기.
- padding 사용하지 않음. 마지막 채널이 2인 이유는 카테고리 수가 2개 라는 의미
- 이러한 과정을 거친 최종 segmentation map은 388*388*2로 원본 사이즈(572572*1)와 동일하지 않다. ==> 원본사이즈를 최종 segmentation map과 비율을 맞춰 사이즈를 줄이는 resizing 과정을 거친다.
- 네트워크 관점에서 봤을 때 2배로 작아지고 커지는 과정이 유리하므로 해당 과정을 거친다.
- 조금 더 원본 정보에 가까운 정보를 활용하고자 할 때 copy and crop 사용. 변이가 덜 일어난 정보를 copy 하여 붙여서 사용
- ResNet에서 처음 사용한 방법으로 압축을 많이 하면 정보 손실이 많이 이뤄진다. 물론 그만큼 주요 정보도 많이 가지고 있지만 원래 정보도 많이 손실되었음을 뜻한다.
- 해당 모델은 세포 인지 아닌지 판단하는 binary 문제로 출력개수가 지금처럼 2일 수도 1일 수도 있다. 만약, 출력 개수가 2이면 softmax이고 1이면 sigmoid가 사용된다. 출력개수가 1로 설계했을 때는 반드시 sigmoid를 사용하게 되어있다.
4) Evaluation Matrix
<평가 지표>.. 0 - 1사이의 값
$$ IOU = 교집합 / 전체 합집합 $$
- mIOU : 일반적으로 segmentation에서 가장 많이 사용하는 성능 지표, 예측하고자 하는 물체가 다소 크고 자주 등장하는 경우 mIOU사용
- Dice Coefficient : 예측하고자 하는 물체가 작고 자주 등장하지 않는 경우 사용따라서, Loss = 1-mIOU 혹은 Loss=1-Dice Coefficient 로 구할 수 있다. Loss가 0에 가까울 수록 잘 예측했음을 알 수 있음. 평가지표는 클 수록 좋다.
'AI' 카테고리의 다른 글
Semantic Segmentation 코드 구현 (0) | 2021.06.12 |
---|---|
Binary Classification (0) | 2021.06.11 |
인공지능 코드 구현 (0) | 2021.06.09 |
TNN(Trainning Neural Network) (0) | 2021.06.07 |
CNN (Convolutional Neural Network) (0) | 2021.06.04 |