본문 바로가기

공부/AI

Convolutional Neural Network 공부했다.(2)

CNN이 양이 상당해서 파트 2로 나누어서 포스팅을 한다. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 Object Detection!! 이름과 사진에서 바로 직감이 왔을 것이다. 그 동안에는 하나의 물체에 대한 판별을 하였다면 이번에는 다양한 물체가 있는 사진에서 각각의 물체가 무엇인지 인식하는 것을 해 보려 한다.


 어떻게 할 수 있을까?? 생각을 조금 해 보았다. 사진에서 물체 같아 보이는 것을 자르고 이것만 CNN을 돌려서 무엇인지 알아낸 다음 다시 그 위치에 Bounding Box를 쳐준다~ 으, 손봐야 할 것이 많다. 옛날에는 이렇게 했다고 한다.


Copyright © 2018. Alina Inc. All Rights Reserved.


 Object Detection에 대해서도 배포되는 모델들이 있다. 이들을 사용해서 Transfer Learning을 할 수도 있는 Pretrained 모델이다. 나는 개인적으로 YOLO에 대해서는 알고 있었는데, 임베디드 시스템에서 쓰일 만큼 연산이 많이 필요하지는 않은 것으로 알고 있다.


Copyright © 2018. Alina Inc. All Rights Reserved.


 실습으로 해 볼 알고리즘은 Semantic Segmentation이라는 것이다. Network구조가 마치 Audoencoder와 비슷하게 되어 있는 것이 보인다. 이는, 픽셀 하나하나별로 Classify를 하는 것이다. 그래서 위 사진을 보면 강아지가 있는 부분만 색이 다르게 되어 있는 것이다. 여기는 강아지 한 마리밖에 없지만, 강아지와 고양이, 이렇게 있다면 이둘을 구별해 주었을 것이다. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 이렇게 말이다. 보면 사람, 자동차, 신호 표시판 등이 항목 별로 같은 색인 것을 볼 수가 있다. 전체 사진은 이렇지만 사실은 모든 픽셀들에 대해서 Classification이 되어 있다는 것을 잊지 말자!


Copyright © 2018. Alina Inc. All Rights Reserved.


 실습해 볼 모델은 Mask RCNN이라는 모델이다. 앞서 말한 바와 같이 픽셀별로 Label을 쳐주어야 하기 때문에 상당히 손이 많이 가는 실습이 될 것이다. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 Object Detection의 여러 모델들이 보인다. 가로 축은 걸리는 시간, 그러니까 오른쪽으로 갈 수록 나쁜 것이다. 세로 축은 정확도, 위로 갈수록 좋은 것이다. Faster RCNN계열은 대체로 연산 시간은 오래 걸리지만 정확도가 높은 것이 보이고, SSD계열은 연산은 얼마 걸리지 않지만, 정확도가 낮을 것이 보인다. 물론 이는 계속해서 연구가 이루어지고 있기에 연산도 적고 정확도도 괜찮은 모델들이 계속해서 나올 것이다. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 보통 이런 Object Detection을 Train시킬 때 MS에서 제공하는 COCO Dataset을 사용한다. 그래서 COCO-trained models라고 적혀 있는 것이고, GitHub 페이지에 들어가 보면 다양한 모델들을 볼 수 있다.


====================코드는 준비중============================


Copyright © 2018. Alina Inc. All Rights Reserved.


 지금부터는 조금 더 보충하는 내용들이 이어진다. Adversarial Attack이라는 것이 있는데, 위 그림을 한 번 보길 바란다. 판다라고 인식하고 있고 실제로 판다이기도 한(뭔가 말이 이상하지만...) 이미지에 임의의 노이즈를 입힌다. 그리고 나서 다시 맞춰보라고 하면 응??? gibbon이라고 한다. 

gibbon이 뭐냐면~


gibbon에 대한 이미지 검색결과

from : https://ko.wikipedia.org/wiki/%EA%B8%B4%ED%8C%94%EC%9B%90%EC%88%AD%EC%9D%B4


 긴팔원숭이다... 인간이 생각하기에는 말도 안되는 결과가 나와 버렸다. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 이번에는 정상적인 표지판에 고의로 이상한 짓을 해보았다. 앞의 3가지 경우는 STOP 즉, 정지하라는 표지판인데, '45로 속도 제한'이라고 결과는 내놓았다. 제일 오른쪽 우회전 금지 표지판(화살표의 색을 조금 이상하게 하였을 때)을 반대로 정지 표지판으로 잘못 인식하였다. 이렇게 인간이 생각할 때는 이해할 수 없지만 인공지능은 생각보다 훨씬 더 멍청(?)하다. 그래서 이렇게 고의로 인공지능을 공격하는 것을 Adversarial Attack이라고 한다. 


 지금은 응?? 하면서 웃으며 볼 수 있지만, 만약 이 인공지능이 적용된 차량이 실제로 잘못 인식하게 되는 경우는 커다란 인명 피해로 이어질 수 있음을 잊지 말자. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 갑자기 이런 이야기를 왜 꺼냈느냐 하면, 위 사진에 있는 Generative Adversarial Network(GAN)을 설명하기 위해서이다. 이는 Adversarial Attack과는 반대로 Random Noise로 부터 이미지를 만들어내는 방법이다! 이것이 어떻게 가능한가 하면,


 지난 Autoencoder를 기억하고 있을지 모르겠다. output과 input의 뉴런 수가 동일한 Network였다. 이 실습에서 뉴런의 폭이 제일  좁을 때 2개였던 것이 기억나는가??


