HPE(Human Pose Estimation)
- 사람의 관절이나 중요 신체부위를 keypoint로 지정하여 사람의 자세를 예측하는 기술
2D HPE란?
- 입력 이미지로부터 사람의 2D 관절 좌표(x,y)를 추정하는 기술
2D HPE 방법론
- Heatmap-based approach vs Regression-based approach
- Top-down approach vs Bottom-up approach
Headmap-based approach
- 입력 이미지로부터 각 관절이 나타날 확률(heatmap)을 추정
- Gaussian filter를 통해 Ground truth heatmap 생성
- Heatmap으로 부터 J번째 관절 위치(최대 pixel value를 갖는 위치)와 confidence value(pixel value)출력
- 학습 방법*
- 2D 관절 정답 좌표를 히트맵으로 변환
- 모델에서 추정된 히트맵과 오차를 줄이는 방향으로 학습(L2 Loss)
- 입력 이미지에 관절 위치를 알 수 없는 경우? Loss를 0으로 지정
특징
- 2D HPE에서 일반적으로 사용
- Optimization이 쉽고, 일반화에 강건함
- 정확도가 높음
- 공간적인 위치정보를 보존함
- 히트맵 크기에 따라 연산량이 커질 수 있음
Regression-based approach
- 입력 이미지로부터 ent-to-end 방식으로 2D 관절 좌표를 직접 추정하는 방식
학습 방법
- 모델에서 추정된 2D 관절 좌표와 2D 정답 관절 좌표와의 오차를 줄이는 방향으로 학습
특징
- 효율적이며 실시간 어플리케이션에 적합
- 입력 이미지로부터 관절 좌표 맵핑이 비선형적이기 때문에 local optimum에 빠지기 쉬움
Top-down aproach
- Human detection(e.g. YOLO) + single person pose estimation
- 사람 영역만을 검출하여 모델에 입력되므로 상대적으로 정확도가 높음
- Human Detector에 관절 추출 성능이 좌우됨
- 사람 영역 검출 후 관절 좌표를 추출하기 때문에 연산량이 상대적으로 많음
Bottom-up approach
- Joint detection + grouping
- 원본 이미지로부터 여러 사람 관절을 직접 추출하기 때문에 연산량이 상대적으로 적음
- 관절 추출에 사용되는 사람영역 이미지가 저해상도일 수 있음
2D HPE 평가방법
- Percentage of Correct Keypoints (PCP)
- Percentage of Detected Joints (PDJ)
- Percentage of Correct Keypoints (PCK)
- Average Precision (AP)
- Object Keypoint Similarity (OKS)
2D HPE 모델링 순서
- 전처리
- Architecture
- Loss
- 평가
- 후처리
전처리
이미지 데이터 전처리
- 이미지 Crop (Top-down approach 적용)
- 입력 이미지에서 사람 영역에 해당하는 부분만을 자르는 방법
- 인물 관절 좌표를 기준으로 상하좌우 10~20% 만큼 margin 확보
- 이미지 Resize
- 딥러닝 모델 입력 크기에 맞도록 이미지 사이즈를 변환
- 학습 데이터셋의 사람 영역 이미지 Height:Width 비율에 따라 달리질 수 있음
- Normalization
- 데이터의 범위를 사용자가 원하는 범위로 제한하는 것
- 학습 속도를 높이고 Local optimum에 빠지는 확률을 낮춤
- 이미지 Normalize
- 이미지 데이터를 RGB 각 채널 평균을 뺀 뒤, RGB 각 채널 표준 편차를 나누어 정규화
- 위 수치는 많은 Vision 모델들의 pretraining에 사용된 ImageNet 데이터셋의 평균 및 표준편차
관절 데이터 전처리
- 관절 좌표 위치 변환
- 원본데이터에서 관절 좌표 위치를 Crop된 바운딩 박스 기준 좌표 위치로 변환 하는 것
- 관절 좌표 -> 히트맵 변환 (heatmap-based-approach)
- 각 관절 별로 가우시안 필터링을 적용한 히트맵이미지를 생성(J x H x W)
- 관절 좌표 normalize (regression-based approach)
- 바운딩 박스 이미지 내의 절대좌표를 0.0~1.0 사이의 값으로 normalize
HPE에서 활용되는 데이터 증강 예시
- Random rotation
- Random scale
- Horizontal Flip
Architecture
딥러닝 네트워크 구성
- Backbon : 입력 이미지로부터 feature map 추출
- Neck : Backbone과 Head사이를 이어주는 연결부
- Head : feature map으로 부터 원하는 결과를 만드는 단계
Stacked Hourglass(2016)
- 8개의 hourglass module을 쌓은 모델
- Maxpooling을 통한 low resolution feature 생성 -> upsampling을 통한 high resolution feature 생성 과정을 반복
- Intermediate supervision으로 정확도 향상
Hourglass module
- Bottom-up, Top-down Inference : 여러 scale에 걸쳐 필요한 정보를 포착
- 얼굴, 손과 같은 작은 부분의 식별 뿐만 아니라 몸 전체 부분에 대한 식별
- Residual module : 몇 개의 layer를 건너뒤어 skip connections을 적용하여 gradient vanishing(기울기 소실) 문제 완화
Stacked Hourglass with Intermediate supervision
- 최종적으로 예측된 heatmap을 통해서만 loss를 구하지 않고, hourglass module 사이사이에 heatmap에 대해서도 추가적으로 loss를 구해 적용함으로써 틀린 부분을 보다 정교하게 보정4
- 이전 hourglass 모듈의 결과값과 현재 hourglass 모듈의 결과값을 결합
**Simple Baseline(2018)
- 단순한 네트워크 구조로 높은 성능 달성
- BackBone : ResNet50, Head: Three Deconv. Layer
- ResNet50 : 입력 이미지를 32배 downsample, Three Deconv. : 8배 upsample
- Deconv. layer는 고해상도의 rich semantic information을 뽑기 위함
Deconvolution
- feature map의 크기를 증가시키는 연산
- CNN의 최종 결과물을 다시 반대로 되돌려 입력 사이즈를 만들어내고 싶을 때 활용 (e.g. semantic segmentation)
- 과정 : 입력 픽셀 주위에 zero-padding을 추가 -> Convolution 연산
HRNet(2019)
- 이전 HPE 모델 문제점
- BackBone에서 입력 이미지가 downsample되어 저해상도 feature map을 초래
- 저해상도 featuremap에서는 인간의 작은 파트(손목 등)이 사라질 수 있음
- 고해상도 feature map을 전체 프로세스 내내 보존, 저해상도 featuremap을 병렬적으로 추가
-> 한번도 up/down sample되지 않은 feature map으로 인해 정확도 향상 - Multi-Scale feature fusion : 더욱 강인한 feature추출을 가능하게 함
ViTpose(2022)
- 현재 2D HPE 분야 Top rank 성능(APL 81.1 on COCO)
- Backbone : Vision Transformer
- Head : Simple Decoder (4 Scale Upsample -> ReLu -> 3 x 3 Conv)
Transformer
- NLP에서 높은 성능을이끌고 있는 모듈
- 입력으로 들어오는 token들 사이의 correlation을 계산하고 correlation에 기반하여 모든 token feature을 aggregate
Vision Transformer
NLP 분야에서 활용된 transformer를 컴퓨터비전에 적용한 네트워크
CNN에 의존하지 않고 이미지 패치의 시퀀스를 입력값으로 사용하여 CNN 기반의 모델 성능을능가
Transformer의 Encoder부분 활용
장점
- 높은 연산 효율성과 확장성
- 모델 크기를 다양하게 조절 가능
- Transformer의 레이어를 쌓거나, feature dimension을 쉽게 늘리거나 줄일 수 있음
- 데이터셋과 모델 크기가 계속 커져도 모델 성능이 포화되지 않고 지속적으로 개선
- Transfer learning시 CNN보다 연산량이 적음
- 높은 연산 효율성과 확장성
단점
- Inductive bias가 부족하여 CNN보다 더 많은 데이터 필요
- Inductive bias : 모델이 처음보는 입력에 대한 출력을 예측하기 위하여 사용하는 가정
과정
- 이미지 패치 단위로 자르기
- 위치 정보를 포함하도록 Positional Embedding 추가
- Class 정보를 포함하는 [CLS] 토큰을 제일 첫부분(0번)에 추가
- Patch를 Flatten(Linear Projection) 한 뒤 Transformer encoder에 입력
- Transformer encoder를 거쳐 나오는 [CLS] 토큰 값을 MLP Head에 넣어서 Class를 예측
MAE(Masked AutoEncoder)
- 기존 vision task에서는 ImageNet을 활용하여 backbone 사전학습 -> Pose estimation task와는 거리가 멀고 많은 양의 데이터 필요
- 적은 양의 Pose 데이터셋으로 BackBone 사전학습을 진행
- Patch의 일부를 마스킹 하면서 Encoder의 끝 부분에서 마스킹 된 부분을 추축하도록 하는 방식
Bilinear Interpolation
- x, y의 2차원에 대해 보간법을 통해 필요한 값을 채우는 방법
Mask R-CNN(2017)
- 기준 Top-down approach와 차이 -> 입력 이미지에서 사람 영역을 crop and resize
- RolAlign -> 입력 이미지가 아니라 feature map에서 crop and resize
- Human detection과 pose estimation이 공유 -> e2e learning and more efficient
RolAlign
- Feature map에서 crop and resize(미분 가능)
- 인간 영역의 feature을 bilinear interpolation을 통하여 추출함
- 추출된 단일 사람의 feature는 pose estimation에 사용됨
2D Human Pose Estimation
- 추출된 단일 사람의 feature로부터 2D heatmap 추정
- Shape of 2D heatmap : J x H x W
Associative Embedding(2017)
- 2D 관절 추출을 위한 heatmap 추정 _ 추정된 관절을 사람별로 grouping 하기 위한 associative embedding 수행 (bottom-up approach)
- 각 픽셀이 어떤 사람에게 속하는지 tag value를 embedding
- 같은 사람에 속하는 관절들은 같은 tag value를 같도록 학습
- 테스트 단계에서 tag value들의 차이가 임계치보다 적으면 같은 관절에 속한다고 판정
- 한계점 : 보이는 부분에만 tag value를 주기 때문에, 폐색(occluson)에 취약
OpenPose(2017)
- 입력 이미지로부터 여러 사람의 2D 관절을 실시간으로 추정(Bottom-up approach)
- 관절 좌표 예측을 위한 confidence map 추정 + 각 인물의 관절을 연결하기 위한 Part affinity Fields 추정
- 구조
- Backbone: VGG-19
- Two branch
- Confidence map(S) : 신체 관절 좌표 위치 추정(heatmap)
- Part affinity field(L) : 추출된 관절이 어떤 사람에 속하는지 추정(2d vector fields)
- Two branch의 결과와 feature map을 연결하여 같은 과정을 여러 번 반복하여 결과 refine
Confidence map
- 신체부위가 위치할 가능성을 확률로 표현한(0.0~1.0) 이미지
- 관절이 위치한 픽셀을 중심(중심 값은 1.0)으로 퍼지면서 값이 감소하는 heatmap을 생성
Part affinity fields(PAFs)
- 한 관절 파트에서 다른 관절 파트로 이어지는 방향을 인코딩한 2D 벡터(인체부위 사이의 연관 정도)
- 관절이 연결된 정보를 담고 있고 누구의 것인가를 파악하는데 사용
HigherHRNet(2019)
- HRNet과 같은 motivation 활용 (고해상도 feature map 사용)
- Bottom-up approach들이 입력으로 받는 여러 ㄴcale의 사람을 강건하게 추정하기 위하여
- Multi-resuolution supervision 적용 : 여러 resolution의 heatmap 추정
- Multi-scale fusion 적용 : 여러 resolution의 heatmap을 조합하여 나은 추정을 하도록 학습
Deconvolution module
- 영상 속 작은 영역 사람은 고해상도 feature map 필요
- Deconv. module은 HRNet에서 출력된 히트맵의 해상도를 높이는 역할
- 4x4 deconvolution 수행
Grouping
- 추정된 관절을 사람별로 grouping 하기 위한 associative embedding수행
- 각 픽셀이 어떤 사람에게 속하는지 tag value를 embedding
Loss
L2 Loss(Heatmap-based approach)
- HPE에서 일반적으로 사용되는 방식
- 모든 조인트에 대한 정답 히트맵과 예측된 히트맵의 오차를 줄이는 방향으로 학습
평가
- 패ㅡ쓰
후처리(Post processing)
Pose Resampling (PoseFix, 2019)
- 기존 2D HPE 모델을 통해 출력된 2D 관절 좌표를 refine하는 네트워크
- 기존 2D HPE 연구들에서 추정된 2D 관절좌표는 유사한 error distribution을 가지고 있음
- 이 error의 통계를 사전정보로 활용하여 합성 포즈(synthetic pose)를 생성하고 훈련데이터로 활용
Synthesize pose
- 자세의 오차 분포를 기반으로 무작위로 합성된 자세를 생성
- Good : 정답 관절 좌표와 아주 작은 변위(very small displacement)가 있는 것
- Jitter : 정답 관절 좌표와 작은 변위가 있는 것
- Inersion : 관절 좌표가 좌우가 뒤 바뀐 것
- Swap : 관절 좌표가 다른 사람에 속한 것
- Miss : 정답 관절 좌표와 아주 큰 변위가 있는 것
Smooting
- 인접한 프레임의 관절 좌표 정보를 활용하여 추출 결과를 부드럽게 하는 방법
- 실제로 관절을 보면 많이 흔들린다.
- 방법 : Low-pass filter, Savitzky-golay filter
- Low-pass filter
- 노이즈가 많은 고주파 신호는 걸러내고, 저주파 신호는 통과시키는 필터
- 이전 프레임(i-1)의 관절 정보를 얼마나 참고할지 Smoothing factor값을 조절하여 현재 프레임의 필터링 된 관절 위치 결정 및 노이즈 제거
- Smoothing factor a(alpha)의 크기에 따라 Jitter(떨림), lag(지연) 현상 발생
- smoothing factor가 낮아지면 : Jitter 발생
- smoothing factor가 높아지면 : lag 발생
Svitzky-golay filter
- Moving average : 시계열 데이터에서 window마다 데이터 일부분을 순차적으로 평균을 구하여 smoothing하는 방법
- 다항 회귀모델을 이용해서 window 마다 smoothing을 적용하는 방법
김성욱 님의 도움으로 작성된 글입니다. 성욱아 고마워 ㅎㅎ
'프로그램 > SKT FLY AI' 카테고리의 다른 글
SKT FLY AI : 37일차 - 광복절 (0) | 2023.08.16 |
---|---|
SKT FLY AI : 36일차 - 프로젝트 시작 (0) | 2023.08.16 |
SKT FLY AI : 34일차 (0) | 2023.08.10 |
SKT FLY AI 3기 : 번외편 - 33일차 대신 (feat. 프로젝트 지원비 + 자격증 정보) (14) | 2023.08.10 |
SKT FLY AI : 32일차 (0) | 2023.08.09 |