Пайплайн OCR и NER для визиток
Сотрудник возвращается с конференции с пачкой визиток — ввод данных в CRM вручную занимает часы. Ошибки при наборе неизбежны: перепутанный телефон, опечатка в email. Наша система автоматического распознавания визиток и бейджей решает эту проблему: извлекаем имя, компанию, должность, контакты и экспортируем напрямую в вашу CRM. Реализуем под ключ — от настройки OCR до интеграции с адресной книгой. Экономия времени ввода контактов достигает 90%, а количество ошибок падает с 5% до 0.5%.
Как пайплайн распознавания справляется с плохими фото?
Пайплайн использует PaddleOCR с автоматическим определением угла наклона — это даёт 97% точности на чётких снимках. Даже на пересвеченных или размытых визитках мы не теряем данные: применяем робастные регулярные выражения для номеров и email, а для имён и компаний — нейросеть DeepPavlov NER. Пример кода ниже показывает реализацию класса BusinessCardRecognizer.
import re from paddleocr import PaddleOCR from transformers import pipeline class BusinessCardRecognizer: def __init__(self): self.ocr = PaddleOCR(use_angle_cls=True, lang='ru', use_gpu=True) # NER для структурирования полей self.ner = pipeline('ner', model='DeepPavlov/rubert-base-cased-conversational', aggregation_strategy='simple') def recognize(self, image_path: str) -> dict: # 1. OCR result = self.ocr.ocr(image_path, cls=True) text_lines = [line[1][0] for line in result[0]] full_text = '\n'.join(text_lines) # 2. Структурирование через правила + NER structured = self._extract_fields(full_text, text_lines) return structured def _extract_fields(self, full_text: str, lines: list[str]) -> dict: result = { 'name': None, 'company': None, 'title': None, 'phones': [], 'emails': [], 'websites': [], 'addresses': [] } # Регулярные выражения для структурированных полей phone_pattern = r'[\+7|8][\s\-]?\(?\d{3}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}' email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' url_pattern = r'(?:https?://)?(?:www\.)?[\w-]+\.[\w.-]+(?:/[\w./?=&\-]*)?' result['phones'] = re.findall(phone_pattern, full_text) result['emails'] = re.findall(email_pattern, full_text) result['websites'] = [u for u in re.findall(url_pattern, full_text) if '.' in u and '@' not in u] # NER для имени и должности ner_result = self.ner(full_text) for entity in ner_result: if entity['entity_group'] == 'PER': result['name'] = entity['word'] elif entity['entity_group'] == 'ORG': result['company'] = entity['word'] # Эвристика: строка между именем и телефонами — должность result['title'] = self._infer_title(lines, result) return result PaddleOCR в 2–3 раза быстрее Tesseract на GPU и точнее обрабатывает кириллицу — мы проверили на 500 визитках. Для плохих фото (блики, размытие) дообучаем NER на ваших данных, поднимая accuracy ещё на 10–15%. Дополнительно применяем INT8-квантизацию модели для снижения latency на CPU. Данные получены на тестовой выборке из 500 визиток.
Почему стоит интегрировать распознавание с CRM?
Ручной ввод даёт ошибки в 5% контактов (по нашим оценкам). Автоматизация сокращает их до 0.5%. После распознавания экспортируем контакты в vCard или напрямую через REST API в Bitrix24, AmoCRM, Salesforce. Данные сразу появляются в адресной книге — менеджеры начинают звонить без задержки. Мы даём гарантию корректного извлечения: если поле не распознано, система помечает его на проверку, а не вставляет мусор.
Как организовать real-time сканирование бейджей?
Для систем регистрации на конференциях: камера сканирует бейдж или визитку, система мгновенно извлекает данные и отмечает посещаемость.
import cv2 from threading import Thread from queue import Queue class BadgeScanner: def __init__(self, recognizer: BusinessCardRecognizer, camera_id: int = 0): self.recognizer = recognizer self.cap = cv2.VideoCapture(camera_id) self.frame_queue = Queue(maxsize=2) self.result_queue = Queue() self.last_scan_time = 0 self.scan_cooldown = 2.0 # секунды между сканированиями def scan_frame(self, frame: np.ndarray) -> dict | None: import time now = time.time() if now - self.last_scan_time < self.scan_cooldown: return None # Быстрая проверка: есть ли прямоугольный объект (карточка) if not self._detect_card_shape(frame): return None result = self.recognizer.recognize_from_array(frame) if result.get('name') or result.get('emails'): self.last_scan_time = now return result return None Система крутится на обычном ноутбуке — задержка сканирования менее 0.5 секунды. Для потоков с сотен участников используем очередь кадров и асинхронную обработку. Получите консультацию по вашему сценарию — мы поможем подобрать оптимальное железо и конфигурацию.
Как мы дообучаем модель под корпоративные визитки?
Если у вас уникальные макеты — нестандартные шрифты, логотипы, тёмный фон — мы проводим fine-tuning на ваших образцах. Достаточно 50 изображений, чтобы поднять точность извлечения названий отделов и должностей на 10–15%. Используем LoRA адаптеры для NER и дообучаем PaddleOCR на специфические символы. Для ускорения инференса применяем ONNX Runtime с INT8-квантизацией — latency снижается на 40% без потери качества.
Экспорт в контактную книгу
После распознавания — экспорт в vCard формат:
import vobject def to_vcard(card_data: dict) -> str: vcard = vobject.vCard() vcard.add('n').value = vobject.vcard.Name(family='', given=card_data.get('name', '')) vcard.add('fn').value = card_data.get('name', '') if card_data.get('company'): vcard.add('org').value = [card_data['company']] if card_data.get('title'): vcard.add('title').value = card_data['title'] for phone in card_data.get('phones', []): tel = vcard.add('tel') tel.value = phone tel.type_param = 'WORK' for email in card_data.get('emails', []): vcard.add('email').value = email return vcard.serialize() Как проходит внедрение
- Анализ ваших визиток и бейджей — определяем сложность макетов, качество фото.
- Настройка OCR (PaddleOCR) и NER (DeepPavlov) под русскоязычные тексты.
- Интеграция с CRM через REST API или экспорт vCard.
- Тестирование на реальных данных — фиксируем accuracy, корректируем регулярные выражения.
- Запуск в эксплуатацию и двухнедельная поддержка.
Что входит в работу
- Деплой пайплайна на ваш сервер или в облако (SageMaker, Vertex AI).
- Документация API и инструкция по эксплуатации.
- Обучение модели на ваших образцах визиток (если требуется).
- Интеграция с CRM через REST API или прямой экспорт vCard.
- Поддержка 2 недели после запуска + гарантия стабильной работы.
Точность на реальных визитках
| Поле | Accuracy (хорошее фото) | Accuracy (телефон) |
|---|---|---|
| Телефон | 96–98% | 88–93% |
| 97–99% | 90–95% | |
| Имя | 85–92% | 75–85% |
| Должность | 75–85% | 65–78% |
| Компания | 82–90% | 72–83% |
Технические требования к фото
- Разрешение: от 300 DPI.
- Формат: JPEG, PNG, TIFF, PDF.
- Освещение: без бликов, равномерное.
- Наклон: не более 15 градусов (PaddleOCR корректирует автоматически).
Сроки ориентировочно
| Задача | Срок |
|---|---|
| Мобильное приложение сканирования визиток | 2–3 недели |
| Система регистрации по бейджам | 3–5 недель |
| Интеграция с CRM, экспорт контактов | 4–6 недель |
У всех задач плавающие сроки — точную оценку даём после анализа ваших данных. Закажите консультацию: опишем архитектуру и рассчитаем бюджет за 1 день. Свяжитесь с нами для запуска проекта.







