Автоматичне розпізнавання візиток та бейджів: OCR, NER, CRM

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

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    997
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1264
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1002

Пайплайн 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 тижні після запуску + гарантія стабільної роботи.

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

Поле Точність (гарне фото) Точність (телефон)
Телефон 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 день. Зв'яжіться з нами для запуску проєкту.