코드: 링크텍스트
딥러닝 기반의 Object detection 기법을 배워갑니다.
Anchor box의 개념에 대해 이해합니다.
single stage detection 모델과 two stage detection 모델의 차이를 이해합니다.
Localization은 이미지 내에 하나의 물체(Object)가 있을 때 그 물체의 위치를 특정하는 것으로
Bounding box 를 많이 사용하며 bounding box 의 left top 또는 right bottom 좌표를 출력합니다.
바운딩 박스는 이미지 내에서 물체의 위치를 사각형으로 싼 형태의 도형을 정의하고 꼭짓점의 좌표를 표현하는 것입니다.
2개의 점을 표현하는 방식은 두 가지가 있는데 첫 번째 방식은 전체 이미지의 좌측 상단을 원점으로 정의하여 바운딩 박스의 좌상단 좌표와 우하단 좌표 두 가지 좌표로 표한하는 것입니다.
두 번째 방식은 원점같이 절대 좌표를 설정하지 않고 폭과 높이로 정의합니다. 이렇게 하면, 좌측 상단의 점에 대한 상대적 위치를 통해서 물체의 위치를 정의할 수 있습니다.
! mkdir -p ~/aiffel/object_detection/images
! ln -s ~/data/person.jpg ~/aiffel/object_detection/images/
from PIL import Image, ImageDraw
import os
img_path=os.getenv('HOME')+'/aiffel/object_detection/images/person.jpg'
img = Image.open(img_path)
draw = ImageDraw.Draw(img)
draw.rectangle((130, 30, 670, 450), outline=(0,255,0),width=2)
img
localization 모델이 인식한 결과를 평가하려면 metric를 사용해야 합니다.
우리가 익히 배운 L1, L2는 박스의 크기에 따라 metric가 달라지는 문제가 생깁니다.
그러므로, 우리는 절대적인 값에 영향을 받지 않고 두 개의 박스 차이를 상대적으로 평가해야합니다.
그것이 바로, IoU입니다.
IoU는 교차하는 영역을 합친 영역으로 나눈 값입니다.
즉, 예측과 정답의 교집합/합집합 인것이죠
박스 위치를 표현할 output노드 4개를 conv_layer로 구성된 백본 네트워크에 추가합니다.
pc:물체가 있을 확률, c1,c2,c3는 각 클래스에 속할 확률
pc=0, 배경이다
c1,c2,c3와 pc를 분리하여 다른 활성화 함수를 적용하고 손실 계산이 가능합니다.
bx,by는 좌측 상단 점
bh,bw는 높이와 폭입니다
Bounding box가 x1, y1, x2, y2이고 image의 크기가 w, h 일때 Target label y=[1, x1/w, y1/h, (y2-y1)/h, (x2-x1)/w]
import tensorflow as tf
from tensorflow import keras
output_num = 1+4+3 # object_prob 1, bbox coord 4, class_prob 3
input_tensor = keras.layers.Input(shape=(224, 224, 3), name='image')
base_model = keras.applications.resnet.ResNet50(
input_tensor=input_tensor,
include_top=False,
weights='imagenet',
pooling=None,
)
x = base_model.output
preds = keras.layers.Conv2D(output_num, 1, 1)(x)
localize_model=keras.Model(inputs=base_model.input, outputs=preds)
localize_model.summary()
Localization을 확장하여 object detection을 할 겁니다.
Multi object detection을 사용하여 이미지에 있는 여러 물체를 한 번에 찾아야합나디.
슬라이딩 윈도우는 전체 이미지를 적당 크기의 영역으로 나누고, 각 영역에 대해 이전 스텝에서 만든 localization network를 반복 적용하는 방식입니다.(커널과 비슷하다)
*input image : 16 x 16, output:4개의 bounding box
*단점
Sliding window방식은 매우 많은 갯수의 window 영역에 대해 이미지의 localization을 돌아가면서 하나씩 진행해야하므로 처리해야할 window 갯수만큼 시간이 더 걸립니다.
또한 물체의 크기가 다양해지면 단일 크기의 window로 이를 커버할 수 없으므로 더욱 처리속도 문제가 심각해집니다.
컨볼루션은 병렬적으로 동시에 진행하기에 Sliding window의 단점인 연산량과 속도를 개선합니다.
그리고 결과로 얻어지는 1x1형태의 output도 동일하게 localization결과로 대체될 수 있습니다.
Anchor를 기반으로 어떻게 학습이 되는지 알아보겠습니다.
YOLO와 Faster-RCNN에서 Anchor를 기반으로 Loss를 계산하는 방식에는 두 가지 Intersection over Union(IoU)를 threshold로 사용합니다.
하나는 Background IoU threshold 그리고 다른 하나는 Foreground IoU threshold입니다.
이런 방식은 Faster RCNN에서 먼저 확인할 수 있는데요. 객체와의 IoU가 0.7이상 일 경우 Foreground로 할당하고 0.3 이하일 경우는 배경(Background)으로 할당합니다.
그럼 0.3과 0.7 중간인 Anchor들은 어떻게 될까요? 이러한 Anchor는 불분명한 영역으로 학습에 활용하지 않습니다.
위의 차량을 Detection 하기 위한 Detection model을 상상해보면 Feature map의 Grid 한 칸마다 다양한 크기 및 Apsect ratio를 가진 Anchor를 만들고 이와 차량의 크기를 비교해서 학습을 해야 합니다.
위의 예시를 보면 Anchor의 크기가 차량의 박스 크기에 비해 매우 작은 것을 알 수 있습니다.
이 경우 차량 영역에 들어간 Anchor box이라도 교차(intersection)하는 면적이 작기 때문에 IoU가 작아 매칭이 되지 않는 것을 알 수 있습니다.
이러한 이유 때문에 우리가 탐지하고자 하는 물체에 따라서 Anchor box의 크기나 aspect ratio를 조정해 주어야 합니다.
만약 세로로 긴 물체를 주로 탐지해야 하면 세로로 긴 Anchor box를 많이 만들고 Matching되는 box를 늘려야 학습이 잘 될 수 있습니다.
차량을 Detection 하기 위해서 Anchor의 크기를 키우고 Aspect ratio를 조정하여 가로로 길게 만들 수 있습니다. 아래 예시에서는 Anchor의 크기를 키우고 Aspect ratio를 조정했습니다.
그리고 Anchor box와 녹색의 차량 bounding box 간의 IoU를 계산해서 물체와의 IoU가 0.3 이하인 경우는 배경으로
그리고 0.7 이상인 경우는 차량으로 할당되고 두 가지 모두에 해당하지 않는 경우에는 Loss가 학습에 반영되지 않도록 합니다.
위의 이미지에서는 노란색의 경우 배경으로 할당되고 회색은 학습에 미반영되며 녹색은 물체로 학습이 됩니다.
이전에 학습했던 것처럼 노란색의 경우에는 배경이므로 물체의 bounding box를 추정하기 위한 Regression은 loss에 반영되지 않습니다.
따라서 파란색 anchor box만이 regression을 학습할 수 있는 sample이 됩니다.
다양한 물체에 Anchor Box가 걸쳐있는 경우 가장 높은 IoU를 가진 물체의 Bounding box를 기준으로 계산이 됩니다
차량을 Detection 하기 위해서 Anchor의 크기를 키우고 Aspect ratio를 조정하여 가로로 길게 만들 수 있습니다.
아래 예시에서는 Anchor의 크기를 키우고 Aspect ratio를 조정했습니다.
그리고 Anchor box와 녹색의 차량 bounding box 간의 IoU를 계산해서 물체와의 IoU가 0.3 이하인 경우는 배경으로 그리고 0.7 이상인 경우는 차량으로 할당되고 두 가지 모두에 해당하지 않는 경우에는 Loss가 학습에 반영되지 않도록 합니다.
위의 이미지에서는 노란색의 경우 배경으로 할당되고 회색은 학습에 미반영되며 녹색은 물체로 학습이 됩니다.
이전에 학습했던 것처럼 노란색의 경우에는 배경이므로 물체의 bounding box를 추정하기 위한 Regression은 loss에 반영되지 않습니다. 따라서 파란색 anchor box만이 regression을 학습할 수 있는 sample이 됩니다.
다양한 물체에 Anchor Box가 걸쳐있는 경우 가장 높은 IoU를 가진 물체의 Bounding box를 기준으로 계산이 됩니다
고로, Achor를 많이 둘수록 탐색하도록 동작을 많이 하기 때문에 좋은 Recall을 얻을 수 있지만 적절하지 않은 Anchor가 많아지면 안 좋은 결과를 내어서 성능 저하가 일어날 수 있게 됩니다.
YOLOv3를 기준으로 설명해드리겠습니다. YOLOv3의 전신인 YOLOv2부터 Bounding box Regression 방식을 사용합니다.
각 Anchor box에 대응되는 network는 tx,ty,tw,th의 4가지 output으로 bounding box를 regression 해서 정확한 box를 표현하게 됩니다.
Bounding box를 예측하기 위해 예측해야 할 것은 bounding box의 중심점(bx,by) 그리고 width(bw)와 height(bh)입니다.
그러나 이 값을 직접 예측하는 것이 아니라 위 그림에 있는 수식과 같이 anchor box의 정보 cx,cy, pw,ph와 연관지어 찾는 방법을 사용합니다.
기존의 Anchor box 위 좌측 상단이 cx,cy이고, width(pw), height(ph)입니다.
이를 얼마나 x축 또는 y축 방향으로 옮길지 그리고 크기를 얼마나 조절해야 하는지를 예측하여 물체의 bounding box를 추론하게 됩니다.
위의 방식으로는 하나의 박스에 한 물체만 인식이 가능합나다. 그래서 박스 한 칸에 서로 다른 형태의 물체가 겹치면 인식하지 못합니다.
이 경우, 앵커 박스를 이용하면, 서로 다른 형태의 물체와 겹친 경우이더라도 대응이 가능합니다.
그래서, 좌우.상하로 늘릴 수 있는 가상의 박스가 존재합니다.
한 그리드 셀에서 앵커 박스에 대한 물체 할당은 위에서 배운 IoU로 할 수 있습니다.
인식 범위 내에 물체가 있고 두 개의 앵커 박스가 있는 경우 IoU가 더 높은 앵커 박스에 물체를 할당하게 됩니다.
즉, 겹친 물체가 있을 시 , IoU를 기준으로 서로 다른 Anchor에 할당하도록 하여 생긴 영역이 다른 물체가 겹치더라도 물체를 검출할 수 있게 도와줍니다.
*집고 넘어갈 개념
바운딩 박스: 네트워크가 예측한 물체의 위치 표현하는 박스로 네트워크의 출력을 말합니다.
앵커 박스: 네트워크가 감지해야할 물체의 shape에 대한 가정으로, 네트워크의 입력입니다.
사실, 앵거 박스를 이용하지 않아도 2x2격자에 물체가 있는 경우 한 물체의 4개의 바운딩 박스를 얻게 됩니다.
NMS을 사용하면 여러 개의 박스를 하나로 줄일 수 있게 됩니다.
NMS는 겹친 박스들이 있을 시, 가장 확률이 높은 박스를 기준으로 기준이 되는 IoU이하의 것을 없앱니다.
그 이유는 어느 정도 겹치더라도 다른 물체가 있을 가능성 때문입니다. 왜냐하면 같은 클래스여도 NMS는 적용이 됩니다.
즉, NMS는 물체 탐색 결과들 중 겹친 결과들을 하나로 줄여서 더 나은 결과를 얻게 합니다.
딥러닝 기반의 Object Detection 모델은 크게 Single stage detector와 Two stage detector로 구분할 수 있습니다.
*many stage: 물체가 있을 법한 위치의 후보를 뽑아내는 단계로 실제 물체가 있는지를 분류하고 정확한 바운딩 박스를 구하는 인식을 수행하는 단계입니다. ex)Faster-RCNN
*One stage Detector: 객체의 검출과 분류 그리고 바운딩 박스 인식을 한 번에 하는 방법입니다.
YOLO는 이미지를 그리드로 나누고 슬라이딩 윈도우 기법을 컨볼루션 연산으로 바뀌어서 Fully convolutional network연산을 통해서 그리드 셀 별로 바운딩 박스를 얻어낸 후에 바운딩 박스들에 대해 NMS한 방식입니다.
그리고, 특성 정보가 동일한 크기의 넓은 영역을 커버하기에 작은 물체를 잡기엔 적합하지 않는 단점이 있습니다.
*예시, YOLO의 output: 7x7x30/ grid:7x7, .. 30??!
*설명
Bounding box를 표현 시, object가 있을 확률과 x,y,w,h 4개로 총 5의 크기를 갖습니다. 이러한 박스 두 개을 인식하므로 10개의 크기를 갖게 됩니다. 30-10 =20이 남게 되죠? 남은 20가지는 class를 의미합니다.
즉, grid cell이 어던 class의 물체가 포함된 영역인지 예측할 때 20가지의 class중 분류하는 문제로 풀게 됩니다.
CNN에서 뽑은 특성 맵의 한 칸은 생각보다 큰 영역의 정보를 담기에 여러 컨볼루션 레이이와 pooling을 거치기 때문에 한 특성 맵의 한 칸은 최초 입력 이미지의 넓은 영역을 볼 수 있습니다.
다양한 크기의 특성 맵으로부터 classification과 바운딩 박스 regression을 수행하여 다양한 크기의 물체에 대응하는 detection 네트워크를 만듭니다.
Feature map에서 detection을 위한 classification과 regression을 수행하는 점입니다. 이렇게 하면 앞단에서 low level feature를 활용하여 작은 물체를 잡을 수 있고 뒤단에선 좀 더 큰 영역을 볼 수 있게 됩니다.
물체가 있을 법한 후보 영역을 뽑아내는 region proposal알고리즘과 후보 영역을 분류하는 CNN을 사용합니다.
Proposal을 만들어내는 데에는 Selective search라는 비 신경 알고리즘이 사용이 되고 후보 영역의 분류와 바운딩 박스의 인식을 위해 신경망을 사용합니다.
단점은 특성을 반복 추출하기 때문에 비효율적이고 느립니다.
후보 영역의 분류와 바운딩 박스 인식을 위한 특성을 한 번에 추출하여 사용합니다.
이 기술은 슬라이딩 윈도우를 이용하지 않고, 해당 부분을 CNN을 거친 특성 맵에 투영해서 특성 맵을 잘라내는 사실입니다.
이렇게 자르면, 한 번의 CNN을 거쳐서 결과물을 재활용할 수 있으므로 연산수를 줄일 수 있습니다.
잘라진 특성 맵의 영역은 여러 모앙과 크기를 갖기에, 해당 영역이 어떤 클래스에 속하고 분류하기 위해 사용하는 FC Layer에 배치 입력값을 사용하려면 영역의 모양과 크기를 맞춰야하는 문제는 생깁니다.
그래서 논문에서. RoI pooling방법을 이용하여 특성을 원하는 크기가 되도록 pooling하여 사용합니다.
*RoI Pooling: 미리 정해둔 크기가 나올 때까지 pooling연산을 수행하는 방법입니다. 이를 이용해서 다양한 크기의 candidate box를 feature map에서 잘라내면 같은 크기로 만들 수 있게 됩니다.
Faster R-CNN의 region proposal과정에서 RPN라고 불리는 신경망 네트워크를 사용합니다.
CAM은 이미지 모델 해석할 때, 주로 사용이 되고 물체를 분류하는 테스크만으로도 활성화 정도를 통해 물체를 찾을 수 있습니다.
정리하자면, 먼저 이미지의 CNN을 적용해 특성을 뽑아낸 후 특성 맵만 가지고 물체의 위치를 알아내게 됩니다.
이때, 특성 맵을 보고 후보 영역을 얻어내는 네트워크를 RPN이라고 합니다
CNN연산을 크게 줄였지만 region proposal 알고리즘이 병목이 되는 단점이 있습니다.