(附代碼)干貨 | 幾十行代碼就能實現(xiàn)關(guān)鍵點檢測
關(guān)鍵點檢測有哪些運用?
判斷姿態(tài)是否標(biāo)準(zhǔn)
比如健身軟件,Keep就可以根據(jù)關(guān)鍵點信息,判斷你健身時的姿態(tài)正確與否。體育運動同樣可以實時跟蹤你的姿態(tài),如乒乓球等,可以幫你改善你的動作。
安全領(lǐng)域
如摔倒檢測,摔倒檢測這一個任務(wù)有實際意義有價值嗎?那肯定是十分有用的,老人摔倒這一問題,就是老年人的最大殺手之一。
袁隆平院士也是今年在三亞摔了一跤,身體開始變差。我在讀研期間,就被分配到了一個摔倒檢測的任務(wù)。場景是運用在電梯口。當(dāng)檢測到摔倒之后,需要立馬救援。因為老年人如果摔倒之后,不采取立刻救援,極易發(fā)生二次摔倒傷害。
那么怎么判斷摔倒呢?當(dāng)時我調(diào)研了一些方案,最終采用的是基于關(guān)鍵點檢測的方案來做。
表盤,人臉等關(guān)鍵點信息的識別
表盤與人臉上等具有明顯關(guān)鍵點信息的任務(wù),可以將關(guān)鍵點定位,再提取其特征,再使用相對應(yīng)的特征來進(jìn)行計算。與設(shè)備之間進(jìn)行交互
未來,使用手勢來作為交互手段,會是一大趨勢~ 我說的!

關(guān)鍵點檢測簡單原理介紹
在我實際任務(wù)中,我用的最好的關(guān)鍵點檢測算法是哪一個呢?登登登登~ 我愿稱之為!
為啥是它呢?結(jié)構(gòu)如下圖,就是很簡單,在數(shù)據(jù)量比較少的情況下,收斂快,并且精度也夠用,網(wǎng)絡(luò)還?。》凑?,很好用就對了!

上圖是論文提出的網(wǎng)絡(luò)模型,叫做堆疊漏斗神經(jīng)網(wǎng)絡(luò)。這個網(wǎng)絡(luò)架構(gòu)形態(tài)就像它的名字的一樣,是由一個個的漏斗狀的神經(jīng)網(wǎng)絡(luò)級聯(lián)起來,每一個漏斗神經(jīng)網(wǎng)絡(luò)就像編碼器和解碼器合成,負(fù)責(zé)提取特征和生成熱圖結(jié)果。整個網(wǎng)絡(luò)使用了大量的卷積/反卷積層,池化/反池化層,以及全連接層。網(wǎng)絡(luò)的輸入是一張或者的標(biāo)準(zhǔn)大小尺寸圖片(×),輸出是該張圖片縮小到一定尺寸的各個節(jié)點的熱圖(×)。如我們需要檢測20個關(guān)鍵點,那我們在模型的輸出特征維度就是,再與標(biāo)簽計算損失進(jìn)行訓(xùn)練。
聊聊我之前做的摔倒檢測的任務(wù)
對于關(guān)鍵點檢測而言,目前主要的做法分為兩種,一種是top-down,一種是bottom-up。我當(dāng)時采用的就是top-down方案,即先使用檢測,將行人拿出來放到關(guān)鍵點檢測的網(wǎng)絡(luò)中去。而bottom-up的做法,是先把圖像中的所有關(guān)鍵點給檢測到,再給連起來。
目前從我的實戰(zhàn)角度而言,top-down更適合,主要是的做法在行人檢測階段能夠獲取較高的召回,故而相對來說會有比較高的精度;
先簡單看下我當(dāng)時的效果,因為公眾號GIF大小要求,所以壓縮的有點奇怪~

我當(dāng)時主要采用的方案為與,這兩個網(wǎng)絡(luò)我們會在面經(jīng)的時候,著重介紹的。歡迎各位持續(xù)關(guān)注哦~
判斷摔倒主要的邏輯是借鑒了一位同學(xué)的畢業(yè)設(shè)計。主要只表示計算上半身與下半身在圖像中的長度,進(jìn)行計算相對應(yīng)的比例,該比例相當(dāng)于一個超參數(shù),低于該參數(shù),視為摔倒。該同學(xué)是用的來獲取的關(guān)鍵點,再使用關(guān)鍵點來進(jìn)行判斷邏輯的。
其中長這樣:

