Convolutional Neural Networks - 3 week
CV에서 object detectoin은 빠르게 발전하고, 유용하게 사용되고 있다
Object Localization
객체 감지를 배우기 전에, object localization을 먼저 배워야 한다
우리는 이미지에 라벨을 붙이는 분류에 대해서 배웠다
여기서 localization은 분류와 함께, 어디에 있는지 경계 상자를 그리는 것도 해야 한다
이제 더 나아가 detection은 여러 객체가 있을 수 있고, 이들을 모두 찾고 경계 상자를 쳐 줘야 한다
아래와 같이 classification with localization을 한다고 생각해보자
추가적으로 물체의 중심 위치 \(b_x, b_y\)를 찾고, 높이와 너비 \(b_h, b_w\)를 알아내야 한다
구체적으로 타깃 레이블을 아래와 같이 설정한다
\(P_c\)는 object가 있는지 여부이다
만약 물체가 없다면 아래의 7개 값은 중요하지 않기에 로스 함수는 왼쪽처럼 \(P_c\)만 사용한다
Landmark Detection
상자보다 일반적인 경우, 상자가 아닌 X, Y 좌표를 추가적으로 찍을 수 있다
관절의 위치, 얼굴의 형태(스노우 필터 느낌)에 이게 활용된다
Landmark라고 부른다
그냥 추가적으로 y에 라벨링을 추가하면 된다
한 가지 주의할 점은 왼쪽 어깨 index에는 항상 왼쪽 어께 위치만 넣는 일관성이 필요하다
Object Detection
Sliding window detection algorithm을 배워보자
작은 이미지에 대해서 conv net을 학습시킨다
빨간 네모를 이동시키며, 자동차가 있는가? 를 계속 반복한다
그리고 더 큰 네모로, 반복한다
stride 만큼 계속 반복해야 하기에 비용이 커진다는 단점이 있다
Convolutional Implementation of Sliding Windows
앞선 알고리즘을 convolutinal 하게 구현해 보자
이를 위해 먼저 FC layer를 conv layer로 변환시키자
무지성 따로 계산은 중복되는 연산을 많이 수행한다
그렇기에 아래와 같이 한 번에 연산하자
위와 같이 학습된 conv를 아래와 같이 적용시킨다
마지막의 2x2는 각각 마치 독립적으로 4번 conv를 시킨 것과 같은 결과를 가진다
Bounding Box Predictions
그러나 이 conv의 문제는 계산은 효율적이나, 경계 상자가 완전 정확하지는 않다
YOLO 알고리즘도 이를 해결 한 방법 중 하나라고 한다(You Only Look Once)
정확한 위치를 알 수 있으며, 잘 작동한다고 한다
y는 3x3으로 격자를 나눴으니 (3x3x8)이 될 것이다
격자 내 여러 객체를 갖는 문제는 나중에 알아보자고 한다
처음 동영상에서 배운 내용이며, 3x3이라면 9번 실행이 아닌 하나의 conv 구현임을 기억하자
Intersection Over Union
object detection 알고리즘이 잘 작동한다는 것을 어떻게 알 수 있을까
객체 감지 알고리즘을 평가할 수 있는 intersection over union (합집합에 대한 교집합)이란 함수를 배워보자
IoU함수가 하는 일은 두 경계 상자의 합집합에 대한 교집합을 계산하는 것이다
완전 일치면 1이다
보통 관습적으로 0.5를 기준으로 맞았다고 판단한다
물론 엄격하게 판단하고 싶으면 0.6, 0.7을 사용해도 되지만 0.5보다 낮은 건 잘 사용하지 않는다
Non-max Suppression
지금까지 배운 알고리즘들의 문제 중 하나는 동일한 객체를 여러 번 탐색하는 가능성이다
격자가 많아지면 자동차의 중심 찾기가 어려워질 수 있다
이를 막기 위해 non-max suppression이 어떻게 작동하는지 알아보자
이름 그대로 "최대가 아닌 것 억제"이다
확률이 낮으면 버린다
살아남은 것 중 가장 높은걸 고르고, 그것과 IoU가 0.5 이상이면 버린다
이를 반복하여 확률이 크고, 겹치지 않는 것들을 살린다
만약 여러 class에 대해 시행하고 싶으면 따로따로 독립적으로 시행시키면 된다
Anchor Boxes
하나의 격자에서 여러 물체가 있는 경우 사용할 수 있는 아이디어를 알아보자
지금까지 아래와 같이 y에게 값을 할당했다
그렇기에 softmax로 하나의 값만 가지기에 두 가지 물체는 판별이 어렵다
Anchor box를 사용하여 이 문제를 해결해보자
5개? 10개 정도의 앵커 박스를 사용하기도 한다고 한다
각각의 상자에서 softmax를 통해 해당 객체가 무엇인지 알 수 있다
앵커 박스들을 많이 만들고, IoU가 높은 grid에 배치하면 된다
사람은 앵커 박스 1과 비슷하게 생겨 위에 두고, 차는 2와 비슷하니 아래에 둔다
만약 차만 있다면 오른쪽과 같은 형태가 될 것이다
YOLO Algorithm
지금까지 배운 걸 합쳐 YOLO 알고리즘을 구현해 보자
두 개의 앵커 박스를 사용하면 y는 아래와 같은 형태를 가진다
3 x 3 x (2 x 8) 차원을 가진다
3 x 3은 경계 상자의 차원이고, 2는 앵커 박스의 수, 8은 (5+클래스의 수)이다
기존까지 진행한 방법을 이용해, 각 벡터를 채워주면 된다
물론 실제로는 19 x 19의 결과 벡터를 사용한다고 한다
각각 그리드에 대해 라벨링을 하곤, non-max를 시행한다
낮은 확률은 지우고 IoU를 통해 하나의 객체는 하나의 그리드에 매치시킨다
Region Proposals(Optional)
object detection에선 region proposals라는 아이디어가 있다고 한다
슬라이딩 윈도우 아이디어를 떠올려보자
객체가 모든 윈도우에 존재하지 않기에
아마도 객체가 없는 지역을 더 많이 탐색하게 될 것이다
이 알고리즘은 객체가 존재하는, conv net을 실행할 지역을 선택하여 해당 부분에만 실행한다
뭔지 알기 위해 세그멘테이션 알고리즘을 시행한다고 한다
2000개쯤의 구역을 만들어 해당 구역을 conv 시킨다
오른쪽 그림에서 알록달록한 것들의 경계 박스를 찾는 것이다
위의 알고리즘을 R-CNN이라 부르며 label과 bounding box를 찾는 유사한 일을 한다
그런데 위의 R-CNN은 그런데 여전히 매우 느리다
한 번에 한 지역이 아닌 conv로 구현한 슬라이딩 윈도를 사용한 Fast R-CNN이라는 것도 있다
그런데 여전히 세그멘테이션으로 지역을 얻는 게 느리다고 한다
또또 그래서 Faster R-CNN은 세그멘테이션 대신 동시 신경망을 사용하여 속도를 높였다
그러나 일반적으로 YOLO보다 좀 느리다고 한다
Semantic Segmentation with U-Net
이 알고리즘은 bounding box보다 객체 주변에 선을 그려, 객체에 속하는 픽셀과 그렇지 않은 픽셀을 정확히 파악하는 알고리즘이다
기존 CNN에선 이미지의 크기는 작아지고, 채널이 많아지는 경향이 보였다
세그멘테이션에는 입력과 출력 크기가 같아져야 하기에 아래와 같은 느낌이 되어야 한다
이를 구현하기 위해 이미지가 커지는 새로운 유형의 tansepos conv를 배워야 한다
Transpose Convolutions
이 conv는 U-Net의 핵심이라고 한다
2 x 2 입력을 4 x 4로 확대시키는 역할을 해준다
필터를 곱하는 과정에서 조금 차이가 있다
하나의 필터 값을 곱해 확대 주는 느낌?
padding과 stride를 입력이 아닌 출력에 적용한다
겹치는 부분은 더해주면 된다
U-Net Architecture Intuition
U-Net의 형태를 대충 알아보자
이미지 크기가 축소되다가 다시 확대된다
이때 Skip connection이 존재하면 유용하다고 한다
압축되며 깊은 정보를 포함하는 과정에서, 공간 해상도가 떨어졌다
그렇기에 초기에 픽셀에 무엇이 있는지 정보를 이용하자
해상도는 낮지만 정보가 많은 레이어에 정보는 적지만 해상도는 높은 정보를 추가하는 느낌이다
U-Net Architecture
전체적인 U-Net의 구성은 아래와 같다
그냥 따라가며 보면 된다
h가 점점 작아지며, 채널의 수는 늘어난다 (세로축이 채널로 보면 된다)
그 후 Trans conv를 통해 이미지 크기를 늘린다 (연파랑)
Skip connection은 왼쪽에 값을 오른쪽으로 복사하는 것이다 (남색)
최종 결과의 차원은 h x w x #classes로 각 클래스일 확률을 나타낸다