객체 검출
고친 사람 github-actions[bot]
객체 검출은 사진 속에서 물체를 찾아 무엇이 어디 있는지 함께 알려 줍니다. 찾은 물체마다 이름표 하나와 그 물체를 감싸는 네모 칸 하나를 내놓습니다. 사진에 물체가 몇 개 있는지 미리 몰라도 찾은 만큼 답을 돌려줍니다.
쉽고 빠른 이해
객체 검출은 사진에서 물체를 하나하나 찾아 이름과 위치를 붙여 줍니다. 주차장 입구 사진을 넣으면 「승용차, 이 네모 안」과 「사람, 저 네모 안」을 돌려줍니다.
사진 전체에 이름표 하나만 붙여서는 차가 몇 대인지, 어디 섰는지 모릅니다. 차를 세거나 번호판만 잘라 읽으려면 위치가 있어야 합니다. 차가 있는지 없는지만 알면 되는 일이면 이름표 하나를 붙이는 이미지 분류로 충분합니다.
어떻게 도나:
- 예시 사진을 많이 보고 배운 프로그램이 사진을 훑어 네모와, 얼마나 확신하는지 적은 점수를 잔뜩 냅니다
- 한 물체에 겹쳐 나온 네모 가운데 점수가 가장 높은 것만 남깁니다
- 점수가 정해 둔 기준에 못 미치는 네모를 버립니다
대가도 있습니다. 사진마다 물체 둘레에 네모를 쳐 둔 정답이 많이 필요합니다. 기준을 낮추면 없는 물체를 잡습니다. 높이면 있는 물체를 놓칩니다.
상세
단체 사진을 받아 든 사람이 얼굴마다 네모를 치고 그 옆에 이름을 적는다고 해 봅시다. 몇 명이 찍혔는지는 사진마다 다르니 네모 수도 그때그때 달라집니다. 객체 검출은 이 일을 컴퓨터에게 맡깁니다.
이 절은 먼저 객체 검출이 돌려주는 답이 어떻게 생겼는지 봅니다. 이어서 그 답을 만드는 두 방식과 겹친 네모를 정리하는 방법, 검출이 맞았는지 재는 방법을 봅니다. 끝으로 백엔드 개발자가 검출을 서비스에 붙일 때 정할 것을 봅니다.
예로는 주차장 입구 사진기가 찍은 사진 한 장을 계속 씁니다. 사진에는 승용차 두 대와 걸어가는 사람 한 명이 찍혀 있습니다. 서비스는 이 사진에서 차가 몇 대인지 세고 차마다 번호판을 읽으려 합니다.
「객체」라는 낱말
이 이름에서 객체는 사진에 찍힌 물체 하나입니다. 승용차 한 대, 사람 한 명, 번호판 하나가 각각 객체입니다. 객체 지향 프로그래밍에서 클래스로 찍어 내는 객체와는 이름만 같습니다.
검출은 찾아낸다는 뜻입니다. 영어 object detection 을 옮긴 말이라 「물체 검출」이나 「객체 탐지」로도 씁니다. 이 문서는 「객체 검출」로 씁니다.
객체 검출은 컴퓨터 비전이 푸는 대표 문제 가운데 하나입니다. 컴퓨터 비전은 컴퓨터가 사진과 영상을 보고 무엇이 찍혔는지 알아내게 하는 분야입니다.
이름표와 네모 칸과 점수
요즘 객체 검출은 대개 학습된 모델이 맡습니다. 모델은 정답을 달아 둔 예시 사진을 많이 보고 판단 규칙을 스스로 익힌 프로그램입니다. 사진을 넣으면 찾은 물체마다 세 가지를 돌려줍니다.
무엇인지 적은 이름표와 어디 있는지 적은 네모 칸, 얼마나 확신하는지 적은 점수입니다. 주차장 사진이라면 답이 아래처럼 나옵니다.
| 이름표 | 점수 | 네모 칸 (x1, y1, x2, y2) |
|---|---|---|
| 승용차 | 0.96 | 120, 342, 612, 720 |
| 승용차 | 0.91 | 900, 360, 1380, 702 |
| 사람 | 0.83 | 1500, 300, 1620, 690 |
표의 한 줄이 물체 하나입니다. 줄 수는 사진마다 달라집니다. 빈 주차장 사진이면 표가 빕니다. 붐비는 날 사진이면 수십 줄이 됩니다.
이름표는 아무 낱말이나 붙는 것이 아닙니다. 모델을 학습시킬 때 정해 둔 목록 안에서만 고릅니다. 이 목록의 한 칸 한 칸을 클래스라고 합니다. 목록에 「자전거」가 없으면 모델은 자전거를 찾지 못합니다.
네모 칸은 물체를 빠짐없이 감싸는 가장 작은 직사각형입니다. 네 변은 사진의 가로선·세로선과 나란합니다. 이 네모를 경계 상자라고 합니다. 영어로는 bounding box 입니다.
경계 상자는 숫자 넷으로 적습니다. 위 표는 왼쪽 위 꼭짓점 (x1, y1)과 오른쪽 아래 꼭짓점 (x2, y2)을 픽셀 단위로 적었습니다. 사진의 왼쪽 위 끝이 (0, 0)입니다. x 는 오른쪽으로, y 는 아래로 갈수록 커집니다.
같은 네모를 가운데 점과 폭·높이로 적는 방식도 흔합니다. 모델과 도구마다 고르는 방식이 다릅니다. 그래서 검출 결과를 주고받을 때는 어느 방식인지부터 맞춰야 합니다.
점수는 0 과 1 사이 값입니다. 1 에 가까울수록 모델이 그 답을 확신한다는 뜻입니다. 이 값이 신뢰도 점수입니다.
확률처럼 읽히지만 0.9 라고 해서 열 번에 아홉 번 맞는다는 보장은 없습니다. 몇 점부터 믿을지는 서비스가 따로 정합니다.
이미지 분류 · 분할과 갈리는 지점
객체 검출은 이웃 문제들과 답의 꼴로 갈립니다. 아래 표는 주차장 사진 한 장에 세 문제를 걸었을 때 나오는 답입니다.
| 문제 | 주차장 사진에서 내놓는 답 | 답의 개수 |
|---|---|---|
| 이미지 분류 | 사진 전체에 이름표 하나. 「승용차」 | 늘 하나 |
| 객체 검출 | 물체마다 이름표와 경계 상자 | 사진마다 다름 |
| 인스턴스 분할 | 물체마다 이름표와 그 물체에 속한 픽셀 전부 | 사진마다 다름 |
검출이 분류보다 어려운 까닭은 먼저 답의 개수에 있습니다. 분류 모델은 늘 이름표 하나를 내면 됩니다. 검출 모델은 사진을 보기 전에는 몇 개를 내야 할지 모릅니다.
위치도 맞혀야 합니다. 이름표는 맞거나 틀리거나 둘 중 하나입니다. 경계 상자는 숫자 넷이라 조금씩 어긋날 수 있습니다.
얼마나 어긋나면 틀린 것인지 재는 잣대가 따로 필요합니다. 이 잣대가 IoU(Intersection over Union, 교집합 대 합집합 비율)입니다. 아래 「겹친 정도를 재는 IoU」 소절에서 봅니다.
어느 문제를 고를지는 서비스가 무엇을 알아야 하는지로 정합니다. 차가 있는지 없는지만 알면 되는 일이면 이미지 분류로 충분합니다. 몇 대인지나 어디 섰는지가 필요하면 객체 검출을 씁니다. 네모로는 모자라고 물체의 윤곽이 필요하면 분할로 갑니다.
작은 창으로 훑는 방법
분류 모델이 이미 있다면 먼저 떠오르는 방법이 있습니다. 사진 위에 작은 창을 놓고 창 안만 분류합니다. 창을 조금씩 옮기며 사진 전체를 훑습니다. 「승용차」로 분류된 창이 곧 승용차의 경계 상자입니다.
문제는 창의 수입니다. 차는 가까우면 크게 찍히고 멀면 작게 찍힙니다. 그래서 창 크기를 여러 가지로 바꿔 가며 다시 훑어야 합니다. 가로로 긴 버스와 세로로 긴 사람을 잡으려면 창 모양도 바꿔야 합니다.
결국 창의 위치와 크기와 모양을 곱한 만큼 분류를 돌리게 됩니다. 사진 한 장에 그 수가 쉽게 수천을 넘습니다. 오늘날의 검출 방법은 모두 이 낭비를 줄이는 쪽으로 나왔습니다.
두 단계 방식과 한 단계 방식
이 소절은 검출 모델이 창을 일일이 훑지 않고 답을 내는 두 갈래를 봅니다. 두 갈래는 후보를 따로 고르느냐로 갈립니다. 아래 그림이 두 흐름을 나란히 보입니다.
flowchart TD
subgraph two["두 단계 방식"]
A1["사진"] --> A2["후보 네모 고르기"]
A2 --> A3["후보마다 이름표 고르고 네모 다듬기"]
end
subgraph one["한 단계 방식"]
B1["사진"] --> B2["격자 칸마다 한꺼번에 예측"]
end
A3 --> C["겹친 네모 정리"]
B2 --> C
두 방식 모두 사진에서 단서를 뽑는 앞부분은 합성곱 신경망이 맡습니다. 합성곱 신경망은 필터라는 작은 숫자 틀을 사진 위로 옮겨 가며 선이나 모서리 같은 무늬를 찾는 딥러닝 모델입니다.
필터도 사진 위를 옮겨 다니지만 앞 소절의 창 훑기와는 다릅니다. 창마다 분류를 처음부터 다시 돌리지 않습니다. 사진을 모델에 한 번 통과시키면 모든 위치의 단서가 한꺼번에 나옵니다.
두 단계 방식은 먼저 물체가 있을 법한 후보 네모를 추립니다. 그다음 후보마다 무엇인지 분류하고 네모 위치를 조금 다듬습니다. 후보를 고르는 단계와 분류하는 단계가 나뉘어 있어 이런 이름이 붙었습니다. 대표는 R-CNN(Region-based Convolutional Neural Network, 영역 기반 합성곱 신경망) 계열입니다.
한 단계 방식은 후보를 따로 고르지 않습니다. 사진을 격자로 나누고 칸마다 「이 근처에 무엇이 어떤 네모로 있나」를 한 번에 예측합니다. 대표는 YOLO(You Only Look Once)와 SSD(Single Shot MultiBox Detector)입니다.
두 방식은 걸리는 시간에서 갈립니다. 두 단계 방식은 후보를 한 번 더 들여다보는 만큼 한 단계 방식보다 오래 걸립니다. 한 단계 방식은 사진을 모델에 한 번만 통과시킵니다. 영상처럼 1초에 여러 장을 처리해야 하면 한 단계 방식을 많이 고릅니다.
어느 방식이든 마지막에는 겹친 네모를 정리하는 단계를 거칩니다. 그 정리는 아래 「비최대 억제」 소절에서 봅니다.
겹친 정도를 재는 IoU
IoU 는 두 네모가 얼마나 겹치는지 0 과 1 사이 값으로 잽니다. 겹친 넓이를 두 네모가 함께 덮은 넓이로 나눕니다. 꼭 맞게 포개지면 1 입니다. 전혀 안 겹치면 0 입니다.
아래는 같은 크기의 두 네모가 한 변의 절반만큼 걸친 경우를 셈한 것입니다. 네모는 앞 표처럼 (x1, y1, x2, y2)로 적었습니다.
a = (0, 0, 10, 10) # 넓이 100
b = (5, 0, 15, 10) # 넓이 100
inter = 5 * 10 # 겹친 넓이 50
union = 100 + 100 - inter # 150
iou = inter / union # 0.333…
절반이 걸쳤는데 IoU 는 0.33 정도입니다. 두 네모를 합친 넓이로 나누기 때문에 눈으로 보는 겹침보다 값이 작게 나옵니다. 이 값은 아래 「비최대 억제」와 「검출이 맞았는지 재는 법」 소절에서 잣대로 쓰입니다.
겹친 네모를 하나로 줄이는 비최대 억제
모델은 한 물체 둘레에 비슷한 네모를 여러 개 냅니다. 격자 칸 여럿이 같은 승용차를 보고 저마다 네모를 내기 때문입니다. 이대로 세면 승용차 두 대가 열 대로 셈해집니다.
그래서 마지막에 겹친 네모를 정리합니다. 이 정리가 비최대 억제, 영어로 NMS(Non-Maximum Suppression)입니다. 점수가 최대인 네모만 남기고 나머지를 누른다는 뜻입니다. 순서는 이렇습니다.
- 네모를 점수가 높은 순서로 줄 세웁니다
- 맨 앞 네모를 답으로 남깁니다
- 남긴 네모와 이름표가 같고 IoU 가 기준보다 큰 네모를 지웁니다
- 남은 네모로 2번부터 되풀이합니다
이 기준은 흔히 0.5 안팎으로 둡니다. 기준을 낮추면 바짝 붙어 선 두 차를 하나로 합쳐 버릴 수 있습니다. 높이면 한 차에 네모가 둘 남을 수 있습니다.
점수 기준과 놓침 · 헛검출
비최대 억제를 거쳐도 점수가 낮은 네모가 남습니다. 서비스는 점수 기준을 정해 그보다 낮은 네모를 검출 결과 목록에서 뺍니다. 이 기준을 어디 두느냐로 두 실수 가운데 어느 쪽이 늘지가 정해집니다.
기준을 높이면 확실한 것만 남습니다. 대신 어둡게 찍힌 차처럼 모델이 덜 확신한 진짜 물체도 버려집니다. 사진에 있는 물체를 못 찾는 이 실수가 놓침입니다.
기준을 낮추면 놓침이 줄어듭니다. 대신 승용차 그림이 그려진 광고판을 승용차로 잡는 일이 늘어납니다. 없는 물체를 찾았다고 하는 이 실수가 헛검출입니다.
한쪽을 줄이면 다른 쪽이 늘어납니다. 이 맞바꿈은 정밀도와 재현율로 잽니다. 두 값을 어떻게 세는지는 다음 소절에서 봅니다.
검출이 맞았는지 재는 법
검출 하나가 맞았다고 치려면 두 조건을 다 채워야 합니다. 이름표가 정답과 같아야 합니다. 정답 경계 상자와의 IoU 가 기준 이상이어야 합니다. 이 기준으로는 0.5 를 흔히 씁니다.
이렇게 맞은 검출을 세면 두 비율이 나옵니다. 모델이 낸 검출 가운데 맞은 것의 비율이 정밀도입니다. 사진에 있던 물체 가운데 찾아낸 것의 비율이 재현율입니다. 헛검출이 많으면 정밀도가 떨어집니다. 놓침이 많으면 재현율이 떨어집니다.
점수 기준을 하나로 정하면 정밀도와 재현율도 한 쌍 나옵니다. 기준을 옮길 때마다 이 쌍이 하나씩 더 나옵니다. AP(Average Precision, 평균 정밀도)는 이 쌍들을 숫자 하나로 묶은 값입니다. 재현율이 낮은 쪽부터 높은 쪽까지 옮겨 가며 정밀도를 평균 냅니다.
mAP(mean Average Precision, 평균 정밀도의 평균)는 이름표마다 AP 를 구해 다시 평균 낸 값입니다. 검출 모델끼리 견줄 때 가장 많이 쓰는 숫자입니다.
학습에 드는 정답
검출 모델을 학습시키려면 정답이 필요합니다. 사진마다 물체 둘레에 네모를 치고 이름표를 단 것이 정답입니다. 레이블링은 사람이 이 정답을 다는 일입니다.
검출의 레이블링은 분류보다 품이 많이 듭니다. 분류는 사진마다 이름표 하나면 됩니다. 검출은 사진 속 물체를 하나도 빠뜨리지 않고 네모를 쳐야 합니다. 빠뜨린 물체는 모델에게 「여기엔 아무것도 없다」는 정답으로 읽힙니다.
그래서 처음부터 학습하기보다 이미 학습된 모델을 가져오는 일이 흔합니다. 공개된 사진 묶음으로 미리 학습된 모델을 자기 사진으로 조금 더 학습시킵니다. 전이 학습은 이렇게 남이 학습시킨 것을 이어받는 방법입니다.
백엔드 개발자가 검출을 붙일 때
모델을 직접 설계하는 일은 드뭅니다. 대개는 학습된 모델을 서버에서 돌립니다. 사진을 보내면 검출 결과를 돌려주는 외부 API(Application Programming Interface, 응용 프로그램 인터페이스)를 부르기도 합니다. 추론은 학습된 모델에 새 사진을 넣어 답을 받는 일입니다.
이때 개발자가 맞춰야 할 것이 셋 있습니다. 경계 상자의 좌표 기준, 점수 기준, 추론을 돌릴 곳입니다.
먼저 좌표 기준입니다. 모델은 대개 사진을 정해진 크기로 줄여서 받습니다. 그러면 돌려준 경계 상자도 줄인 사진 기준입니다. 번호판만 잘라 글자를 읽으려면 원본 크기로 되돌려야 합니다.
가로 1920 · 세로 1080 픽셀 사진을 가로 640 · 세로 360 으로 줄여 넣었다고 해 봅시다. 가로세로 모두 3분의 1 입니다. 모델이 돌려준 왼쪽 위 꼭짓점을 원본으로 되돌리면 이렇습니다.
s = 1920 / 640 # 3.0
x1, y1 = 40, 114 # 줄인 사진 기준
x1 * s, y1 * s # (120.0, 342.0)
되돌린 값이 앞 표에 적은 첫 승용차의 왼쪽 위 꼭짓점입니다. 이 네모만 잘라 광학 문자 인식에 넘기면 사진 전체를 읽을 때보다 엉뚱한 간판 글자를 읽을 일이 줄어듭니다.
다음은 점수 기준입니다. 몇 점을 넘는 답만 받아들일지는 서비스가 정합니다. 기준에 못 미친 네모가 있는 사진은 버리지 않고 사람이 확인하는 대기열로 보내기도 합니다.
마지막은 추론을 돌릴 곳입니다. 추론은 보통의 요청 처리보다 오래 걸립니다. 추론에는 대개 GPU(Graphics Processing Unit, 그래픽 처리 장치)를 씁니다. 사진을 받는 요청과 추론 사이에 큐를 두면 요청이 추론을 기다리지 않고 바로 끝납니다.
영상이라면 장면마다 검출을 돌립니다. 검출은 장면 하나만 보므로 앞 장면의 차와 이번 장면의 차가 같은 차인지는 모릅니다. 같은 물체를 장면끼리 이어 붙이는 일은 객체 추적이 맡습니다.
관련 항목
객체 검출과 답의 꼴로 갈리는 비전 문제
이미지 분류 · 이미지 분할 · 의미론적 분할 · 인스턴스 분할 · 객체 추적 · 광학 문자 인식 · 자세 추정
객체 검출이 내놓는 답의 구성 요소
경계 상자 · 클래스 레이블 · 신뢰도 점수 · 픽셀 · 이미지 좌표계
객체 검출 모델이 거치는 처리 단계
전처리 · 영역 제안 · 앵커 박스 · 특징 피라미드 네트워크 · 비최대 억제 · 후처리
객체 검출을 구현한 모델 계열
R-CNN · Faster R-CNN · YOLO · Single Shot MultiBox Detector · RetinaNet · DETR
객체 검출 모델을 만드는 학습 방법
머신러닝 · 딥러닝 · 신경망 · 합성곱 신경망 · 지도학습 · 전이 학습 · 레이블링 · 데이터 증강
객체 검출을 재는 지표
IoU · 정밀도 · 재현율 · 정밀도와 재현율 · 평균 정밀도 · mAP · 혼동 행렬
객체 검출 모델을 서비스로 굴리는 수단
추론 · 모델 서빙 · GPU · 큐 · 배치 처리 · 엣지 컴퓨팅
객체 검출을 채택한 응용 분야
번호판 인식 · 얼굴 검출 · 자율 주행 · 영상 감시 · 의료 영상 · 머신 비전
객체 검출을 구현한 라이브러리
OpenCV · PyTorch · TensorFlow · ONNX Runtime
객체 검출이 속하는 상위 분야
다른 이름: object detection · 물체 검출 · 객체 탐지 · 오브젝트 디텍션