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