Содержание статьи
Если ты смотрел «Терминатор», то помнишь кадры из глаз T-800: он смотрел по сторонам и определял разные объекты. Тогда о такой машине можно было только мечтать, а сегодня ее можно смастерить самому из готовых частей.
Распознавание объектов сегодня пригождается для решения самых разных задач: классификации видов растений и животных, распознавания лиц, определения габаритов объектов — и это далеко не полный список.
Какие бывают алгоритмы
Существует несколько алгоритмов обнаружения объектов на изображениях и видео. Посмотрим, что они собой представляют.
R-CNN, Region-Based Convolutional Neural Network
Сперва на изображении с помощью алгоритма выборочного поиска выделяются регионы, которые предположительно содержат объект. Далее сверточная нейронная сеть (CNN) пытается выявить признаки объектов для каждого из этих регионов, после чего машина опорных векторов классифицирует полученные данные и сообщает класс обнаруженного объекта.
Обработка в режиме реального времени: не поддерживается.
Fast R-CNN, Fast Region-Based Convolutional Neural Network
Подход аналогичен алгоритму R-CNN. Но вместо того, чтобы предварительно выделять регионы, мы передаем входное изображение в CNN для создания сверточной карты признаков, где затем будет происходить выборочный поиск, а предсказание класса объектов выполняет специальный слой Softmax.
Обработка в режиме реального времени: не поддерживается.
Faster R-CNN, Faster Region-Based Convolutional Neural Network
Подобно Fast R-CNN, изображение передается в CNN создания сверточной карты признаков, но вместо алгоритма выборочного поиска для прогнозирования предложений по регионам используется отдельная сеть.
Обработка в режиме реального времени: поддерживается при высоких вычислительных мощностях.
YOLO, You Only Look Once
Изображение делится на квадратную сетку. Для каждой ячейки сети CNN выводит вероятности определяемого класса. Ячейки, имеющие вероятность класса выше порогового значения, выбираются и используются для определения местоположения объекта на изображении.
Обработка в режиме реального времени: поддерживается!
Как видишь, YOLO пока что лучший вариант для обнаружения и распознавания образов. Он отличается высокой скоростью и точностью обнаружения объектов, а еще этот алгоритм можно использовать в проектах на Android и Raspberry Pi с помощью нетребовательного tiny-варианта сети, с которым мы с тобой сегодня будем работать.
Tiny-вариант несколько проигрывает в точности полноценному варианту сети, но и требует меньшей вычислительной мощности, что позволит запустить проект, который мы сегодня будем делать, как на слабом компьютере, так и, при желании, на смартфоне.
Пишем код
Чтобы написать легковесное приложение для обнаружения объектов на изображении, нам с тобой понадобятся:
- названия классов датасета COCO, которые умеет определять сеть YOLO;
- конфигурации для tiny-варианта сети YOLO;
- веса для tiny-варианта сети YOLO.
Дополнительно установим библиотеки 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
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»