Обнаружение объектов с помощью 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%. При уменьшении значения отображается больше объектов, а при увеличении значения обеспечивается обнаружение объектов с максимальной точностью.
Надеюсь, вам понравилось! Не стесняйтесь обращаться ко мне с вопросами и отзывами или просто для того, чтобы поделиться своими интересными проектами.