Copyright © 2018. Alina Inc. All Rights Reserved.


 여기에서 학습된 Decorder에 임의의 2개 숫자를 넣어주면 MNIST이미지가 생성되었었다. Adversarial Attack에서도 비슷하게 Generator를 학습시킨다고 생각하면 될 것 같다. 


 예를 들어, train set으로 나무들이 있다고 하자, 진짜 나무 사진들이 있고, Generator에서 만들어진 가짜 나무 사진들이 있다. Discriminator는 이들이 진짜인지 가짜인지 구분하는 것을 목표로 학습을 하게 된다. 그런데 Generator의 목표는 자기가 만든 이미지들이 진짜로 판별나게 하는 것이다. 이렇게 이 두 학습기가 계속해서 학습하면서 어떠한 일이 일어나느냐 하면,


 Discriminator가 더 정교해지고, Generator는 그만큼 더 진짜 같은 사진을 만들어내게 된다. Generator와 Discriminator가 팽팽한 대결을 벌이는 것이다. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 MNIST Dataset에 대해서 하나는 원본 이미지이고, 다른 하나는 GAN을 거치면서 만들어진 것이다. 상당히 구별하기 힘들다. 그런데 이렇게 간단한 데이터 뿐만 아니라


Copyright © 2018. Alina Inc. All Rights Reserved.


 실제같은 사진도 만들어낸다. 위 사진들은 놀랍게도 실제로 존재하는 이미지가 아니다. GAN이 만들어낸 이미지이다. 인간은 당연히 구분할 수 없을 정도이다. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 GAN이 재미있는 부분이 무엇이냐 하면, 사진에서 Vector연산도 가능하다는 것이다. 위 그림을 보면서 설명을 더 하자면,


안경쓴 '남자' - '남자' = 안경

안경 + 여자 = 안경여자


 이런 연산이 가능하다는 것이다!! 놀랍다!! 재미있어서 하나 더 올린다. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 요롷게, 웃고 있는 표정에 대해서 더하고 빼는 연산도 가능하다. 다음으로는 Convolution에 대해서 조금 더 알아보자. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 일반적으로 이미지는 3개의 채널을 가진다. 그러면 3채널 이미지 1장이 Convolution Filter를 거친 결과는 어떻게 될까?? 3장?? 아니다!! 1장이 나온다. 위 그림은 이에 대해서 설명하고 있다. 

Convolution Filter는 각 채널마다 1장씩 있어야 한다. 그리고 연산의 결과는 이 3장의 합으로 나오게 되는 것이다. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 그래서 output이 2장이 나오게 하고 싶다면 필터를 2번씩 거쳐주어야 하고 채널이 3개 이므로 총 2 * 3 = 6장의 필터가 필요한 것이다. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 다음으로 알아볼 것은 Stride에 대한 것이다. Convolution을 수행하면서 연산을 하고 위아래로 한 칸 움직일지, 아니면 그렇게 하면 너무 연산이 많아 2칸씩 움직일지에 대한 내용이다. 그래서 위 사진을 보면 원래 데이터의 크기는 다른데, Convolution의 결과는 같은 것이 보인다. 이는 왼쪽에서는 Stride가 1이어서 상하좌우로 한 번씩 움직인 것이고, 오른쪽에서는 Stride가 2여서 데이터 크기가 큼에도 상하좌우로 1번씩 밖에 움직이질 못하였기 때문이다. 


Copyright © 2018. Alina Inc. All Rights Reserved.


 이번에는 Padding이라는 것에 대해서 배워 본다. 원래 Convolution을 취하면 데이터의 크기가 작하질 수 밖에 없다. 그래서 만약 input과 output의 크기가 같아지길 원한다면 원본 이미지의 둘레에 특정한 값들을 채워 넣어주어야 한다. 위에서는 둘레로 1개씩 감싸주었기 때문에 Padding=1인 것이다. 


 이렇게 세부적인 개념들까지 배운 우리는 이제 아래와 같은 논문들을 보아도 이해할 수가 있다!!


Copyright © 2018. Alina Inc. All Rights Reserved. 

Copyright © 2018. Alina Inc. All Rights Reserved. 


Copyright © 2018. Alina Inc. All Rights Reserved. 

Copyright © 2018. Alina Inc. All Rights Reserved. 

 




 이렇게 해서 Convolutional Neural Network까지 모두 알아 보았다. 다시 한 번 말하지만 이는 모두 Alina의 AI PM을 보면서 내가 공부한 내용을 기록한 것일 뿐이다. 강좌를 직접 보는 것을 추천한다.