點擊上方「小白學視覺」,選擇加"星標"或「置頂」git
重磅乾貨,第一時間送達github
現在,體育運動的熱潮日益流行。一樣,以不正確的方式進行運動的風險也在增長。有時可能會致使嚴重的傷害。考慮到這些緣由,提出一種以分析運動員的關節運動,來幫助運動員糾正姿式的解決方案。算法
人體姿式估計是計算機視覺領域的重要問題。它的算法有助於定位手腕,腳踝,膝蓋等部位。這樣作是爲了使用深度學習和卷積神經網絡的概念提供個性化的運動訓練體驗。特別是對於體育活動而言,訓練質量在很大程度上取決於圖像或視頻序列中人體姿式的正確性。微信
從圖像或視頻序列中檢測運動員的姿式網絡
數據集
正確選擇數據集以對結果產生適當影響也是很是必要的。在此姿式檢測中,模型在兩個不一樣的數據集即COCO關鍵點數據集和MPII人類姿式數據集上進行了預訓練。app
1. COCO:COCO關鍵點數據集是一個多人2D姿式估計數據集,其中包含從Flickr收集的圖像。迄今爲止,COCO是最大的2D姿式估計數據集,並被視爲測試2D姿式估計算法的基準。COCO模型有18種分類。COCO輸出格式:鼻子— 0,脖子—1,右肩—2,右肘—3,右手腕—4,左肩—5,左手肘—6,左手腕—7,右臀部—8,右膝蓋—9,右腳踝—10,左臀部—11,左膝—12,左腳踝—13,右眼—14,左眼—15,右耳—16,左耳—17,背景—18框架
具體步驟
步驟1:需求收集(模型權重)和負載網絡
訓練有素的模型須要加載到OpenCV中。這些模型在Caffe深度學習框架上進行了訓練。Caffe模型包含兩個文件,即.prototxt文件和.caffemodel文件。學習
.prototxt文件指定了神經網絡的體系結構。
.caffemodel文件存儲訓練後的模型的權重。
而後咱們將這兩個文件加載到網絡中。
# Specify the paths for the 2 filesprotoFile = "pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"weightsFile = "pose/mpi/pose_iter_160000.caffemodel"# Read the network into Memorynet = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)
步驟2:讀取圖像並準備輸入網絡
首先,咱們須要使用blobFromImage函數將圖像從OpenCV格式轉換爲Caffe blob格式,以即可以將其做爲輸入輸入到網絡。這些參數將在blobFromImage函數中提供。因爲OpenCV和Caffe都使用BGR格式,所以無需交換R和B通道。
# Read imageframe = cv2.imread("image.jpg")# Specify the input image dimensionsinWidth = 368inHeight = 368# Prepare the frame to be fed to the networkinpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight), (0, 0, 0), swapRB=False, crop=False)# Set the prepared object as the input blob of the networknet.setInput(inpBlob)
步驟3:作出預測並解析關鍵點
一旦將圖像傳遞到模型,就能夠使用OpenCV中DNN類的正向方法進行預測,該方法經過網絡進行正向傳遞,這只是說它正在進行預測的另外一種方式。
output = net.forward()
輸出爲4D矩陣:
第一個維度是圖片ID(若是您將多個圖片傳遞到網絡)。
第二個維度指示關鍵點的索引。該模型會生成置信度圖(在圖像上的機率分佈,表示每一個像素處關節位置的置信度)和全部已鏈接的零件親和度圖。對於COCO模型,它由57個部分組成-18個關鍵點置信度圖+ 1個背景+ 19 * 2個部分親和度圖。一樣,對於MPI,它會產生44點。咱們將僅使用與關鍵點相對應的前幾個點。
第三維是輸出圖的高度。
第四個維度是輸出圖的寬度。
而後,咱們檢查圖像中是否存在每一個關鍵點。咱們經過找到關鍵點的置信度圖的最大值來得到關鍵點的位置。咱們還使用閾值來減小錯誤檢測。
置信度圖
一旦檢測到關鍵點,咱們便將其繪製在圖像上。
H = out.shape[2]W = out.shape[3]# Empty list to store the detected keypointspoints = []for i in range(len()): # confidence map of corresponding body's part. probMap = output[0, i, :, :] # Find global maxima of the probMap. minVal, prob, minLoc, point = cv2.minMaxLoc(probMap) # Scale the point to fit on the original image x = (frameWidth * point[0]) / W y = (frameHeight * point[1]) / H if prob > threshold : cv2.circle(frame, (int(x), int(y)), 15, (0, 255, 255), thickness=-1, lineType=cv.FILLED) cv2.putText(frame, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, lineType=cv2.LINE_AA)# Add the point to the list if the probability is greater than the threshold points.append((int(x), int(y))) else : points.append(None)cv2.imshow("Output-Keypoints",frame)cv2.waitKey(0)cv2.destroyAllWindows()
步驟4:繪製骨架
因爲咱們已經繪製了關鍵點,所以咱們如今只需將兩對鏈接便可繪製骨架。
for pair in POSE_PAIRS: partA = pair[0] partB = pair[1] if points[partA] and points[partB]: points[partA], points[partB], (0, 255, 0), 3)
結果
上面顯示的輸出向咱們顯示了運動員在特定時刻的準確姿式。下面是視頻的檢測結果。
項目源碼:https://github.com/ManaliSeth/Athlete-Pose-Detection
交流羣
歡迎加入公衆號讀者羣一塊兒和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫學影像、GAN、算法競賽等微信羣(之後會逐漸細分),請掃描下面微信號加羣,備註:」暱稱+學校/公司+研究方向「,例如:」張三 + 上海交大 + 視覺SLAM「。請按照格式備註,不然不予經過。添加成功後會根據研究方向邀請進入相關微信羣。請勿在羣內發送廣告,不然會請出羣,謝謝理解~
本文分享自微信公衆號 - 小白學視覺(NoobCV)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。