От обнаружения объектов до Генеративных состязательных сетей (GAN) глубокое обучение демонстрирует свое мастерство. Обнаружение объектов эволюционировало от старых добрых детекторов признаков, созданных вручную, до современных детекторов объектов сверточной нейронной сети (CNN), основанных на глубоком обучении, таких как R-CNN и YOLO. Обнаружение с использованием CNN приближает местоположение объекта на изображении, предсказывая его координаты ограничивающего прямоугольника, тогда как сегментация идет дальше, предсказывая границы объектов на изображениях. В этой статье мы рассмотрим шаги по запуску сети обнаружения транспортных средств с YOLOv3, обученным на наборе данных MS-COCO, который может обнаруживать около 90 различных классов объектов. С помощью этой сети мы сможем обнаруживать и отслеживать автомобили, автобусы, грузовики, велосипедисты и многое другое! Чтобы найти больше интересных статей об ИИ, погрузитесь прямо сюда.

1. Знакомство с тензорнетами

Загрузить веса Darknet для YOLOv3 и заставить его работать в тензорном потоке - довольно утомительная задача. Но мы сделаем то же самое за 2 минуты! Как спросить?

Что ж, мистер Тэхун Ли взял на себя труд преобразовать веса различных популярных сетей в формат тензорного потока и выпустил библиотеку PyPi под названием «Tensornets». Tensornets позволил выполнять переносное обучение и выполнять логический вывод всего за «10 строк» ​​интуитивно понятного кода.

Посетите его страницу на Github: https://github.com/taehoonlee/tensornets

2. Загрузка YOLO

YOLOv3 - это улучшенная версия YOLOv2, которая имеет более высокую точность и оценку MAP, и это основная причина, по которой мы выбираем v3 вместо v2.

Поехали.

Во-первых, нам нужно установить библиотеку «tensornets», и это легко сделать с помощью удобной команды «PIP». «Pip install tensornets» подойдет, но его также можно установить, вытащив его с GitHub. Убедитесь, что у вас установлен Tensorflow, прежде чем начинать творить чудеса с кодом.

Запустите свою любимую IDE и импортируйте тензорный поток и тензорные сети. Наряду с этим нам понадобятся OpenCV и numpy, чтобы помочь с импортом изображений и видео. Мы используем «время», чтобы отслеживать время, необходимое сети для обработки одного кадра.

import tensorflow as tf
import tensornets as nets
import cv2
import numpy as np
import time

После того, как мы импортируем необходимые библиотеки, мы переходим к созданию входного заполнителя для сети и самой модели.

inputs = tf.placeholder(tf.float32, [None, 416, 416, 3]) 
model = nets.YOLOv3COCO(inputs, nets.Darknet19)

Эти две линии выполняют кропотливую задачу по загрузке весов и графика «Всего две».

3. Выполнение вывода

Пришло время создать сеанс тензорного потока и выполнить логический вывод для видео. Строки ниже определяют классы объектов, которые мы хотим отслеживать, и их индексы MS-COCO.

classes={'0':'person','1':'bicycle','2':'car','3':'bike','5':'bus','7':'truck'}
list_of_classes=[0,1,2,3,5,7]#to display other detected #objects,change the classes and list of classes to their respective #COCO indices available in their website. Here 0th index is for #people and 1 for bicycle and so on. If you want to detect all the #classes, add the indices to this list
with tf.Session() as sess:
    sess.run(model.pretrained())
    
    cap = cv2.VideoCapture("D://pyworks//yolo//videoplayback.mp4")
    #change the path to your directory or to '0' for webcam
    while(cap.isOpened()):
        ret, frame = cap.read()
        img=cv2.resize(frame,(416,416))
        imge=np.array(img).reshape(-1,416,416,3)
        start_time=time.time()
        preds = sess.run(model.preds, {inputs: model.preprocess(imge)})

4. Результат

Двигаемся дальше! Как только видеокадр передается в сеть, он возвращает ограничивающие прямоугольники и инкапсулирует его в объект «preds». Теперь мы можем получить обнаруженные классы и их координаты из объекта «preds».

print("--- %s seconds ---" % (time.time() - start_time)) #to time it
        boxes = model.get_boxes(preds, imge.shape[1:3])
        cv2.namedWindow('image',cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 700,700)
        
        boxes1=np.array(boxes)
        for j in list_of_classes: #iterate over classes
            count =0
            if str(j) in classes:
                lab=classes[str(j)]
            if len(boxes1) !=0:
#iterate over detected vehicles
                for i in range(len(boxes1[j])): 
                    box=boxes1[j][i] 
                    #setting confidence threshold as 40%
                    if boxes1[j][i][4]>=.40: 
                        count += 1    
 
                        cv2.rectangle(img,(box[0],box[1]),(box[2],box[3]),(0,255,0),3)
                        cv2.putText(img, lab, (box[0],box[1]), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), lineType=cv2.LINE_AA)
            print(lab,": ",count)
    
        #Display the output      
        cv2.imshow("image",img)  
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

Это отображает гусеничные автомобили с именными тегами в новом окне!

Вот как это делается!

Скорость YOLOv3 при работе на Nvidia GTX 1060 6GB дает около 12 кадров в секунду, а на Nvidia Titan она может достигать 30 кадров в секунду. С появлением мощных периферийных вычислительных устройств YOLO может заменить Mobilenet и другие компактные сети обнаружения объектов, которые менее точны, чем YOLO. Сверточные сети могут делать больше, чем просто обнаружение объектов. Семантическая сегментация, генерация изображений, сегментация экземпляров и другое.

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

Интерпретация мельчайших деталей бумаги YOLO

Машинное обучение, несомненно, меняет ландшафт цифрового мира. И вскоре ИИ затронет почти каждую отрасль.

Чтобы узнать больше об ИИ, погрузитесь в HackerStreak

Найдите весь код на GitHub https://github.com/Baakchsu/Vehicle-and-people-tracking-with-YOLOv3-

Есть вопросы? Стреляй в меня.



Первоначально опубликовано на https://hackerstreak.com