Я собираюсь выполнить обнаружение ориентиров на нескольких изображениях. Ниже я привел код, который использует PoseLandmarkerOptions для идентификации 33 ориентиров на теле. Найдя эти ориентиры, я планирую классифицировать угол лица как 0 градусов, 90 градусов, 180 градусов или 270 градусов. .
Данные:
Я включил образцы изображений из набора данных MARS, так как не смог использовать исходные изображения из-за проблемы — они имеют более высокое разрешение и размеры по сравнению с MARS. набор данных.




[img]https://i.sstatic. net/QD1M6onZ.jpg[/img]



все изображения в сжатом виде файл:
Код:
Я предоставил основной код для обнаружения ориентиров на изображениях.
Код: Выделить всё
import sys
import cv2
import numpy as np
import glob
import os
import base64
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
from typing import Dict
base_options = python.BaseOptions(
model_asset_path="./models/pose_landmarker.task",
delegate=python.BaseOptions.Delegate.GPU,
)
options = vision.PoseLandmarkerOptions(
base_options=base_options,
output_segmentation_masks=True,
min_pose_detection_confidence=0.5,
min_pose_presence_confidence=0.5,
min_tracking_confidence=0.5,
)
detector = vision.PoseLandmarker.create_from_options(options)
def check_landmarks(detection_result, img, address):
file_name = address.split("/")[-1]
w, h, _ = img.shape
for each_person_pose in detection_result.pose_landmarks:
for each_key_point in each_person_pose:
if each_key_point.presence > 0.5 and each_key_point.visibility > 0.5:
x_px = int(each_key_point.x * h)
y_px = int(each_key_point.y * w)
cv2.circle(img, (x_px, y_px), 3, (255, 0, 0), 2)
cv2.imwrite("./landmarks/" + file_name, img)
def rectifier(detector, image, address):
try:
srgb_image = mp.Image.create_from_file(address)
detection_result = detector.detect(srgb_image)
check_landmarks(detection_result, srgb_image.numpy_view(), address)
except Exception as e:
print(f"error {e}")
def rectify_image(rectify_image_request):
image = cv2.imdecode(
np.frombuffer(base64.b64decode(rectify_image_request["image"]), np.byte),
cv2.IMREAD_COLOR,
)
rectifier(detector, image, rectify_image_request["address"])
def read_image_for_rectify(address: str) -> Dict:
face_object = dict()
img = cv2.imread(address)
_, buffer = cv2.imencode(".jpg", img)
img = base64.b64encode(buffer).decode()
face_object["image"] = img
face_object["address"] = address
return face_object
folder_path = "./png2jpg"
file_paths = glob.glob(os.path.join(folder_path, "*.jpg"), recursive=True)
for id_file, file in enumerate(file_paths):
print(id_file, file)
rectify_image(read_image_for_rectify(file))
Изначально я использовал адреса изображений для подачи изображений напрямую в Mediapipe, и результаты показали приемлемую производительность. .









< /p>
Однако теперь мне нужно получать изображения в виде словарей с изображениями, закодированными в base64. Я соответствующим образом изменил входные данные, но при просмотре выходных данных в этом сценарии Mediapipe не может обнаружить ориентиры на многих изображениях. Поэтому я передаю изображения в виде массива numpy в медиапайп, изменив эту строку на
Код: Выделить всё
srgb_image = mp.Image.create_from_file(address)
Код: Выделить всё
srgb_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=image)








Как добиться согласованного результата в обоих сценариях?
Подробнее здесь: https://stackoverflow.com/questions/792 ... py-array-i