Извлечение данных с визиток и бейджей: OCR, NER и CRM-интеграция

Пайплайн OCR и NER для визиток

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1461
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1314
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1014
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1275
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    727
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1019

Пайплайн 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() 

Как проходит внедрение

  1. Анализ ваших визиток и бейджей — определяем сложность макетов, качество фото.
  2. Настройка OCR (PaddleOCR) и NER (DeepPavlov) под русскоязычные тексты.
  3. Интеграция с CRM через REST API или экспорт vCard.
  4. Тестирование на реальных данных — фиксируем accuracy, корректируем регулярные выражения.
  5. Запуск в эксплуатацию и двухнедельная поддержка.

Что входит в работу

  • Деплой пайплайна на ваш сервер или в облако (SageMaker, Vertex AI).
  • Документация API и инструкция по эксплуатации.
  • Обучение модели на ваших образцах визиток (если требуется).
  • Интеграция с CRM через REST API или прямой экспорт vCard.
  • Поддержка 2 недели после запуска + гарантия стабильной работы.

Точность на реальных визитках

Поле Accuracy (хорошее фото) Accuracy (телефон)
Телефон 96–98% 88–93%
Email 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 день. Свяжитесь с нами для запуска проекта.