Обнаружение объектов с помощью Python и YOLO

Компьютерное зрение с вашей веб-камерой

Резюме

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

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

Основными задачами компьютерного зрения являются классификация изображений и обнаружение объектов. Первый распознает, о чем изображение, и классифицирует его с помощью метки. Лучшим примером будет классификация фотографий собак и кошек. Но что, если задача - посчитать, сколько собак и кошек на картинке? Это было бы проблемой обнаружения объекта. Обнаружение объектов занимается обнаружением экземпляров семантических объектов определенного класса в цифровых изображениях и видео.

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

Настраивать

Есть несколько способов использования предварительно обученной модели для компьютерного зрения, самые популярные фреймворки - Tensorflow и Keras. Однако я считаю, что ImageAI - самый удобный инструмент для такого ленивого программиста, как я. Этот пакет облегчает использование глубокого обучения и компьютерного зрения, поскольку он предоставляет очень мощные и простые функции для обнаружения объектов и классификации изображений.

Прежде всего, я загружу веса предварительно обученного YOLO отсюда (файл yolo.h5) и сохраню файл в какой-нибудь папке на моем компьютере.

modelpath = "mycomputer/myfolder/yolo.h5"

Затем я могу очень легко загрузить модель с помощью ImageAI:

from imageai import Detection
yolo = Detection.ObjectDetection()
yolo.setModelTypeAsYOLOv3()
yolo.setModelPath(modelpath)
yolo.loadModel()

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

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

import cv2
cam = cv2.VideoCapture(0) #0=front-cam, 1=back-cam
cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1300)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 1500)

Предсказывать

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

while True:
    ## read frames
    ret, img = cam.read()
    ## predict yolo
    img, preds = yolo.detectCustomObjectsFromImage(input_image=img, 
                      custom_objects=None, input_type="array",
                      output_type="array",
                      minimum_percentage_probability=70,
                      display_percentage_probability=False,
                      display_object_name=True)
    ## display predictions
    cv2.imshow("", img)
    ## press q or Esc to quit    
    if (cv2.waitKey(1) & 0xFF == ord("q")) or (cv2.waitKey(1)==27):
        break
## close camera
cam.release()
cv2.destroyAllWindows()

Весело, правда? И модель тоже неплохо себя чувствует, хотя и распознает апельсин как «спортивный мяч».

Я использую минимальную процентную вероятность 0,70, что означает, что мы можем обнаруживать объекты только тогда, когда модель уверена как минимум на 70%. При уменьшении значения отображается больше объектов, а при увеличении значения обеспечивается обнаружение объектов с максимальной точностью.

Надеюсь, вам понравилось! Не стесняйтесь обращаться ко мне с вопросами и отзывами или просто для того, чтобы поделиться своими интересными проектами.

LinkedIn | Instagram | Твиттер | GitHub