Ước lượng tư thế con người - Human Pose Estimation

Tiếp tục những chủ đề liên quan đến việc nhận diện thông qua sử dụng camera hôm nay chúng ta sẽ tìm hiểu việc ước lượng tư thế của con người. Nghe có vẻ lạ xa lạ nhỉ? Nhưng thực chất việc ước lượng tư thế được ứng dụng rất nhiều trong việc tạo ra các nhân vật trong thế giới Marvel, các ứng dụng y tế hiện đại, ..vv.


Để bắt đầu chúng ta cần chuẩn bị như sau:

pip install opencv-python
pip install numpy

 

Thực hiện:

  • Chúng ta cần load model lên bộ nhớ
  • Nhập video
import cv2
import numpy as np

# Load model
protoFile = "./pose_deploy_linevec_faster_4_stages.prototxt.txt"
weightsFile = "./pose_iter_160000.caffemodel"
net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)

frameSize = (800, 600)
cap = cv2.VideoCapture('./video/dance_video_test.mp4')
out = cv2.VideoWriter('out.avi', cv2.VideoWriter_fourcc(
    'M', 'J', 'P', 'G'), 10, frameSize)
print('Start Processing...')
while True:
    _, frame = cap.read()
    if _ == False:
        break
    frame = cv2.resize(frame, frameSize)
    # Caculate 
    frame = pose_estimation(frame)
    out.write(frame)

print("Finish!")
out.release()
cap.release()

def pose_estimation(frame):
    # Read image
    frameCopy = np.copy(frame)
    frameWidth = frame.shape[1]
    frameHeight = frame.shape[0]
    inWidth = 368
    inHeight = 368
    # Prepare the frame to be fed to the network
    inpBlob = 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 network
    net.setInput(inpBlob)

    frameCopy = frame.copy()
    output = net.forward()
    H = output.shape[2]
    W = output.shape[3]
    nPoints = 15
    POSE_PAIRS = [[0, 1], [1, 2], [2, 3], [3, 4], [1, 5], [5, 6], [6, 7], [
        1, 14], [14, 8], [8, 9], [9, 10], [14, 11], [11, 12], [12, 13]]
    threshold = 0.01

    points = []
    for i in range(nPoints):
        probMap = output[0, i, :, :]
        minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)
        x = (frameWidth * point[0]) / W
        y = (frameHeight * point[1]) / H
        # print(prob)
        if prob > threshold:
            cv2.circle(frame, (int(x), int(y)), 15, (0, 255, 255),
                       thickness=-1, lineType=cv2.FILLED)
            cv2.putText(frame, "{}".format(i), (int(x), int(
                y)), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 2, lineType=cv2.LINE_AA)
            points.append((int(x), int(y)))
        else:
            points.append(None)
    for pair in POSE_PAIRS:
        partA = pair[0]
        partB = pair[1]
        if points[partA] and points[partB]:
            cv2.line(frameCopy, points[partA], points[partB], (0, 255, 255), 2)
            cv2.circle(frameCopy, points[partA], 8, (0,
                                                     0, 255), thickness=-1, lineType=cv2.FILLED)
            cv2.circle(frameCopy, points[partB], 8, (0,
                                                     0, 255), thickness=-1, lineType=cv2.FILLED)
    return frameCopy





























 

Có thể bạn quan tâm ???


Sản phẩm liên quan