Обнаружение объектов в видео заключается в том, чтобы обнаруживать присутствие объектов, помещать их в определенные классы на основе нашей модели глубокого обучения и размещать вокруг них ограничивающие рамки.

Проще говоря, наш ввод — это видео или изображения с несколькими объектами, а вывод — это то же видео или изображение с ограничивающими рамками (определенной высоты и ширины) вокруг объектов + имена классов и вероятности, к которым они принадлежат.

Здесь мы будем использовать предварительно обученную модель YOLO (You Only Look Once), которая была обучена для большого набора данных, состоящего примерно из 80 классов объектов, в течение длительного времени с высокой -мощные ресурсы. В этой статье мы не будем углубляться в архитектуру YOLO и сосредоточимся больше на библиотеке ImageAI библиотеке для обнаружения объектов на нашем видео и получения Результаты.

Чтобы узнать больше о внутренней работе YOLO, вы всегда можете обратиться к этой замечательной статье: Ссылка на статью.

Создание этих моделей с нуля требует глубокого понимания математики и ее архитектуры, а также написания тысяч строк кода. Таким образом, мы всегда можем воспользоваться концепцией переноса обучения и использовать обученные веса кого-то другого, кто был достаточно любезен, чтобы обучить свои модели с очень дорогими ресурсами и сделать их общедоступными.

Именно здесь появляется ImageAI, который позволил любому, кто имеет базовые знания Python, создавать приложения и системы, которые могут обнаруживать объекты в видео, используя всего несколько строк программного кода.

Прежде чем мы начнем использовать ImageAI, нам нужно установить несколько зависимостей. Я использую Jupyter Notebooks для выполнения следующего кода:

  1. ТензорФлоу
!pip3 install tensorflow==2.4.0

2. Другие зависимости

!pip install keras==2.4.3 numpy==1.19.3 pillow==7.0.0 scipy==1.4.1 h5py==2.10.0 matplotlib==3.3.2 opencv-python keras-resnet==0.2.0

3. ИмиджИИ

!pip install imageai --upgrade

Теперь мы установили все необходимые инструменты для получения предварительно обученной модели YOLOv3. Получить можно здесь: Ссылка на модель

Эта модель уже обучена обнаруживать около 80 классов объектов, упомянутых ниже:

person, bicycle, car, motorcycle, airplane,
bus, train, truck, boat, traffic light, fire hydrant, stop_sign,
parking meter, bench, bird, cat, dog, horse, sheep, cow, elephant, bear, zebra,
giraffe, backpack, umbrella, handbag, tie, suitcase, frisbee, skis, snowboard,
sports ball, kite, baseball bat, baseball glove, skateboard, surfboard, tennis racket,
bottle, wine glass, cup, fork, knife, spoon, bowl, banana, apple, sandwich, orange,
broccoli, carrot, hot dog, pizza, donot, cake, chair, couch, potted plant, bed,
dining table, toilet, tv, laptop, mouse, remote, keyboard, cell phone, microwave,
oven, toaster, sink, refrigerator, book, clock, vase, scissors, teddy bear, hair dryer,
toothbrush.

Вы можете скачать любое видео с YouTube с кучей этих объектов или всегда снимать один из своих.

Я использовал уличное видео, показывающее группу людей и машин. Ниже приведен скриншот из этого видео.

Выполните приведенный ниже код, и он начнет обрабатывать ваше видео в кадрах.

Если у вас достаточно хороший графический процессор NVIDIA, вы всегда можете использовать зависимость tensorflow-gpu, и этот процесс обнаружения должен выполняться менее чем за минуту в зависимости от размера вашего видео. В противном случае это может занять несколько минут.

Обнаружение будет выполняться для каждого кадра обнаруженного видео, а сохраненное обнаруженное видео будет автоматически обновляться для каждого обнаруженного кадра.

from imageai.Detection import VideoObjectDetection
import os
path = os.getcwd()
det = VideoObjectDetection()
det.setModelTypeAsYOLOv3()
det.setModelPath(os.path.join(path, "yolo.h5"))
det.loadModel()
video_path = det.detectObjectsFromVideo(input_file_path=os.path.join(path,"your_video_file.mp4"),
                                     output_file_path=os.path.join(path, "your_video_file_detected"),
                         display_percentage_probability = False,                        
                        frames_per_second=20, log_progress=True)
print(video_path)

Вывод:

На выходе отображаются обнаруженные объекты с ограничивающими прямоугольниками и именами вокруг них. Для простоты я использовал display_percentage_probability = False.

Если вы почерпнули какие-то идеи из этой статьи, хлопайте в ладоши. Вы можете связаться со мной в разделе комментариев, если у вас есть какие-либо вопросы или предложения.