它可以得到深度圖信息,同時可以得到最多個人的個關(guān)鍵點。而深度學(xué)習(xí)的技術(shù),就可以彌補這些硬件的弱勢,使用一個不錯的攝像頭,就可以達(dá)到一個較好的效果了。

MediaPipe
今天推薦一個非常吊的庫叫做, 官方網(wǎng)站放在了參考鏈接中。
先看下對于的評價:
這里也簡單介紹下:
是機器視覺開源框架;它具有如下優(yōu)勢:
多種功能支持:同時支持姿態(tài)估計、手勢識別、臉部識別、目標(biāo)檢測等機器視覺主流應(yīng)用模型;
2)跨平臺支持:同時支持windows、linux、Android、IOS四大主流平臺,連web識別都支持;
3)精度和性能好:總結(jié)來說就是又快又準(zhǔn)!
4)節(jié)省數(shù)十萬云服務(wù)器年費,充分利用用戶手機計算資源;避免網(wǎng)絡(luò)延遲降低識別實時性;現(xiàn)有開源功能滿足業(yè)務(wù)場景需求
同樣,的劣勢為:無法在小程序中實現(xiàn)識別功能;需要單獨開發(fā)APP,Android、IOS需要分別開發(fā),研發(fā)團(tuán)隊技術(shù)棧不匹配APP開發(fā);需要用戶單獨下載APP,需要更多運營成本。
具體支持哪些功能呢?看下圖:

而我在這里,使用來做一個手勢關(guān)鍵點檢測,各位可以看下效果如何。
代碼如下所示:
import cv2
import mediapipe as mp
import time
class handDetector():
def __init__(self, mode=False, maxHands=2, detectionCon=0.5, trackCon=0.5):
self.mode = mode
self.maxHands = maxHands
self.detectionCon = detectionCon
self.trackCon = trackCon
self.mpHands = mp.solutions.hands
self.hands = self.mpHands.Hands(self.mode, self.maxHands,
self.detectionCon, self.trackCon)
self.mpDraw = mp.solutions.drawing_utils
def findHands(self, img, draw=True):
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
self.results = self.hands.process(imgRGB)
# print(results.multi_hand_landmarks)
if self.results.multi_hand_landmarks:
for handLms in self.results.multi_hand_landmarks:
if draw:
self.mpDraw.draw_landmarks(img, handLms,
self.mpHands.HAND_CONNECTIONS)
return img
def findPosition(self, img, handNo=0, draw=True):
lmList = []
if self.results.multi_hand_landmarks:
myHand = self.results.multi_hand_landmarks[handNo]
for id, lm in enumerate(myHand.landmark):
# print(id, lm)
h, w, c = img.shape
cx, cy = int(lm.x * w), int(lm.y * h)
# print(id, cx, cy)
lmList.append([id, cx, cy])
if draw:
cv2.circle(img, (cx, cy), 1, (255, 0, 255), cv2.FILLED)
return lmList
def main():
pTime = 0
cap = cv2.VideoCapture('./finger_dancer.mp4')
detector = handDetector()
wid = int(cap.get(3))
hei = int(cap.get(4))
size = (wid, hei)
fps = 30
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
out = cv2.VideoWriter()
out.open(r"./out.mp4",
fourcc, fps, size)
while True:
success, img = cap.read()
img = detector.findHands(img)
lmList = detector.findPosition(img)
if len(lmList) != 0:
print(lmList[4])
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 1,
(255, 0, 255), 3)
cv2.imshow("Image", img)
out.write(img)
cv2.waitKey(1)
if __name__ == "__main__":
main()
引用
https://www.zhihu.com/question/401635800/answer/1774116555 https://zhuanlan.zhihu.com/p/357158418 https://google.github.io/mediapipe/
?------------------------------------------------
雙一流大學(xué)研究生團(tuán)隊創(chuàng)建,一個專注于目標(biāo)檢測與深度學(xué)習(xí)的組織,希望可以將分享變成一種習(xí)慣。
整理不易,點贊三連!
