Итак, ребята, в сегодняшнем блоге мы увидим, как мы можем выполнять сегментацию человека с помощью Mask R-CNN. Это очень продвинутый проект, и многие вещи происходят под капотом. Так что без каких-либо дополнительных должностей.
Полную статью с исходным кодом читайте здесь —https://machinelearningprojects.net/invisible-man-using-mask-rcnn/
Давай сделаем это…
Код для сегментации человека с использованием Mask-RCNN…
from imutils.video import FPS import numpy as np import matplotlib.pyplot as plt import cv2 import os webcam = 1 expected_confidence = 0.3 threshold = 0.1 show_output = 1 save_output = 1 kernel = np.ones((5,5),np.uint8) writer = None fps = FPS().start() weightsPath = "mask-rcnn-coco/frozen_inference_graph.pb" configPath = "mask-rcnn-coco/mask_rcnn_inception_v2_coco_2018_01_28.pbtxt" print("[INFO] loading Mask R-CNN from disk...") net = cv2.dnn.readNetFromTensorflow(weightsPath, configPath) if use_gpu: # set CUDA as the preferable backend and target print("[INFO] setting preferable backend and target to CUDA...") net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) print("[INFO] accessing video stream...") cap = cv2.VideoCapture(0) print("[INFO] background recording...") for _ in range(60): _,bg = cap.read() print("[INFO] background recording done...") fourcc = cv2.VideoWriter_fourcc(*"MJPG") writer = cv2.VideoWriter('output.avi', fourcc, 20,(bg.shape[1], bg.shape[0]), True) while True: grabbed, frame = cap.read() cv2.imshow('org',frame) if not grabbed: break blob = cv2.dnn.blobFromImage(frame, swapRB=True, crop=False) net.setInput(blob) (boxes, masks) = net.forward(["detection_out_final","detection_masks"]) for i in range(0, boxes.shape[2]): classID = int(boxes[0, 0, i, 1]) if classID!=0:continue confidence = boxes[0, 0, i, 2] if confidence > expected_confidence: (H, W) = frame.shape[:2] box = boxes[0, 0, i, 3:7] * np.array([W, H, W, H]) (startX, startY, endX, endY) = box.astype("int") boxW = endX - startX boxH = endY - startY mask = masks[i, classID] mask = cv2.resize(mask, (boxW, boxH),interpolation=cv2.INTER_CUBIC) mask = (mask > threshold) bwmask = np.array(mask,dtype=np.uint8) * 255 bwmask = np.reshape(bwmask,mask.shape) bwmask = cv2.dilate(bwmask,kernel,iterations=1) frame[startY:endY, startX:endX][np.where(bwmask==255)] = bg[startY:endY, startX:endX][np.where(bwmask==255)] if show_output: cv2.imshow("Frame", frame) if cv2.waitKey(1) ==27: break if save_output: writer.write(frame) fps.update() fps.stop() print("[INFO] elasped time: {:.2f}".format(fps.elapsed())) print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
- Строка 1–5 — Импорт необходимых библиотек для Mask-RCNN.
- Строка 7–14 — Объявление некоторых констант.
- Строка 16–20 — Загрузка сети Mask RCNN.
- Строка 22–26. Если вы хотите использовать GPU, установите серверную часть и цель на CUDA.
- Строка 28–29 — Чтение кадров из прямой трансляции.
- Строка 31–34 — Запись фона.
- Строка 36–37 — Использование cv2.VideoWriter() для сохранения вывода в формате видео.
- Строка 39–43 — Запустите цикл while и начните захватывать кадры с веб-камеры. Если веб-камера ничего не возвращает, Break.
- Строка 45–47 — Используйте cv2.dnn.blobFromImage() для создания большого двоичного объекта из изображения, затем этот большой двоичный объект устанавливается в качестве входных данных для сети, он проходит через сеть, и мы получаем выходные данные в виде ограничивающих рамок и масок.
- Строка 48–66 — просмотр всех выходных данных и предварительная обработка масок для дальнейшего улучшения. Теперь в этой маске везде, где пиксели белые, замените эти пиксели исходного изображения фоновыми пикселями (строка 66).
- Строка 68–72 — Показать вывод и прерваться, когда кто-то нажмет клавишу ESC.
- Строка 74–75 — Сохраните вывод в виде видео.
- Строка 77 — Обновление fps.
- строка 79–81 — Вывести количество кадров в секунду.
Окончательные результаты…
PS. Я знаю, что результаты не идеальны, но они не что иное, как волшебство.
ПРИМЕЧАНИЕ. Если в вашей системе нет графического процессора, не пытайтесь запускать это, потому что это займет вечность из-за использования Mask-RCNN. Даже на GPU еле давал 5-8 кадров в секунду.
Дайте мне знать, если есть какие-либо вопросы относительно сегментации человека с использованием Mask-RCNN, связавшись со мной по электронной почте или LinkedIn. Вы также можете прокомментировать ниже любые вопросы.
Чтобы узнать больше о машинном обучении, глубоком обучении, компьютерном зрении, НЛП и проектах Flask, посетите мой блог — Проекты машинного обучения
Для дальнейшего объяснения кода и исходного кода посетите здесь —
Итак, это все для этого блога, ребята, спасибо за то, что прочитали его, и я надеюсь, что вы возьмете что-то с собой после прочтения этого и до следующего раза 👋…
Прочитайте мой предыдущий пост: NEURAL STYLE TRANSFER