Обнаружение человека на изображении

Как можно подступиться к решению задачи, по поводу обнаружения человека на изображении и выделения области где он находится. Я примерно представляю что нужна нейронная сеть, которая на выходе. Будeт выдавать 4 координаты области, внутри которой будет находиться человек. Но я не до конца понимаю как обучать такую нейросеть и какую структуру она должна иметь.


Ответы (2 шт):

Автор решения: Ret7020

Итак, данная задача - задача семантической сегментации/object detection. В основном практически все нейросети, которые работают с изображениями основаны на свёртке(CNN). Архитектур подобных нейросетей очень много. К примеру: R-CNN, Yolo, Mask RCNN. Можно конечно написать архитектуру таких моделей самому, но я думаю для начала Вам будет достаточно просто взять готовую реализацию из фреймворков, таких как tensorflow или pytorch. К вопросу о том, как это обучать. Очевидно вам нужен датасет. Датасет представляет из себя набор пар: изображение - координаты bounding box с человеком. Т.е. каждой картинке у вас есть соответствующие координаты прямоугольника внутри которого есть человек. Для того, чтобы разметить такой датасет можно использовать различные программы, такие как LabelIMG. Они позволят упростить процесс разметки. Но, справедливости ради, задача поиска человека на фото не новая, и в открытом доступе вы можете найти уже размеченные датасеты. Их стоит поискать на kaggle.com. Вот некоторые ссылки, касающиеся поиска объектов на изображении. Офф. документация PyTorch с вашей задачей

Обучение на готовом датасете COCO

На Tensorflow

Очень подробно про разметку и обучение, tensorflow

Простое объяснение о работе CNN

→ Ссылка
Автор решения: ППУПУПУПУ

Вот пример разметки данных (для y):

import cv2
import os

image_dir = "images/"
output_file = "label.txt"

image_files = [f for f in os.listdir(image_dir) if f.endswith((".jpg", ".png", ".jpeg"))]

annotations = []
current_idx = 0

def draw_bbox(event, x, y, flags, param):
    global x_start, y_start, drawing, img, annotations, image_files, current_idx

    if event == cv2.EVENT_LBUTTONDOWN:
        x_start, y_start = x, y
        drawing = True

    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        cv2.rectangle(img, (x_start, y_start), (x, y), (0, 255, 0), 2)
        annotations.append(f"{x_start} {y_start} {x} {y}")

while current_idx < len(image_files):
    file_name = image_files[current_idx]
    img_path = os.path.join(image_dir, file_name)
    img = cv2.imread(img_path)

    if img is None:
        print(f"Ошибка загрузки изображения: {img_path}")
        current_idx += 1
        continue

    cv2.namedWindow("Image")
    cv2.setMouseCallback("Image", draw_bbox)

    while True:
        cv2.imshow("Image", img)
        key = cv2.waitKey(1)

        if key == ord("s"):
            with open(output_file, "a") as f:
                f.write(f"# {img_path}\n")
                for bbox in annotations:
                    f.write(f"{bbox}\n")
                annotations = []
            print(f"Сохранено: {file_name}")
            break

        elif key == ord("n"):
            break

        elif key == ord("q"):
            cv2.destroyAllWindows()
            exit()

    current_idx += 1
    cv2.destroyAllWindows()

print("Разметка завершена! Все аннотации сохранены в label.txt")
→ Ссылка