- Регистрация
- 6 Ноя 2025
- Сообщения
- 136
- Реакции
- 1
- Баллы
- 18
Распознавание объектов с YOLO: от капчи до подсчета людей в помещении.
Тема компьютерного зрения — это сейчас хайп, но реально полезная штука. Особенно когда нужно быстро и без лишних движений определить, что там на картинке происходит. Помнишь «Терминатора», где T-800 смотрел по сторонам и видел надписи «водитель», «пассажир», «оружие»? Тогда это казалось фантастикой. А сейчас ты можешь сделать такую же хреновину у себя на ноутбуке за пару часов.
В этой статье я расскажу про YOLO — алгоритм, который работает в реальном времени и при этом не жрет ресурсы как бешеный. Мы на его основе накатаем программу на Python, которая будет распознавать объекты на картинках и видео. В качестве бонуса — попробуем обойти капчу с грузовиками и посчитаем количество людей в лондонском барбершопе через публичную веб-камеру.
---
Какие бывают алгоритмы распознавания объектов
Прежде чем лезть в код, давай разберемся, что вообще есть на рынке. Я перепробовал несколько подходов, и у каждого свои плюсы и минусы.
R-CNN (Region-Based CNN). Сначала алгоритм выделяет на изображении регионы, которые предположительно содержат объект (выборочный поиск). Потом сверточная нейронная сеть пытается найти признаки объектов в каждом регионе, и в конце машина опорных векторов классифицирует результат. Минус — медленно. В реальном времени не работает.
Fast R-CNN. Почти то же самое, но вместо выборочного поиска на исходном изображении, оно сначала прогоняется через CNN, получается карта признаков, и выборочный поиск происходит уже на ней. Классификация — через Softmax. Тоже не для реального времени.
Faster R-CNN. Похоже на Fast R-CNN, но вместо выборочного поиска используется отдельная сеть для прогнозирования регионов. Уже быстрее, но для реального времени нужны серьезные вычислительные мощности.
YOLO (You Only Look Once). Изображение делится на сетку. Для каждой ячейки CNN выдает вероятности классов. Те ячейки, у которых вероятность выше порога, используются для определения местоположения объекта. Работает в реальном времени. Именно его мы и будем юзать.
Есть еще tiny-вариант YOLO — облегченная версия для слабых устройств (Raspberry Pi, старые смартфоны). Немного теряет в точности, но зато жрет меньше ресурсов. Мы возьмем его.
---
Что нам понадобится
· Названия классов из датасета COCO — то, что YOLO умеет определять (люди, машины, собаки, грузовики и т.д.).
· Конфигурация сети для tiny-варианта YOLO.
· Веса для tiny-варианта YOLO.
Все это легко гуглится, я дам ссылки в процессе.
Ставим библиотеки:
---
Пишем код: функция распознавания объектов
Начнем с главной функции, которая принимает изображение, прогоняет его через YOLO и возвращает результат с отмеченными объектами.
---
Рисуем рамки и подписи
Функция, которая обводит найденный объект и подписывает его класс.
Функция, которая выводит общее количество найденных объектов нужного класса.
---
Запускаем распознавание на картинке
---
Обход капчи с грузовиками
Я нашел в интернете капчу, где нужно выбрать все картинки с грузовиками. Класс truck в датасете COCO есть. Прогоняем через нашу программу.
Результат: два из трех грузовиков распознались правильно. Один пропустили. Точность не идеальная, но для автоматического обхода капчи — уже неплохо. Капча с третьей попытки прошла бы. Но восстание машин пока откладывается.
---
Модифицируем под видео: считаем людей в помещении
Теперь самое интересное. В разгар ковидных ограничений многим нужно было контролировать количество людей в помещении. Я нашел публичную веб-камеру в лондонском барбершопе (адрес в коде). Задача — считать, сколько человек в кадре.
Добавляем функцию обработки видео:
В main меняем классы для поиска: теперь нас интересуют "truck" (для капчи) и "person" (для видео).
Результат: на видео из барбершопа распозналось 6 из 7 человек. Один сидел в углу, его плохо видно. Для практических целей — более чем достаточно.
---
Что можно улучшить
· Отправка уведомлений. Если людей больше N — шлем сообщение в Telegram или на почту.
· Соблюдение дистанции. Это уже сложнее. Нужно определять габариты объектов в трехмерном пространстве, учитывать перспективу камеры. Есть алгоритмы вроде YOLO 3D Oriented Object Bounding Box Detection.
· Запись нарушений. Сохранять кадры, когда правил. Удобно для оспаривания штрафов.
---
Выводы
YOLO — это реально рабочая штука. Да, точность не 100%, но для большинства практических задач ее хватает. А tiny-версия позволяет запускать распознавание даже на слабом железе.
Из минусов: для обучения на своих классах нужны размеченные данные и время. Но готовые веса под COCO закрывают 80% типовых задач — люди, машины, животные, бытовые предметы.
В следующий раз, когда увидишь капчу с выделением объектов, знай — есть способы её обойти. Ну и если когда-нибудь будешь делать систему контроля заполняемости помещения — YOLO отличный вариант.
Тема компьютерного зрения — это сейчас хайп, но реально полезная штука. Особенно когда нужно быстро и без лишних движений определить, что там на картинке происходит. Помнишь «Терминатора», где T-800 смотрел по сторонам и видел надписи «водитель», «пассажир», «оружие»? Тогда это казалось фантастикой. А сейчас ты можешь сделать такую же хреновину у себя на ноутбуке за пару часов.
В этой статье я расскажу про YOLO — алгоритм, который работает в реальном времени и при этом не жрет ресурсы как бешеный. Мы на его основе накатаем программу на Python, которая будет распознавать объекты на картинках и видео. В качестве бонуса — попробуем обойти капчу с грузовиками и посчитаем количество людей в лондонском барбершопе через публичную веб-камеру.
---
Какие бывают алгоритмы распознавания объектов
Прежде чем лезть в код, давай разберемся, что вообще есть на рынке. Я перепробовал несколько подходов, и у каждого свои плюсы и минусы.
R-CNN (Region-Based CNN). Сначала алгоритм выделяет на изображении регионы, которые предположительно содержат объект (выборочный поиск). Потом сверточная нейронная сеть пытается найти признаки объектов в каждом регионе, и в конце машина опорных векторов классифицирует результат. Минус — медленно. В реальном времени не работает.
Fast R-CNN. Почти то же самое, но вместо выборочного поиска на исходном изображении, оно сначала прогоняется через CNN, получается карта признаков, и выборочный поиск происходит уже на ней. Классификация — через Softmax. Тоже не для реального времени.
Faster R-CNN. Похоже на Fast R-CNN, но вместо выборочного поиска используется отдельная сеть для прогнозирования регионов. Уже быстрее, но для реального времени нужны серьезные вычислительные мощности.
YOLO (You Only Look Once). Изображение делится на сетку. Для каждой ячейки CNN выдает вероятности классов. Те ячейки, у которых вероятность выше порога, используются для определения местоположения объекта. Работает в реальном времени. Именно его мы и будем юзать.
Есть еще tiny-вариант YOLO — облегченная версия для слабых устройств (Raspberry Pi, старые смартфоны). Немного теряет в точности, но зато жрет меньше ресурсов. Мы возьмем его.
---
Что нам понадобится
· Названия классов из датасета COCO — то, что YOLO умеет определять (люди, машины, собаки, грузовики и т.д.).
· Конфигурация сети для tiny-варианта YOLO.
· Веса для tiny-варианта YOLO.
Все это легко гуглится, я дам ссылки в процессе.
Ставим библиотеки:
Bash:
pip install opencv-python
pip install numpy ---
Пишем код: функция распознавания объектов
Начнем с главной функции, которая принимает изображение, прогоняет его через YOLO и возвращает результат с отмеченными объектами.
Python:
import cv2
import numpy as np
def apply_yolo_object_detection(image_to_process):
"""
Распознавание и определение координат объектов на изображении
"""
height, width, depth = image_to_process.shape ---
Рисуем рамки и подписи
Функция, которая обводит найденный объект и подписывает его класс.
Python:
def draw_object_bounding_box(image_to_process, index, box):
"""
Рисование границ объекта с подписями
"""
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) Функция, которая выводит общее количество найденных объектов нужного класса.
Python:
def draw_object_count(image_to_process, objects_count):
"""
Подпись количества найденных объектов на изображении
"""
start = (45, 150)
font_size = 1.5
font = cv2.FONT_HERSHEY_SIMPLEX
width = 3
text = "Objects found: " + str(objects_count) ---
Запускаем распознавание на картинке
Python:
def start_image_object_detection():
"""
Анализ изображения
"""
try:
image = cv2.imread("assets/truck_captcha.png")
image = apply_yolo_object_detection(image)
cv2.imshow("Image", image)
if cv2.waitKey(0):
cv2.destroyAllWindows()
except KeyboardInterrupt:
pass ---
Обход капчи с грузовиками
Я нашел в интернете капчу, где нужно выбрать все картинки с грузовиками. Класс truck в датасете COCO есть. Прогоняем через нашу программу.
Результат: два из трех грузовиков распознались правильно. Один пропустили. Точность не идеальная, но для автоматического обхода капчи — уже неплохо. Капча с третьей попытки прошла бы. Но восстание машин пока откладывается.
---
Модифицируем под видео: считаем людей в помещении
Теперь самое интересное. В разгар ковидных ограничений многим нужно было контролировать количество людей в помещении. Я нашел публичную веб-камеру в лондонском барбершопе (адрес в коде). Задача — считать, сколько человек в кадре.
Добавляем функцию обработки видео:
Python:
def start_video_object_detection():
"""
Захват и анализ видео в режиме реального времени
"""
while True:
try:
video_camera_capture = cv2.VideoCapture("http://81.130.136.82:82/mjpg/video.mjpg")
while video_camera_capture.isOpened():
ret, frame = video_camera_capture.read()
if not ret:
break
frame = apply_yolo_object_detection(frame)
frame = cv2.resize(frame, (1920 // 2, 1080 // 2)) # уменьшаем окно
cv2.imshow("Video Capture", frame)
if cv2.waitKey(0): # по нажатию любой клавиши следующий кадр
break
video_camera_capture.release()
cv2.destroyAllWindows()
except KeyboardInterrupt:
pass В main меняем классы для поиска: теперь нас интересуют "truck" (для капчи) и "person" (для видео).
Python:
if name == 'main':
# Загружаем веса и конфиг
net = cv2.dnn.readNetFromDarknet("yolov4-tiny.cfg", "yolov4-tiny.weights")
layer_names = net.getLayerNames()
out_layers_indexes = net.getUnconnectedOutLayers()
out_layers = [layer_names[index[0] - 1] for index in out_layers_indexes] Результат: на видео из барбершопа распозналось 6 из 7 человек. Один сидел в углу, его плохо видно. Для практических целей — более чем достаточно.
---
Что можно улучшить
· Отправка уведомлений. Если людей больше N — шлем сообщение в Telegram или на почту.
· Соблюдение дистанции. Это уже сложнее. Нужно определять габариты объектов в трехмерном пространстве, учитывать перспективу камеры. Есть алгоритмы вроде YOLO 3D Oriented Object Bounding Box Detection.
· Запись нарушений. Сохранять кадры, когда правил. Удобно для оспаривания штрафов.
---
Выводы
YOLO — это реально рабочая штука. Да, точность не 100%, но для большинства практических задач ее хватает. А tiny-версия позволяет запускать распознавание даже на слабом железе.
Из минусов: для обучения на своих классах нужны размеченные данные и время. Но готовые веса под COCO закрывают 80% типовых задач — люди, машины, животные, бытовые предметы.
В следующий раз, когда увидишь капчу с выделением объектов, знай — есть способы её обойти. Ну и если когда-нибудь будешь делать систему контроля заполняемости помещения — YOLO отличный вариант.

