1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        (附代碼)干貨 | 幾十行代碼就能實現(xiàn)關鍵點檢測

        共 4437字,需瀏覽 9分鐘

         ·

        2021-05-31 20:35

        全網(wǎng)搜集目標檢測文章,人工篩選最優(yōu)價值內(nèi)容

        編者薦語
        關鍵點檢測,是一個基礎的任務,同時在實際生活中也是十分重要的。通過找到關鍵點,我們能判斷很多部位之間的位置關系,通過部件相互關系可以為我們帶來更多有價值的信息。


        關鍵點檢測有哪些運用?

        • 判斷姿態(tài)是否標準

          比如健身軟件,Keep就可以根據(jù)關鍵點信息,判斷你健身時的姿態(tài)正確與否。體育運動同樣可以實時跟蹤你的姿態(tài),如乒乓球等,可以幫你改善你的動作。

        • 安全領域
          摔倒檢測,摔倒檢測這一個任務有實際意義有價值嗎?那肯定是十分有用的,老人摔倒這一問題,就是老年人的最大殺手之一。
          袁隆平院士也是今年在三亞摔了一跤,身體開始變差。

          我在讀研期間,就被分配到了一個摔倒檢測的任務。場景是運用在電梯口。當檢測到摔倒之后,需要立馬救援。因為老年人如果摔倒之后,不采取立刻救援,極易發(fā)生二次摔倒傷害。

          那么怎么判斷摔倒呢?當時我調(diào)研了一些方案,最終采用的是基于關鍵點檢測的方案來做。

        • 表盤,人臉等關鍵點信息的識別
          表盤與人臉上等具有明顯關鍵點信息的任務,可以將關鍵點定位,再提取其特征,再使用相對應的特征來進行計算。

        • 與設備之間進行交互
          未來,使用手勢來作為交互手段,會是一大趨勢~ 我說的!

        關鍵點檢測簡單原理介紹

        在我實際任務中,我用的最好的關鍵點檢測算法是哪一個呢?登登登登~ 我愿稱之為!

        為啥是它呢?結(jié)構(gòu)如下圖,就是很簡單,在數(shù)據(jù)量比較少的情況下,收斂快,并且精度也夠用,網(wǎng)絡還?。》凑?,很好用就對了!

        stack hourglass

        上圖是論文提出的網(wǎng)絡模型,叫做堆疊漏斗神經(jīng)網(wǎng)絡。這個網(wǎng)絡架構(gòu)形態(tài)就像它的名字的一樣,是由一個個的漏斗狀的神經(jīng)網(wǎng)絡級聯(lián)起來,每一個漏斗神經(jīng)網(wǎng)絡就像編碼器和解碼器合成,負責提取特征和生成熱圖結(jié)果。整個網(wǎng)絡使用了大量的卷積/反卷積層,池化/反池化層,以及全連接層。網(wǎng)絡的輸入是一張或者的標準大小尺寸圖片(×),輸出是該張圖片縮小到一定尺寸的各個節(jié)點的熱圖(×)。如我們需要檢測20個關鍵點,那我們在模型的輸出特征維度就是,再與標簽計算損失進行訓練。

        聊聊我之前做的摔倒檢測的任務

        對于關鍵點檢測而言,目前主要的做法分為兩種,一種是top-down,一種是bottom-up。我當時采用的就是top-down方案,即先使用檢測,將行人拿出來放到關鍵點檢測的網(wǎng)絡中去。而bottom-up的做法,是先把圖像中的所有關鍵點給檢測到,再給連起來。

        目前從我的實戰(zhàn)角度而言,top-down更適合,主要是的做法在行人檢測階段能夠獲取較高的召回,故而相對來說會有比較高的精度;

        先簡單看下我當時的效果,因為公眾號GIF大小要求,所以壓縮的有點奇怪~


        我當時主要采用的方案為,這兩個網(wǎng)絡我們會在面經(jīng)的時候,著重介紹的。歡迎各位持續(xù)關注哦~

        判斷摔倒主要的邏輯是借鑒了一位同學的畢業(yè)設計。主要只表示計算上半身與下半身在圖像中的長度,進行計算相對應的比例,該比例相當于一個超參數(shù),低于該參數(shù),視為摔倒。該同學是用的來獲取的關鍵點,再使用關鍵點來進行判斷邏輯的。

        其中長這樣:

        它可以得到深度圖信息,同時可以得到最多個人的個關鍵點。而深度學習的技術,就可以彌補這些硬件的弱勢,使用一個不錯的攝像頭,就可以達到一個較好的效果了。

        針對腦癱患兒的Kinect游戲,幫助其康復運動

        MediaPipe

        今天推薦一個非常吊的庫叫做, 官方網(wǎng)站放在了參考鏈接中。

        先看下對于的評價:

        這里也簡單介紹下:

        機器視覺開源框架;它具有如下優(yōu)勢:

        1. 多種功能支持:同時支持姿態(tài)估計、手勢識別、臉部識別、目標檢測等機器視覺主流應用模型;
          2)跨平臺支持:同時支持windows、linux、Android、IOS四大主流平臺,連web識別都支持;
          3)精度和性能好:總結(jié)來說就是又快又準!
          4)節(jié)省數(shù)十萬云服務器年費,充分利用用戶手機計算資源;避免網(wǎng)絡延遲降低識別實時性;現(xiàn)有開源功能滿足業(yè)務場景需求

        同樣,的劣勢為:無法在小程序中實現(xiàn)識別功能;需要單獨開發(fā)APP,Android、IOS需要分別開發(fā),研發(fā)團隊技術棧不匹配APP開發(fā);需要用戶單獨下載APP,需要更多運營成本。

        具體支持哪些功能呢?看下圖:

        MediaPipe支持的功能

        而我在這里,使用來做一個手勢關鍵點檢測,各位可以看下效果如何。

        代碼如下所示:

        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/

        ?------------------------------------------------

        雙一流大學研究生團隊創(chuàng)建,一個專注于目標檢測與深度學習的組織,希望可以將分享變成一種習慣。

         

        整理不易,點贊三連!

        瀏覽 207
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            女生被艹的视频 | 国产91欧美 | 日韩美穴 | 国产淫语对白粗口video | 在线中文天堂 | 大香蕉导航 | 丝袜老师踩我的喷水 | 男女生羞羞视频网站在线观看 | 波多野结衣无码一区=区三区 | 米奇色色 |