본 포스팅은 충남대 고영준 교수님의 강의자료를 바탕으로 작성한 글입니다.
객체탐지에서 input은 RGB image이고,
output은 탐지된 객체들이다. 카테고리 라벨과 바운딩 박스를 포함한!
그리고 더 많은 탐지를 위해서는 더 높은 해상도가 필요하다. (작은 객체도 탐지하려면!)
Single object
feature vector를 추출하는 구조를 backbone이라고 할 것이다.
What 카테고리 라벨
backbone을 통과한 후 벡터 형태의 출력을 linear layer를 통과시켜 class 개수만큼의 차원으로 이루어진 출력을 낸다.
뭐 예를 들어.. Cat:0.9 Dog:0.05 Car:0.001 이런식으로 나올 것이다.
그럼 Correct label인 Cat과 비교해 Softmax Loss를 계산하여 모델을 학습시킨다.
Where 바운딩 박스
위의 backbone을 마찬가지로 통과한 후 벡터 형태의 출력을 lineat layer를 통과시켜 4개의 차원으로 이루어진 출력을 낸다.
왜냐? x, y, w, h를 맞힐 것이기 때문!
이후 correct box의 x', y', w', h'와 비교해 L2 Loss를 계산하여 모델을 학습시킨다.
그럼 이 두 개를 같이 해야 하는 object detection에선, 카테고리 라벨과 바운딩 박스에서 발생한 Loss 둘을 합해 최종 Loss로 본다.
(그리고 보통 backbone은 이미 imageNet에서 학습된 애들을 쓴다.)
근데 이렇게 하면 문제가 생기는 것이, 만약 더 많은 종류의 객체가 있다면 어떡할 것인가!
Multiple object
이미지마다 객체가 몇 개씩 있는지는 다르다.
위의 방법을 적용시킨다 해도, 엄청 많은 객체가 있다면 Duck1 : (x, y, w, h), Duck2 : (x, y, w, h), ..., 이런식으로 많은 출력을 가질 것이다.
basic idea는,
1. 후보 영역 집합을 샘플링한다.
2. 각 영역(region)에 대해 이미지 분류를 수행한다.
여기선 sliding window를 사용하는데, 필터를 만들어놓고 얘를 사진에서 움직이는 것.
근데.. 그럼 가능한 bounding box가 도대체 몇 개겠음? 셀 수가 없다.
만약 box가 h*w라 하면, 가능한 x좌표는 W-w+1개, y좌표는 H-h+1개이므로 가능한 위치 자체가 (W-w+1)*(H-h+1)개이다.
그러고 가능한 box 개수는 H(H+1)W(W+1)/4 이다..
region proposal
지역 제안은 합리적인 실행 시간으로 객체를 놓치지 않고 Rol의 수를 줄여야 함..
selective search
위의 지역제안 알고리즘은 계층적 응집 클러스터링에 기반한다.
1. 초기화 : input image를 겹치지 않는 많은 요소들로 나눈다. 각 나눠진 그룹들은 같은 색임
2. 각 세그먼트에 대한 후보 경계 상자 영역 생성
3. 위치, 색, 크기에 기반해 각 segment를 섞는다.
4. 2-3번을 반복한다, 하나의 segment만 남을 때까지
region classification
각 ROI를 객체인지 배경인지 구분하고,
배경 클래스와 함께 이미지 분류를 진행한다.
한 객체에 대한 여러 detection이 있을 때,
nms를 통해 겹치는 detection을 제거함..
R-CNN
Region-Based CNN
Input image에서 임의의 크기의 박스들이 뽑혔다고 하자.
그건 일정한 크기의 image로 바뀌게 되고, (Warped image regions) - 224*224
각각은 ConvNet을 통과하게 되어 class와Bbox(tx, ty, th, tw - ROI를 맞추기 위한 예측 변환 파라미터)를 출력한다.
이렇게 되면 결과적으로 출력은 탐지된 객체의 집합이 되는 것이다.
위의 파라미터를 예측하는 과정(tx, ty, th, tw)에서, 경우가 둘로 나뉘는데,
transform이라면 tx, ty, th, tw가
이렇게 되는 거고,
offset이라면 ox, oy, oh, ow가
이렇게 되는 것이다.
그리고 nms로 bbox를 구하는 것에 대해 더 자세히 말하자면,
1. 가장 높은 점수의 box를 고르고
2. 그다음으로 높은 box와의 IoU를 구해서 이를 threshold와 비교 후,
3. 만약 박스가 남아있다면 다시 1번 과정부터 반복!
근데 이 과정은.. 막 객체가 엄청나게 많은 image가 있을 때는 정확히 수행되지 못한다.
Fast R-CNN
R-CNN의 문제는 너무 느리다는 것이다. 그냥 저 bbox를 구하고 이미지 분류하는 과정을 계속 거쳐야 하기에..
그래서 여기서 생각한 것은, warping을 하기 전에 아예 convnet을 통과시켜놓자는 것이다.
그 convnet을 backbone이라 하는데, 어떤 구조를 쓸지는 뭐.. 아무거나 정하는 것이다. AlexNet, VGG, ResNet 등..
그 input image를 ConvNet에 통과시키면 Image feature가 출력으로 나올 것이다.
그럼 여기서 RoI(Region of Interest)를 찾는 것이다.
이후 이 feature들을 Crop하고 resize하여 Per-Region Network(조금 가볍게 변형시킨..)에 통과시킨다. 이것도 CNN
최종적으로 class 와 bbox를 출력해내는 것이다.
그럼 Per-Region Network가 뭘까.. 싶겠는데, 정말 간단하다.
기존 모델을 둘로 나눠서 출력 부분을 Fast R-CNN의 출력 CNN에 쓰고, 입력 부분을 backbone에 쓰는 것.
사진으로 보면 이해가 편한데, 아래는 AlexNet을 둘로 나눠서 빨간 부분을 출력 CNN, 파란 부분을 backbone에 쓴 것이다.
마찬가지로 뭐 ResNet도 이런식으로 나눠서 쓰면 된다.
그럼 Crop+Resize features는 어떻게 하냐? 하면,
이렇게, 이미 만든 Image features에서 객체의 bbox 부분을 찾아, 원하는 크기로 만들기 위해 각 격자를 나누면 된다.
지금은 2*2로 만들고 싶어서 그렇게 나눈 것이다.
이후 max-pooling을 해서 512*2*2 크기의 region features로 만들어준다.
(보통 2*2로는 잘 안 하고.. 7*7 정도 크기로 만들긴 하는데, 일단 편의를 위해 이렇게 한다.
근데 만약에! 객체의 bbox를 찾아서 이를 Image features에서 봤더니.. 좌표가 실수값으로 나타난다.. 이러면?
이렇게 일단 등분을 하고, 거기서 4개의 픽셀을 알아서 찾음. 비율 맞도록. 그리고 이를 interpolation을 이용해 바꿀 수 있다.
그냥 진짜 interpolation 공식이랑 똑같음.
이것도 이렇게 진행하고서 max-pool 하면 됨.
Fast R-CNN vs Slow R-CNN
Fast는 일단 이미지를 ConvNet에 통과시킨 후 feature detection을 해서 crop하고 CNN 통과시키고 bbox와 class 출력
Slow는 모든 region마다 ConvNet 통과시켜서 bbox와 class 출력
train할 때는 거의 10배 정도 속도의 차이가 나고,
test할 때는 22배 정도 속도의 차이가 나는 것 같은데, 여기서 region proposal을 포함하느냐 마느냐에 따라 속도가 또 많이 차이난다.
왜냐면 이건 원래 휴리스틱한 Selective Search 알고리즘으로 진행돼서 그런데, 이걸 이제 CNN으로 바꿔보겠다!
Faster R-CNN
Learnable region proposals
이건 Region Proposal Network, RPN을 추가한 것이다.
CNN(backbone)을 통과한 이미지 feature에다가 anchor box를 씌워볼 건데, 이건 고정된 크기로 모든 point를 탐색한다
그러고 그 박스가 객체를 포함하고 있느냐를 탐지한다.
긍정적인 박스에 대해, anchor box에서 object box로 변경해서 객체 탐지를 진행한다.
anchor box의 크기가 잘못된 경우를 생각해서 k개의 다른 anchor box를 각 point에 대해 시행한다.
여기선 loss의 종류가 4가지가 있는데,
1. RPN classification : anchor box가 객체인지 아닌지
2. RPN regression : anchor box를 proposal box로 잘 변환했는지
3. Object classification : proposal들을 배경과 객체로 잘 구분했는지
4. Object regression : proposal box를 object box로 잘 변환했는지
anchor box : 사전 정의된 특정 크기의 박스
proposal box : 객체 후보 영역
object box : 실제 gt 영역
RPN에선 object의 위치를 예측하는 ConvNet과 Box offsets(h, w, x, y)를 나타내는 ConvNet은 따로 존재한다.
[클래스 수 + 1(배경)] * 4(offset)
이건 총 두 단계로 진행되는데,
1. per img
- backbone - region proposal net
2. per region
- crop - class predict - bbox offset predict
근데 저 per region 단계가 필요할까?
- FCN 접근(속도 빠르지만 정확도 낮음)
Instance segmentation
Mask R-CNN
객체 있는 부분만 뽑아낼 수 있는 binary mask
FPN
Feature Pyramid Network
규모 불변성 및 등분산 개선
1. Img Pyramid
- 이미지 피쳐 추출해서 predict하는 걸 크기 줄이면서 쌓음
2. Multi-scale Features
- 이미지 크기 줄이는 걸 쌓아서 predict함
3. Naive In-network Pyramid
- 이미지 크기 줄여서 predict, 줄여서 predict..
- 필터 통과할수록 strong features, low resolution
4. Feature Pyramid Network
- 일단 크기를 줄이면서 올라가고, 그걸 크기를 키우면서 합체하면서 predict
feature 퀄을 그닥 따지지 않기에 여전히 빠르긴 함
그럼 저 4번에서 upsample은 어케 함?
일단 Img에서 필터 통과해가면서 feature map 크기 감소. 이걸 1*1 Conv에 통과시켜 차원 축소. 그러고 upsampling
차언축소된 애들이랑 upsampling된 애들 중 크기 맞는 애들끼리 더해서 새로운 feature map을 만들고,
이를 Conv에 통과시켜 최종 feature map 생성
DCN(Deformable convolution network)
이렇게 변화를 주는 것. 가지각색의 정보가 들어올 것임.
Object Detector 2 stage
1. 후보 영역 샘플링
2. 각 영역에 대해 이미지 분류 수행
ex) Faster R-CNN, RPN, RoI pool/Align, bounding box regression, nms
YOLO
위에서 말했듯, 진짜 2단계나 필요할까?
YOLO는 1단계로도 충분하다.
1. 이미지를 격자단위로 나누고
2. bbox 와 class 를 각 영역에 대해 예측하고
3. nms 수행
SSD는 anchor box와 multi-scale feature map 이용
'AI > 컴퓨터비전' 카테고리의 다른 글
Vision Transformer (0) | 2024.12.16 |
---|---|
Image Warping (new!) (0) | 2024.12.16 |
Image Alignment (1) | 2024.12.16 |
SIFT (0) | 2024.12.16 |
Image Classification (0) | 2024.12.15 |