합성곱 신경망을 이용하여 제안 영역을 구하는 방법을 Faster R-CNN이라고 부릅니다. 왜냐면 Fast R-cnn보다 더 빠르거든요. 아이디어는 선택적 탐색이라는 휴리스틱 방법 대신 합성곱 신경망으로 제안 영역을 예측하거든요. 동작 과정은 아까 본 fast r-cnn이랑 비슷한데, 백본 신경망 뒤에 제안 영역 신경망 region proposal network RPN라는 작은 신경망이 추가되어 제안 영역들을 예측합니다.
파이프라인이 있는데 입력 이미지가 있으면 백본 신경망을 통과해서 이미지 특징들을 구하고 이 이미지 레벨 특징을 왼쪽의 제안 영역 신경망에 넣어 제안 영역들을 구해내고 나머지는 fast r-cnn과 동일 합니다. 이미지 특징을 미분 가능하도록 잘라내기 위해서 제안 영역들을 구할 것이고, 각 제안 영역마다 분류를 하고, 바운딩 박스 변환을 수행하겠습니다.
여기서 새로운 부분은 영역 제안 신경망 뿐인데, 그러면 우리는 어떻게 하면 합성곱 신경망으로 제안 영역을 뽑아낼 수 있을까요??
이걸 이해하기 위해서 제안 영역 신경망 아키텍처에 대해서 조금 깊게 살펴봅시다. 이 신경망은 백본 신경망의 영향을 받는데요. 입력 이미지를 백본 신경망에다가 넣어 512 x 20 x 15차원의 이미지 특징을 구하겠습니다. 여기서 아이디어는 백본 신경망으로 얻은 이미지 특징은 입력 이미지의 특징과 일치하고 있습니다.
여기서 우리가 해볼수 있는건 이 합성곱 특징 맵의 각 지점에서 앵커 박스라고 하는 고정된 크기와 고정된 종횡비를 가지는 바운딩 박스가 있다고 해봅시다. 이 앵커박스를 슬라이드 시키면서, 백본 신경망으로부터 얻은 이미지 특징 지도의 모든 위치에 존재한다고 할께요.
우리가 할 일은 작은 합성곱 신경망을 이 앵커박스가 객체를 가지고있는지 객체가 없는지 학습시키겠습니다. 이그러면 이 문제는 이진 분류 문제가 되어 각 제안 영역들/앵커 박스들이 양의 스코어를 가지는지, 음의 스코어를 가지는 지에 대한 출력을 받겠습니다.
이 이미지 레벨 특징에서 한 점에 대한 앵커 박스 하나가 있으면, 또 다른 합성곱 레이어로 양 혹은 음에 대한 스코어를 얻을수가 있는데, 1 x 1 합성곱 레이어로 해당 앵커에 객체가 있는지 없는지에 대한 스코어를 얻을수 있겠습니다. 그리고 이 두 카테고리를 소프트맥스 비용으로 학습할수가 있어요.
이 앵커 박스로는 이미지에 있는 물체에 잘 맞추지 못할수도 있는데, 트릭 으로
앵커 박스의 스코어 뿐만 아니라, 합성곱 특징맵에서 각 위치에대한 박스 변환도 출력으로 얻어내어 기존의 앵커박스를 변환시켜 실제 제안 영역으로 바꾸겠습니다. 위 슬라이드에서 앵커박스는 녹색인데 실제 제안 영역 박스는 노란색이 되겠습니다. 이 박스 변환은 이전에 본 방법대로 회귀 비용을 사용해서 학습할수가 있습니다.
이건 그렇게 복잡하지는 않으며, 또다른 합성곱 레이어로 박스 변환에 대한 값들을 얻어내었습니다. 합성곱 특징 맵에서 한 지점에 대한 고정된 크기를 갖는 하나의 앵커박스를 사용하는것 만으로는 우리가 인식하고자하는 모든 객체들을 찾아내기는 부족합니다.
그래서 실제로 사용할때는 일반적으로 합성곱 특징맵의 모든 지점에다가 k가지의 다른 크기와 종횡비를 갖는 앵커 박스들을 사용합니다. 질문이 들어왔는데 앵커가 물체인지 여부는 k나 2k개가 될수 있는데 어떻게 구현하느냐에 달린것이며 원래 논문에서는 2k을 가지며,
양과 음의 스코어를 출력하고 소프트맥스 비용을 사용했었는데 이와 동일하게 단일 스코어를 출력으로 받는데 큰 양의 값은 긍정, 큰 음의 값은 부정 그리고 로지스틱 비용을 사용해도 됩니다. 둘다 동일하며 뭘 사용해도 사용해도 중요하지는 않아요.
대부분 구현의 경우 한 앵커당 양의 스코어와 음의 스코어를 받아 스프트맥스 비용을 사용하나 로지스틱 회귀를 사용해도 문제 없겠습니다.
그래서 해결 방법은 모든 지점에서 서로 다른 크기와 종횡비를 가지는 k 앵커를 사용하면 되겠으며 이는 하이퍼 파라미터가 되겠습니다. 얼마나 많은 앵커를 사용할지 어떤 스케일과 크기를 지정할지 모두가 객체 탐지에서 하이퍼 파라미터입니다.
이건 faster r-cnn에 대해서 전체를 정리한 것인데, 4개의 학습해야할 서로다른 비용들을 가지고 있습니다. 영역 제안 신경망은 2개의 비용을 가지는데, 분류 비용의 경우 앵커 박스가 객체인지 객체가 아닌지를 찾고, 회귀 비용은 영역 제안 신경망이 기존의 앵커 위치에서 실제 제안 영역 위치로의 변환 값을 출력합니다.
이제 fast r-cnn의 나머지 내용들을 가지고, 영역제안 신경망으로부터 얻은 각 제안 영역에다가 영역 단위 신경망을 돌려서 두 개의 비용을 또 얻습니다. 하나는 객체 분류 비용으로 객체가 무슨 카테고리에 속하는지 혹은 배경인지에 대한 것이며, 최종 물체 회귀 비용은 다시 영역 제안 신경망으로부터 얻은 제안 영역을 최종 출력 박스로 회귀하겠습니다.
이 내용들이 많고 지저분 하기는 하지만 더 자세히 얘기할 시간은 없구 물체 탐지는 실제로 동작하기 까지 꽤 복잡한 주제가 되겠습니다.
이걸 다하면 faster r-cnn은 정말로 정말로 빠릅니다. 왜냐면 우리는 cpu를 이용한 영역 제안으로 인한 병목 현상을 제거하였고, 대신 제안 영역들을 이미지 특징과 아주 작은 합성곱 신경망으로 구하였거든요. 그래서 아주 빠르며, 실시간으로 돌릴수가 있습니다. 그래서 gpu로 돌리는 faster r-cnn는 fast r-cnn보다 10배나 빨라요. spp-net에 대해서 이야기할 시간은 없는데, 이건 빠르지만 다르게 동작하는 방법입다.
좋아요 faster r-cnn은 종종 two-stage object detector 두 단계로 이루어진 객체 검출기라고도 합니다. 이 방법은 두 단계로 이루어져있는데, 첫 번째 단계는 파란색 부분으로 전체 이미지를 신경망으로 돌려서 합성곱 특징을 구하고, 이걸 영역 제안 신경망에 돌려서 제안 영역들을 얻어냅니다. 두번째 단계는 영역 별 연산을 수행하고, 각 영역별로 최종 분류 스코어랑 회귀 파라미터를 얻어냅니다.
그런데 질문이 있습니다. 우리가 정말로 두번째 단계가 필요한건가요? 즉 첫번쨰 단계만으로 모든걸 할수없느냐인데, 즉 시스템을 더 간소화해서 더 빠르게 만들자말입니다. 왜냐면 우리는 이렇게 영역별로 나눠서 계산을 할 필요가 없거든요.
이 개념이 실제로 가능합니다. 단일 단계 객체 탐지라는 방법이 있는데, faster r-cnn의 rpn 처럼 보는것이나 앵커박스로 객체인지 아닌지 분간하는게 아니라 물체 카테고리 중 어떤거인지 바로 분류 결정을 내립니다. 우리가 c 개체 카테고리를 분류하고자 한다면, 이제 앵커의 출력은 20 x 15 공간 크기에다가 각 위치마다 k개의 앵커 박스와 바로 c개의 카테고리와 배경을 포함해서 c + 1개의 스코어를 얻습니다.
이 과정을 합성곱 레이어로 한번에 할 수 있어요. 그렇게 되면 기존의 rpn에서 이진/두 클래스 비용을 사용했던것 대신에 완전한 분류 비용을 사용하고, 앵커당 박스 변환 값들을 얻을 수가 있겠습니다.
척도에 대해서 이제 정리하고 다시 객체 탐지 방법으로 돌아갑시다. R-CNN은 영역 기반 합성곱 신경망으로 객체를 잘 탐지합니다.
하지만 이 모델은 매우 느린 문제를 가지고 있는데, 선택적 탐색 방법으로 얻은 각 제안 영역들에 대해서 합성곱 신경망을 통한 연산을 하기 때문입니다. 선택적 탐색 방법은 2000개의 제안 영역들을 만든데 이미지로부터 객체 검출시 2000개의 순전파 연산을 해야되다보니 꽤 계산비용이 크며 매번 이미지들을 실시간으로 돌리기는 어렵겠습니다.
그래서 이 과정을 더 빠르게 만들어야하는데, 사람들이 사용하는 이 과정을 더 빠르게 만든 방법으로 합성곱 신경망을 돌리고 나서 워핑을 합니다. 그렇게 함으로서 서로 다른 영역들 간에 많은 계산량을 공유할수 있게 되요(?)
어떻게 이계 동작할까요. 일단 R-CNN을 느린 R-CNN이라고 부르고 있습니다.
이를 대신하는 방법을 Fast R-CNN이라 불러요. Fast R-CNN은 기본적으로 slow r-cnn과 동일하나 합성곱 연산과 영역 변환의 순서를 뒤바꿉니다.
입력 이미지를 가지고 와서 이 고해상도 이미지를 단일 합성곱 신경망으로 돌립니다. 이 신경망은 완전 연결신경망없이 전체가 합성곱 레이어로 이루어집니다. 그 출력 결과는 합성곱 특징 맵이 나오겠습니다. 이 이미지를 돌리는 모델을 백본 신경망이라 부릅니다. 이건 alexnet이나 vgg, resnet 등 사용하고 싶은걸 쓰면 되요.
그 다음에는 선택적 탐색같은 영역 제안 방법을 돌릴수가 있는데, 입력 이미지의 픽셀을 잘라내기보다는
제안 영역들을 합성곱 특징 맵에다가 사영시켜, 입력 이미지가 아닌 이 특징 맵으로부터 잘라내겠습니다. 정리하자면 합성곱 백본 신경망으로 부터 얻은 특징 맵을 잘라낸다고 생각하면 되겠습니다.
그러고나서 각 영역들마다 가벼운 신경망을 돌리고
출력으로 각 영역별로 분류 스코어랑 바운딩 박스 회귀 변환값들을 얻겠습니다.
이 과정은 아주 빠른데 대부분의 계산 과정은 백본 네트워크에서 일어나기 때문이며, 각 영역마다 돌아가는 신경망은 아주 작고 가볍다보니 빠르게 돌아갑니다.
그래서 alexnet을 백본 신경망으로 활용한 fast r-cnn 모델의 경우 벡본은 알렉스넷의 합성곱 레이어 전체가 되겠고, 각 영역 신경망은 마지막 두 완전 연결 레이어가 되겠습니다. 이 방법은 영역이 많더라도잘 동작하겠습니다.
잔류 신경망을 사용하는 경우에는 마지막 합성곱 연산 단계를 각 영역들을 연산하는데 사용하고, 나머지 단계들이 백본으로 사용되겠습니다. 백본 신경망에서 제안 영역들간의 연산량을 공유함으로서 계산량을 줄이겠습니다.
그러면 여기서 특징을 잘라낸다는게 어떤 의미는 무엇일까요? 백본 신경망의 가중치들을 잘 역전파 시키기 위해서는 이 특징들을 미분 가능하도록 잘라내어야 합니다.
특징을 미분 가능하도록 잘라내는 방법은 ROI(Region Of Interest) Pool이라고 부르는 연산자를 사용하면 되겠습니다. 여기에 이런 입력이미지와 입력 이미지에 대한 제안 영역이 주어지면
벡본 신경망을 돌려서 위와 같은 합성곱 연산을 통해 이미지 특징을 얻겠습니다. 데이터 형태를 정리하자면 입력 이미지는 rgb채널과 공간 크기로 640 x 480을 가지고 있으며, 합성곱 특징은 512차원에 20 x 15의 공간적 크기를 가지겠습니다.
이 신경망은 완전히 합성곱 연산으로만 이루어져있기때문에 이 합성곱 특징 지도는 입력 이미지의 각 점들에 대응한다고 할 수 있겠습니다. 우리가 할 일은 이 제안 영역을 특징 맵에다가 사영시키겠습니다. 이 다음으로는 이 특징들을 스냅(딸각 맞출수가)시킬수가 있는데, 사영한 뒤에 제안 영역이 합성곱 그리드에 완전히 일치하지 않거든요
그래서 합성곱 지도 격자에 맞추도록 스냅을 시키고,
2 x 2 풀링을 할 수 있도록 2 x 2 하부 영역으로 나누겠습니다. 그래서 제안 영역을 대략적으로 가능한 2 x 2의 하부 영역으로 나눈다음에
이 하부 영역들에 대해서 최대 풀링을 하겠습니다. 여기서 파란색 영역은 512 x 2 x 2가 되고, 최대 풀링을해서 출력 결과는 단일 512차원의 벡터가 되겠습니다. 녹색 영역의 경우 512 x 3 x 2 크기고, 출력 결과는 512차원의 벡터가 되겠습니다. 이 의미는 입력 제안 영역이 다른 크기를 가지고 있더라도 RoI Pool 여산자의 출력은 항상 고정된 크기를 가지며, 이것을 영역별 연산을 수행하는 이후 합성곱 레이어에 전달되서 동작하겠습니다.
다시 역전파의 경우에도 일반적인 최대 풀링의 역전파가 적용되겠습니다. 영역 특징에 대해서 업스트림 그라디언트를 받으면 해당하는 이미지 특징의 영역으로 전파됩니다. 그리고 우리가 아주 많은 영역을 가지는 배치로 학습을 할때, 대부분의 이미지 특징의 그라디언트들을 얻을수가 있겠습니다.
여기서 약간의 문제가 있는데, 스냅할때 약간의 비정합 문제로 녹색 영역 파란 영역이 다른 사이즈를 가질 수도 있어요.
사람들이 사용하는 조금 더 복잡한 버전으로 roi align이 있는데, 아주 자세한 내용을 다루기는 싫지만
이 방법은 스냅하는 대신에 잘 정합 할 수 있도록 양선형 보간법을 사용합니다. roi align은 쉬우며
입력 특징과 출력 특징 간에 더 나은 정합 결과를 만들어 낼수가 있겠습니다.
이번에는 fast r-cnn과 slow r-cnn을 한번 살펴보겠습니다. 이들 사이의 차이는 합성곱 연산과 크롭 그리고 워핑의 순서를 바꾼것인데요. fast r-cnn은 제안 영역들의 연산을 공유/한번에 하기 때문에 빠르며 fast r-cnn이 얼마나 빠르냐면
한번 훈련 시간과 추론 시간을 비교해볼수가 있겠습니다. r-cnn을 학습하는 경우에는 84시간이 걸렸습니다. 당연히 몇년 전이고 옛날 gpu를 사용했기 때문인데 faster r-cnn을 같은 gpu 환경에서 한 경우에 훈련하는데 10배 정도 빨라졌습니다.
추론 시간의 경우 fast r-cnn은 r-cnn보다 다양한 이미지 영역들을 한번에 계산하기 때문에 훨씬 빨라졌습니다. 여기서 흥미로운 부분은
fast r-cnn은 대부분 시간을 제안 영역을 계산하는데 소모합니다. 제안 영역은 선택적 탐색이라고 부르는 경험적/휴리스틱 알고리즘을 사용하기 때문인데 이 알고리즘이 cpu에서 동작하기 때문입니다. 그래서 이 fast r-cnn을 보면 동작 시간의 90%가 이 제안 영역을 계산하는데 사용하고 있어요.
여기서 경험적 알고리즘으로 제안 영역을 구하는 대신 이걸 합성곱 신경망으로 대체해서 구하면 더 효율적이게 되겠죠. 그러면 이 객체 인식 시스템을 훨씬 개선할수 있겠습니다.
객체 탐지 문제에서 발생하는 또 다른 문제로는 같은 객체의 영역을 겹쳐서 나타내는 박스의 셋이 출력되는 경우가 있습니다. 이건 실제 객체 탐지 결과가 아니라 슬라이드의 예시인데 이 두 강아지 예시에서 객체 탐지기는 객체 하나당 박스 하나가 아니라 객체를 포함시키는 여러개의 상자를 출력하는데 이런 상황에서 주의해야 합니다.
이 박스 겹침 문제를 해결하기 위해서는 객체 검출 시스템으로부터 얻은 이 상자들에다가 후처리 과정을 하면 되는데, 비최대 억제 non max suppresion NMS라고 부르는 알고리즘을 사용합니다. 이 비최대 억제를 구현하는 수 많은 방법들이 있긴 한데, 가장 간단한 방법은 탐욕 알고리즘입니다. 객체 검출기로 얻은 출력들을 모두 박스 들이며, 각 박스들은 카테고리에 해당하는 확률을 가지고 있습니다. 여기에 4개의 박스가 있는데, 각 상자들은 서로 다른 분류 스코어를 만들고 있어요.
여기서 비최대 억제를 위한 탐욕 알고리즘은 우선 가장 높은 스코어를 갖는 박스를 선택하는데 여기서 파란색 상자가 가장 큰 스코어를 가지고 있고, 이 파란 상자와 다른 상자들의 IoU를 계산합니다.
거기다가 0.7 보다 큰 경우로 임계화를 하면 검출기로 구한 두 상자의 IoU가 이 임계치보다 큰 경우 서로 다른 객체를 감싸고 있는것이 아니라 동일한 물체를 겹쳐지게 탐지한다고 볼 수 있겠습니다. 그러고 나서 작은 박스를 제거 시키면 됩니다.
이 예시에서는 파란색 박스와 주황색 박스의 IoU가 0.78이며 스코어가 낮은 오랜지색 박스를 제거하겠습니다. 오렌지 박스를 제거한 다음에 다시 스탭 1로 가서 다음 가장 큰 스코어를 갖는 박스를 찾는데 여기서 보라색 박스의 확률이 0.75이고, 다시 가장 큰 박스와 나머지 박스들의 IoU를 계산하는데 여기서 작은 박스는 노란색 박스 하나 뿐이며 노란 박스와 보라 박스의 IoU가 0.74이니
노란색 박스를 제거해서, 객체 검출기의 최종 결과는 파란 박스와 보라 박스가 되며 겹치는 부분없이 잘 분리가 되었습니다.
이 알고리즘은 꽤 합리적으로 보으로보이며, 기본적인 객체 탐지기들은 대부분 이런 비최대 억제 알고리즘과 같은 방법으로 겹치는 부분들을 제거 합니다. 하지만 비 최대 억제는 문제점을 가지고 있는데, 이미지에 서로 겹치는 부분이 많은 객체가 포함되는 경우에 어려움을 겪습니다.
지금 당장은 컴퓨터 비전 커뮤니티에서 좋은 방법은 없습니다. 위와 같이 아주 많은 군중 사진처럼 박스가 많이 겹치는 사진에서는 아주 가까운 박스 끼리 구분 시키기가 매우어려우며 객체 탐지 분야의 도전 과제가 되겠습니다.
또 다뤄야될 주제로는 지금까지 각각의 박스를 비교하기 위해서 IoU 척도를 사용하였습니다. 하지만 객체 탐지기가 테스트셋으로 얼마나 잘 동작하는지 전체적으로 평가하는 척도가 필요해요. 이미지 분류의 경우 간단했는데, 테스트 셋의 예측 결과가 실제 라벨과 비교해서 정확도를 구했으면 됬거든요. 그래서 이미지 분류 문제는 계산하기 간편한 정확도를 이용해서 어떤 모델이 더 좋은지 비교할 수 있었죠.
하지만 객체 탐지 문제에서는 꽤 복잡합니다. 여기서 테스트 셋에 대한 모델의 성능을 정량화할필요가 있는데, 검출은 훨씬 복잡한 작업이며 불행히도 검출 결과를 비교하기 위한 척도는 지저분 합니다.
하지만 기본적으로는 우린 주어진 데이터셋으로 객체 탐지기를 학습시키고, 이게 얼마나 객체를 탐지를 잘하는지를 나타내는 수를 구해야하는데 우리가 할일은 Mean Average Precision MAP라는 척도를 계산하겠습니다. 이 척도는 객체 탐지기를 비교하기 위한 표준 척도가 되겠습니다.
가장 먼저 학습한 객체 검출기를 테스트셋으로 돌리고, 비최대 억제로 겹치는 검출 영역을 제거한뒤 박스들이 남을탠데 이 박스는 각각의 카테고리에 대한 스코어를 가지고 있을겁니다. 그리고 각 카테고리별로 개별적으로 평균 정밀도 average precision라고 부르는 수를 계싼하겠습습니다. 이 값은 한 카테고리에대해서 스코어가 전반적으로 얼마나 되는지를 알려줘요,
여러분들이 평균 정밀도라고 하는 척도와 친숙하다면, 이건 정밀도, 재현율 곡선 아래 영역의 넓이와 동일합니다. 이개념과 친숙하지않으면 조금더 자세히 들어가볼게요. 우리가 다루고자 하는 카테고리가 있으면, 테스트 셋으로 검출한 결과를 정렬시키겠습니다. 이 과정은 카테고리별로 개별적으로 진행해요.
여기에 파란색 박스는 검출기로 얻은 강아지 카테고리들의 스코어 확률로 가장큰건 0.99, 두번째로 큰건 p(dog) = 0.95, 쭉 값니다. 그다음에는 주황색 박스는 테스트셋의 실제 강아지 영역을 나타내겠습니다.
스코어에 따라 정렬한 검출 영역과 실제 영역과 IoU가 0.5 이상으로 임계화가 되면 매칭을 하겠습니다. p(dog) = 0.99인 경우, 실제로 그 이미지의 어느 groud truth dog 박스와 매치가 된다고 가정해서, 참 긍정으로 판별하겠습니다.
그렇게 올바르게 검출을 하면, 정밀도 재현율 곡선에서 한 점의 위치를 계산 할수가 있겠습니다. 아직 우리는 가장 높은 스코어를 가진 박스의 경우 만을 고려하였습니다. 정밀도 precision은 검출 결과가 실제로 참인 경우일 비율이고, 재현율 recall은 전체 ground truth 중에서 실제로 맞을 비율이 되겠습니다.
이 경우에는 가장 높은 스코어를 가지는 경우를 다루다보니 정밀도는 100%이고, 재현율은 세 그라운드 트루스 중 하나를 찾아내었기 때문이 1/3이 되겠습니다. 이렇게 해서 정밀도 재현율 그래프에서 한 점을 구해내었습니다.
이 과정을 다음 검출 박스에 대해서 반복하는데, 두 번째로 가장 큰 스코어를 갖는 강아지 영역은 또 다른 그라운드 트루스 박스와 매치가 된다고 가정하면 2개의 참 긍정 검출 결과를 찾아내었습니다. 세 그라운트 트루스 영역 중에서 2개를 찾아내었으므로 재현율은 2/3이 되겠습니다.
세 번째후보 영역을 거짓 긍정이라 한다면, 이미지 상에서 매치되는 그라운드 트루스 영역이 없을 것이고 새로운 정밀도 재현율 곡선 상의 점이 계산되겠습니다.
다음의 경우도 거짓 긍정이라면 재현율은 그대로이나 정밀도가 더 떨어지게되고
마지막 영역이 참 긍정인 경우, 마지막 그라운드 트루스와 매치가 되어 정밀도는 5개의 검출 결과 중에서 3개를 참 긍정이므로 3/5가 되며, 재현율은 실제 그라운드 트루스를 다 찾아내었으므로 1이 되겠습니다.
이 재현율 정밀도 곡선을 채워서 아래 넓이를 계산하면 0 ~ 1사이의 값이 나올건데 0이면 성능이 나쁜것이고, 1이라면 좋다고 할 수 있으며 이 값을 해당 카테고리의 평균 정밀도 average precision이라고 합니다. 이 객체 탐지 결과의 경우 강아지 평균 정밀도는 0.86이 되겠습니다.
ap 수가 무엇을 나타내냐면, 한번 1.0을 받으려면 어떻게 해야하는지 생각해보면 좋은데 ap 1.0을 얻으려면 거짓 긍정이 나오기전에 모든 참 긍정이 매치가 되겠습니다. 그래서 ap 1.0은 우리의 모델로 구한 검출 결과가 모든 참 긍정이며, 중복된 검출이나 거짓 긍정이 없다고 볼수 있겠습니다. 그리고 모든 영역들이 실제 그라운드 트루스 영역과 적어도 0.5 iou이상으로 매치되고 있습니다.
하지만 실제로 ap 1.0은 아주 얻기 힘들어요. 이 ap 척도를 사용하는 이유는 다은 응용 분야에서 얼마나 많이 올바른 영역을 찾아낼지 놓여낼지 트레이드 오프를 하길 원할수 있는데, 자율 주행차 같은 분야에서는 다른 차를 놓치지 않는게 매우 중요하다보니 아무것도 놓치기 싫을거고 모든 검출 결과가 올바르길 원할겁니다.
그래서 다양한 사용 경우에 따라서 서로다른 임계치와 정밀도와 재현율 사이에 트레이드 오프가 필요하지만, 이 평균 정밀도 척도를 계산하면 이건 정밀도와 재현율 사이에 가능한 모든 트레이드 오프 관계를 정리하다보니 사람들이 객체 탐지기를 평가하는데 자주 사용합니다
그래서 실제 사용시에는 모든 객체 카테고리에 대해서 계산해서 평균 정밀도를 구하고 모든 카테고리에 대한 평균 정밀도의 평균을 구할수가 있겠습니다. 하지만 이게 잘못 될수도 있는데, 이 평균 정밀도의 평균을 계산할때 박스의 위치 추정이 잘되는지 고려하지 않고 검출된 박스와 그라운드 트루스와 iou만 보고 매칭하기 때문입니다. 그래서 실제로 정밀하게 검출했는지를 알수 없습니다.
실제 사용시에는 이 전체 과정을 다른 iou 임계치로 돌려볼수가 있고, 이렇게 다양한 임계치 값에 대한 mAP 값을 얻을수가 있습니다. 이 과정은 객체 검출기를 평가하기에는 매우 복잡하지만 사람들이 실제로 사용하는 만큼 유용한 방법이고, 여러분들이 객체 검출에 관한 논문을 읽어볼때마다 mAP수치들을 볼수 있을거에요.
지금까지 다뤄온 컴퓨터 비전 문제는 기본적으로 이미지 분류 문제들을 위로 다뤄봤다. 단일 이미지를 합성곱 모델에다가 넣어서 이미지의 카테고리 라벨을 얻었다. 고양인지, 강아지인지, 차인지 등 이와 같이 단일 카테고리 라벨을 얻었다. 이 작업은 수많은 응용분야에서 유용하며, 딥러닝 파이프라인 전체를 어떻게 만들고 학습해나가는지에도 좋았다. 하지만 이미지 분류 문제는 컴퓨터 비전에서 다루는 수많은 작업들중 하나일 뿐이다.
여기에 컴퓨터 비전에서 일하는 사람들이 다루는 작업들을 계층적으로 정리한건데 이미지와 객체를 다양한 방식으로 식별하려고 하고 있다. 이번과 다음 강의에서는 이미지 상 객체의 공간적 존재 여부를 식별하는 다양한 방법들을 살펴볼것이고, 고전적인 이미지 분류 문제처럼 각 이미지의 픽셀별로 카테고리 라벨을 붙이는게 아니라 주어진 이미지에 대한 카테고리 라벨을 구해보겠다.
다른 컴퓨터 비전 작업으로 하나의 카테고리 라벨을 주는게 아니라 이미지의 여러 다른 부분에 다른 카테고리를 주고싶을 수도 있다. 이번과 다음 강의에서 이러한 작업들에 대해서 다룰것이고, 이번 시간에는 객체 탐지라고 하는 작업에 대해서 다뤄볼 것이고 컴퓨터 비전의 수 많은 응용분야에서 핵심이기도 하다.
객체 탐지란 입력 이미지를 주었을때 출력으로 검출한 객체들을 가지는 작업이 되겠다. 검출한 객체들은 여러가지들을 출력하는데 그 중 하나는 그 검출된 객체의 카테고리이고, 다른 하나는 바운딩 박스로 이미지 상에 공간 어디에 위치하는지에 대한 정보가 되겠다. 이 바운딩 박스는 4개의 수로 이뤄져있는데 박스의 중앙점 x, y와 폭과 높이 w, h가 있다.
모델이 회전된 바운딩 박스를 만들어 낼수도 있긴하지만 일반적인 객체 탐지 작업의 경우 그러지 않고, 축과 나란한 박스를 만들어 내므로 위의 4개의 실수로 정의할수 있겠다. 이 작업은 이미지 분류와 비교해보면 바뀐게 별로 없어보이지만 얼마나 어려울까? 여기서 우리가 할일은 이 박스와 카테고리 라벨만 구하면 되지만 이건 아주 어려운 작업이다.
객체 검출에서 우리가 다뤄야 할 문제들 중 하나는 다중 출력을 내야하는 것인데, 이미지 분류의 경우 하나의 이미지에 대해서 하나의 분류 결과를 냈으면 되었지만 이미지에서 검출된 객체 전체의 분류 결과를 만들어 내야 한다. 그래서 모델을 만들때 고정된 크기의 출력이 아닌 가변 크기의 출력을 내도록 하여야 하므로 어려운 일이 되겠다.
또 다른 문제로 각 객체들은 두 출력 값을 가지고 있는데 하나는 카테고리 라벨과 다른 하나는 바운딩 박스가 있다. 그래서 바운딩 박스를 구할수 있도록 하는 과정이 필요하다. 객체 탐지의 다른 문제는 계산 비용 문제로 상대적으로 고해상도 이미지에서의 처리가 필요하다. 대부분 이미지 분류의 경우 저 해상도 이미지로도 충분하였지만 객체 탐지의 경우 이미지안에 있는 여러 객체들을 식별해야하므로, 객체를 탐지할 만큼 충분한 이미지의 공간적 크기(해상도)가 필요하다. 객체 탐지 모델의 구체적인 예시로 이미지 해상도는 800 x 600정도로 이미지 분류에서 사용했던것보다 크다. 그래서 학습에 오랜 시간이 걸리고, 계산 비용으로 인해 객체 탐지가 훨씬 어렵게 되겠다.
하지만 객체 탐지는 매우 유용한 문제로 우리가 만들고자 하는 많은 시스템에서 사용될수가 있겠다. 예시로 자율주행 차가 있겠고, 자율 주행차의 비전 시스템을 만든다면 차 주위에 무엇이 있는지 알아야할것이고 이게 매우 중요한 문제다보니 이미지로 단일 카테고리만 필요한게 아니라 전체 객체들을 구하여야 하겠다. 기본적으로 이미지 분류 다음에는 객체 탐지가 컴퓨터 비전 분야에서 두번째로 핵심적인 문제라고 할수 있겠다.
이미지의 여러 객체가 아니라 단일 객체를 찾는 경우로 조금 단순하게 살펴봅시다. 단일 이미지를 탐지하는 경우 단순하게 할수가 있습니다. 왼쪽 이미지가 있고, 알렉스넷이라던가 선호하는 신경망 아키텍처에 넣으면 이미지의 벡터 표현 결과가 나오겠습니다.
벡터를 가지고 나뭇가지 형태로 분기해서 할수 있는 일을 보면 하나의 가지로 내려가면 이미지 분류에 사용할수도 있는데, 이건 이전에 살펴봣던 이미지 분류 작업과 동일하다고 할수 있으며 카테고리별 스코어를 구하고 소프트맥스 로스로 올바른 카테고리를 구합니다.
또 다른 가지로 내려가서 두번째 가지에서는 똑같이 이미지의 벡터 표현 결과가 들어가지만 4개의 출력을 갖는 완전 연결 계층을 가진다. 이 4개의 수는 바운딩 박스의 좌표계값들로 이 값들은 L2같은 회귀 비용을 사용해서 학습할수가 있겠고, 실제 바운딩 박스의 좌표계값과 예측한 바운딩 박스의 좌표계값의 차이로 학습 시킬수가 있다.
이제 문제는 두개의 비용 함수를 사용한다는 점인데, 이렇게 된 이유는 우리가 두 개의 모델이 두개를 예측하도록 하였기 때문인데 하나는 라벨 카테고리와 다른 하나는 바운딩 박스의 위치가 되겠다. 이 두개를 합친 비용함수를 구할수도 있지만 그라디언트 하강을 계산하기 위해선 단일한 스칼라 비용값이 나와야 한다. 하지만 우리는 여러개의 로스를 처리하는 방법을 모르고 있다.
이 문제를 극복하기 위해서 서로 다른 비용들을 가중합하여 최종 비용을 구하면 되겠다. 비용의 가중합을 구하는 이유는 소프트 맥스 비용과 L2 회귀 비용 사이의 중요도를 서로 압도하지 않도록 미세 조정할 필요가 있기 때문이다. 이 다중 비용 함수를 사용하는 아이디어는 하나의 신경망이 여러개를 학습을 해야하는 경우 사용한다.
그래서 하나의 비용 함수뿐만이 아니라 다른 예측할 비용함수를 추가하고 이들을 가중합을 구함으로서 신경망이 다중 출력 결과를 학습할수 있도록 만들수가 있다. 이러한 일반적인 구조를 다중 작업 비용 함수라 부른다. 신경망이 다른 작업들을 한번에 학습할수 있고, 끝에 단일한 비용 함수로 만들어내기 때문이다.
이걸 실제로 쓰기 위해선 이 백본 합성곱 신경망을 이미지넷 분류셋으로 선학습한 후에 네트워크 전체를 다중 비용 위치 추정 문제로 미세조정을 할수가 있겠다. 객체 탐색에 있어서 바보같은 방법인데, 직관적이며 완전 연결신경망을 끝내다가 붙여 박스 좌표계값들을 추정해낸다. 이 상대적으로 간단한 방법은 꽤 잘 동작하지만 이미지에서 하나의 객체만 탐지하는 경우에만 사용 가능하다.
하지만 실제 이미지에서는 탐지할 객체가 여러개이므로 일반적인 용도로 사용하는데는 적합하지 않습니다.
일반적인 경우 이미지들은 탐지해야할 다양한 개수의 객체들을 가지고 있습니다. 이 고양이 이미지의 경우 한 객체만 탐지해서 고양이의 바운딩 박스에 대한 4개의 수를 추정해내면 되지만. 중간의 이미지는 3개의 객체를 탐지해야하는데 2 강아지랑 1고양이로 3 x 4 = 12개의 수를 추정해내야되요. (슬라이드는 버그)
맨 아래의 사진에는 귀여운 오리들이 엄마 오리들을 따라가고 있는데 아주 많은 오리들이 있죠. 셀수도 없고 아무튼 아주 많습니다. 하지만 우리가 만든 신경망은 이 모든 오리들을 다 탐지해낼수 있어야 합니다. 이 경우에는 아주 많은 수의 결과를 구해내야 합니다. 그래서 우리 모델이 다양한 개수의 객체들을 출력 해낼수 있는 메커니즘이 필요합니다.
그래서 이걸 할수 있는 상대적으로 쉬운 방법으로 슬라이딩 윈도우를 이용한 객체 탐지 방법이 있습니다. 여기에 개념을 볼수 있는데 합성곱 신경망으로 분류 작업을 할건데, 이 합성곱 신경망은 입력 이미지의 윈도우/서브리전을 분류를 합니다. c개의 카테고리로 분류하는 경우 c + 1개의 출력을 할수가 있는데 여기서 추가되는 1개의 경우는 배경을 의미하며 이미지 탐지 문제를 이미지 분류 문제로 만들기 위함입니다.
이 합성곱 신경망을 이미지의 수많은 영역들에 적용해서 서 강아지인지 고양이인지 혹은 아무것도 없으면 배경으로 분류해냅니다. 이 슬라이딩 윈도우 합성곱 신경망 객체 검출기를 파란색 영역에다가 사용해보면 아무런 객체가 없으니 이 이영역은 배경으로 분류하겠습니다.
이 영역을 슬라이드시키고, 이 영역은 강아지를 잘 감싸고 있으므로 강아지가 있다고 할수 있겠습니다.
여기에는 강아지가
여기에는 고양이가 있다고 할수 있겠죠. 그래서 이런 객체 검출기를가지고 다양한 영역들에 슬라이드 시키기고 각 영역을 합성곱 신경망에 넣어 객체인지 배경인지 알수있겠습니다. 이건 꽤 간단한 방법이지만 문제가 있습니다.
H x W 크기의 이미지에 바운딩 박스가 몇개가 존재할수 있을까요?
바운딩 박스의 크기가 h x w라고 할때, (W - w + 1) * (H - h + 1)개의 가능한 x, y의 위치 경우의 수가 있으며
고정된 크기의 박스가 아니라 모든 가능한 크기를 고려했을때 이와 같은 이차식같은 형태의 가능한 경우의 수들이 존재합니다.
이게 얼마나 나쁘냐면 800 x 600 크기의 이미지가 있으면 ~58M개의 박스가 존재할수 있으며, 집약된 슬라이딩 윈도우 방식은 실제로 사용할수가 없겠습니다. 그래서 다른 객체 검출 방식이 필요해요.
영역 제안 이라고 하는 방법이 있습니다. 가능한 모든 영역에 대해서 객체 검출기로 평가할수없다보니, 이미지에서 후부 영역들을 만들어내는 알고리즘을 사용할수 있는데, 후보 영역들은 상대적으로 작은 서브리전이지만 이미지에서 객체를 높은 확률을 가지고 있습니다.
몇년전에 수 많은 논문에서 이런 후보 영역들을 만들어내는 메커니즘이 소개되었는데 이들을 영역 제안 resion proposal이라고 부릅니다. 이게 어떻게 동작하는지 깊이 들어가지는 않을건데 결국에 이 방식들이 신경망으로 대체되었기 때문입니다.
이런 초기 영역 제안 방식은 입력 이미지에다가 이미지 프로세싱을 수행했다고 할수 있는데, 이미지에 블롭같은 영역이나 에지 영역이나 다른 로레벨 이미지 프로세싱 기법으로 객체를 높은 확률로 가졌을만한 영역들을 찾아내었습니다.
이런 방법들중에서 가장 유명한것 중하나로 선택적 탐색 selective search가 있습니다. 이 알고리즘은 cpu로도 돌릴수 있는데 이미지당 2000개의 리전을 몇초만에 알려줍니다. 이 2000개의 제안 영역들은 우리가 높은 확률로 있다고 보고 주의를 기울일만한 객체들을 가지고 있어요. 이러한 영역 제안 방법은 심층 신경망을 이용해서 실제 사용가능한 객체 검출기로 직관적으로 학습시킬수가 있습니다.
매우 유명한 논문으로 RCNN이 있습니다. 여기서 R은 region based를 뜻하며 이 논문은 Region based CNN이라고 부릅니다. 이 논문은 2014년도에 나온 매우 영향력이 컸던 논문이라고 할수 있겠습니다. 하지만 이 방법은 꽤 이해하기 쉽게 동작해요 우리할 일은 일단 이 입력 이미지를
선택적 탐색과 같은 영역 제안 방법을 돌리는데, 선택적 탐색법은 2000개의 후보 제안 영역들을 줍니다. 2000개는 많으니 여기선 3개만 표시하겠습니다.
각 후보 영역들은 서로 다른 크기나 비를 가지고 있을것이고 각 제안 영역들을 224 x 224의 고정 크기로 변환시키겠습니다.
각 후보 영역들을 독립적으로 합성곱 신경망에다가 돌리고,
그러면 각 합성곱 신경망은 분류 스코어를 출력하겠습니. 이 c + 1개의 분류 스코어가 이게 배경인지 혹은 배경이 아니고 무엇인지 알려주겠습니다. 여기서 문제가 있는데, 이 선택적 탐색으로 얻은 제안 영역들이 실제로 우리가 탐지하고자 하는것과 일치하지 않을수가 있습니다. 왜냐면 여기서 구하는 전체 바운딩 박스들을 구하는 메커니즘은 블랙박스인 선택적 탐색 방법을 사용하기 때문에 박스를 구하는데 있어서 학습 과정이 존재하지 않습니다.
이 문제를 극복하기 위해서 멀티태스크 비용같은 방법을 사용해서 cnn이 추가 정보를 내도록 변경시켜, 예측한 바운딩 박스가 실제 우리가 원하는 박스를 출력하도록 변환을 추가하겠습니다.
여기서 짚고 넘어가고 싶은 부분은 바운딩 박스 회귀는 우리가 처음에 얻은게 아니라 입력으로 주어진 제안 영역을 변경시켜 얻은 것입니다. 제안 영역들도 좋긴 하지만 더 물체를 잘 찾아내서 개선할 수 있도록 할것이고, 바운딩 박스는 4개의 수로 모수화 할수 있다보니 구한 바운딩 박스와의 차이(transform/delta)도 4개의 수로 정리할수 있겠습니다.
바운딩 박스 변환의 다양한 모수화 방법이 있는데, 가장 흔하게 사용되는건 우측에 있는게 있겠습니다. 제안 영역이 주어지면, 이 제안 영역인 px, py, ph, pw를 가지고 있고, 이걸 4개의 수 tx, ty, th, tw로 변환시키고, 최종 결과 output box는 주어진 제안 영역에다가 변환 값을 반영하여 구하겠습니다.
여기서 있는 모수값들은 박스 크기에 비례하여 평행이동시키며, 로그 공간상에서 크기 조정을 하겠습니다. 제안 영역의 폭과 높이의 스케일을 조정시킬것인데, cnn에 넣기 전의 입력 영역으로 다시 되돌려 주기 위함입니다.
지금까지 본 내용들이 우리가 처음으로본 합성곱 신경망을 이용한 객체 탐지기가 되겠습니다. 이제 테스트 타임의 파이프라인을 살펴보면 이렇게 생겼는데, 싱글 RGB 이미지를 선택적 탐색같은 영역 제안 방법을 돌려서 2000개 정도의 제안 영역들을 구합니다.
각 제안 영역들을 구하면 고정된 크기로 224 x 224로 변환하고 독립적으로 합성곱 신경망으로 돌려서 카테고리를 구합니다. 거기다가 BBox 변환으로 기존의 제안 영역의 좌표를 고쳐줍시다.
이제 테스트 타임에는 어플리케이션에 쓸수 있도록 유한개의 셋을 구하면 되겠는데, 여기서 다양한 방법들이 있겠지만 우리가 사용한 어플리케이션에 따라서 고르면 되겠습니다. 여기서 사용해볼수 있는 방법으로 전체 영역들의 예측 스코어로 박스 셋을 구하고 싶을수도 있을텐데 한가지 방법은 이미지당 10개의 객체들을 구하길 원한다면 카테고리가 무엇인지 신경쓰지말고, 백그라운드 스코어로 임계화를하는데 배경 스코어가 가장 낮은 10개를 최종 예측 결과로 사용하면 됩니다.
다른 방법으로 카테고리별 임계치를 설정하는 방법도 있는데 분류신경망은 배경 뿐만이 아니라 전체 카테고리 스코어도 출력을 하기 때문이며, 또 다른 옵션으로 특정한 임계치를 넘는 카테고리의 박스를 최종 결과셋으로 출력해도 되겠습니다.
여기서 사용하는 합성곱 신경망은 모두 같은 가중치를 공유하고 있으며, 제안 영역들에 적용됩니다. 만약 이 합성곱 신경망들이 가중치를 공유하지 않으면 잘 동작하지 않을수가 있는데, 이미지마다 서로 다른 개수의 제안 영역들을 가질수 있고, 이미지당 2000개의 고정된 개수의 제안 영역들을 가진다고해도 개별적으로 다 돌리기 어렵기 때문입니다.
그래서 지금까지 이미지를 입력으로 주고 바운딩 박스 셋을 출력으로 하는 실용적인 알고리즘에 대해서 살펴보았는데, 우리가 구한 박스들이 실제로 우리가 구해야 하는 박스와 비슷한지 다른 사람의 것과 성능이 더 나아졌는지 비교할수 있도록 평가할 필요가 있습니다.
그걸 하기 위해선 두 바운딩 박스를 비교하는 메커니즘이 필요합니다. 위와 같은 귀여운 강아지 이미지가 있으면 그린 박스는 시스템이 실제 구해야하는 박스고, 우리의 알고리즘이 구한 박스는 블루 박스가 되겠습니다. 그리고 이들을 파란 상자가 녹색 상자랑 잘 맞는지 비교를 할 방법이 필요합니다.
일반적으로 두 바운딩 박스를 비교하기 위해서 사용하는 방법은 Intersection over Union IoU라는 척도가 있습니다. 이걸 다른 상황에서는 jaccard similarity/index라고도 합니다. 하지만 객체 탐지에선 IoU라고 부릅니다. 이 값은 두 바운딩 박스의 비슷한 정도를 나타내는데, 두 박스의 겹치는 부분 intersection(주황)과 두 박스를 합한 영역 union(보라)의 비율로 계산합니다.
이 예시에서 IoU는 0.54가 되는데 항상 0과 1사이의 값이되며, 두 박스가 완전히 일치하는 경우 이 비율은 1이 되고, 완전히 겹치는 부분이 없으면 0이 되겠습니다. 일반적으로 IoU는 0과 1사이로 두 박스가 더 잘 매치될수록 더 큰 수가 나옵니다.
IoU가 0.5보다 크다면 그래도 두 바운딩 박스가 잘 매치되고 있구나라고 볼수 있는데, 0.54면 완벽하지는 않지만 객체의 중요한 부분을 잘 찾았다고 볼수 있겠습니ㅏㄷ.
0.7은 아주 잘찾은것이며, 약간 에러는 있지만 물체 위치를 잘 추정해내었다고 볼수 있습니다.
0.9 이상인 경우 거의 완벽하다고 할수 있겠습니다. iou라는 척도는 두 바운딩 박스를 비교하는 다양한 상황에서 사용하고 있습니다.