File size: 6,292 Bytes
1a7ee60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# Technical Architecture & Implementation Guide

This document provides a deep dive into the internal workings of the IDP (Intelligent Document Processing) system. It explains the "how" and "why" behind the implementation decisions.

## 1. System Architecture

The system follows a modern decoupled architecture:

```mermaid
graph TD
    User[User] -->|Uploads File| Frontend[Next.js Frontend]
    Frontend -->|POST /process| API[FastAPI Backend]
    
    subgraph "Inference Pipeline"
        API -->|Raw Image/PDF| Preprocessor[Preprocessing Module]
        Preprocessor -->|Cleaned Image| OCR[OCR Engine]
        OCR -->|Raw Text + BBoxes| Classifier[Document Classifier]
        OCR -->|Raw Text| NER[NER Model]
        
        Classifier -->|Doc Type| PostProcessor[Post-Processing]
        NER -->|Entities| PostProcessor
        OCR -->|Text + BBoxes| PostProcessor
        
        PostProcessor -->|Structured JSON| API
    end
    
    API -->|JSON Response| Frontend
    Frontend -->|Render| UI[Results Display]
```

## 2. Component Deep Dive

### A. Frontend (`/frontend`)

Built with **Next.js 14** (App Router), **React 18**, and **Tailwind CSS**.

*   **`app/page.tsx`**: The main entry point. It manages the global state for `result`, `loading`, and `isSystemOnline`. It uses a polling mechanism (`setInterval`) to check the backend health status every 30 seconds.
*   **`components/DocumentUpload.tsx`**: Handles file selection and drag-and-drop.
    *   **Auto-Processing**: As soon as a valid file is selected, it automatically triggers the upload.
    *   **Validation**: Checks file size (<10MB) and type (PDF, PNG, JPEG).
*   **`components/ResultsDisplay.tsx`**: Renders the JSON response.
    *   **Dynamic Badges**: Uses `getDocTypeStyle` to color-code document types (Purple for Invoice, Pink for Receipt, Blue for Bank Statement).
    *   **Confidence Indicators**: Color-codes confidence scores (Green > 80%, Yellow > 60%, Red < 60%).
*   **Styling**: Uses `globals.css` for custom animations (`animate-fade-in-up`) and utility classes (`glass-panel`, `bento-card`).

### B. Backend API (`api_server.py`)

Built with **FastAPI**.

*   **Endpoints**:
    *   `GET /health`: Simple status check.
    *   `POST /process`: The core endpoint. Accepts `multipart/form-data`.
*   **File Handling**: Uses `tempfile` to safely store uploaded files temporarily for processing, ensuring they are cleaned up afterwards.
*   **CORS**: Configured to allow requests from the frontend (localhost or production domain).

### C. Inference Pipeline (`inference_pipeline.py`)

The heart of the system. It orchestrates the flow of data through various ML models.

#### 1. Preprocessing (`preprocessing.py`)
Before OCR, images are cleaned to improve accuracy:
*   **Resizing**: Images are resized to a standard width (2048px) to maintain aspect ratio.
*   **Denoising**: `cv2.fastNlMeansDenoising` removes grain/noise.
*   **Thresholding**: Adaptive thresholding converts images to binary (black/white) for clearer text.
*   **Deskewing**: Detects text orientation and rotates the image to be horizontal.

#### 2. OCR Engine (`ocr_engine.py`)
*   **Engine**: Uses **EasyOCR** (or PaddleOCR) to extract text and bounding boxes.
*   **Output**: Returns a list of text lines with their coordinates and confidence scores.

#### 3. Classification (`classifier_model.py` & `demo_mode.py`)
Determines if the document is an Invoice, Receipt, Bank Statement, etc.
*   **Model**: Uses a fine-tuned **MiniLM** transformer model.
*   **Demo Mode / Heuristics**: If the model isn't loaded, it falls back to smart keyword matching:
    *   *Invoice*: Contains "invoice".
    *   *Bank Statement*: Contains "account statement", "summary", etc.
    *   *Receipt*: Contains "receipt", "total".
*   **Refinement**: Even with a trained model, we use `_refine_classification` in the pipeline to override the model if strong keywords are present (e.g., correcting "Receipt" to "Invoice" if the word "Invoice" is clearly visible).

#### 4. NER (Named Entity Recognition) (`ner_model.py`)
Extracts specific fields like Dates, Amounts, and IDs.
*   **Model**: **DistilBERT** fine-tuned for token classification.
*   **Tags**: Uses BIO tagging (e.g., `B-DATE`, `I-DATE`) to identify the start and continuation of entities.

#### 5. Post-Processing (`postprocessing.py`)
Cleans up and validates the raw ML outputs.
*   **Regex Fallbacks**: If NER misses a field (like a date), regex patterns (`\d{2}/\d{2}/\d{4}`) attempt to find it in the raw text.
*   **Validation**: Checks if extracted values make sense (e.g., is the "Total" actually a number?).
*   **Normalization**: Converts dates to `YYYY-MM-DD` and amounts to standard float format (removing currency symbols).
*   **Confidence Scoring**: Combines Model Confidence + OCR Confidence to give a final reliability score.

## 3. Data Flow Example

1.  **Upload**: User uploads `invoice.pdf`.
2.  **Conversion**: `PDFtoImageConverter` converts it to `invoice.png`.
3.  **Preprocess**: Image is deskewed and binarized.
4.  **OCR**: Text "Invoice #123" is detected at `[100, 100]`.
5.  **Classify**: Model sees "Invoice" -> Classifies as `INVOICE` (Conf: 0.98).
6.  **NER**: Model identifies "123" as `INVOICE_NUMBER`.
7.  **Post-Process**:
    *   `INVOICE_NUMBER` "123" is validated.
    *   Date "Jan 1, 2024" is normalized to `2024-01-01`.
8.  **Response**: JSON returned to frontend.
9.  **Display**: Frontend shows "Invoice" badge and lists extracted fields.

## 4. Key Technologies & Libraries

*   **PyTorch**: Deep learning framework for Classifier and NER.
*   **Transformers (Hugging Face)**: Model architecture (DistilBERT, MiniLM).
*   **OpenCV**: Image manipulation.
*   **EasyOCR**: Optical Character Recognition.
*   **NumPy**: Numerical operations.
*   **Uvicorn**: ASGI server for FastAPI.

## 5. Customization

*   **Adding New Doc Types**:
    1.  Update `classifier_model.py` labels.
    2.  Add keywords to `_refine_classification` in `inference_pipeline.py`.
    3.  Add field extraction logic to `postprocessing.py`.
    4.  Update `ResultsDisplay.tsx` in frontend to handle new badge types.

*   **Tuning Accuracy**:
    *   Adjust `ocr_confidence_threshold` in `api_server.py`.
    *   Add more regex patterns in `postprocessing.py`.