thekfp/synthetic-cameroon-national-id-card-orc-dataset
๐จ๐ฒ Cameroon National ID Card OCR Dataset Synthetic dataset for information extraction from Cameroonian National Identity Cards via OCR. ๐ Description This dataset contains 60,000 examples of simulated OCR text from Cameroonian National ID Cards with corresponding structured information in JSON format. The data covers two ID card formats (2018 and 2025) and two sides (front/back) with different levels of OCR noise. ๐ฏ Use Cases Fine-tuning LLMโฆ See the full description on the dataset page: https://huggingface.co/datasets/thekfp/synthetic-cameroon-national-id-card-orc-dataset.
๐จ๐ฒ Cameroon National ID Card OCR Dataset
Synthetic dataset for information extraction from Cameroonian National Identity Cards via OCR.
๐ Description
This dataset contains 60,000 examples of simulated OCR text from Cameroonian National ID Cards with corresponding structured information in JSON format. The data covers two ID card formats (2018 and 2025) and two sides (front/back) with different levels of OCR noise.
๐ฏ Use Cases
- Fine-tuning LLM models for named entity extraction
- Training official document recognition systems
- Developing ID card digitization applications
- Research in automatic government document processing
๐ Dataset Structure
Distribution
- 4 separate datasets:
cni_2018_recto,cni_2018_verso,cni_2025_recto,cni_2025_verso - 15,000 examples per dataset
- Total: 60,000 examples
Columns
Noise Distribution
- 45% Light noise (code 0): 6,750 examples per dataset
- 35% Medium noise (code 1): 5,250 examples per dataset
- 20% Heavy noise (code 2): 3,000 examples per dataset
๐ท๏ธ ID Card Formats
2018 ID Card - Front
Extracted fields:
{
"nom_surname": "string",
"prenom_given_name": "string",
"date_of_birth": "DD.MM.YYYY",
"lieu_of_birth": "string",
"sex": "M|F",
"taille": "X.XX",
"profession": "string"
}2018 ID Card - Back
Extracted fields:
{
"pere_father": "string",
"mere_mother": "string",
"sp_sm": "6 digits",
"date_of_issue": "DD.MM.YYYY",
"date_of_expiration": "DD.MM.YYYY",
"identifiant_unique": "17 digits",
"numero_de_carte": "9 digits",
"authorite": "Martin MBARGA NGUรLร"
}2025 ID Card - Front
Extracted fields:
{
"numero_de_carte": "9 digits",
"nom_surname": "string",
"prenom_given_name": "string",
"date_of_birth": "DD.MM.YYYY",
"sex": "M|F",
"date_of_expiration": "DD.MM.YYYY"
}2025 ID Card - Back
Extracted fields:
{
"pere_father": "string",
"mere_mother": "string",
"lieu_of_birth": "string",
"date_of_issue": "DD.MM.YYYY",
"taille": "X.XX",
"profession": "string",
"identifiant_unique": "2 letters + 9 digits",
"authorite": "Martin MBARGA NGUรLร"
}๐ง Data Generation
Source Data
- 320 authentic Cameroonian names (all regions)
- 320 typical Cameroonian given names
- 500 Cameroonian cities and villages
- 500 local professions
- Algorithmically generated dates, heights, and numbers
Realistic OCR Simulation
OCR noise includes:
- Element omission (40% priority) - missing labels and values
- Character corruption (10%) - visually similar substitutions (
Oโ0,Iโ1) - Missing spaces (5%) - fusion of adjacent words
- Alphanumeric noise (10%) - parasitic characters
XZ7,A3K - Order reversal (10%) - permutation of nearby elements
Information Preservation
- Minimum 60% of critical information preserved
- Differential noise by type (labels > alphabetic values > numeric values)
- Special protection for dates and identifiers
๐ Usage
Loading the Dataset
from datasets import load_dataset
# Load a specific dataset
dataset = load_dataset("username/cameroon-cni-ocr", "cni_2018_recto")
# Access the data
print(dataset['train'][0])
# {
# 'ID': 'cni_2018_recto_000001',
# 'ocr_text': 'REPUBLIQUE CAMEROUN NOM KENGALI FEGUE...',
# 'result': '{"nom_surname": "KENGALI FEGUE", ...}',
# 'niveau_bruitage': 1
# }Fine-tuning Example
from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer
# Recommended prompt format
def format_prompt(ocr_text):
return f"Extract JSON from this Cameroonian ID card:\n{ocr_text}\nJSON:"
# Fine-tuning with Trainer
# (see example scripts in the repository)Filtering by Noise Level
# Progressive training by difficulty
easy_data = dataset.filter(lambda x: x['niveau_bruitage'] == 0)
medium_data = dataset.filter(lambda x: x['niveau_bruitage'] == 1)
hard_data = dataset.filter(lambda x: x['niveau_bruitage'] == 2)๐ Included Files
๐ฆ cameroon-cni-ocr/
โโโ ๐ README.md
โโโ ๐ cni_2018_recto.csv # 2018 ID front dataset (15k rows)
โโโ ๐ cni_2018_verso.csv # 2018 ID back dataset (15k rows)
โโโ ๐ cni_2025_recto.csv # 2025 ID front dataset (15k rows)
โโโ ๐ cni_2025_verso.csv # 2025 ID back dataset (15k rows)
โโโ ๐ง scripts/
โ โโโ generate_dataset.py # Complete generation script
โ โโโ bruitage_ocr.py # OCR noise functions
โ โโโ fine_tuning_qwen3.py # Fine-tuning script
โ โโโ evaluation_metrics.py # Evaluation metrics
โโโ ๐ data/
โ โโโ donnees_completes.json # Source data (names, places, etc.)
โ โโโ etiquettes_bruit.json # OCR noise configuration
โ โโโ templates_cni.py # ID card templates by format
โโโ ๐ docs/
โโโ methodology.md # Detailed methodology
โโโ evaluation_results.md # Benchmark results๐ฏ Evaluation Metrics
To evaluate models on this dataset:
Recommended Metrics
- ROUGE-1/2/L: Textual similarity
- Exact Match: Perfectly correct JSON
- Key Accuracy: % of correct JSON keys
- Value Accuracy: % of correct values
- Parse Success Rate: % of syntactically valid JSON
โ๏ธ Ethical Considerations
Synthetic Data
- All data is synthetic and does not correspond to any real person
- Names and information are randomly generated from public lists
- No real personal information was used
Responsible Use
- This dataset is designed for research and development
- Commercial applications must comply with local regulations
- Do not use to create fake identities or fraudulent documents
Potential Biases
- Geographic representation centered on Cameroon
- Names from major Cameroonian ethnic groups
- Format limited to Cameroonian ID cards (not generalizable)
๐ License
Apache 2.0 - Free use for research and commercial applications.
๐ค Contributing
To report issues or suggest improvements:
- Open an issue on GitHub
- Submit pull requests for scripts
- Share your fine-tuning results
๐ Citation
If you use this dataset in your research:
@dataset{cameroon_cni_ocr_2025,
title={Cameroon National ID Card OCR Dataset: Synthetic Dataset for Information Extraction from Cameroonian National Identity Cards},
author={[Pacom KENGALI F.]},
year={2025}