📋 PROJECT FACTS DOSSIER: Rakīm AI (رَقِيم)
This dossier provides a verified, factual inventory of the Arabic manuscript HTR/OCR project based on a deep inspection of codebase files, test logs, config files, and the presentation dashboard.
1. Project Naming Inventory & Recommendation
Names Currently in Use:
- Phoenix AI: Main name defined in
config.py(PROJECT_NAME = "Phoenix AI"),docker-compose.yml, and environmental configurations. Developed by the "Phoenix Team" (فريق فنكس). - Muharaf (مُحرف): Used in the core
README.md, the olderproject_review_report.md("Muharaf OCR Project Review & Execution Guide"), and the SQLite cache database filename (muharaf_cache.db). - Rakīm / رَقيم (Rakīm AI): Used in the unified presentation document
المقارنة_الموحدة.mdand the HTR handoff notesHTR_handoff_v2.md. - Athar: Mentioned in historical requirements but not active in core codebase configurations.
- Phoenix AI: Main name defined in
Unified Name Recommendation: We strongly recommend unifying the project under the name Rakīm AI (رَقيم) for the final report and user interface.
- Rationale: "رَقِيم" is a classical Arabic term meaning "inscribed tablet" or "writing," which perfectly aligns with the cultural preservation of manuscripts. It sounds highly professional, unique, and premium for a national AI competition, whereas "Phoenix AI" represents the team name and "Muharaf" is a generic tool name.
2. One-Paragraph Project Description
Rakīm AI is an intelligent, end-to-end pipeline system designed to transcribe, segment, analyze, and catalog historical handwritten Arabic manuscripts (HTR/OCR), with a primary focus on Maghrebi calligraphic hands. The system takes raw manuscript page images, processes them through a layout routing engine to select optimal neural segmentation and recognition models, classifies lines into main text (matn) or margins (hashiya), corrects transcriptions using a local character n-gram language model, and provides a suite of AI-assisted tools (automatic summarization, title suggestion, entity extraction, context dictionary definitions, fuzzy Levenshtein search, and manuscript catalog matching against OpenITI and Fihrist databases).
3. Implemented Architecture
The system implements a structured processing pipeline:
graph TD
A[Raw Page Image] --> B[Image Deskew & Preprocessing]
B --> C[Kraken nlbin Binarization]
C --> D[Layout Router]
D -->|Framed Layout| E1[Logic Segmentation Model: logic_philosophy_v2_seg]
D -->|General Layout| E2[Default Segmentation Model: seg_best]
E1 & E2 --> F[Line Polygons & Coordinates]
F --> G[Adaptive Line Merging & Noise Filtering]
G --> H[Region Classifier: Matn vs. Hashiya]
H --> I[Recognition Model Routing]
I -->|Framed Layout & Logic| J1[Logic Rec Model: logic_philosophy_v2_rec]
I -->|General/Dense Layout| J2[Default Rec Model: exp6_best]
J1 & J2 --> K[CTC Beam Search decoding / Optional LM fusion: char8_trainval.lm]
K --> L[Logical Arabic Text Output]
L --> M[Post-OCR AI Analysis / Fuzzy Search / Catalog Matching]
- Optional Components: Language Model (LM) decoding (activated by setting
USE_LM=truein.env) and AI Analysis Features (rely on external OpenRouter/Gemini API keys).
4. Model Inventory
| Model File | Type | Role | Used in Profile | Status / Notes |
|---|---|---|---|---|
seg_best.mlmodel |
Segmentation (BLLA) | Default line segmenter | default profile, and fallback in auto |
Implemented and active. Tends to over-segment pages with margins/marginalia. |
exp6_best.mlmodel |
Recognition (TorchSeq) | Default recognition model for Maghrebi handwriting | default profile, and fallback in auto |
Implemented and active. Highly accurate on Maghrebi manuscript hands. |
logic_philosophy_v2_seg.mlmodel |
Segmentation (BLLA) | Specialized segmenter for framed/dense manuscripts | logic profile, and selected in auto when frame detected |
Implemented and active. Renamed from logic_shamsiyya_seg.mlmodel. |
logic_philosophy_v2_rec.mlmodel |
Recognition (TorchSeq) | Specialized recognition for philosophy manuscripts | logic profile, and selected in auto when framed page detected |
Implemented and active. Renamed from logic_shamsiyya.mlmodel or reg.mlmodel. |
char8_trainval.lm |
Language Model (n-gram) | Character-level language model for error correction | Enabled via USE_LM=true |
Implemented and verified. Improves CER on test sets. |
reg(96.5).mlmodel |
Recognition (Legacy) | Legacy standard recognition model | None | Obsolete. Must NOT be used by default (causes gibberish outputs on Maghrebi hands). |
logic_shamsiyya.mlmodel |
Recognition (Alternative) | Alternative name / backup of logic recognition model | None | Present in models directory. |
logic_shamsiyya_seg.mlmodel |
Segmentation (Alternative) | Alternative name / backup of logic segmentation model | None | Present in models directory. |
5. Model Routing System
The application features an independent routing system that selects segmentation and recognition models dynamically or lets users force them:
- Segmentation Profiles:
auto|default|logic - Recognition Profiles:
auto|default|logic
Routing Decisions under auto:
- Framed Page Layout: The router scans the page for a framed structure (straight horizontal and vertical borders enclosing a text block). If detected, it sets the route to
segmentation=logicandrecognition=logic(reason:framed_text_block). - Dense Handwritten Layout (No Frame): The router measures ink density, horizontal line groupings, and the presence of red ink. If it looks like a dense philosophy page, it uses
segmentation=logicto capture crowded text, but falls back torecognition=default(exp6_best.mlmodel) because the general recognition model is more accurate for dense handwriting. (reason:dense_red_layout:...;recognition_default_for_dense_layout). - General Layout: If layout cues are weak, it falls back to
segmentation=default(seg_best.mlmodel) andrecognition=default(exp6_best.mlmodel). (reason:forced_default).
Verification Reports (output/logic_router_tests/):
report_default_default.md: Confirms that when profiles are forced todefault, both models runseg_best.mlmodelandexp6_best.mlmodelon all samples.report_logic_default.md: Confirms that when profiles are forced tologic/default, the system pairslogic_philosophy_v2_seg.mlmodelwithexp6_best.mlmodel.report_logic_logic.md: Confirms that when profiles are forced tologic/logic, the system pairslogic_philosophy_v2_seg.mlmodelwithlogic_philosophy_v2_rec.mlmodel.report.md(auto/auto): Verifies thatsample_01_framed_margin.jpgcorrectly routes tologic/logic(framed), whilesample_02, 03, 04correctly route tologic/default(dense handwriting).
6. Current .env Configuration (Safe Values)
Safe parameters extracted from backend/.env (and backend/.env.example templates):
USE_VISION_OCR=false(forces local Kraken engine instead of cloud vision APIs).REC_MODEL_FILE=exp6_best.mlmodel(default recognition model).SEG_MODEL_FILE=seg_best.mlmodel(default segmentation model).DEVICE=auto(resolves tocudaif torch detects GPU, elsecpu).USE_FP16=true(enables half-precision for GPU speedups).USE_LM=false(disabled by default in the environment for stable demonstration, but fully functional when set totrue).CANDIDATES_ENABLED=false(disabled by default; when enabled, allows extraction of visual/text alternatives).AUTO_CANDIDATES=false(disabled by default; when enabled, automatically pre-computes candidates for low-confidence lines).FAST_SEGMENTATION=true(reduces neural BLLA segmentation time to 1-3 seconds instead of 15-30 seconds).MAX_IMAGE_SIZE=4000(limits image resolution to prevent memory overflow).
Note: Confidential API keys (OPENROUTER_API_KEY and GOOGLE_GEMINI_KEY) are loaded but masked for safety.
7. GPU/Docker Runtime Environment
- Docker Services (from
docker-compose.yml):nginx: Runs Alpine Nginx load balancer on port80, mapping to/etc/nginx/nginx.conf.ocr-worker: Runs the backend on port8001with2or3replicas (CPUs limited to 2.0, Memory 4GB in production).
- Local Access URLs:
- Through load balancer:
http://localhost/app - Direct API:
http://localhost:8001/app/ API Docs:http://localhost:8001/docs
- Through load balancer:
- GPU Status in Docker:
- Docker-compose files force
DEVICE=cpuandUSE_FP16=falsein the environment variables for workers. Therefore, Docker runs on CPU only. - Local execution (running
python run.pynatively) supports GPU and mixed precision (DEVICE=autowill resolve tocudaon local setups with CUDA-compatible cards like the RTX 4050).
- Docker-compose files force
- Verification Command:
To check actual logs inside Docker, use:
docker logs phoenix_e2e_lmtrue --tail 150(or the active worker container name). To inspect system resources and hardware:GET http://localhost:8001/api/system/info
8. Language Model (LM) Decoding Status
- Status: Fully implemented and integrated.
- Model File:
نماذج/char8_trainval.lm(character n-gram language model, ~34.5 MB). - Operation: Shallow fusion decoding. It replaces standard greedy decoding in Kraken with a Beam Search CTC decoder (
LMDecoderinbackend/app/services/ocr/lm_decoder.py) that scores character transitions based on language probability. - Measured Improvements:
- RASAM Dataset (Maghrebi): Character Error Rate (CER) improved from 7.48% → 6.79% (absolute reduction of
0.69%). - TariMa Dataset: Character Error Rate (CER) improved from 10.27% → 8.81% (absolute reduction of
1.46%).
- RASAM Dataset (Maghrebi): Character Error Rate (CER) improved from 7.48% → 6.79% (absolute reduction of
- Technical Note: This is a local statistical n-gram model executing via C++ binding (Kraken/PyTorch), not an external generative API (like ChatGPT).
9. Catalog and Index Data
- Metadata Databases: Combined dataset utilizing OpenITI (13,364 works) and FIHRIST (15,543 manuscripts from UK libraries).
- Catalog Statistics (
catalog_stats.json):- Total Works: 35,632
- Total Manuscript Copies: 49,980
- Works with Multiple Copies: 6,003 (16.85%)
- Average Copies per Work: 1.4
- Top Institutions: Wellcome Collection, London (11,192 copies); Bodleian Library, Oxford (7,167 copies); University Library, Cambridge (5,233 copies).
- Top Sources: Fihrist (36,616 copies); OpenITI (13,364 copies).
- App Implementation: Fully implemented as a dedicated tab ("فهرس المخطوطات") in the frontend workspace. It supports search queries (Arabic/Latin) and matches OCR-extracted text fingerprints against catalog works (
/api/catalog/match-content).
10. UI Enhancements
Verified frontend improvements:
- Organized Toolbar Layout: Restructured into a clean two-row toolbar:
- Row 1: Main operations (File upload, Segmentation/Recognition selectors, region filters, bounding box toggle, direct mode, cache clear, and export).
- Row 2: Labeled "🤖 التحليل الذكي (AI)" with analysis buttons (terminology explanation, page explanation, entity extraction, summary/title generation, uncertain highlighting, candidates, and manuscript search).
- Scroll Lock Fix: Replaced layout locks on mobile/tablet viewports (
max-width: 900px) with natural vertical scrolling (overflow-y: auto !importanton body and panels), ensuring the text workspace is fully accessible on all screen sizes. - Dedicated Dropdowns: Added separate dropdown lists for Segmentation (القص) and Recognition (التفريغ) with choices
auto,default, andlogicto support independent routing control. - Arabic Localization: Buttons, titles, and explanations are localized into clear Arabic.