肢體識別本質上還是分類任務,該技術有很多應用場景,比如手勢識別控制類應用、動作檢測類應用、動作評測類應用、以及一些移動設備AR視頻合成類應用。對於純粹的檢測類應用,可以直接對RGB源圖像進行分類,當前基於CNN的圖像分類技術已經非常成熟和穩定,准確性也完全達到了實用標准。而對於另外涉及到肢體評測、AR合成類的應用,單靠圖像分類技術已經不太夠了,需要用到關鍵點檢測技術,它能檢測出肢體關鍵點(比如四肢、面部紋理、手指等),然后基於檢測到的關鍵點做進一步處理。關鍵點檢測的原理其實跟分類技術原理差不多,只是神經網絡的輸出不太一樣。
圖像分類
在大部分深度學習入門教程中,圖像分類基本就是hello world級別存在的,最常見的是識別貓還是狗。ImageNet比賽比的是1000分類,基本涵蓋了大部分常見物體。圖像分類的流程很簡單,輸入RGB圖像,輸出各分類的概率值,1000分類任務就輸出1000個概率值。圖像分類是深度學習技術在CV領域最基礎的應用,主要原因是它涵蓋了深度學習最重要的環節:特征自動提取。我們剛學習CNN時接觸到的Alexnet、GoogleNet或者Resnet之類的,全部都是特征自動提取網絡,如果需要對輸入分類,網絡后面再接特征分類層即可。
那么具體到肢體識別任務上,也可以將它看作一個圖像分類任務,這里以‘剪刀石頭布識別’為例子,是一個3分類的分類任務:
上面這張圖大部分接觸過深度學習的人應該很清楚,最基礎的分類任務。圖像分類起到的作用很有限,僅僅是對肢體做一個大概的分類,無法滿足更細致的需求,接下來介紹關鍵點檢測。
關鍵點檢測
關鍵點檢測的技術當前也非常成熟了,github上最早的OpenPose項目非常火爆,有幾萬星星。通過訓練后,模型能夠實時推理檢測出人體關鍵點(四肢和面部,具體技術原理跟其他采用神經網絡的深度學習技術相似,可以參考網絡資料)。
關鍵點檢測出來之后,可以進一步對這些關鍵點進行分析。分析結果就不僅僅是肢體識別了,還可以通過這些關鍵點相互之間的關系來判斷肢體動作的協調程度、或者像一些AR應用在人體上疊加一些其他內容(類似抖音視頻合成)。
接下來介紹兩種關鍵點分析方法,一種是基於傳統機器學習,先從關鍵點中人工提取特征、然后再對特征進行分析(基於常見的機器學習算法去做分類、聚類或者回歸之類的);另外一種是基於深度學習端到端的處理方式,關鍵點直接作為神經網絡的輸入,輸出對應想要的結果。從這兩種不同的處理方式中可以了解到傳統機器學習和深度學習的區別,關於兩者的區別可以看一下。
關鍵點+機器學習方式
機器學習的一大特點是需要人工提取原數據的特征,這個過程叫特征工程。如果需要對關鍵點進行分析,先要從這些關鍵點中提取高質量特征數據,為什么要高質量?因為提取特征的方式或者說維度有很多,要保證提取到的特征數據最具代表性、能夠充分表達原數據的特點。現以‘石頭剪刀布手勢識別’為例子,來說明如何人工提取特征數據。我們知道,石頭剪刀布3種手勢之間手指的形狀差異很大,手指和手指關節之間的直線距離差異很明顯,那么我們可以將關節之間直線距離當作關鍵點的特征數據,並將其提取出來。
使用提取到的特征數據(特征向量,Feature Vector),訓練K-Means或者DBSCAN等機器學習分類算法模型,並將其泛用到其他新數據(新特征)。
關鍵點+深度學習方式
跟機器學習不同,深度學習的一大特點就是神經網絡能夠自動提取特征、自動尋找源數據內部的規律。至於它如何提取、或者根據什么原理去提取,很難解釋。你只需要將源數據(關鍵點坐標)輸入神經網絡,直接可以輸出對應結果,如果是前面提到的‘石頭剪刀布手勢識別’任務,網絡可以輸出三種手勢分別對應的概率。我們可以看到,機器學習和深度學習兩種方式的輸入是不一樣的,前者的輸入是人工提取的特征數據(某些關節點之間的直線距離值集合),后者輸入可以直接是關鍵點坐標值(關鍵點XY值集合)。正因為深度學習這種端到端的處理方式、省去了繁瑣的特征工程,才能使得其大規模應用在復雜的非結構化數據上,比如CV中的CNN網絡,它直接接收RGB格式圖像作為輸入,它處理的對象是像素值,而無需人工做過多的干預。關於這塊詳細參見之前的一篇文章。
我們用關鍵點數據訓練最簡單的神經網絡,將訓練得到的模型應用到真實數據上。本文主要介紹了肢體識別的幾種方式,以及采用關鍵點檢測時,如何處理關鍵點數據。同時提到了機器學習和深度學習不同的工作流程,以及各自的特點。有問題的朋友可以留言交流。