Категория > Новости > YOLO! Используем нейросеть, чтобы следить за людьми и разгадывать капчу - «Новости»
YOLO! Используем нейросеть, чтобы следить за людьми и разгадывать капчу - «Новости»24-06-2021, 06:49. Автор: Онисим |
сверточная нейронная сеть (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-вариант несколько проигрывает в точности полноценному варианту сети, но и требует меньшей вычислительной мощности, что позволит запустить проект, который мы сегодня будем делать, как на слабом компьютере, так и, при желании, на смартфоне. Пишем кодЧтобы написать легковесное приложение для обнаружения объектов на изображении, нам с тобой понадобятся:
Дополнительно установим библиотеки OpenCV и NumPy: pip install opencv-python pip install numpy Теперь напишем приложение, которое будет находить объекты на изображении при помощи YOLO и отмечать их. Мы попробуем обойти CAPTCHA с изображениями грузовиков — класс truck в датасете COCO. Дополнительно мы посчитаем количество обнаруженных объектов нужного нам класса и выведем всю информацию на экран. Начнем с написания функции для применения YOLO. С ее помощью определяются самые вероятные классы объектов на изображении, а также координаты их границ, которые позже мы будем использовать для отрисовки. import cv2 import numpy as np def 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 Далее добавим функцию, которая позволит нам обвести найденные на изображении объекты с помощью координат границ, которые мы получили в 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 Вариант 2. Открой один материал
Я уже участник «Xakep.ru» [img]"[/img] Перейти обратно к новости |