Jak działa parsowanie paragonów: Wewnątrz potoku OCR Yomio (AWS + Azure)
Techniczne zagłębienie się w potok OCR paragonów Yomio — jak AWS Textract i Azure Document Intelligence wyodrębniają, normalizują i kategoryzują dane paragonów na dużą skalę.
Alex Chen
Product Manager & Adwokat Finansów Osobistych
Jak działa parsowanie paragonów: Wewnątrz potoku OCR Yomio (AWS + Azure)
Kiedy skanujesz paragon w Yomio, wiele dzieje się między naciśnięciem spustu migawki a zobaczeniem skategoryzowanej transakcji na swoim dashboardzie. Twoje zdjęcie paragonu podróżuje przez wieloetapowy potok OCR, który wyodrębnia, normalizuje i wzbogaca surowy tekst w ustrukturyzowane dane finansowe.
Ten artykuł opisuje, co dzieje się wewnątrz tego potoku. Jest techniczny — ale także przydatny do zrozumienia, dlaczego niektóre paragony skanują się idealnie, a inne wymagają poprawek, i jak pracujemy nad zamknięciem tej luki.
Kluczowe wnioski
- Yomio używa zarówno AWS Textract, jak i Azure Document Intelligence — architektura z dwoma dostawcami dla nadmiarowości i dokładności
- Potok ma 5 etapów: pozyskiwanie, ekstrakcja OCR, normalizacja, kategoryzacja, wzbogacanie
- Ekstrakcja pozycji to najtrudniejszy problem — paragony nie mają standardowego formatu
- Ocena ufności oznacza pola o niskiej ufności do ręcznego przeglądu
- Wsparcie multimodalne — przyjmuje obrazy, PDF i dane strukturalne
- Obecna dokładność: 94,7% ekstrakcji pozycji, 99,3% całkowitego przechwytywania
- Czas przetwarzania: 2–6 sekund na paragon od skanu do skategoryzowanego wpisu
Przegląd potoku
Potok OCR ma pięć etapów:
- Pozyskiwanie — wstępne przetwarzanie obrazu i walidacja formatu
- Ekstrakcja OCR — ekstrakcja tekstu i struktury przez AWS Textract / Azure Document Intelligence
- Normalizacja — dopasowanie nazwy sprzedawcy, formatowanie daty, wykrywanie waluty
- Kategoryzacja — przypisanie kategorii na poziomie pozycji i sumy
- Wzbogacanie — wyszukiwanie kodów kreskowych, dane produktu, łączenie konta użytkownika
Każdy etap ma wbudowane mechanizmy awaryjne. Jeśli etap produkuje wynik o niskiej ufności, potok go oznacza, zamiast propagować złe dane dalej.
Etap 1: Pozyskiwanie — Wstępne przetwarzanie obrazu
Zanim silniki OCR dotkną paragonu, obraz przechodzi przez wstępne przetwarzanie:
Normalizacja formatu:
- Zdjęcia są skalowane do maksymalnie 2048px na najdłuższej krawędzi
- Zastosowana jest kompresja JPEG (jakość 85%) dla efektywności przechowywania
- Strony PDF są renderowane jako obrazy w 300 DPI
Kontrole jakości:
- Detekcja rozmycia — jeśli obraz jest zbyt rozmyty (wariancja Laplaciana poniżej progu), użytkownik proszony jest o ponowne zrobienie zdjęcia
- Detekcja przekoszenia — paragony sfotografowane pod ekstremalnymi kątami są korygowane przez transformację perspektywiczną
- Normalizacja kontrastu — paragony o niskim kontraście (wyblakły papier termiczny) otrzymują adaptacyjną equalizację histogramu
Obsługa wielu stron:
- Paragony dłuższe niż jedna strona są automatycznie wykrywane (znaczniki podziału strony, zagięte krawędzie)
- Wielostronicowe paragony są łączone w jeden dokument do przetwarzania
callout.info
Surowe zdjęcia paragonów z telefonu są zaskakująco zmienne. Ciemne oświetlenie w restauracjach, pogniecione paragony z papieru termicznego ze sklepów spożywczych i paragony z liniami zagięć są powszechne. Wstępne przetwarzanie normalizuje je do spójnego formatu, z którym oba silniki OCR dobrze sobie radzą. Kontrole jakości na tym etapie zapobiegają 3–5% skanów, które w przeciwnym razie dałyby bezużyteczne wyniki.
Etap 2: Ekstrakcja OCR — AWS Textract i Azure Document Intelligence
To jest rdzeń potoku. Yomio używa dwóch dostawców OCR:
AWS Textract:
- Podstawowy dostawca dla standardowych paragonów
- Najlepszy w swojej klasie do ekstrakcji drukowanego tekstu
- Receipt API (Expense) specjalnie trenowane na układach paragonów
- Wykrywa: nazwę sprzedawcy, datę transakcji, sumę, podsumę, podatek, pozycje, metodę płatności
Azure Document Intelligence (Form Recognizer):
- Drugorzędny dostawca dla paragonów ze złożonymi układami
- Lepiej wykrywa struktury tabel w paragonach
- Używany jako awaryjny, gdy wyniki ufności Textract są poniżej progu
- Lepsze wykrywanie pisma odręcznego dla ręcznie pisanych paragonów
Logika wyboru dostawcy:
- Podstawowa próba: AWS Textract
- Jeśli ufność Textract < 70% dla kluczowych pól: uruchom również Azure Document Intelligence
- Porównaj wyniki — wybierz wynik z wyższą ufnością dla każdego pola
- Jeśli oba są poniżej progu: oznacz paragon do ręcznego przeglądu
Ta architektura z dwoma dostawcami oznacza, że jeśli jeden dostawca ma martwe pole dla określonego formatu paragonu (częste w przypadku nieangielskich paragonów lub nietypowych układów), drugi dostawca może to skompensować.
Co każdy dostawca wyodrębnia
Obaj dostawcy wyodrębniają podobne pola, ale z różnymi mocnymi stronami:
| Field | Textract Strength | Azure Doc Intel Strength |
|---|---|---|
| Merchant name | High (standard) | High (standard) |
| Transaction date | High | High |
| Total amount | Very high | Very high |
| Line items | High (simple layouts) | High (table layouts) |
| Tax amount | Medium | High |
| Discounts | Medium | High (item-level) |
| Currency detection | High | High |
| Handwriting | Low | Medium |
Etap 3: Normalizacja — Ujednolicanie danych
Surowe wyjście OCR jest dokładne, ale nieuporządkowane. "Starbucks Coffee #4521" i "Starbucks" muszą być rozpoznane jako ten sam sprzedawca. "05/08/2026" i "8 maja 2026" muszą być tą samą datą. Ten etap zajmuje się tymi transformacjami.
Normalizacja sprzedawcy:
- Rozmyte dopasowywanie ciągów względem bazy danych sprzedawców (ponad 50 000 sprzedawców)
- Grupowanie na poziomie marki: "Starbucks Coffee #4521" → "Starbucks"
- Identyfikacja sieci: lokalne franczyzy mapowane na ich markę nadrzędną
- Aliasy zdefiniowane przez użytkownika: jeśli zmienisz nazwę sprzedawcy raz, system się tego uczy
Normalizacja daty:
- Wykrywa format daty z paragonu (US: MM/DD/YYYY, EU: DD/MM/YYYY, ISO: YYYY-MM-DD)
- Rozwiązuje niejednoznaczność za pomocą kontekstu (paragon od brytyjskiego sprzedawcy 03/04/2026 → 3 kwietnia 2026)
- Wykrywanie strefy czasowej z lokalizacji sprzedawcy
Normalizacja waluty:
- Wykrywanie symboli walut ($, €, £, ¥, itp.)
- Wykrywanie trzyliterowych kodów (USD, EUR, GBP)
- Rozwiązywanie niejednoznaczności ($ może być USD, CAD, AUD, MXN — rozwiązywane przez lokalizację sprzedawcy)
Walidacja kwoty:
- Krzyżowe sprawdzenia: podsuma + podatek = suma? Zweryfikowane względem sumy pozycji
- Wykrywanie rabatu: jeśli suma pozycji minus suma > próg, zastosowano rabat
- Wykrywanie napiwku (paragony restauracyjne): różnica między podsumą a sumą, gdy istnieje linia napiwku
Etap 4: Kategoryzacja — Inteligentne tagowanie
Wyodrębnione pozycje muszą być przypisane do kategorii budżetowych. Dzieje się to przez system dwuwarstwowy:
Warstwa 1: Reguły oparte na sprzedawcy
- Znani sprzedawcy mają domyślne mapowania kategorii
- "Kroger" → Artykuły spożywcze (domyślnie), "Shell" → Transport (domyślnie), "Netflix" → Rozrywka (domyślnie)
- Użytkownicy mogą nadpisywać dla konkretnego sprzedawcy: "Chcę, aby Shell był kategoryzowany jako Transport"
Warstwa 2: Kategoryzacja AI na poziomie pozycji
- Dla nieznanych sprzedawców lub paragonów mieszanych kategorii (Target z artykułami spożywczymi i elektroniką)
- Każda pozycja jest kategoryzowana osobno na podstawie nazwy produktu, ceny i danych historycznych
- Kategorie obejmują: Artykuły spożywcze, Jedzenie, Transport, Zakupy, Rozrywka, Opieka zdrowotna, Media, Mieszkanie, Edukacja, Pielęgnacja osobista i 12+ podkategorii
Wynik ufności kategoryzacji określa, czy przypisanie jest automatyczne, czy sugerowane do przeglądu. Przy ufności 90%+ kategoria jest stosowana po cichu. Poniżej tego jest podświetlana do potwierdzenia przez użytkownika.
Etap 5: Wzbogacanie — Połączenie z Twoim kontem
Ostatni etap łączy przetworzony paragon z Twoim kontem Yomio:
- Przypisanie użytkownika — paragon jest łączony z Twoim kontem (lub grupą rodzinną, jeśli udostępnianie jest włączone)
- Aktualizacja zapasów — pozycje pasujące do znanych pozycji zapasów wywołują aktualizacje ilości (zobacz nasze zagłębienie w zarządzanie zapasami)
- Wykrywanie subskrypcji — powracający sprzedawcy z regularnymi kwotami są oznaczani jako potencjalne subskrypcje
- Rozpoznawanie kodu kreskowego — zeskanowane kody kreskowe są dopasowywane do Open Food Facts i baz danych produktów dla wzbogacenia
- Aktualizacja serii — licznik codziennych serii jest zwiększany
- Nagroda XP — XP za skanowanie jest dopisywane do Twojego konta
Czas przetwarzania i skalowalność
- Średni czas przetwarzania: 2–6 sekund na paragon
- Szczytowa przepustowość: tysiące paragonów na minutę (automatyczne skalowanie oparte na Lambda)
- Przechowywanie: obrazy paragonów w S3, dane strukturalne w PostgreSQL
- CDN: obrazy paragonów dostarczane przez CDN dla szybkiego pobierania
callout.tip
Sami dostawcy OCR potrzebują 1–3 sekund na przetworzenie paragonu. Pozostały czas jest dzielony między wstępne przetwarzanie (0,5 s), normalizację (0,3 s), kategoryzację (0,2 s) i wzbogacanie (0,5 s). Paragony wielostronicowe trwają dłużej z powodu przetwarzania strona po stronie.
Benchmarki dokładności
Ciągle mierzymy dokładność potoku względem ręcznie przygotowanego zestawu testowego 10 000 paragonów:
| Metric | Current Accuracy |
|---|---|
| Total amount capture | 99,3% |
| Line-item extraction | 94,7% |
| Merchant detection | 98,1% |
| Date detection | 99,5% |
| Category assignment | 92,4% |
| Currency detection | 99,7% |
Gdzie nadal występują błędy:
- Ręcznie pisane paragony (30% niższa dokładność niż drukowane)
- Poważnie uszkodzony papier termiczny (wyblakły, zwinięty, podarty)
- Paragony z niestandardowymi strukturami rabatów (BOGO, realizacja punktów lojalnościowych)
- Mikrodrukowane warunki i postanowienia (OCR celowo je ignoruje)
ocrAccuracyEstimator.badge
ocrAccuracyEstimator.title
ocrAccuracyEstimator.subtitle
Przyszłe ulepszenia
Potok jest aktywnie ulepszany w trzech obszarach:
1. Rozpoznawanie pisma odręcznego. Obecna dokładność pisma odręcznego jest największą luką. Trenujemy niestandardowe modele na piśmie odręcznym specyficznym dla paragonów (kwoty napiwków, ręcznie pisane nazwy sprzedawców, osobiste notatki na paragonach).
2. Pokrycie formatów paragonów. Międzynarodowe paragony mają różne układy, struktury podatkowe i języki. Rozszerzamy dane treningowe dostawców, aby pokryć więcej regionalnych formatów.
3. Sugestie korekt w czasie rzeczywistym. Zamiast wymagać ręcznej korekty po skanowaniu, następna wersja potoku będzie sugerować korekty podczas przepływu skanowania — przed sfinalizowaniem paragonu.
Często zadawane pytania
Wypróbuj potok OCR
Zeskanuj dowolny paragon teraz i zobacz potok w akcji. Od spustu do skategoryzowanego wpisu w mniej niż 10 sekund.
Zeskanuj paragon za darmo