You only look once, или YOLO, — эффективный алгоритм, который позволяет выделять объекты на изображении. В этой статье мы используем его, чтобы написать на Python программу для определения числа людей в помещении, а по дороге опробуем его в разгадывании капчи.
Если ты смотрел «Терминатор», то помнишь кадры из глаз T-800: он смотрел по сторонам и определял разные объекты. Тогда о такой машине можно было только мечтать, а сегодня ее можно смастерить самому из готовых частей.
Распознавание объектов сегодня пригождается для решения самых разных задач: классификации видов растений и животных, распознавания лиц, определения габаритов объектов — и это далеко не полный список.
Существует несколько алгоритмов обнаружения объектов на изображениях и видео. Посмотрим, что они собой представляют.
Сперва на изображении с помощью алгоритма выборочного поиска выделяются регионы, которые предположительно содержат объект. Далее сверточная нейронная сеть (CNN) пытается выявить признаки объектов для каждого из этих регионов, после чего машина опорных векторов классифицирует полученные данные и сообщает класс обнаруженного объекта.
Обработка в режиме реального времени: не поддерживается.
Подход аналогичен алгоритму R-CNN. Но вместо того, чтобы предварительно выделять регионы, мы передаем входное изображение в CNN для создания сверточной карты признаков, где затем будет происходить выборочный поиск, а предсказание класса объектов выполняет специальный слой Softmax.
Обработка в режиме реального времени: не поддерживается.
Подобно Fast R-CNN, изображение передается в CNN создания сверточной карты признаков, но вместо алгоритма выборочного поиска для прогнозирования предложений по регионам используется отдельная сеть.
Обработка в режиме реального времени: поддерживается при высоких вычислительных мощностях.
Изображение делится на квадратную сетку. Для каждой ячейки сети CNN выводит вероятности определяемого класса. Ячейки, имеющие вероятность класса выше порогового значения, выбираются и используются для определения местоположения объекта на изображении.
Обработка в режиме реального времени: поддерживается!
Как видишь, YOLO пока что лучший вариант для обнаружения и распознавания образов. Он отличается высокой скоростью и точностью обнаружения объектов, а еще этот алгоритм можно использовать в проектах на Android и Raspberry Pi с помощью нетребовательного tiny-варианта сети, с которым мы с тобой сегодня будем работать.
Tiny-вариант несколько проигрывает в точности полноценному варианту сети, но и требует меньшей вычислительной мощности, что позволит запустить проект, который мы сегодня будем делать, как на слабом компьютере, так и, при желании, на смартфоне.
Чтобы написать легковесное приложение для обнаружения объектов на изображении, нам с тобой понадобятся:
Дополнительно установим библиотеки OpenCV и NumPy:
pip install opencv-python pip install numpy
Теперь напишем приложение, которое будет находить объекты на изображении при помощи YOLO и отмечать их.
Мы попробуем обойти CAPTCHA с изображениями грузовиков — класс truck в датасете COCO. Дополнительно мы посчитаем количество обнаруженных объектов нужного нам класса и выведем всю информацию на экран.
Начнем с написания функции для применения YOLO. С ее помощью определяются самые вероятные классы объектов на изображении, а также координаты их границ, которые позже мы будем использовать для отрисовки.
import cv2import numpy as npdef apply_yolo_object_detection(image_to_process): """ Распознавание и определение координат объектов на изображении :param image_to_process: исходное изображение :return: изображение с размеченными объектами и подписями к ним """ height, width, depth = image_to_process.shape blob = cv2.dnn.blobFromImage(image_to_process, 1 / 255, (608, 608), (0, 0, 0), swapRB=True, crop=False) net.setInput(blob) outs = net.forward(out_layers) class_indexes, class_scores, boxes = ([] for i in range(3)) objects_count = 0 # Запуск поиска объектов на изображении for out in outs: for obj in out: scores = obj[5:] class_index = np.argmax(scores) class_score = scores[class_index] if class_score > 0: center_x = int(obj[0] * width) center_y = int(obj[1] * height) obj_width = int(obj[2] * width) obj_height = int(obj[3] * height) box = [center_x - obj_width // 2, center_y - obj_height // 2, obj_width, obj_height] boxes.append(box) class_indexes.append(class_index) class_scores.append(float(class_score)) # Выборка chosen_boxes = cv2.dnn.NMSBoxes(boxes, class_scores, 0.0, 0.4) for box_index in chosen_boxes: box_index = box_index[0] box = boxes[box_index] class_index = class_indexes[box_index] # Для отладки рисуем объекты, входящие в искомые классы if classes[class_index] in classes_to_look_for: objects_count += 1 image_to_process = draw_object_bounding_box(image_to_process, class_index, box) final_image = draw_object_count(image_to_process, objects_count) return final_image
Далее добавим функцию, которая позволит нам обвести найденные на изображении объекты с помощью координат границ, которые мы получили в apply_yolo_object_detection
.
def draw_object_bounding_box(image_to_process, index, box): """ Рисование границ объекта с подписями :param image_to_process: исходное изображение :param index: индекс определенного с помощью YOLO класса объекта :param box: координаты области вокруг объекта :return: изображение с отмеченными объектами """ x, y, w, h = box start = (x, y) end = (x + w, y + h) color = (0, 255, 0) width = 2 final_image = cv2.rectangle(image_to_process, start, end, color, width) start = (x, y - 10) font_size = 1 font = cv2.FONT_HERSHEY_SIMPLEX width = 2 text = classes[index] final_image = cv2.putText(final_image, text, start, font, font_size, color, width, cv2.LINE_AA) return final_image
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
1 год9300 р. |
1 месяц870 р. |
Я уже участник «Xakep.ru»
Читайте также
Последние новости