Итак, ребята, в сегодняшнем блоге мы увидим, как мы можем выполнять сегментацию человека с помощью 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