Outils pour utilisateurs

Outils du site


movenet

MoveNet

Ressources

Optimisation de Tensorflow

Movenet appelle Tensorflow Lite, qui n'est pas optimisé pour GPU. Inutile d'installer Cuda.
Il ne tourne que sur CPU, et demande à avoir AVX2 et FMA.
Pour compiler Tensorflow, voir Linux Compiler Tensorflow avec Bazel

Altrnatives, trouver un truc tout fait:

Exemple

movenet_test.py
from time import time
import cv2
import numpy as np
import tensorflow as tf
 
def draw(frame, keypoints_with_scores):
    for item in keypoints_with_scores[0][0]:
        if item[2] > 0.3:  # confiance
            x = int(item[1]*720)  # numpy array x est le 2ème
            y = int(item[0]*720)
            cv2.circle(frame, (x, y), 6, color=(0,0,255), thickness=-1)
    return frame
 
models = [  "lite-model_movenet_singlepose_thunder_3.tflite",
            "lite-model_movenet_singlepose_thunder_tflite_float16_4.tflite",
            "lite-model_movenet_singlepose_thunder_tflite_int8_4.tflite"]
 
interpreter = tf.lite.Interpreter(model_path=models[0])
interpreter.allocate_tensors()
 
cv2.namedWindow('color', cv2.WND_PROP_FULLSCREEN)
cam = cv2.VideoCapture(2)
cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
 
t0 = time()
nbr = 0
 
while 1:
 
    nbr += 1
    ret, frame = cam.read()
 
    if not ret:
        continue
 
    # Extraction d'une image carrée [rows, columns]
    frame = frame[:, 280:1000]
 
    image = tf.expand_dims(frame, axis=0)
    # Resize and pad the image to keep the aspect ratio and fit the expected size.
    image = tf.image.resize_with_pad(image, 256, 256)
 
    # TF Lite format expects tensor type of float32.
    input_image = tf.cast(image, dtype=tf.float32)
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()
 
    interpreter.set_tensor(input_details[0]['index'], input_image.numpy())
    interpreter.invoke()
 
    # Output is a [1, 1, 17, 3] numpy array.
    keypoints_with_scores = interpreter.get_tensor(output_details[0]['index'])
 
    frame = draw(frame, keypoints_with_scores)
 
    # Affichage de l'image
    cv2.imshow('color', frame)
 
    # Calcul du FPS, affichage toutes les 10 s
    if time() - t0 > 10:
        print("FPS =", round(nbr/10, 2))
        t0, nbr = time(), 0
 
    # Pour quitter
    if cv2.waitKey(1) == 27:
        break
 
cv2.destroyAllWindows()

Des essais amusants

movenet.txt · Dernière modification : 2021/12/16 09:07 de serge