論文:Self-Supervised Learning of 3D Human Pose using Multi-view Geometry
該方法局限于訓(xùn)練時(shí)的數(shù)據(jù)集传黄,無(wú)法在訓(xùn)練集以外的業(yè)務(wù)場(chǎng)景中泛化坝锰,已由作者本人在Github上確認(rèn)收壕。
該方法大致步驟為:
? 從2D多目圖片中預(yù)測(cè)3D姿態(tài)
- 輸入不同視角的2D圖像產(chǎn)生極線位置 (右側(cè)兩條分支)
- 由極線位置生成3D姿態(tài)A
- 由原始圖像直接生成3D姿態(tài)B(左側(cè)分支)
- A與B進(jìn)行自監(jiān)督學(xué)習(xí)
如上圖象泵,2D與3D部分的主要構(gòu)成都是類似Hourglass的結(jié)構(gòu),為一個(gè)ResNet50+Deconv恢復(fù)維度,生成的Heatmap經(jīng)過(guò)Softmax計(jì)算,得到各種的關(guān)節(jié)預(yù)測(cè)結(jié)果衰粹。
每一個(gè)Hourglass都是在MPII 2D姿態(tài)數(shù)據(jù)集上預(yù)訓(xùn)練的,下半部分2D姿態(tài)估計(jì)在訓(xùn)練過(guò)程中是凍結(jié)(Frozen)的笆怠,也就是說(shuō)只使用這個(gè)預(yù)訓(xùn)練好的網(wǎng)絡(luò)得到結(jié)果寄猩,不更新參數(shù)。
作者說(shuō)使用它原因是避免直接生成3D坐標(biāo)會(huì)使得所有坐標(biāo)值坍塌到一個(gè)點(diǎn)骑疆。
在訓(xùn)練時(shí)田篇,算法步驟2由已知的相機(jī)內(nèi)參數(shù)(焦距、主點(diǎn))箍铭、外參數(shù)(旋轉(zhuǎn)角和平移位置)泊柬,建立一個(gè)針孔圖像投影模型(pinhole image projection model)計(jì)算3D坐標(biāo)。
針對(duì)相機(jī)旋轉(zhuǎn)角未知的情況诈火,作者也提出使用RANSAC算法在多目圖片中求解相機(jī)的旋轉(zhuǎn)角(以第一個(gè)相機(jī)為中心)兽赁,然后使用三角多項(xiàng)式計(jì)算3D坐標(biāo)。
求解R的過(guò)程其實(shí)很有意思:兩個(gè)相機(jī)分別拍攝的圖片中冷守,相同的關(guān)節(jié)點(diǎn)Ui和Ui+1滿足:
對(duì)任意節(jié)點(diǎn)j刀崖,有Ui,jFUi+1,j=0,然后計(jì)算本質(zhì)矩陣E=KTFK拍摇,將E奇異值分解亮钦,就可以得到R的4個(gè)解,帶入3D投影能得到正的Z軸值的就是求得的R充活。
實(shí)際上在訓(xùn)練和測(cè)試過(guò)程中蜂莉,需要計(jì)算和更新參數(shù)的就是紅色底的3D姿態(tài)生成部分蜡娶,在測(cè)試時(shí)也只需要加載這部分的網(wǎng)絡(luò)。
2D姿態(tài)轉(zhuǎn)換計(jì)算的結(jié)果A和3D直接生成的結(jié)果求差為x映穗,然后計(jì)算loss:
優(yōu)化單元:接受3D結(jié)果/噪聲輸入
? 2個(gè)計(jì)算單元
? BN窖张,LReLU,DropOut
? 有監(jiān)督地計(jì)算殘差損失
目前有一些問題:(應(yīng)用場(chǎng)景:人在圓形遮擋物后旋轉(zhuǎn))
? 從頭訓(xùn)練需要多角度攝像頭構(gòu)建極線位置
? 論文并沒有討論該方法的實(shí)時(shí)性 – 測(cè)試大約0.6s
? 在圖像尺寸不匹配蚁滋、場(chǎng)景復(fù)雜時(shí)效果差
解決方案:
? 輸入圖片使用仿射變換 旋轉(zhuǎn)縮放
? 數(shù)據(jù)增強(qiáng)宿接,增加使用場(chǎng)景下的遮擋,準(zhǔn)備增加霍夫變換識(shí)別圓形
實(shí)驗(yàn)驗(yàn)證:
- 增加固定遮擋(80%圓形+30%隨機(jī)) 人在遮擋后旋轉(zhuǎn)
- 原始模型下原始采集圖片輸入 結(jié)果很差
- 原始模型下經(jīng)過(guò)人工裁剪之后作為輸入 效果可以
- 小batch進(jìn)行fine-tune之后 經(jīng)過(guò)人工裁剪之后作為輸入 效果不錯(cuò)
輸出維度細(xì)節(jié):
深度網(wǎng)絡(luò)的輸出Preds:
Preds (1,1024,64,64): batch, depth* joints, height, width
Reshape(1,16,-1): batch, joints ,3D 每個(gè)關(guān)節(jié)64*64*64
Softmax(1,16,-1): dim2 歸一化: sum(preds,2) = 1
heatmaps.reshape(1,16,64,64,64): batch, joints, depth , height, width
accu_x = sum(dim=2 depth)→sum(dim=2 height): batch, joints, width 1,16,64
accu_y = sum(dim=2 depth)→sum(dim=3 width): batch, joints, height 1,16,64
accu_z = sum(dim=3 height)→sum(dim=3 width): batch, joints, depth 1,16,64
accu_x |accu_y |accu_z 分別 sum(dim=2 xyz) 求和 1,16 → x, y, z
(x, y, z)/(64,64,64)-0.5 三維坐標(biāo)系居中
Cat, Reshape(1,48): 拼接
數(shù)據(jù)集標(biāo)簽輸入Labels:
輸入224圖像時(shí)辕录,首先處理關(guān)節(jié)點(diǎn)坐標(biāo)睦霎,將xyz縮放到圖片尺度,并且中心在112,112
Joints[:,:]-=Joints[6,:] 居中
提取匹配圖片尺寸的2D姿態(tài)標(biāo)簽pts踏拜,計(jì)算3D姿態(tài)標(biāo)簽的縮放尺度
Scale= (2D骨架長(zhǎng)度之和)/(3D骨架長(zhǎng)度之和) = 0.127435
joints[:, :2] *= scale+112 縮放 居中
Joints[:,0]=width- Joints[:,0]-1: 左右互換
Joints[:,0:2] 根據(jù)圖像仿射變換進(jìn)行旋轉(zhuǎn)
Joints[:,2] = joints[:2]/(2000*scale)*256 深度歸一化,根據(jù)仿射變換縮放系數(shù)恢復(fù)到256
(Joints[:,0:2])/(256,256)-0.5三維坐標(biāo)系居中
(Joints[:,2])/(256) 深度已經(jīng)是居中值
測(cè)試畫圖:
輸出Preds (1,1024,64,64): batch, depth* joints, height, width
Reshape(1,16,-1): batch, joints ,3D 每個(gè)關(guān)節(jié)64*64*64
Softmax(1,16,-1): dim2 歸一化: sum(preds,2) = 1
heatmaps.reshape(1,16,64,64,64): batch, joints, depth , height, width
accu_x = sum(dim=2 depth)→sum(dim=2 height): batch, joints, width 1,16,64
accu_y = sum(dim=2 depth)→sum(dim=3 width): batch, joints, height 1,16,64
accu_z = sum(dim=3 height)→sum(dim=3 width): batch, joints, depth 1,16,64
accu_x |accu_y |accu_z 分別 sum(dim=2 xyz) 求和 1,16 → x, y, z
(x, y, z)/( 64,64,64)-0.5 三維坐標(biāo)系居中
Cat, Reshape(1,48): 拼接
Reshape(1,16,3)
((x,y)+0.5)*256 縮放并挪到正坐標(biāo)
z*256 縮放
拼接 傳送給畫圖函數(shù) 按照關(guān)節(jié)順序連接3D坐標(biāo)點(diǎn)
無(wú)法解決的問題:
模型的性能比較和實(shí)驗(yàn)測(cè)試都是在Human3.6數(shù)據(jù)集上進(jìn)行的低剔,在使用該模型對(duì)其他數(shù)據(jù)進(jìn)行測(cè)試時(shí)效果很差速梗。
也就是說(shuō)應(yīng)用于具體場(chǎng)景前,使用公共數(shù)據(jù)集進(jìn)行訓(xùn)練是不夠的襟齿,需要采集場(chǎng)景下的多目圖片重新訓(xùn)練或者fine-tune姻锁。