이미지에 나타난 객체의 크기를 알고싶을 수 있다. 단지 pixel수를 세어서는 크기를 알아낼 수 없기에객체의 크기를 정교하게 측정하는 방법이 필요하다. →Imaginea Labs에서 제안한 방법에 따라 사진상의 객체를 측정하는 과정을 단계별로 알아보자.
🤔 Reference Object client의 사진만으로 신발사이즈를 추천해보자. 발치수 예측모델의 추론 시, 다양한 발자국 이미지를 처리하기에 Augmentation이 필수적이다. 또한, 카메라와 종이의 거리같은 요인또한 존재하기에 효과적인 solution을 만들기란 쉽지않다. 이런scale문제는 거의 모든 client가 갖는참조객체(Reference Object)를 image에 포함시켜 간단히 해결할 수 있다. 고객 대부분은 표준크기의 카드를 갖고 있을 것이므로 이를 보정객체(calibration object)로 활용할 수 있다. 좌측보다 우측이 좀 더 확대된 이미지즉, 참조대상을 추가시켜 이를 해당 객체와 발을 비교하는 것으로 단순화시키는 것이다.
🤔 Segmentation 모델은 먼저 image를 2가지로 세분화해 추출해야한다. ∙ 신용카드 ∙ 발자국 이를 위해 Mask R-CNN을 사용한다. Mask분기를 통해 발자국, 신용카드 각각에 대한 마스크를 예측해 위 그림 우측처럼 유사한 결과를 얻는다. 이제 우린 위의 예측된 마스크를 아래처럼 개별적인 각각의 마스크로 볼 수 있다.
이제, 올바른 측정값을 얻기 위해 Mask들을 정렬해야한다.
🤔 회전수정 Mask를 얻은 후회전에 대한 정규화를 수행해야한다. 회전을 수정하기 위해각 Mask에 대해 PCA로 Eigen Vector값을 얻는다. 가장 큰 고유벡터의 방향의 객체의 크기 = 객체의 길이. PCA의 특성상2번째 주성분부터의 고유벡터는 분산에 대한 기여도가 점점 줄어든다. PCA이전, Mask의 차원은 좌측그림처럼 원본 이미지에 대한 차원축을 갖는 vector space에 존재한다. PCA이후, 고유벡터들이 다른 vector space basis에 위치, 축이 가장 큰 분산의 방향을 따른다(우측그림). →원래 좌표축과 첫번째 고유벡터사이의 각도를 이용해 얼마나 회전보정해야하는지 결정할 수 있다.
🤔 비율 및 측정 회전수정된 Mask를 통해 이제 발자국 측정이 가능하다. ❗️ 발자국과 신용카드의 측정값은 cm가 아닌, pixel단위라는 점에 유의
신용카드의 정확한 치수만 알면 필셀치수와 카드의 실제치수 사이 비율을 통해 신발 치수를 예측, client에게 제공해줄 수 있다.
ii) Counting
🤔 Filter 분해 아래 사진에서 포도의 알은 몇개일까? 지금까지의 소개한 개념을 기초로, 아래 접근방식 중 하나를 취할 수 있다.
Detection Classifier를 훈련, 열매를 검출, Bbox개수세기 (박스가 열매를 합쳐버릴 수 있다는 단점)
Segmentation방법으로 접근, 군집의 속성에 따라 열매개수결정. (열매가 너무 작거나 크면 잘못된 결과 초래.) 즉, 참조객체를 활용하기 곤란.
🤔 PoseNet [1단계] ∙ Detection모델을 사용해 Interest point의Heatmap을 식별 (일반적인 Interest point: 관절(joint or landmark), 눈, 코 등) (Heatmap: Detection모델 classifier head에서 출력되는 점수 = threshold지정 이전값)
[2단계] ∙ Detect된 각 joint를 기준, 근처 joint의 가장 가능성있는 위치 식별.
[3단계] ∙ Hough Transform이라는 Weighted Voting Mechanism으로 1,2단계에 따라 선택된 Joint기반, pose검출. 이때, 2,3단계는 다양한 joint탐지를 위해 단순 detection모델로는 충분치 않기에 필수적이다. 그렇기에 joint와 joints사이의 offset도 예측하는 것이다.
🤔 다중객체의 pose estimation 단일 이미지에서 여러사람의 pose estimation을 위해 위의 step에 몇가지 기술추가가 필요하다.
1. segmentation모델을 활용, 사람에 해당하는 모든 pixel 식별 2. joint조합을 참고해 가장 가능성 높은 신체부위 식별 3.각 사람에게 사람 pixel을 할당. (1에서 찾은 mask의 Pixel과 2에서 식별한 가능성높은 joint를 이용.)
🧐 Human Pose Estimation 방식
1) Top-Down 방식
: 사람을 먼저 Detect → Detect된 자세를 추정.
정확도가 Bottom-up방식보다 높음. 검출된 사람들을 순회하며 joint들을 찾기에 속도가 Bottom-up방식보다 느리다 보통 저해상도에서 고해상도로 과정이 수행
즉,object detector를 사용해, 개별 instance를 식별(identifying), localizing → 한 사람의 포즈를 추정.
ex) AlphaPose, Mask-RCNN
2) Bottom-Up 방식
joint를 먼저 Detect → 서로 연결해 자세를 추정. 정확도는 Top-down 방식에 비해 떨어짐.
Object Detection 과정이 없어 속도가 빨라 실시간 처리에 사용 가능 보통 고해상도에서 저해상도로 과정이 수행
즉, 확인되지 않은(identity-free) 의미론적 실체(semantic entities)를 지역화→사람 인스턴스로 그룹화
🤔 분산 검색 유사한 임베딩 검색을 위해선? Dataset의 image embedding에 대한 Search Index를 생성해야한다. 이 embedding index를 대규모분산데이터웨어하우스에 저장한다 가정하자. 이때, embedding과 다른 모든 embedding간의 유클리드 거리를 계산하고 가장가까운 일치항목을 표시한다.
🤔 빠른 검색 위의 예제에서 대규모데이터웨어하우스는 효율적 검색이 가능하지만 latency가 긴 경향이 있기에 ms로 응답시간을 얻을 수 없다.
🤔 더 나은 임베딩 더 맞춤화된 embedding을 사용할 수 있다. ex) 얼굴유사성을 검색할 때,얼굴을 식별하고 확인하도록 훈련된 모델의 embedding이 일반 embedding보다더 성능이 좋다. FaceNet: 목적: facial search embedding최적화를 위해 얼굴특징을 기반 정렬된 일치/불일치 얼굴패치의 삼중항(triplet)을 사용. 삼중항: 일치하는 얼굴섬네일 2개 + 일치안하는 얼굴섬네일 1개
Triplet Loss: 가능한 최대거리만큼 양성쌍과 음성쌍을 분리하는 것이 목표인 함수. 라벨로 함께 군집화한 embedding생성에 사용가능.
<아래 3개의 image>로 정의된다. ∙anchor이미지,같은 label의 다른 이미지(두번째 이미지와 anchor가 양성쌍을 형성) ∙다른 label을 갖는 3번째 이미지(세번째 이미지와 anchor는 음성쌍을 형성) 세 이미지에 대해 삼중항 (a,p,n)손실은 거리 d(a,p)가 0을 향하고 거리 f(a,n)이 f(a,p)보다 일정한 여유만큼 더 크게 정의된다. 이때, α 는 margin(= positive와 negative의 거리)을 의미.이 손실에 대해 음성은 3가지로 나뉜다. ∙Hard Negative: 양성보다 앵커에 더 가까움 ∙Easy Negative:앵커에서 아주 멀리 떨어져있음 ∙Semi-Hard Negative:양성보다는 멀리있으나 여유거리내에 있음 Linear Layer추가 후, Semi-Hard Negative에 초점을 맞춰 해당이미지의 삼중항손실을 최소화하도록 모델을 훈련시켜 embedding을 개선시킬 수 있다. 결과적으로 결과 embedding이 유사한 label로 clustering된다.