# DEKR
## Bottom-Up Human Pose Estimation Via Disentangled Keypoint Regression
Geng, Zigang, et al. "Bottom-up human pose estimation via disentangled keypoint regression." Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2021.
人體姿態關鍵點
[toc]
### Top-Down vs. Bottom-Up
| 方法 | Top-Down (如 Mask R-CNN) | Bottom-Up (如 DEKR) |
|---------------------|----------------------------------|--------------------------------|
| **流程** | 先偵測人體,再回歸關鍵點 | 一次性偵測所有關鍵點,然後分組 |
| **是否偵測 Bounding Box?** | ✅ 是 | ❌ 否 |
| **關鍵點預測方式** | 每個人體框內獨立預測關鍵點 | 在全圖範圍內預測所有關鍵點 |
| **計算成本** | 高,每個人獨立推理 | 低,單次推理處理所有人 |
| **多人場景準確性** | 高(個別處理每個人體) | 可能混淆,需額外分組 |
| **適用場景** | 需要高精度的單人姿態估計 | 適合多人場景 |
| **代表方法** | Mask R-CNN, HRNet + SimpleBaseline | OpenPose, HigherHRNet, DEKR |
#### Top-Down 方法的特點
- **先偵測人體框**(Bounding Box),然後在框內進行 **關鍵點回歸**。
- **每個人的關鍵點是獨立預測的**,不受其他人的影響。
- **適用於單人體場景或高精度要求的應用**(如醫療姿態分析)。
- **計算成本較高**,因為每個人都需要單獨執行一次關鍵點回歸。
#### Bottom-Up 方法的特點
- **不偵測 Bounding Box**,而是直接在 **整張圖片** 上預測所有人的關鍵點。
- **需要透過分組演算法來區分不同人體**(如 Center Heatmap 或 Part Affinity Fields)。
- **適合多人場景,如群體運動分析、行人監測**。
- **計算成本較低**,因為只需一次前向傳播就能獲得所有人的關鍵點。
#### DEKR 為何仍屬於 Bottom-Up?
- DEKR **沒有偵測人體框,而是直接預測所有關鍵點**。
- **Instance Box 只用於 Loss 計算,不影響推理時的過程**。
- **最終關鍵點透過 Heatmap + Offset + 分組來組織,而不是依賴 Bounding Box 來切割人員**。
### Disentangled keypoint regression

#### Multi-branch Regression
在 傳統方法 中,所有關鍵點的偏移量(offset)會由單一網絡分支進行回歸:
$O=F(X)$
但在 DEKR 方法 中,每個關鍵點有 獨立的分支 來進行回歸:
$O_k=F_k(X_k)$
比如:
* 鼻子(Nose) 的特徵圖 $X_1$ 只用於回歸鼻子的位置。
* 左肩(Left Shoulder) 的特徵圖 $X_2$只用於回歸左肩的位置。
#### Adaptive activation
```python
class AdaptBlock(nn.Module):
def __init__(self, inplanes, outplanes, stride=1, downsample=None, dilation=1, deformable_groups=1):
super(AdaptBlock, self).__init__()
# 設定標準 3×3 卷積點的初始位置
regular_matrix = torch.tensor([
[-1, -1, -1, 0, 0, 0, 1, 1, 1], # X 坐標
[-1, 0, 1, -1, 0, 1, -1, 0, 1] # Y 坐標
])
self.register_buffer('regular_matrix', regular_matrix.float())
# 學習變換矩陣(Transformation Matrix)
self.transform_matrix_conv = nn.Conv2d(inplanes, 4, 3, 1, 1, bias=True)
# 學習平移偏移量(Translation Offset)
self.translation_conv = nn.Conv2d(inplanes, 2, 3, 1, 1, bias=True)
# 可變形卷積(Deformable Convolution)
self.adapt_conv = ops.DeformConv2d(
inplanes, outplanes, kernel_size=3, stride=stride,
padding=dilation, dilation=dilation, bias=False, groups=deformable_groups
)
```
##### Standard Convolution
$y(q) = \sum_{i=1}^{9} W_i \cdot x(s_i + q)$
$W_i$: 3 × 3 kernel weights
$q$: center (2D) position
$x$: Feature Map
$s_i = \{(-1,-1),(-1,0),(-1,1),...,(0,0),(1,1)\}$


if $q=(2,2)$
and $s_1=(-1,-1)$
$x((-1,-1)+(2,2)) = x(1,1) = 7$
##### Adaptive Convolution
$y(q) = \sum_{i=1}^{9} W_i \cdot x(g^q_{s_i} + q)$
$g^q_{s_i}$: Offset
$\{g^q_{s_1},g^q_{s_2},...,g^q_{s_9}\}$: 2 × 9 matrix $G^q_s$
$G^q_s = A^qG_t+[t\ t \ ...\ t]$
$A_q(∈R^{2×2})$: Affine Transformation Matrix 控制旋轉、縮放


$t(∈R^{2×1})$: Translation vector



