1. 程式人生 > >頭部姿態估計——multi-loss

頭部姿態估計——multi-loss

1.引言: 本文提出了一種簡潔和魯棒的方式來確定姿態,通過訓練一個multi-loss的卷積神經網路。 直接使用RGB結合分類和迴歸損失來預測Euler angles(yaw,pitch and roll)。

2.網路結構: 在這裡插入圖片描述 本文提出使用3個分離的losses,為每一個角度。每個loss由兩部分組成:a binned pose classification and a regression component 組成。

最後為每一個尤拉角的損失為: 在這裡插入圖片描述 實現細節: 1) 對尤拉角(Yaw,Pitch,Roll)按角度區間進行分類,比如3度,那麼Yaw:-90-+90,可以分成180/3= 60個類別,Pitch和Roll同Yaw角類似。這樣就可以進行分類任務了。 2) 對分類的結果恢復成實際的角度,類別*3-90,在和實際的角度計算迴歸損失。 3) 最後將回歸損失和分類損失進行合併來得到最後的損失,迴歸損失的前面增加了一個權重係數α。

3.測試: 1)不同測試集的測試結果 在這裡插入圖片描述 2)不同網路結構設定α引數的結果比較 在這裡插入圖片描述 不同的網路結構需要自行去調節α進行訓練。

4.小結: 使用分類和迴歸的方式進行約束,可以提升姿態估計的準確率。 但資料集構建比較麻煩。

5.部分參考程式碼:

虛擬碼:
# 類別數(yaw:60類)
idx_tensor1 = [idx for idx in xrange(60)]
idx_tensor1 = tf.convert_to_tensor(idx_tensor1,dtype=tf.float32)

# yaw角groundtruth獲取
# continous labels
label_yaw_cont=ordinal_batch[:,0]
# binned labels				
label_yaw_bin=nominal_batch[:,0]

# 分類損失
# Cross entropy loss
loss_yaw_cl =tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits (labels=tf.cast(label_yaw_bin,tf.int64), logits=logits_nominal_yaw))

# 迴歸損失
# MSE loss
yaw_predict = tf.nn.softmax(logits_nominal_yaw)
logits_ordinal_yaw = tf.reduce_mean(yaw_predict*idx_tensor1,1)*3-90
loss_yaw_reg = tf.reduce_mean((logits_ordinal_yaw-label_yaw_cont)**2)

# 總損失	
#total loss
alpha=FLAGS.alpha
loss_yaw =tf.add_n([loss_yaw_cl,alpha * loss_yaw_reg])
注:博眾家之所長,叢集英之薈萃。