Reconocimiento de gestos humanos basado en Python y tecnología de aprendizaje profundo

El reconocimiento de poses humanas es una aplicación importante en el campo de la visión por computadora. Puede juzgar con precisión la pose y el movimiento del cuerpo humano al identificar los puntos clave y las posiciones de las articulaciones del cuerpo humano. Esta tecnología se puede aplicar en muchos campos, como entrenamiento deportivo, rehabilitación médica, monitoreo de seguridad, etc., lo que brinda una gran comodidad y beneficios para la vida y el trabajo de las personas.

Reconocimiento de gestos humanos basado en Python y tecnología de aprendizaje profundo

En este artículo, presentaremos un método de reconocimiento de poses del cuerpo humano basado en Python y tecnología de aprendizaje profundo. Al leer imágenes o secuencias de video capturadas por cámaras, los modelos OpenCV y Tensorflow se utilizan para detectar poses del cuerpo humano en imágenes y, finalmente, generar una imagen. , marcando la posición de cada punto clave y articulación del cuerpo, así como la conexión entre las articulaciones.

Preparación

Antes de comenzar a implementar el reconocimiento de gestos humanos, debemos preparar algunas herramientas y materiales necesarios. Primero, debe instalar el entorno de Python y las bibliotecas relacionadas, como OpenCV, Tensorflow, Numpy, etc. En segundo lugar, debe descargar un modelo Tensorflow previamente entrenado para detectar poses humanas en imágenes. Finalmente, se requiere una imagen o un flujo de video capturado por una cámara como datos de entrada.

Cargue el modelo y defina los parámetros

Antes de cargar el modelo, necesitamos definir algunas constantes y parámetros, como el número de partes del cuerpo, conexiones de juntas, etc. El código específico es el siguiente:

import cv2
import numpy as np

# 定义身体部位编号
body_parts = {
    
    
    0: "Nose",
    1: "Neck",
    2: "Right Shoulder",
    3: "Right Elbow",
    4: "Right Wrist",
    5: "Left Shoulder",
    6: "Left Elbow",
    7: "Left Wrist",
    8: "Right Hip",
    9: "Right Knee",
    10: "Right Ankle",
    11: "Left Hip",
    12: "Left Knee",
    13: "Left Ankle",
    14: "Right Eye",
    15: "Left Eye",
    16: "Right Ear",
    17: "Left Ear"
}

# 定义关节连线
pose_parts = [
    [0, 1], [1, 2], [2, 3], [3, 4], [1, 5], [5, 6],
    [6, 7], [1, 8], [8, 9], [9, 10], [1, 11], [11, 12], [12, 13],
    [0, 14], [14, 16], [0, 15], [15, 17]
]

# 加载预训练的 Tensorflow 模型
net = cv2.dnn.readNetFromTensorflow("graph_opt.pb")

Leer imágenes o secuencias de video

A continuación, necesitamos leer la imagen o el flujo de video capturado por la cámara como datos de entrada. El código específico es el siguiente:

# 读取图片或者视频流
image = cv2.imread("test.jpg")
# cap = cv2.VideoCapture(0)

Si desea leer la transmisión de video, puede cancelar el comentario y establecer el parámetro en el número de cámara correspondiente.

procesar datos de imagen

Antes de introducir los datos de la imagen en el modelo, debemos realizar un procesamiento en la imagen para convertirla al formato de entrada requerido por la red neuronal. El código específico es el siguiente:

python
# 处理图像数据
blob = cv2.dnn.blobFromImage(image, 1.0, (368, 368), (0, 0, 0), swapRB=False, crop=False)
net.setInput(blob)
output = net.forward()

Entre ellos, la función cv2.dnn.blobFromImage se usa para convertir la imagen al formato de entrada requerido por la red neuronal, es decir, para escalar la imagen al tamaño especificado, restar el valor medio y realizar la normalización y otras operaciones. La función net.setInput se utiliza para configurar los datos de entrada de la red neuronal. La función net.forward se utiliza para los cálculos de propagación directa para obtener las coordenadas de los puntos clave.

Dibujar puntos clave y líneas de unión

Después de obtener las coordenadas de los puntos clave, debemos dibujarlos para su observación y análisis. El código específico es el siguiente:

# 绘制关键点和关节连线
points = []
for i in range(len(body_parts)):
    # 获取可信度
    prob = output[0, i, 2]
    # 判断可信度是否达到阈值
    if prob > 0.5:
        # 获取关键点坐标
        x = int

código completo

import cv2
# 关节标识

body_parts={
    
    "Nose":0,"Neck":1,
            "RShoulder":2,"RElbow":3,"RWrist":4,
            "LShoulder": 5, "LElbow": 6, "LWrist": 7,
            "RHip":8,"RKnee":9,"RAnkle":10,
            "LHip":11,"LKnee":12,"LAnkle":13,
            "REye":14,"LEye":15,
            "REar":16,"LEar":17
            }
#关节连线
pose_parts=[
    ["Neck","RShoulder"],["Neck","LShoulder"],
    ["RShoulder","RElbow"],["RElbow","RWrist"],
    ["LShoulder","LElbow"],["LElbow","LWrist"],
    ["Neck","RHip"],["RHip","RKnee"],["RKnee","RAnkle"],
    ["Neck","LHip"], ["LHip","LKnee"], ["LKnee","LAnkle"],
    ["Neck","Nose"],
    ["Nose","REye"], ["REye","REar"],
    ["Nose","LEye"], ["LEye","LEar"]
]
cap=cv2.VideoCapture("a2.jpg")
# cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)
# 加载模型
net=cv2.dnn.readNetFromTensorflow("pose.pb")
while cv2.waitKey(1)<0:
    ok,frame=cap.read()
    if not ok:
        cv2.waitKey()
        break
    width=frame.shape[1]
    height=frame.shape[0]
    net.setInput(cv2.dnn.blobFromImage(
        frame,1.0,(368,368),(127,127,127),swapRB=True,crop=False
    ))
    out=net.forward()
    out=out[:,:19,:,:]
    # print(out)
    points=[]
    for i in range(len(body_parts)):
        heatmap=out[0,i,:,:]
        _,conf,_,point=cv2.minMaxLoc(heatmap)
        x=(width*point[0])/out.shape[3]
        y=(height*point[1])/out.shape[2]
        points.append((int(x),int(y))if conf>0.2 else None)
    # print(points)
    for p in pose_parts:
        partfrom = p[0]
        partto=p[1]
        idfrom=body_parts[partfrom]
        idto=body_parts[partto]
        if points[idfrom] and points[idto]:
            # 画线
            cv2.line(frame,points[idfrom],points[idto],(0,200,0),3)
            # 画点
            cv2.ellipse(frame,points[idfrom],(3,3),0,0,360,(0,0,200),cv2.FILLED)
            cv2.ellipse(frame, points[idto], (3, 3), 0, 0, 360, (0, 0, 200), cv2.FILLED)
    cv2.imshow("",frame)

Efecto

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_46556714/article/details/130952146
Recomendado
Clasificación