Программирование

Как распознать убитых врагов и бонусы в 2D‑шутере без OCR

Узнайте, как быстро и без Tesseract распознавать убитых врагов и собранные бонусы в 2‑D‑шутере, используя объектные детекторы и шаблонное сопоставление.

Как можно реализовать распознавание уничтоженных врагов и собранных бонусов в 2‑D‑стрелялке без Tesseract, чтобы ускорить обучение самообучающегося бота с экранным зрением на Python? Я пробовал Sequential из TensorFlow, но обучение идёт медленно, а Tesseract приводит к утечкам памяти. Какие подходы к «визуальному» распознаванию можно применить, чтобы получать награды (score) и события (enemy kill, bonus pickup) напрямую с экрана?

Уничтожения врагов и сбор бонусов можно отследить, применяя объектный детектор или шаблонное сопоставление на кадрах игры. Это позволяет обойти Tesseract, избежать утечек памяти и сократить время обучения, поскольку модель обучается только на небольших датасетах изображений, а не на распознавании текста, не правда ли? Далее разберём наиболее надёжные подходы и как их быстро внедрить в Python‑бота.

Содержание


Как избежать Tesseract и ускорить обучение

На самом деле, Tesseract работает с изображением текста, поэтому он не подходит для отслеживания игровых объектов. Даже если изменить конфигурацию, OCR вызовет избыточное потребление памяти и долгие задержки. Поскольку наша цель — получить бинарные события (убийство/сбор) с минимальной задержкой, лучше использовать методы, специально разработанные для распознавания объектов.

Ключевой вывод: замените OCR на объектный детектор или шаблонное сопоставление.


Объектные детекторы: YOLOv5, SSD, Faster R‑CNN

Детектор Архитектура Число параметров Скорость (FPS) Подходит для Примеры кода
YOLOv5 CSP‑Darknet ~7‑14 M 60‑200 FPS Быстрый inference, небольшая модель torch.hub.load('ultralytics/yolov5', 'yolov5s')
SSD‑MobileNet MobileNet‑V2 ~6 M 50‑120 FPS Умеренно быстрый, менее ресурсоёмкий torch.hub.load('pytorch/vision', 'ssd300_vgg16')
Faster R‑CNN ResNet‑50 ~23 M 20‑50 FPS Высокая точность при медленном inference torch.hub.load('pytorch/vision', 'fasterrcnn_resnet50_fpn')

Почему YOLOv5 хорош для 2‑D‑стрелялки

  • Одно проходное детектирование: один forward‑pass даёт координаты всех объектов.
  • Малая модель (yolov5s) легко обучается и запускается на CPU.
  • Пакет ultralytics предоставляет готовые скрипты для обучения с пользовательским датасетом.

Минимальный пример обучения YOLOv5

python
# Установка
!pip install ultralytics

# Создание датасета в формате YOLO
#  - data.yaml
#  - train/ и val/ с изображениями и аннотациями в формате .txt

# Запуск обучения
!yolo train data=data.yaml model=yolov5s --epochs 20 --batch 16

Источник: Ultralytics YOLOv5 Documentation

Интеграция с экраном

  1. Захват кадра с помощью mss или pyautogui.
  2. Передача изображения в модель.
  3. Получение списка детекций с классами enemy, bonus.
  4. Сравнение координат с предыдущим кадром → событие kill/pickup.

Шаблонное сопоставление и Feature Matching

На самом деле, если объекты в игре строго фиксированы и не меняют масштаба, шаблонное сопоставление (cv2.matchTemplate) работает быстро и без обучения.

python
import cv2, numpy as np, pyautogui

# Загрузка шаблонов
enemy_template = cv2.imread('enemy.png', 0)
bonus_template = cv2.imread('bonus.png', 0)

def detect_template(gray_img, tmpl, threshold=0.8):
    res = cv2.matchTemplate(gray_img, tmpl, cv2.TM_CCOEFF_NORMED)
    loc = np.where(res >= threshold)
    return list(zip(*loc[::-1]))  # (x, y) координаты

# Захват экрана
screenshot = pyautogui.screenshot()
frame_gray = cv2.cvtColor(np.array(screenshot), cv2.COLOR_BGR2GRAY)

enemies = detect_template(frame_gray, enemy_template)
bonuses = detect_template(frame_gray, bonus_template)

Ограничения

  • Чувствителен к изменению масштаба/цвета.
  • Не подходит, если персонажи имеют анимацию.

Источник: OpenCV Template Matching Guide


Трекинг и подсчёт событий с помощью OpenCV

На самом деле, после обнаружения объектов важно отслеживать их движение и определять, когда объект исчезает (т.е. убит или собран). Самый простой способ — использовать трекеры OpenCV:

python
tracker = cv2.TrackerCSRT_create()  # или KCF, MOSSE
tracker.init(frame, bbox)           # bbox – координаты первого кадра

# В каждом новом кадре
ok, bbox = tracker.update(frame)
if not ok:
    # Объект исчез, считаем kill/pickup

Для более надёжного трекинга можно комбинировать детектор + трекер (Det–Track). Детектор обновляет траекторию каждые N кадров, а трекер продолжается между ними, снижая количество инференсов.

Источник: OpenCV Tracking API


Оптимизация обучения и inference

На самом деле, Data augmentation применяет случайные сдвиги, масштабирование, обрезку – повышает обобщающую способность без долгого обучения.

Шаг Как ускорить
Data augmentation albumentations применяет случайные сдвиги, масштабирование, обрезку – повышает обобщающую способность без долгого обучения.
Mixed‑precision training torch.cuda.amp позволяет обучать более быстро без потери точности.
Пакетная загрузка DataLoader с num_workers > 0 ускоряет чтение файлов.
Inference on CPU YOLOv5s можно запускать без GPU, используя torch.backends.cudnn.benchmark = False.
Пост‑тренировочный квантизация torch.quantization уменьшит размер модели и ускорит inference.

Источник: PyTorch Mixed‑Precision Training


Заключение

  • Избегайте OCR – на самом деле применяйте объектные детекторы или шаблонное сопоставление.
  • YOLOv5 (или SSD/Faster R‑CNN) – лучший баланс точности и скорости для 2‑D‑стрелялки.
  • Трекинг позволяет точно фиксировать события убития/сбора без повторного инференса.
  • Оптимизация (микс‑прецизион, квантизация, пакетная обработка) ускорит обучение и inference до уровня реального времени.
  • После интеграции модели в пайплайн бота, награды можно считать напрямую из детекций, а не парсить экранные тексты.
Авторы
Проверено модерацией
Модерация