#### 1×1 Convolution
再經由 1×1 卷積得到 2D 偏移量(offset)
輸出為:H×W×2
每個像素點 (i,j) 都有一個對應的 (Δx,Δy) 偏移量。
### Regression loss
$\ell_p = \sum_{i \in C} \frac{1}{Z_i} \text{smooth}_{L_1} (\mathbf{o}_i - \mathbf{o}_i^*).$
* $Z_i=\sqrt{H^2_i+W^2_i}$
* 用於正規化(Normalization Factor)
* 為Instance Box的對角線長度(由 Ground Truth 得知)
$H_i=max(y_k)-min(y_k)$
$W_i=max(x_k)-min(x_k)$
* $o_i$: offset prediction
* $o^*_i$: ground truth offset
### Keypoint and center heatmap estimation loss.
$(H,C)=H(X)$
$X$: Feature Map
$H(X)$ A function that predicts 𝐻 and 𝐶
$H$ : Keypoint Heatmap
$C$ : Center Heatmap
透過神經網絡 𝐻 從輸入特徵圖 𝑋預測出關鍵點熱圖 H 和中心熱圖 C。
* 透過 Sigmoid 在0,1之間
* GT: Gaussian Distribution,隨著距離 Ground Truth 點越遠,置信度逐漸降低。
* 關鍵點熱圖(Keypoint Heatmap H):表示每個關鍵點(如鼻子、膝蓋、腳踝)的可能位置。
* 中心熱圖(Center Heatmap C):表示人體中心點的可能位置。
#### H(Keypoint Heatmap)
H(Keypoint Heatmap)標示人體各部位的關鍵點位置,幫助定位鼻子、膝蓋等關鍵點。
$H×W×K$
$K$是關鍵點數
$\ell_k = \|M^h \odot (H - H^*)\|_2^2$
⊙: Element-wise Product
$M^h$: Keypoint Heatmap Mask
根據 Ground Truth 關鍵點標註計算,非關鍵點區域設較低權重(0.1)
$M^h_k$: Specific Keypoint Mask for Class k
$M^h=\{M^h_1,M^h_2,...,M^h_{17}\}$
針對某個關鍵點類別(如鼻子),權重設為 $M^h_k(p)=1$,非該關鍵點區域設為 $M^h_k(p)=0.1$
#### C(Center Heatmap)
C(Center Heatmap)標示人體的中心位置,幫助關鍵點分組,確保不同人體的關鍵點不會錯誤匹配。
確保回歸的關鍵點在同一個人身上
$H×W$
$\ell_c = \|M^c \odot (C - C^*)\|_2^2$: Center Heatmap Loss
$M^c$: Center Heatmap Mask
Ground Truth 生成,非人體區域的權重降低
#### Whole loss
$\ell_h = \ell_k + \ell_c$
$\ell_h = \|M^h \odot (H - H^*)\|_2^2 + \|M^c \odot (C - C^*)\|_2^2$
$\ell = Heatmap\ estimation\ loss + Regression\ loss$
$\ell = \ell_h + λ\ell_p$
λ: trade-off weight (0.03)
### Inference
#### Center Heatmap
##### Center NMS
進行 NMS 去除熱度低於0.01的位置
過程是 Local Maxima Detection
找出鄰域最大值保留作為候選點
候選點的熱圖值小於0.01就刪除
##### Pose NMS
通過 Center NMS 篩選後的中心點,執行Pose NMS
* 從這些中心點出發,透過 Offset 回歸每個關鍵點的位置,形成一組姿態(Pose Instance)(如鼻子、肩膀、膝蓋等 17 個點的組合)。
* 如果多個姿態估計結果過於接近,則會使用 Pose NMS 來篩選最可靠的結果,並且最多保留 30 個候選姿態。把重疊或相似的 Pose Candidates 進行移除
Score = 姿態中 K 個關鍵點的平均熱圖值。
##### 姿態候選結果的最終排序
中心熱圖值(Center Heat Value):人體中心點的置信度。
關鍵點熱圖值(Keypoint Heat Values):各個關鍵點的置信度。
形狀特徵(Shape Feature):
關鍵點對之間的距離($d_{ij}$),表示人體的結構穩定性。
關鍵點之間的相對偏移量($p_i-p_j$),表示人體的空間分佈。
* 兩個Fully-Connected Layers,每層後接 ReLU 激活函數
* 最後Linear Prediction Layer。
OKS = ScoringNet(Center Score,Keypoint Score,Shape Features)
OKS 不是一個固定的計算公式,而是透過 神經網絡(ScoringNet) 學習來預測的,這個神經網絡已經在訓練階段學習了「一個合理的 POSE 應該長什麼樣子」
1. 學習 OKS(Object Keypoint Similarity)分數 來評估和篩選姿態估計的準確性。
2. OKS 是衡量整個人體姿態的結構 預測與 Ground Truth 之間相似度的標準,姿態評分網絡的目標是 學習如何預測 OKS 分數,從而在推理階段篩選出最可靠的姿態結果。
3. 這樣可以確保高質量的姿態預測被保留,而低質量的姿態被剔除。
OKS 就類似關鍵點的IOU ,在推理(Inference)階段,模型已經產生了多個候選姿態(Pose Candidates),從中以OKS這個分數找出最佳的一組關鍵點