Разработка интеллектуальных RPA-ботов с Computer Vision для работы с UI
Классические RPA-боты (UiPath, Automation Anywhere, Blue Prism) работают с UI через селекторы и координаты. Они хрупки: изменилась кнопка на 5 пикселей — бот сломался. Computer Vision устраняет эту зависимость: бот «видит» экран как изображение и находит нужный элемент по визуальным признакам, независимо от его позиции и внутренней структуры DOM или оконной иерархии.
Когда CV-подход необходим
CV-расширение для RPA оправдано в конкретных сценариях:
- Работа с legacy-системами без доступа к API и с закрытой оконной иерархией (старые COBOL/AS400 терминалы, Citrix Virtual Desktop)
- Веб-приложения с динамически генерируемыми классами (React/Angular с CSS Modules), где XPath нестабилен
- Работа с PDF-документами и scanned images внутри RPA-потока
- Автоматизация десктопных приложений третьих сторон без SDK
Архитектура CV-RPA бота
import cv2
import numpy as np
from ultralytics import YOLO
class CVRPAAgent:
def __init__(self, ui_detector_model: str):
# YOLOv8 дообученный на UI элементах
self.detector = YOLO(ui_detector_model)
self.screenshot_engine = ScreenshotEngine()
def find_element(self, element_type: str,
text_hint: str = None) -> tuple[int, int]:
screenshot = self.screenshot_engine.capture()
detections = self.detector.predict(screenshot, conf=0.7)
candidates = [d for d in detections if d.class_name == element_type]
if text_hint:
candidates = self._filter_by_ocr_text(candidates, screenshot, text_hint)
if not candidates:
raise ElementNotFoundError(f"Cannot find {element_type}")
best = max(candidates, key=lambda d: d.confidence)
return best.center_x, best.center_y
def click(self, element_type: str, text_hint: str = None):
x, y = self.find_element(element_type, text_hint)
pyautogui.click(x, y)
Для обнаружения UI-элементов используем YOLOv8, дообученный на датасете UI компонентов (кнопки, поля ввода, чекбоксы, дропдауны). Базовая модель: Rico Dataset (66k Android UI) + кастомная разметка под конкретный интерфейс заказчика.
OCR-интеграция для чтения данных
Для извлечения текстовых данных из экрана: PaddleOCR (лучший баланс скорости и точности для кириллицы) или EasyOCR. Интеграция в поток: найти элемент → извлечь из ROI (Region of Interest) текст → передать в логику обработки.
import paddleocr
ocr = paddleocr.PaddleOCR(use_angle_cls=True, lang='ru')
def extract_text_from_region(image, bbox):
x1, y1, x2, y2 = bbox
region = image[y1:y2, x1:x2]
result = ocr.ocr(region, cls=True)
return ' '.join([line[1][0] for line in result[0]])
Работа в Citrix и RDP окружениях
В Citrix-среде бот не имеет доступа к оконной иерархии удалённого рабочего стола. Решение: захват скриншота через Citrix Virtual Channel или простой screen capture, анализ через CV-модель, клики через виртуальный mouse/keyboard input. Дополнительная сложность: компрессия видеопотока Citrix снижает качество изображения — обучаем модель на скриншотах низкого качества.
Метрики надёжности
| Метрика | Классический RPA | CV-RPA |
|---|---|---|
| Устойчивость к смене позиции элемента | Низкая | Высокая |
| Устойчивость к смене UI framework | Средняя | Высокая |
| Скорость выполнения | Быстро | На 15–25% медленнее |
| Точность нахождения элемента | 99% (при корректном XPath) | 91–96% |
| Сложность автоматизации | Срок |
|---|---|
| 1–3 процесса, готовые интерфейсы | 2–4 недели |
| 5–10 процессов, Citrix/RDP | 5–8 недель |
| Комплексная автоматизация с обучением модели | 8–14 недель |







