├── erax_vl_7b_v1 ├── __init__.py ├── utils.py └── erax_api_lib.py ├── run.sh ├── .env_sample ├── images ├── cccd.jpg ├── hoadon.jpg ├── bao_hiem_0.jpg └── bao_hiem_1.jpg ├── requirements.txt ├── run_erax_api.sh ├── MANIFEST.in ├── setup.py ├── examples ├── extract_image.py └── extract_multiple_images.py ├── erax_api.py ├── .gitignore ├── README.md ├── LICENSE └── prompts └── Vietnam_popular_prompts.txt /erax_vl_7b_v1/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | python3 ./examples/ocr_image.py -------------------------------------------------------------------------------- /.env_sample: -------------------------------------------------------------------------------- 1 | ERAX_URL_ID= 2 | API_KEY= -------------------------------------------------------------------------------- /images/cccd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EraX-JS-Company/erax-vl-7b-v1/HEAD/images/cccd.jpg -------------------------------------------------------------------------------- /images/hoadon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EraX-JS-Company/erax-vl-7b-v1/HEAD/images/hoadon.jpg -------------------------------------------------------------------------------- /images/bao_hiem_0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EraX-JS-Company/erax-vl-7b-v1/HEAD/images/bao_hiem_0.jpg -------------------------------------------------------------------------------- /images/bao_hiem_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EraX-JS-Company/erax-vl-7b-v1/HEAD/images/bao_hiem_1.jpg -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | json_repair==0.29.10 2 | numpy==1.26.4 3 | matplotlib==3.8.4 4 | tqdm==4.66.5 5 | pillow==10.3.0 6 | PyMuPDF==1.24.11 7 | opencv-python 8 | python-dotenv 9 | requests 10 | regex==2024.9.11 -------------------------------------------------------------------------------- /run_erax_api.sh: -------------------------------------------------------------------------------- 1 | python3 erax_api.py --paths images/cccd.jpg \ 2 | --prompt "Hãy trích xuất toàn bộ chi tiết của các bức ảnh này theo đúng thứ tự của nội dung bằng định dạng json và không bình luận gì." 3 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include README.md 2 | include LICENSE 3 | 4 | exclude .env 5 | exclude *.key 6 | exclude *.pem 7 | exclude output.json 8 | 9 | exclude __pycache__ 10 | exclude tmp/* 11 | exclude images/* 12 | 13 | exclude test_2.txt 14 | exclude test.py -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup( 4 | name="erax-vl-7b-v1", 5 | version="0.1.0", 6 | description="EraX-VL-7B-V1 - A multimodal vision-language model based on Qwen2-VL-7B architecture.", 7 | long_description=open("README.md", "r").read(), 8 | long_description_content_type="text/markdown", 9 | url="https://github.com/EraX-JS-Company/erax-vl-7b-v1", 10 | author="EraX", 11 | author_email="nguyen@erax.ai", 12 | license="Apache License 2.0", 13 | packages=find_packages(), 14 | install_requires=[ 15 | "json_repair", 16 | "numpy", 17 | "matplotlib", 18 | "tqdm", 19 | "pillow", 20 | "PyMuPDF", 21 | "opencv-python", 22 | "python-dotenv", 23 | "requests", 24 | "regex" 25 | ], 26 | classifiers=[ 27 | "Development Status :: 3 - Alpha", 28 | "Programming Language :: Python :: 3", 29 | "License :: OSI Approved :: Apache Software License", 30 | "Operating System :: OS Independent", 31 | "Topic :: Scientific/Engineering :: Artificial Intelligence" 32 | ], 33 | python_requires=">=3.6", 34 | ) 35 | -------------------------------------------------------------------------------- /examples/extract_image.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from pathlib import Path 4 | import argparse 5 | import json 6 | import json_repair 7 | 8 | FILE = Path(__file__).resolve() 9 | ROOT = FILE.parents[1] 10 | if str(ROOT) not in sys.path: 11 | sys.path.append(str(ROOT)) 12 | 13 | from erax_vl_7b_v1.prompts import ( 14 | sickness_medicines, 15 | cities, 16 | default_prompt, 17 | PDF_prompt, 18 | popular_prompt, 19 | ycbt_ocr_only_prompt, 20 | pdf_full_prompt, 21 | ycbt_ocr_conversation_single_image_prompt 22 | ) 23 | from erax_vl_7b_v1.utils import ( 24 | process_lr, 25 | get_json, 26 | openBase64_Image, 27 | add_img_content, 28 | add_pdf_content, 29 | add_pdf_content_json 30 | ) 31 | from erax_vl_7b_v1.erax_api_lib import ( 32 | API_Image_OCR_EraX_VL_7B_vLLM, 33 | API_PDF_OCR_EraX_VL_7B_vLLM, 34 | API_Chat_OCR_EraX_VL_7B_vLLM, 35 | API_Multiple_Images_OCR_EraX_VL_7B_vLLM, 36 | API_PDF_Full_OCR_EraX_VL_7B_vLLM 37 | ) 38 | 39 | from dotenv import load_dotenv 40 | load_dotenv() 41 | 42 | if __name__ == "__main__": 43 | ERAX_URL_ID = os.getenv('ERAX_URL_ID') 44 | API_KEY = os.getenv('API_KEY') 45 | 46 | image_path = "./images/hoadon.jpg" 47 | 48 | prompt = """Hãy trích xuất toàn bộ chi tiết của các bức ảnh này theo đúng thứ tự của nội dung bằng định dạng json và không bình luận gì. 49 | """ 50 | 51 | result, history = API_Image_OCR_EraX_VL_7B_vLLM( 52 | image_paths=image_path, 53 | is_base64=False, 54 | prompt=prompt, 55 | erax_url_id=ERAX_URL_ID, 56 | API_key=API_KEY, 57 | ) 58 | 59 | # Convert string json to json. It is result. 60 | json_result = get_json(result) 61 | 62 | print(json_result) -------------------------------------------------------------------------------- /erax_api.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import argparse 4 | import json 5 | import json_repair 6 | from erax_vl_7b_v1.prompts import ( 7 | sickness_medicines, 8 | cities, 9 | default_prompt, 10 | PDF_prompt, 11 | popular_prompt, 12 | ycbt_ocr_only_prompt, 13 | pdf_full_prompt, 14 | ycbt_ocr_conversation_single_image_prompt 15 | ) 16 | from erax_vl_7b_v1.utils import ( 17 | process_lr, 18 | get_json, 19 | openBase64_Image, 20 | add_img_content, 21 | add_pdf_content, 22 | add_pdf_content_json 23 | ) 24 | from erax_vl_7b_v1.erax_api_lib import ( 25 | API_Image_OCR_EraX_VL_7B_vLLM, 26 | API_PDF_OCR_EraX_VL_7B_vLLM, 27 | API_Chat_OCR_EraX_VL_7B_vLLM, 28 | API_Multiple_Images_OCR_EraX_VL_7B_vLLM, 29 | API_PDF_Full_OCR_EraX_VL_7B_vLLM 30 | ) 31 | 32 | from dotenv import load_dotenv 33 | load_dotenv() 34 | 35 | def main(args): 36 | ERAX_URL_ID = os.getenv('ERAX_URL_ID') 37 | API_KEY = os.getenv('API_KEY') 38 | 39 | files = args.paths 40 | if files[0].split(".")[-1].lower() == "pdf": 41 | 42 | if args.prompt: 43 | prompt = args.prompt 44 | else: 45 | prompt = PDF_prompt 46 | 47 | # PDF file 48 | result, history = API_PDF_OCR_EraX_VL_7B_vLLM( 49 | pdf_paths=files, 50 | is_base64=False, 51 | prompt=prompt, 52 | erax_url_id=ERAX_URL_ID, 53 | API_key=API_KEY 54 | ) 55 | 56 | else: 57 | if args.prompt: 58 | prompt = args.prompt 59 | else: 60 | prompt = default_prompt 61 | 62 | # Images files 63 | result, history = API_Image_OCR_EraX_VL_7B_vLLM(image_paths=files, 64 | is_base64=False, 65 | prompt=prompt, 66 | erax_url_id=ERAX_URL_ID, 67 | API_key=API_KEY) 68 | 69 | final_result = get_json(result) 70 | with open("output.json", 'w', encoding='utf-8') as f: 71 | json.dump(final_result, f, indent=4, ensure_ascii=False) 72 | print(final_result) 73 | 74 | print("Output is at output.json") 75 | print("Enjoy!") 76 | 77 | def parse_opt(): 78 | parser = argparse.ArgumentParser(description='EraX API') 79 | parser.add_argument("-p", "--paths", metavar='-p', 80 | type=str, 81 | required=True, 82 | help='List of paths to images or PDF files, paths separated by commas') 83 | parser.add_argument("-r", "--prompt", metavar='-r', 84 | type=str, 85 | required=False, 86 | help='Optional: prompt for captioning') 87 | 88 | args = parser.parse_args() 89 | args.path = args.paths.split(",") 90 | return args 91 | 92 | if __name__ == "__main__": 93 | """* Attention: please check erax_api_lib.py to: 94 | - use proper PROMPT which is VERY important 95 | - tune parameters likes temperature, top_p, top_k 96 | - only use 1-3 images for testing 97 | """ 98 | 99 | args = parse_opt() 100 | main(args=args) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/#use-with-ide 110 | .pdm.toml 111 | 112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 113 | __pypackages__/ 114 | 115 | # Celery stuff 116 | celerybeat-schedule 117 | celerybeat.pid 118 | 119 | # SageMath parsed files 120 | *.sage.py 121 | 122 | # Environments 123 | .env 124 | .venv 125 | env/ 126 | venv/ 127 | ENV/ 128 | env.bak/ 129 | venv.bak/ 130 | 131 | # Spyder project settings 132 | .spyderproject 133 | .spyproject 134 | 135 | # Rope project settings 136 | .ropeproject 137 | 138 | # mkdocs documentation 139 | /site 140 | 141 | # mypy 142 | .mypy_cache/ 143 | .dmypy.json 144 | dmypy.json 145 | 146 | # Pyre type checker 147 | .pyre/ 148 | 149 | # pytype static type analyzer 150 | .pytype/ 151 | 152 | # Cython debug symbols 153 | cython_debug/ 154 | 155 | # PyCharm 156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 158 | # and can be added to the global gitignore or merged into this file. For a more nuclear 159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 160 | #.idea/ 161 | 162 | # Others 163 | tmp 164 | output.json 165 | test_2.txt 166 | test.py 167 | -------------------------------------------------------------------------------- /examples/extract_multiple_images.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from pathlib import Path 4 | import argparse 5 | import json 6 | import json_repair 7 | 8 | FILE = Path(__file__).resolve() 9 | ROOT = FILE.parents[1] 10 | if str(ROOT) not in sys.path: 11 | sys.path.append(str(ROOT)) 12 | 13 | from erax_vl_7b_v1.prompts import ( 14 | sickness_medicines, 15 | cities, 16 | default_prompt, 17 | PDF_prompt, 18 | popular_prompt, 19 | ycbt_ocr_only_prompt, 20 | pdf_full_prompt, 21 | ycbt_ocr_conversation_single_image_prompt 22 | ) 23 | from erax_vl_7b_v1.utils import ( 24 | process_lr, 25 | get_json, 26 | openBase64_Image, 27 | add_img_content, 28 | add_pdf_content, 29 | add_pdf_content_json 30 | ) 31 | from erax_vl_7b_v1.erax_api_lib import ( 32 | API_Image_OCR_EraX_VL_7B_vLLM, 33 | API_PDF_OCR_EraX_VL_7B_vLLM, 34 | API_Chat_OCR_EraX_VL_7B_vLLM, 35 | API_Multiple_Images_OCR_EraX_VL_7B_vLLM, 36 | API_PDF_Full_OCR_EraX_VL_7B_vLLM 37 | ) 38 | 39 | from dotenv import load_dotenv 40 | load_dotenv() 41 | 42 | if __name__ == "__main__": 43 | ERAX_URL_ID = os.getenv('ERAX_URL_ID') 44 | API_KEY = os.getenv('API_KEY') 45 | 46 | image_paths = ["./images/bao_hiem_0.jpg", "./images/bao_hiem_1.jpg"] 47 | 48 | prompt = """Hãy trích xuất toàn bộ chi tiết của các bức ảnh này theo đúng thứ tự của nội dung bằng định dạng json và không bình luận gì. 49 | """ 50 | 51 | full_prompt = """Bạn là một chuyên gia bồi thường bảo hiểm xuất sắc. 52 | Bạn được cung cấp danh sách các json là kết quả đã được OCR chính xác từ một (1) hay nhiều ảnh khác nhau. 53 | Các json này là của một hay nhiều phiếu trong một bộ hồ sơ yêu cầu bồi thường bảo hiểm, bao gồm một hay nhiều hoá đơn các loại. 54 | 55 | Bạn có 1 nhiệm vụ: phân tích và tổng hợp các jsons được cung cấp này: 56 | - Phân tích kỹ lưỡng tất cả các json OCR được cung cấp, không đưỡ bỏ sót json nào. 57 | - Tổng hợp tất cả các json trên bằng 1 json khác có tính tổng hợp nhưng đầy đủ chi tiết để công ty tiến hành xem xét thủ tục bồi thường chính xác và công bằng với định dạng json dưới đây. 58 | - Không được bỏ qua bất kỳ chi tiết nào về các triệu chứng, các loại thuốc được kê mua, tên bệnh, đề xuất, các phí dịch vụ y tế và các chi phí khác. 59 | - Không được bỏ qua bất kỳ nội dung nào, kể cả các ghi chú, điều kiện, uỷ quyền, cam kết 60 | - Lưu ý phải tóm tắt ngắn gọn sau khi phân tích 61 | - Các từ viết tắt thông dụng: NĐBH: Người được Bảo hiểm, CMND: Chứng minh nhân dân, GCNBH: Giấy chứng nhận Bảo hiểm, Số thẻ BH: Số thẻ Bảo hiểm, CCCD: Căn cước công dân, YCBT: Yêu cầu bồi thường, PK: Phòng khám, BVĐK: Bệnh viện Đa khoa, CTY: Công ty, BS: Bác sĩ, ThS: Thạc sĩ, STT: Số thứ tự, Mã BN: Mã bệnh nhân, GCN: Giấy chứng nhận, BS.CKII: Bác sĩ chuyên khoa 2, BHXH: Bảo hiểm Xã hội, ... 62 | - Các họ phổ biến ở Việt Nam: NGUYỄN, Nguyễn, TRẦN, Trần, LÊ, Lê, ĐINH, Đinh, PHẠM, Phạm, TRỊNH, Trịnh, LÝ, Lý, HOÀNG, Hoàng, BÙI, Bùi, NGÔ, Ngô, PHAN, Phan, VÕ, Võ, HỒ, Hồ, HUỲNH, Huỳnh, TRƯƠNG, Trương, ĐẶNG, Đặng, ĐỖ, Đỗ, ... 63 | - Các tỉnh, thành phố ở Việt Nam: An Giang, Bà Rịa-Vũng Tàu, Bắc Giang, Bắc Kạn, Bạc Liêu, Bắc Ninh, Bến Tre, Bình Định, Bình Dương, Bình Phước, Bình Thuận, Cà Mau, Cần Thơ, Cao Bằng, Đà Nẵng, Đắk Lắk, Đắk Nông, Điện Biên, Đồng Nai, Đồng Tháp, Gia Lai, Hà Giang, Hà Nam, Hà Nội, Hà Tĩnh, Hải Dương, Hải Phòng, Hậu Giang, TP. Hồ Chí Minh, Hòa Bình, Hưng Yên, Khánh Hòa, Kiên Giang, Kon Tum, Lai Châu, Lâm Đồng, Lạng Sơn, Lào Cai, Long An, Nam Định, Nghệ An, Ninh Bình, Ninh Thuận, Phú Thọ, Phú Yên, Quảng Bình, Quảng Nam, Quảng Ngãi, Quảng Ninh, Quảng Trị, Sóc Trăng, Sơn La, Tây Ninh, Thái Bình, Thái Nguyên, Thanh Hóa, Thừa Thiên - Huế, Tiền Giang, Trà Vinh, Tuyên Quang, Vĩnh Long, Vĩnh Phúc, Yên Bái. 64 | 65 | # Dữ liệu được cung cấp: 66 | 67 | {ocr_results} 68 | 69 | Trả về định dạng json. Không diễn giải cách làm, không tóm tắt, chỉ trả lại duy nhất 1 json. 70 | ``` 71 | 72 | # Output: 73 | """ 74 | 75 | result, history = API_Multiple_Images_OCR_EraX_VL_7B_vLLM( 76 | image_paths=image_paths, 77 | is_base64=False, 78 | prompt=prompt, 79 | pdf_full_prompt=full_prompt, 80 | erax_url_id=ERAX_URL_ID, 81 | API_key=API_KEY, 82 | ) 83 | 84 | # Convert string json to json. It is result. 85 | json_result = get_json(result) 86 | 87 | print(json_result) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EraX-VL-7B-V1 2 |

3 | Logo 4 |

5 | 6 |

7 | 🤗 Hugging Face   8 |
9 |

10 | 11 | ## Introduction 12 | 13 | After a month's relentless efforts, today we are thrilled to release **EraX-VL-7B-V1**! 14 | 15 | `NOTA BENE: EraX-VL-7B-V1 is NOT a typical OCR-only tool likes Tesseract but is a Multimodal LLM-based model. To use it effectively, you may have to twist your prompt carefully depending on your tasks.` 16 | 17 | `EraX-VL-7B-V1` is the latest version of the vision language models in the EraX model families. 18 | 19 | ## Benchmark 20 | Below is the evaluation benchmark of **global open-source and proprietary Multimodal Models** on the [MTVQA](https://huggingface.co/datasets/ByteDance/MTVQA) Vietnamese test set conducted by [VinBigdata](https://www.linkedin.com/feed/update/urn:li:activity:7243887708966641664/). We plan to conduct more detailed and diverse evaluations in the near future. 21 |
22 | 23 | 24 | (Source: VinBigData) 25 | (20:00 23 September 2024) 26 |
27 |
28 | 29 | ## Quickstart 30 | Below, we provide simple examples to show how to use `EraX-VL-7B-V1` 🤗 Transformers. 31 | 32 | The code of `EraX-VL-7B-V1` has been in the latest Hugging face transformers and we advise you to build from source with command: 33 | 34 | Install the necessary packages: 35 | ```bash 36 | python -m pip install git+https://github.com/huggingface/transformers@21fac7abba2a37fae86106f87fcf9974fd1e3830 accelerate 37 | python -m pip install qwen-vl-utils 38 | pip install flash-attn --no-build-isolation 39 | ``` 40 | ### Using Google Colaboratory 41 | * Google Colaboratory run right away: [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1CnSxtWDLG48-NQh7wk9_z8WI7J4OY_Ci?usp=sharing) 42 | * Google Colaboratory API (key required): [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/179ZzegjBmuvr-5QfJfJzbVOzRTgD0K_r?usp=sharing) 43 | 44 | ### Using 🤗 Transformers 45 | 46 | ```python 47 | import os 48 | import base64 49 | import json 50 | 51 | import cv2 52 | import numpy as np 53 | import matplotlib.pyplot as plt 54 | 55 | import torch 56 | from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor 57 | from qwen_vl_utils import process_vision_info 58 | 59 | model_path = "erax/EraX-VL-7B-V1" 60 | 61 | model = Qwen2VLForConditionalGeneration.from_pretrained( 62 | model_path, 63 | torch_dtype=torch.bfloat16, 64 | attn_implementation="eager", # replace with "flash_attention_2" if your GPU is Ampere architecture 65 | device_map="auto" 66 | ) 67 | 68 | tokenizer = AutoTokenizer.from_pretrained(model_path) 69 | # processor = AutoProcessor.from_pretrained(model_path) 70 | 71 | min_pixels = 256 * 28 * 28 72 | max_pixels = 1280 * 28 * 28 73 | processor = AutoProcessor.from_pretrained( 74 | model_path, 75 | min_pixels=min_pixels, 76 | max_pixels=max_pixels, 77 | ) 78 | 79 | image_path = "image.jpg" 80 | 81 | with open(image_path, "rb") as f: 82 | encoded_image = base64.b64encode(f.read()) 83 | decoded_image_text = encoded_image.decode('utf-8') 84 | base64_data = f"data:image;base64,{decoded_image_text}" 85 | 86 | messages = [ 87 | { 88 | "role": "user", 89 | "content": [ 90 | { 91 | "type": "image", 92 | "image": base64_data, 93 | }, 94 | { 95 | "type": "text", 96 | "text": "Diễn tả nội dung bức ảnh này bằng định dạng json." 97 | }, 98 | ], 99 | } 100 | ] 101 | 102 | # Prepare prompt 103 | tokenized_text = processor.apply_chat_template( 104 | messages, tokenize=False, add_generation_prompt=True 105 | ) 106 | 107 | image_inputs, video_inputs = process_vision_info(messages) 108 | 109 | inputs = processor( 110 | text=[ tokenized_text], 111 | images=image_inputs, 112 | videos=video_inputs, 113 | padding=True, 114 | return_tensors="pt", 115 | ) 116 | inputs = inputs.to("cuda") 117 | 118 | # Generation configs 119 | generation_config = model.generation_config 120 | generation_config.do_sample = True 121 | generation_config.temperature = 0.2 122 | generation_config.top_k = 1 123 | generation_config.top_p = 0.001 124 | generation_config.max_new_tokens = 2048 125 | generation_config.repetition_penalty = 1.1 126 | 127 | # Inference 128 | generated_ids = model.generate(**inputs, generation_config=generation_config) 129 | generated_ids_trimmed = [ 130 | out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids) 131 | ] 132 | output_text = processor.batch_decode( 133 | generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False 134 | ) 135 | 136 | print(output_text[0]) 137 | ``` 138 | ### Using API 139 | Install `erax-vl-7b-v1` package: 140 | ```bash 141 | pip install erax-vl-7b-v1==0.1.0 142 | ``` 143 | Then you can use this library for image extraction task like this: 144 | ```python 145 | import os 146 | 147 | from erax_vl_7b_v1.utils import ( 148 | process_lr, 149 | get_json, 150 | openBase64_Image, 151 | add_img_content, 152 | add_pdf_content, 153 | add_pdf_content_json 154 | ) 155 | from erax_vl_7b_v1.erax_api_lib import ( 156 | API_Image_OCR_EraX_VL_7B_vLLM, 157 | API_PDF_OCR_EraX_VL_7B_vLLM, 158 | API_Chat_OCR_EraX_VL_7B_vLLM, 159 | API_Multiple_Images_OCR_EraX_VL_7B_vLLM, 160 | API_PDF_Full_OCR_EraX_VL_7B_vLLM 161 | ) 162 | 163 | ERAX_URL_ID = "EraX's URL ID" 164 | API_KEY = "EraX's API Key" 165 | 166 | image_path = "image.jpg" 167 | prompt = """Hãy trích xuất toàn bộ chi tiết của các bức ảnh này theo đúng thứ tự của nội dung bằng định dạng json và không bình luận gì thêm.""" 168 | 169 | result, history = API_Image_OCR_EraX_VL_7B_vLLM( 170 | image_paths=image_path, 171 | is_base64=False, 172 | prompt=prompt, 173 | erax_url_id=ERAX_URL_ID, 174 | API_key=API_KEY, 175 | ) 176 | 177 | # Convert string json to json. It is result. 178 | json_result = get_json(result) 179 | 180 | print(json_result) 181 | ``` 182 | 183 | ## For API inquiry 184 | - For correspondence regarding this work or inquiry for API trial, please contact Nguyễn Anh Nguyên at [nguyen@erax.ai](nguyen@erax.ai). 185 | 186 | ## Citation 187 | If you find our project useful, we would appreciate it if you could star our repository and cite our work as follows: 188 | ```BibTeX 189 | @article{EraX-VL-7B-V1, 190 | title={EraX-VL-7B-V1: A Highly Efficient Multimodal LLM for Vietnamese, especially for medical forms and bills}, 191 | author={Nguyễn Anh Nguyên and Nguyễn Hồ Nam (BCG) and Hoàng Tiến Dũng and Phạm Đình Thục and Phạm Huỳnh Nhật}, 192 | organization={EraX}, 193 | year={2024}, 194 | url={https://huggingface.co/erax-ai/EraX-VL-7B-V1} 195 | } 196 | ``` 197 | ## Acknowledgement 198 | 199 | `EraX-VL-7B-V1` is built with reference to the code of the following projects: [Qwen2-VL](https://github.com/QwenLM/Qwen2-VL), [InternVL](https://github.com/OpenGVLab/InternVL) and Khang Đoàn ([5CD-AI](https://huggingface.co/5CD-AI)). Thanks for their awesome work! 200 | -------------------------------------------------------------------------------- /erax_vl_7b_v1/utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | import regex as re 3 | import base64 4 | from io import BytesIO 5 | import uuid 6 | from tqdm import tqdm 7 | 8 | from PIL import Image 9 | import matplotlib.pyplot as plt 10 | 11 | import pymupdf 12 | 13 | from json_repair import repair_json 14 | from erax_vl_7b_v1.prompts import ( 15 | sickness_medicines, 16 | cities, 17 | default_prompt, 18 | PDF_prompt, 19 | popular_prompt, 20 | ycbt_ocr_only_prompt, 21 | pdf_full_prompt, 22 | ycbt_ocr_conversation_single_image_prompt 23 | ) 24 | 25 | uniChars = "àáảãạâầấẩẫậăằắẳẵặèéẻẽẹêềếểễệđìíỉĩịòóỏõọôồốổỗộơờớởỡợùúủũụưừứửữựỳýỷỹỵÀÁẢÃẠÂẦẤẨẪẬĂẰẮẲẴẶÈÉẺẼẸÊỀẾỂỄỆĐÌÍỈĨỊÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢÙÚỦŨỤƯỪỨỬỮỰỲÝỶỸỴÂĂĐÔƠƯ" 26 | unsignChars = "aaaaaaaaaaaaaaaaaeeeeeeeeeeediiiiiooooooooooooooooouuuuuuuuuuuyyyyyAAAAAAAAAAAAAAAAAEEEEEEEEEEEDIIIOOOOOOOOOOOOOOOOOOOUUUUUUUUUUUYYYYYAADOOU" 27 | 28 | def loaddicchar(): 29 | dic = {} 30 | char1252 = 'à|á|ả|ã|ạ|ầ|ấ|ẩ|ẫ|ậ|ằ|ắ|ẳ|ẵ|ặ|è|é|ẻ|ẽ|ẹ|ề|ế|ể|ễ|ệ|ì|í|ỉ|ĩ|ị|ò|ó|ỏ|õ|ọ|ồ|ố|ổ|ỗ|ộ|ờ|ớ|ở|ỡ|ợ|ù|ú|ủ|ũ|ụ|ừ|ứ|ử|ữ|ự|ỳ|ý|ỷ|ỹ|ỵ|À|Á|Ả|Ã|Ạ|Ầ|Ấ|Ẩ|Ẫ|Ậ|Ằ|Ắ|Ẳ|Ẵ|Ặ|È|É|Ẻ|Ẽ|Ẹ|Ề|Ế|Ể|Ễ|Ệ|Ì|Í|Ỉ|Ĩ|Ị|Ò|Ó|Ỏ|Õ|Ọ|Ồ|Ố|Ổ|Ỗ|Ộ|Ờ|Ớ|Ở|Ỡ|Ợ|Ù|Ú|Ủ|Ũ|Ụ|Ừ|Ứ|Ử|Ữ|Ự|Ỳ|Ý|Ỷ|Ỹ|Ỵ'.split( 31 | '|') 32 | charutf8 = "à|á|ả|ã|ạ|ầ|ấ|ẩ|ẫ|ậ|ằ|ắ|ẳ|ẵ|ặ|è|é|ẻ|ẽ|ẹ|ề|ế|ể|ễ|ệ|ì|í|ỉ|ĩ|ị|ò|ó|ỏ|õ|ọ|ồ|ố|ổ|ỗ|ộ|ờ|ớ|ở|ỡ|ợ|ù|ú|ủ|ũ|ụ|ừ|ứ|ử|ữ|ự|ỳ|ý|ỷ|ỹ|ỵ|À|Á|Ả|Ã|Ạ|Ầ|Ấ|Ẩ|Ẫ|Ậ|Ằ|Ắ|Ẳ|Ẵ|Ặ|È|É|Ẻ|Ẽ|Ẹ|Ề|Ế|Ể|Ễ|Ệ|Ì|Í|Ỉ|Ĩ|Ị|Ò|Ó|Ỏ|Õ|Ọ|Ồ|Ố|Ổ|Ỗ|Ộ|Ờ|Ớ|Ở|Ỡ|Ợ|Ù|Ú|Ủ|Ũ|Ụ|Ừ|Ứ|Ử|Ữ|Ự|Ỳ|Ý|Ỷ|Ỹ|Ỵ".split( 33 | '|') 34 | for i in range(len(char1252)): 35 | dic[char1252[i]] = charutf8[i] 36 | return dic 37 | 38 | dicchar = loaddicchar() 39 | 40 | def covert_unicode(txt): 41 | return re.sub( 42 | r'à|á|ả|ã|ạ|ầ|ấ|ẩ|ẫ|ậ|ằ|ắ|ẳ|ẵ|ặ|è|é|ẻ|ẽ|ẹ|ề|ế|ể|ễ|ệ|ì|í|ỉ|ĩ|ị|ò|ó|ỏ|õ|ọ|ồ|ố|ổ|ỗ|ộ|ờ|ớ|ở|ỡ|ợ|ù|ú|ủ|ũ|ụ|ừ|ứ|ử|ữ|ự|ỳ|ý|ỷ|ỹ|ỵ|À|Á|Ả|Ã|Ạ|Ầ|Ấ|Ẩ|Ẫ|Ậ|Ằ|Ắ|Ẳ|Ẵ|Ặ|È|É|Ẻ|Ẽ|Ẹ|Ề|Ế|Ể|Ễ|Ệ|Ì|Í|Ỉ|Ĩ|Ị|Ò|Ó|Ỏ|Õ|Ọ|Ồ|Ố|Ổ|Ỗ|Ộ|Ờ|Ớ|Ở|Ỡ|Ợ|Ù|Ú|Ủ|Ũ|Ụ|Ừ|Ứ|Ử|Ữ|Ự|Ỳ|Ý|Ỷ|Ỹ|Ỵ', 43 | lambda x: dicchar[x.group()], txt) 44 | 45 | char = "àảãáạăằẳẵắặâầẩẫấậòỏõóọôồổỗốộơờởỡớợèẻẽéẹêềểễếệùủũúụưừửữứựìỉĩíịỳỷỹýỵđ" #kí tự thuần việt 46 | kdau = "aAăĂâÂbBcCdDđĐeEêÊfFgGhHiIjJkKlLmMnNoOôÔơƠpPqQrRsStTuUưƯvVwWxXyYzZ" 47 | kdau_c = "aAăĂâÂeEêÊiIoOôÔơƠuUưƯ" 48 | cbo_di_khi_lay_van = "bcdfghjklmnpqrstuvwz" 49 | cdau = "aàảãáạăằẳẵắặâầẩẫấậeèẻẽéẹêềểễếệiìỉĩíịoòỏõóọôồổỗốộơờởỡớợuùủũúụưừửữứựyỳỷỹýỵAÀẢÃÁẠĂẰẲẴẮẶÂẦẨẪẤẬEÈẺẼÉẸÊỀỂỄẾỆIÌỈĨÍỊOÒỎÕÓỌÔỒỔỖỐỘƠỜỞỠỚỢUÙỦŨÚỤƯỪỬỮỨỰYỲỶỸÝỴ" 50 | 51 | thanh_bang = "àằầòồờèềùừìỳy" + "àằầòồờèềùừìỳy".upper() + kdau_c 52 | thanh_trac = "".join([i for i in cdau if i not in thanh_bang]) 53 | 54 | all_chars = cdau + kdau 55 | bang_trac = (thanh_bang + thanh_trac) 56 | 57 | all_chars_lower = all_chars.lower() 58 | all_chars_lower = covert_unicode(all_chars_lower) 59 | all_chars_lower = set(all_chars_lower) 60 | all_chars_lower = "".join(all_chars_lower) 61 | 62 | all_chars_lower_extra = all_chars_lower + ",;!.?" 63 | 64 | def process_lr(text): 65 | tmp = text.split('\n') 66 | new_text = "" 67 | for idx, i in enumerate(tmp): 68 | i = i.strip() 69 | if len(i)==0 or i.isdigit(): 70 | continue 71 | # start new line but lower case --> bring them up 72 | if i[0] in all_chars_lower_extra: 73 | new_text += " " + i 74 | else: 75 | if idx!=0: 76 | new_text += "\n" + i 77 | else: 78 | new_text += i 79 | return new_text.replace(' ', ' ').replace(' ,', ',').replace(' .', '.').strip() 80 | 81 | def get_json(content): 82 | import copy 83 | original_content = copy.deepcopy(content) 84 | 85 | key = "" 86 | if "[" in original_content: 87 | if "{" in original_content: 88 | point_0 = original_content.find("[") 89 | point_1 = original_content.find("{") 90 | if point_0 < point_1: 91 | key = "[" 92 | else: 93 | key = "{" 94 | else: 95 | key = "[" 96 | else: 97 | key = "{" 98 | 99 | if key == "{": 100 | key_2 = "}" 101 | else: 102 | key_2 = "]" 103 | 104 | try: 105 | start = original_content.find(key) 106 | end = original_content.rfind(key_2) 107 | if end == -1: 108 | return dict() 109 | 110 | content = original_content[start:end + 1] 111 | content = repair_json(content, return_objects=True) 112 | except Exception as e: 113 | print(e) 114 | return dict() 115 | 116 | return content 117 | 118 | max_allowed_images = 5 119 | max_width_mm = 448 120 | 121 | def openBase64_Image(b64): 122 | return Image.open(BytesIO(base64.b64decode(b64))) 123 | 124 | # ------------------------------------------- 125 | # Generate base64 & prompt for image captioning. 126 | # If there are more than 1 images then all images will be scaled to max_width_mm 127 | # ------------------------------------------- 128 | def add_img_content( 129 | image_paths=None, 130 | is_base64=False, 131 | prompt=default_prompt, 132 | tmp_path="./tmp/", 133 | max_images=max_allowed_images, 134 | force_scale=True 135 | ): 136 | os.makedirs(tmp_path, exist_ok=True) 137 | 138 | max_width_mm = 448 139 | scaled = False 140 | 141 | if image_paths is not None: 142 | if type(image_paths) == str: 143 | image_paths = [image_paths, ] 144 | else: 145 | scaled = True 146 | if scaled or force_scale: 147 | scaled = True 148 | 149 | # Multi images --> scale all images to max_width_mm 150 | img_path_new = [] 151 | for img_path in image_paths[:max_images]: 152 | if not is_base64: 153 | img = Image.open(img_path) 154 | else: 155 | img = openBase64_Image(img_path) 156 | w, h = img.size 157 | ratio = w / h 158 | w = max_width_mm 159 | h = int(w / ratio) 160 | img = img.resize((w, h)) 161 | file_name = tmp_path + str(uuid.uuid4()) + ".jpg" 162 | if img.mode in ["RGBA", "P"]: 163 | img = img.convert("RGB") 164 | img.save(file_name) 165 | img_path_new.append(file_name) 166 | image_paths = img_path_new 167 | 168 | content_img = [] 169 | for image_path in image_paths: 170 | with open(image_path, "rb") as f: 171 | encoded_image = base64.b64encode(f.read()) 172 | 173 | img_base64 = encoded_image.decode('utf-8') 174 | img_base64 = f"data:image;base64,{img_base64}" 175 | 176 | content_img.append( 177 | { 178 | "type": "image_url", 179 | "image_url": 180 | { 181 | "url": img_base64 182 | } 183 | } 184 | ) 185 | if scaled: 186 | os.remove(image_path) 187 | 188 | tag_image = "".join([""] * len(image_paths)) 189 | messages = [ 190 | { 191 | "role": "user", 192 | "content": content_img + [ 193 | { 194 | "type": "text", 195 | "text": f"{tag_image}\n{prompt}" 196 | }] 197 | } 198 | ] 199 | else: 200 | messages = [ 201 | { 202 | "role": "user", 203 | "content": [ 204 | { 205 | "type": "text", 206 | "text": f"{prompt}" 207 | }, 208 | ], 209 | } 210 | ] 211 | return messages 212 | 213 | # ------------------------------------------- 214 | # Generate base64 for PDF w/ validation 215 | # ------------------------------------------- 216 | def add_pdf_content( 217 | pdf_paths=None, 218 | force_validated=True 219 | ): 220 | if type(pdf_paths)==str: 221 | pdf_paths = [pdf_paths] 222 | 223 | all_base64_pdf = [] 224 | for pdf_path in pdf_paths: 225 | with open(pdf_path, "rb") as f: 226 | encoded_pdf = base64.b64encode(f.read()) 227 | pdf_base64 = encoded_pdf.decode('utf-8') 228 | 229 | if force_validated: 230 | dump_name = str(uuid.uuid4()) 231 | with open(f"{dump_name}.pdf", "wb") as f: 232 | f.write(base64.b64decode(pdf_base64)) 233 | doc = pymupdf.open(f"{dump_name}.pdf") 234 | os.remove(f"{dump_name}.pdf") 235 | 236 | all_base64_pdf.append(pdf_base64) 237 | 238 | return all_base64_pdf 239 | 240 | # --------------------------------------------------- 241 | # Generate base64 & prompt for PDF parsing 242 | # If these are insurance forms, use "ycbt_ocr_only_prompt" 243 | # --------------------------------------------------- 244 | def add_pdf_content_json( 245 | pdf_paths=None, 246 | prompt=PDF_prompt, 247 | force_validated=True, 248 | is_base64=True 249 | ): 250 | if type(pdf_paths)==str: 251 | pdf_paths = [pdf_paths, ] 252 | 253 | if not is_base64: 254 | all_base64_pdf = add_pdf_content(pdf_paths=pdf_paths, force_validated=force_validated) 255 | else: 256 | all_base64_pdf = pdf_paths 257 | 258 | if len(all_base64_pdf) > 0: 259 | messages = [ 260 | { 261 | "role": "user", 262 | "content":[ 263 | { 264 | "type": "pdf", 265 | "text": f"{all_base64_pdf[0]}", 266 | "prompt": prompt 267 | }] 268 | } 269 | ] 270 | return messages 271 | 272 | else: 273 | return None -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /erax_vl_7b_v1/erax_api_lib.py: -------------------------------------------------------------------------------- 1 | import os 2 | import regex as re 3 | import base64 4 | from io import BytesIO 5 | import uuid 6 | import json_repair 7 | from tqdm import tqdm 8 | 9 | import cv2 10 | from PIL import Image 11 | import matplotlib.pyplot as plt 12 | 13 | import pymupdf 14 | 15 | import requests 16 | import time 17 | from json_repair import repair_json 18 | from erax_vl_7b_v1.prompts import ( 19 | sickness_medicines, 20 | cities, 21 | default_prompt, 22 | PDF_prompt, 23 | popular_prompt, 24 | ycbt_ocr_only_prompt, 25 | pdf_full_prompt, 26 | ycbt_ocr_conversation_single_image_prompt 27 | ) 28 | from erax_vl_7b_v1.utils import ( 29 | process_lr, 30 | get_json, 31 | openBase64_Image, 32 | add_img_content, 33 | add_pdf_content, 34 | add_pdf_content_json 35 | ) 36 | 37 | erax_url_id = "" 38 | API_key = "" 39 | 40 | def checkStatusLongRun( 41 | ocr_result, 42 | erax_url_id=erax_url_id, 43 | API_key=API_key 44 | ): 45 | """RunPod long run 46 | - Lưu ý cho PDF nhiều trang hay nhiều ảnh, API sẽ trả về IN_PROGRESS 47 | - Dùng /status để check progress và lấy về 48 | """ 49 | final_result = ocr_result.copy() 50 | while True: 51 | time.sleep(0.5) 52 | if type(final_result) == dict: 53 | if "status" in final_result.keys() and (final_result["status"] == "IN_PROGRESS" or final_result["status"] == "IN_QUEUE"): 54 | job_id = final_result["id"] 55 | print(f"Check status & result...{job_id}") 56 | runpod_status_url = f"https://api.runpod.ai/v2/{erax_url_id}/status/{job_id}" 57 | head = dict() 58 | head["authorization"] = API_key 59 | final_result = requests.post(runpod_status_url, headers=head, timeout=120).json() 60 | else: 61 | break 62 | else: 63 | break 64 | 65 | return final_result 66 | 67 | def API_Image_OCR_EraX_VL_7B_vLLM( 68 | image_paths=None, 69 | is_base64=True, 70 | prompt=default_prompt, 71 | erax_url_id=erax_url_id, 72 | API_key=API_key, 73 | force_scale=True 74 | ): 75 | """Image Captioning w/ list of [images paths or base64] 76 | - Bạn có thể dùng API này để captioning ảnh 77 | - Lưu ý prompt hợp lý theo đúng kiểu văn bản cần parse 78 | - API chỉ chấp nhận tối đa 20 ảnh nhưng bạn nên captioning tối đa 3 ảnh 79 | - API này kỳ vọng bạn truyền vào list các base64 thuần của ảnh 80 | - Lưu ý prefix: API đã thêm "data:image;base64" trước decoded {base64} của ảnh rồi 81 | """ 82 | messages = add_img_content( 83 | image_paths, 84 | is_base64=is_base64, 85 | prompt=prompt, 86 | force_scale =force_scale 87 | ) 88 | 89 | content = { 90 | "generation_config": 91 | { 92 | "temperature": float(0.01), 93 | "top_p": float(0.001), 94 | "top_k": int(1), 95 | "repetition_penalty": float(1.1), 96 | "max_tokens": 32000 97 | }, 98 | "messages": messages 99 | } 100 | data_to_send ={ 101 | "input": content 102 | } 103 | head = {} 104 | head["authorization"] = API_key 105 | 106 | erax_url = f"https://api.runpod.ai/v2/{erax_url_id}/runsync" 107 | res = requests.post(erax_url, headers=head, json=data_to_send, timeout=3600) 108 | 109 | error = False 110 | 111 | try: 112 | result = res.json()["output"] 113 | except: 114 | result = res.json() 115 | try: 116 | result = checkStatusLongRun(result, erax_url_id=erax_url_id)["output"] 117 | except: 118 | error = True 119 | 120 | content["messages"].append({ 121 | "role": "assistant", 122 | "content": result, 123 | "error": error 124 | } 125 | ) 126 | 127 | return result, content 128 | 129 | def API_PDF_OCR_EraX_VL_7B_vLLM( 130 | pdf_paths=None, 131 | is_base64=False, 132 | prompt=PDF_prompt, 133 | erax_url_id=erax_url_id, 134 | API_key=API_key 135 | ): 136 | """PDF Captioning with PDF paths or base64 137 | - Bạn có thể dùng API này để parse PDF cả text & ảnh trong đó 138 | - Lưu ý prompt hợp lý theo đúng kiểu văn bản cần parse 139 | - API chỉ chấp nhận 1 PDF tại 1 thời điểm 140 | - API này kỳ vọng bạn truyền vào đường dẫn đến file PDF or list of PDF's base64 141 | """ 142 | messages = add_pdf_content_json( 143 | pdf_paths, 144 | prompt=prompt, 145 | is_base64=is_base64 146 | ) 147 | 148 | content = { 149 | "generation_config": 150 | { 151 | "temperature": float(0.01), 152 | "top_p": float(0.001), 153 | "top_k": int(1), 154 | "repetition_penalty": float(1.1), 155 | "max_tokens": 32000 156 | }, 157 | "messages": messages 158 | } 159 | 160 | data_to_send ={ 161 | "input": content 162 | } 163 | 164 | head = {} 165 | head["authorization"] = API_key 166 | 167 | erax_url = f"https://api.runpod.ai/v2/{erax_url_id}/runsync" 168 | res = requests.post(erax_url, headers=head, json=data_to_send, timeout=3600) 169 | 170 | error = False 171 | 172 | try: 173 | result = res.json()["output"] 174 | except: 175 | result = res.json() 176 | try: 177 | result = checkStatusLongRun(result, erax_url_id=erax_url_id)["output"] 178 | except: 179 | error = True 180 | 181 | content["messages"].append({ 182 | "role": "assistant", 183 | "content": result, 184 | "error": error 185 | } 186 | ) 187 | 188 | return result, content 189 | 190 | def API_Chat_OCR_EraX_VL_7B_vLLM( 191 | prompt, 192 | history=None, 193 | erax_url_id=erax_url_id, 194 | API_key=API_key 195 | ): 196 | """Chat with the previous results from EraX 197 | - Bạn có thể hội thoại liên tục với kết quả EraX đã captioning lần trước hoặc đơn giản là chat với QWen2 198 | """ 199 | if history is not None: 200 | history["messages"].append({ 201 | "role": "user", 202 | "content": [ 203 | { 204 | "type": "text", 205 | "text":prompt 206 | } 207 | ] 208 | }) 209 | else: 210 | history = [ 211 | { 212 | "role": "user", 213 | "content": [ 214 | { 215 | "type": "text", 216 | "text":prompt 217 | } 218 | ] 219 | } 220 | ] 221 | content = { 222 | "generation_config": 223 | { 224 | "temperature": float(0.1), 225 | "top_p": float(0.1), 226 | "top_k": int(10), 227 | "repetition_penalty": float(1.1), 228 | "max_tokens": 8192 229 | }, 230 | "messages": history 231 | } 232 | data_to_send ={ 233 | "input": content 234 | } 235 | 236 | head = {} 237 | head["authorization"] = API_key 238 | 239 | erax_url = f"https://api.runpod.ai/v2/{erax_url_id}/runsync" 240 | res = requests.post(erax_url, headers=head, json=data_to_send, timeout=3600) 241 | 242 | error = False 243 | 244 | try: 245 | result = res.json()["output"] 246 | except: 247 | result = res.json() 248 | try: 249 | result = checkStatusLongRun(result, erax_url_id=erax_url_id)["output"] 250 | except: 251 | error = True 252 | 253 | content["messages"].append( 254 | { 255 | "role": "assistant", 256 | "content": result 257 | } 258 | ) 259 | 260 | return result, content 261 | 262 | def API_Multiple_Images_OCR_EraX_VL_7B_vLLM( 263 | image_paths=None, 264 | is_base64=False, 265 | prompt=ycbt_ocr_only_prompt, 266 | pdf_full_prompt=pdf_full_prompt, 267 | erax_url_id=erax_url_id, 268 | API_key=API_key 269 | ): 270 | """Multiple Images Captioning with paths OR Base64 271 | - Bạn có thể dùng API này để parse multiple images cả text & ảnh trong đó 272 | - Lưu ý prompt hợp lý theo đúng kiểu văn bản cần parse 273 | """ 274 | print ("--> Parsing all images...") 275 | 276 | output_text = "" 277 | for idx, img_path in enumerate(image_paths): 278 | print (f"- Parsing image...{idx}") 279 | ocr_result, _ = API_Image_OCR_EraX_VL_7B_vLLM( 280 | image_paths=img_path, 281 | is_base64=is_base64, 282 | prompt=prompt, 283 | erax_url_id=erax_url_id, 284 | API_key=API_key, 285 | force_scale=True 286 | ) 287 | 288 | output_text += f"** Nội dung của giấy tờ trong ảnh số {idx+1}**\n" + \ 289 | ocr_result.replace("```json", "").replace("```", "") +"\n\n" 290 | 291 | print ("--> Summarize result...") 292 | 293 | pdf_full_prompt_to_send = pdf_full_prompt.replace("ocr_results", output_text) 294 | 295 | if pdf_full_prompt_to_send == pdf_full_prompt: 296 | pdf_full_prompt_to_send = f"{pdf_full_prompt}\n\n{output_text}" 297 | 298 | new_prompt = f"{pdf_full_prompt_to_send}" 299 | 300 | # print(new_prompt) 301 | 302 | 303 | # Chat w/ API to summarize all into 1 304 | try: 305 | final_result, history = API_Chat_OCR_EraX_VL_7B_vLLM( 306 | new_prompt, 307 | history=None, 308 | erax_url_id=erax_url_id, 309 | API_key=API_key 310 | ) 311 | 312 | except Exception as E: 313 | print ("ERROR chatting w/ API: ", str(E)) 314 | return new_prompt, None 315 | 316 | # print(final_result) 317 | 318 | # # Done 319 | # final_text = final_result.replace("```json", "").replace("```", "") 320 | # try: 321 | # final_text = json_repair.loads(final_text) 322 | # except: 323 | # pass 324 | 325 | return final_result, history 326 | 327 | def API_PDF_Full_OCR_EraX_VL_7B_vLLM( 328 | pdf_paths=None, 329 | is_base64=False, 330 | prompt=ycbt_ocr_only_prompt, 331 | pdf_full_prompt=pdf_full_prompt, 332 | erax_url_id=erax_url_id, 333 | API_key=API_key 334 | ): 335 | """PDF Captioning ALL pages with PDF paths OR Base64 336 | - Bạn có thể dùng API này để parse PDF cả text & ảnh trong đó 337 | - Lưu ý prompt hợp lý theo đúng kiểu văn bản cần parse 338 | - API chỉ chấp nhận 1 PDF tại 1 thời điểm 339 | - API này kỳ vọng bạn truyền vào đường dẫn đến file PDF hoặc Base64 340 | """ 341 | 342 | def getPDF_text(json_content): 343 | text = "" 344 | for data in json_content: 345 | text += data["text"] 346 | for img_text in data["images_text"]: 347 | text += "\n\n" + img_text["text"] 348 | return text 349 | 350 | print ("Parsing PDF...") 351 | ocr_result, history = API_PDF_OCR_EraX_VL_7B_vLLM( 352 | pdf_paths=pdf_paths, 353 | is_base64=is_base64, 354 | prompt=prompt, 355 | erax_url_id=erax_url_id, API_key=API_key 356 | ) 357 | 358 | try: 359 | final_pdf = json_repair.loads(ocr_result) 360 | final_pdf = str(getPDF_text(final_pdf["json_content"]).replace("```json", "").replace("```", "").replace("\n\n", "\n").replace("\n\n", "\n")) 361 | except Exception as E: 362 | print("ERROR wrong PDF output format!", str(E)) 363 | return ocr_result, None 364 | 365 | print ("Summarize result...") 366 | pdf_full_prompt_to_send = pdf_full_prompt.replace("ocr_results", final_pdf) 367 | 368 | new_prompt = f"{pdf_full_prompt_to_send}" 369 | 370 | # Chat w/ API to summarize all into 1 371 | try: 372 | final_result, history = API_Chat_OCR_EraX_VL_7B_vLLM( 373 | new_prompt, 374 | history=None, 375 | erax_url_id=erax_url_id, API_key=API_key 376 | ) 377 | 378 | except Exception as E: 379 | print ("ERROR chatting w/ API: ", str(E)) 380 | return new_prompt, None 381 | 382 | # Done 383 | # final_pdf_text = final_result.replace("```json", "").replace("```", "").replace("\n\n", "\n").replace("\n\n", "\n") 384 | # try: 385 | # final_pdf_text = json_repair.loads(final_pdf_text) 386 | # final_pdf_text = get_json(final_result) 387 | # except: 388 | # pass 389 | 390 | return final_result, history -------------------------------------------------------------------------------- /prompts/Vietnam_popular_prompts.txt: -------------------------------------------------------------------------------- 1 | * Model 2B parameters: 2 | generation_config_2B= { 3 | "temperature": 0.01, 4 | "top_p": 0.1, # 0.1 5 | "min_p": 0.1, 6 | "top_k": 1, 7 | "max_tokens": 1024, 8 | "repetition_penalty": 1.16, 9 | "best_of": 5 10 | } 11 | 12 | * Model 7B parameters: 13 | generation_config_7B= { 14 | "temperature": 0.01, 15 | "top_p": 0.1, 16 | "min_p": 0.1, 17 | "top_k": 1, 18 | "max_tokens": 1024, 19 | "repetition_penalty": 1.1, 20 | "best_of": 5 21 | } 22 | 23 | * Căn cước công dân: 24 | 25 | CCCD_FRONT_PROMPT = """ 26 | Bạn là một hệ thống AI đẳng cấp thế giới hỗ trợ nhận diện ký tự quang học (Optical Character Recognition - OCR) từ hình ảnh. 27 | Bạn được cung cấp 1 ảnh mặt trước của 1 căn cước công dân hợp pháp, không vi phạm. Có thể có nhiều phiên bản khác nhau của căn cước công dân. 28 | Bạn phải thực hiện 01 (một) nhiệm vụ chính là bóc tách chính xác thông tin trong ảnh thành json như yêu cầu dưới đây. 29 | 30 | ## Tham khảo danh sách các từ viết tắt, họ, tỉnh, thành phố của Việt Nam 31 | - Các họ phổ biến ở Việt Nam: NGUYỄN, Nguyễn, TRẦN, Trần, LÊ, Lê, ĐINH, Đinh, PHẠM, Phạm, TRỊNH, Trịnh, LÝ, Lý, HOÀNG, Hoàng, BÙI, Bùi, NGÔ, Ngô, PHAN, Phan, VÕ, Võ, HỒ, Hồ, HUỲNH, Huỳnh, TRƯƠNG, Trương, ĐẶNG, Đặng, ĐỖ, Đỗ, ... 32 | - Các tỉnh, thành phố ở Việt Nam: An Giang, Bà Rịa-Vũng Tàu, Bắc Giang, Bắc Kạn, Bạc Liêu, Bắc Ninh, Bến Tre, Bình Định, Bình Dương, Bình Phước, Bình Thuận, Cà Mau, Cần Thơ, Cao Bằng, Đà Nẵng, Đắk Lắk, Đắk Nông, Điện Biên, Đồng Nai, Đồng Tháp, Gia Lai, Hà Giang, Hà Nam, Hà Nội, Hà Tĩnh, Hải Dương, Hải Phòng, Hậu Giang, TP. Hồ Chí Minh, Hòa Bình, Hưng Yên, Khánh Hòa, Kiên Giang, Kon Tum, Lai Châu, Lâm Đồng, Lạng Sơn, Lào Cai, Long An, Nam Định, Nghệ An, Ninh Bình, Ninh Thuận, Phú Thọ, Phú Yên, Quảng Bình, Quảng Nam, Quảng Ngãi, Quảng Ninh, Quảng Trị, Sóc Trăng, Sơn La, Tây Ninh, Thái Bình, Thái Nguyên, Thanh Hóa, Thừa Thiên - Huế, Tiền Giang, Trà Vinh, Tuyên Quang, Vĩnh Long, Vĩnh Phúc, Yên Bái. 33 | - Lưu ý là các thông tin quê quán và dịa chỉ thường trú có thể nằm ở 2 dòng liên tiếp nhau. 34 | - Không được bỏ sót bất kỳ thông tin chi tiết nào về địa chỉ quê quán hoặc địa chỉ thường trú hoặc ngày hết hạn của thẻ. 35 | - Bảo đảm các câu từ có dấu tiếng Việt là đầy đủ và chính xác. 36 | 37 | Trả lại chính xác kết quả OCR của ảnh qua định dạng JSON như sau: 38 | 39 | { 40 | "Số": "(No.) Số căn cước công dân", 41 | "Tên": "Họ và tên", 42 | "Ngày sinh":"Ngày tháng năm sinh", 43 | "Giới tính": "Giới tính", 44 | "Quốc tịch": "Quốc tịch", 45 | "Nguyên quán": "Không có thì để None. Trích xuất thông tin chi tiết của quê quán hoặc nguyên quán. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 46 | "DKHK thường trú": "Không có thì để None. Trích xuất thông tin chi tiết của nơi thường trú, hay còn gọi là 'DKHK thường trú'. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 47 | "Quê quán": "Không có thì để None. Nằm ở mặt trước, có ảnh chân dung. Trích xuất thông tin chi tiết của quê quán. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 48 | "Nơi thường trú": "Không có thì để None. Nằm ở mặt trước, có ảnh chân dung. Trích xuất thông tin chi tiết của nơi thường trú. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 49 | "Có giá trị đến": "Ngày hết hạn của giấy tờ này" 50 | } 51 | """ 52 | 53 | CCCD_BACK_PROMPT = """ 54 | Bạn là một hệ thống AI đẳng cấp thế giới hỗ trợ nhận diện ký tự quang học (Optical Character Recognition - OCR) từ hình ảnh. 55 | Bạn được cung cấp ảnh mặt sau của 1 căn cước công dân hợp pháp, không vi phạm. 56 | Bạn phải thực hiện nhiệm vụ chính là bóc tách chính xác thông tin trong ảnh và trả lời bằng json như yêu cầu dưới đây và không được bịa đặt gì thêm. 57 | 58 | ## Lưu ý: mặt sau của căn cước không có họ tên hay địa chỉ của người được cấp căn cước, chỉ có thể ó các dấu vân tay và các đặc điểm nhân dạng. 59 | 60 | { 61 | "Đặc điểm nhân dạng": "Nằm ở mặt sau, không có ảnh chân dung. Thông tin về các đặc điểm nhận dạng của người được cấp căn cước (ví dụ: sẹo thẳng, vết sẹo 1cm, sẹo tròn, dưới dái tai, sống mũi, trên trán ...).", 62 | "Nơi cấp": "Nằm ở mặt sau, không có ảnh chân dung. Tên của cơ quan quản lý đóng mộc cấp căn cước này (ví dụ: cục quản lý hành chính về trật tự xã hội,...) ", 63 | "Ngày cấp": "Nằm ở mặt sau, không có ảnh chân dung. Ngày, tháng, năm cấp căn cước này", 64 | "Cán bộ ký tên": "Nằm ở mặt sau, không có ảnh chân dung. Tên đầy đủ của sỹ quan ký tên cấp căn cước này", 65 | 'Mã hoá': "Nằm ở mặt sau, không có ảnh chân dung. Chuỗi mã hoá nằm ở 2 hàng và có định dạng IDVN...<<..<...<<<"" 66 | } 67 | """ 68 | 69 | CCCD_BOTH_SIDE_PROMPT = """ 70 | Bạn là một hệ thống AI đẳng cấp thế giới hỗ trợ nhận diện ký tự quang học (Optical Character Recognition - OCR) từ hình ảnh. 71 | Bạn được cung cấp 2 ảnh là 2 măht của cùng 1 căn cước công dân (chứng minh nhân dân). 72 | Hình ảnh là hợp pháp, không vi phạm. Có thể có nhiều phiên bản khác nhau của căn cước công dân. 73 | Bạn phải thực hiện nhiệm vụ là trích xuất chính xác thông tin trong 2 ảnh thành json duy nhất như yêu cầu dưới đây. 74 | 75 | ## Tham khảo danh sách các từ viết tắt, họ, tỉnh, thành phố của Việt Nam 76 | - Các họ phổ biến ở Việt Nam: NGUYỄN, Nguyễn, TRẦN, Trần, LÊ, Lê, ĐINH, Đinh, PHẠM, Phạm, TRỊNH, Trịnh, LÝ, Lý, HOÀNG, Hoàng, BÙI, Bùi, NGÔ, Ngô, PHAN, Phan, VÕ, Võ, HỒ, Hồ, HUỲNH, Huỳnh, TRƯƠNG, Trương, ĐẶNG, Đặng, ĐỖ, Đỗ, ... 77 | - Các tỉnh, thành phố ở Việt Nam: An Giang, Bà Rịa-Vũng Tàu, Bắc Giang, Bắc Kạn, Bạc Liêu, Bắc Ninh, Bến Tre, Bình Định, Bình Dương, Bình Phước, Bình Thuận, Cà Mau, Cần Thơ, Cao Bằng, Đà Nẵng, Đắk Lắk, Đắk Nông, Điện Biên, Đồng Nai, Đồng Tháp, Gia Lai, Hà Giang, Hà Nam, Hà Nội, Hà Tĩnh, Hải Dương, Hải Phòng, Hậu Giang, TP. Hồ Chí Minh, Hòa Bình, Hưng Yên, Khánh Hòa, Kiên Giang, Kon Tum, Lai Châu, Lâm Đồng, Lạng Sơn, Lào Cai, Long An, Nam Định, Nghệ An, Ninh Bình, Ninh Thuận, Phú Thọ, Phú Yên, Quảng Bình, Quảng Nam, Quảng Ngãi, Quảng Ninh, Quảng Trị, Sóc Trăng, Sơn La, Tây Ninh, Thái Bình, Thái Nguyên, Thanh Hóa, Thừa Thiên - Huế, Tiền Giang, Trà Vinh, Tuyên Quang, Vĩnh Long, Vĩnh Phúc, Yên Bái. 78 | - Lưu ý là các thông tin quê quán và dịa chỉ thường trú có thể nằm ở 2 dòng liên tiếp nhau. 79 | - Không được bỏ sót bất kỳ thông tin chi tiết nào về địa chỉ quê quán hoặc địa chỉ thường trú hoặc ngày hết hạn của thẻ, đặc điểm nhận dạng, nơi cấp & người cấp căn cước này. 80 | - Bảo đảm các câu từ có dấu tiếng Việt là đầy đủ và chính xác. 81 | - Ảnh thứ nhất là mặt trước và ảnh thứ 2 là mặt sau của cùng một căn cước công dân của 1 người duy nhất. 82 | - Lưu ý mã định danh nằm ở mặt sau và không có ảnh chân dung. Chuỗi mã định danh nằm ở 3 hàng liên tục và có định dạng IDVNM...<<...<...<<< 83 | 84 | Trả lại kết quả OCR của tất cả các ảnh trong 1 JSON duy nhất qua định dạng chính xác như sau, mỗi key chỉ xuất hiện 1 lần và không được thiếu key nào. Nếu key không có value thì để None. 85 | ```json 86 | { 87 | "Thông tin": { 88 | "Số thẻ": "Nằm ở mặt trước, có ảnh chân dung. Số căn cước công dân", 89 | "Tên": "Nằm ở mặt trước, có ảnh chân dung. Họ và tên người được cấp", 90 | "Ngày sinh":"Nằm ở mặt trước, có ảnh chân dung. Ngày tháng năm sinh người được cấp", 91 | "Giới tính": "Nằm ở mặt trước, có ảnh chân dung. Giới tính người được cấp", 92 | "Quốc tịch": "Nằm ở mặt trước, có ảnh chân dung. Quốc tịch người được cấp", 93 | "Nguyên quán": "Không có thì để None. Trích xuất thông tin chi tiết của quê quán hoặc nguyên quán. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 94 | "DKHK thường trú": "Không có thì để None. Trích xuất thông tin chi tiết của nơi thường trú, hay còn gọi là 'DKHK thường trú'. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 95 | "Quê quán": "Không có thì để None. Nằm ở mặt trước, có ảnh chân dung. Trích xuất thông tin chi tiết của quê quán. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 96 | "Nơi thường trú": "Không có thì để None. Nằm ở mặt trước, có ảnh chân dung. Trích xuất thông tin chi tiết của nơi thường trú. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 97 | "Có giá trị đến": "Nằm ở mặt trước, có ảnh chân dung. Ngày hết hạn của giấy tờ này", 98 | "Đặc điểm nhân dạng": "Nằm ở mặt sau, không có ảnh chân dung. Thông tin về các đặc điểm nhận dạng của người được cấp căn cước (ví dụ: sẹo thẳng, vết sẹo 1cm, sẹo tròn, dưới dái tai, sống mũi, trên trán ...).", 99 | "Nơi cấp": "Nằm ở mặt sau, không có ảnh chân dung. Tên của cơ quan quản lý đóng mộc cấp căn cước này (ví dụ: cục quản lý hành chính về trật tự xã hội,...) ", 100 | "Ngày cấp": "Nằm ở mặt sau, không có ảnh chân dung. Ngày, tháng, năm cấp căn cước này", 101 | "Cán bộ ký tên": "Nằm ở mặt sau, không có ảnh chân dung. Tên đầy đủ của sỹ quan ký tên cấp căn cước này" 102 | }, 103 | 'Mã định danh': "Nằm ở mặt sau, không có ảnh chân dung. Chuỗi mã hoá nằm ở 3 hàng và có định dạng IDVNM...<<...<...<<<", 104 | } 105 | ``` 106 | """ 107 | 108 | * Chứng minh nhân dân (cũ) 109 | 110 | CMND_FRONT_PROMPT = """ 111 | Bạn là một hệ thống AI đẳng cấp thế giới hỗ trợ nhận diện ký tự quang học (Optical Character Recognition - OCR) từ hình ảnh. 112 | Bạn được cung cấp 1 ảnh mặt trước của 1 căn cước công dân hợp pháp, không vi phạm. Có thể có nhiều phiên bản khác nhau của căn cước công dân. 113 | Bạn phải thực hiện 01 (một) nhiệm vụ chính là bóc tách chính xác thông tin trong ảnh thành json như yêu cầu dưới đây. 114 | 115 | ## Tham khảo danh sách các từ viết tắt, họ, tỉnh, thành phố của Việt Nam 116 | - Các họ phổ biến ở Việt Nam: NGUYỄN, Nguyễn, TRẦN, Trần, LÊ, Lê, ĐINH, Đinh, PHẠM, Phạm, TRỊNH, Trịnh, LÝ, Lý, HOÀNG, Hoàng, BÙI, Bùi, NGÔ, Ngô, PHAN, Phan, VÕ, Võ, HỒ, Hồ, HUỲNH, Huỳnh, TRƯƠNG, Trương, ĐẶNG, Đặng, ĐỖ, Đỗ, ... 117 | - Các tỉnh, thành phố ở Việt Nam: An Giang, Bà Rịa-Vũng Tàu, Bắc Giang, Bắc Kạn, Bạc Liêu, Bắc Ninh, Bến Tre, Bình Định, Bình Dương, Bình Phước, Bình Thuận, Cà Mau, Cần Thơ, Cao Bằng, Đà Nẵng, Đắk Lắk, Đắk Nông, Điện Biên, Đồng Nai, Đồng Tháp, Gia Lai, Hà Giang, Hà Nam, Hà Nội, Hà Tĩnh, Hải Dương, Hải Phòng, Hậu Giang, TP. Hồ Chí Minh, Hòa Bình, Hưng Yên, Khánh Hòa, Kiên Giang, Kon Tum, Lai Châu, Lâm Đồng, Lạng Sơn, Lào Cai, Long An, Nam Định, Nghệ An, Ninh Bình, Ninh Thuận, Phú Thọ, Phú Yên, Quảng Bình, Quảng Nam, Quảng Ngãi, Quảng Ninh, Quảng Trị, Sóc Trăng, Sơn La, Tây Ninh, Thái Bình, Thái Nguyên, Thanh Hóa, Thừa Thiên - Huế, Tiền Giang, Trà Vinh, Tuyên Quang, Vĩnh Long, Vĩnh Phúc, Yên Bái. 118 | - Lưu ý là các thông tin quê quán và dịa chỉ thường trú có thể nằm ở 2 dòng liên tiếp nhau. 119 | - Không được bỏ sót bất kỳ thông tin chi tiết nào về địa chỉ quê quán hoặc địa chỉ thường trú hoặc ngày hết hạn của thẻ. 120 | - Bảo đảm các câu từ có dấu tiếng Việt là đầy đủ và chính xác. 121 | 122 | Trả lại chính xác kết quả OCR của ảnh qua định dạng JSON như sau: 123 | 124 | { 125 | "Số": "(No.) Số căn cước công dân", 126 | "Tên": "Họ và tên", 127 | "Ngày sinh":"Ngày tháng năm sinh", 128 | "Giới tính": "Giới tính", 129 | "Quốc tịch": "Quốc tịch", 130 | "Nguyên quán": "Không có thì để None. Trích xuất thông tin chi tiết của quê quán hoặc nguyên quán. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 131 | "DKHK thường trú": "Không có thì để None. Trích xuất thông tin chi tiết của nơi thường trú, hay còn gọi là 'DKHK thường trú'. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 132 | "Quê quán": "Không có thì để None. Nằm ở mặt trước, có ảnh chân dung. Trích xuất thông tin chi tiết của quê quán. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 133 | "Nơi thường trú": "Không có thì để None. Nằm ở mặt trước, có ảnh chân dung. Trích xuất thông tin chi tiết của nơi thường trú. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 134 | "Có giá trị đến": "Ngày hết hạn của giấy tờ này" 135 | } 136 | """ 137 | 138 | CMND_BACK_PROMPT = """ 139 | Bạn là một hệ thống AI đẳng cấp thế giới hỗ trợ nhận diện ký tự quang học (Optical Character Recognition - OCR) từ hình ảnh. 140 | Bạn được cung cấp ảnh mặt sau của 1 căn cước công dân hợp pháp, không vi phạm. 141 | Bạn phải thực hiện nhiệm vụ chính là bóc tách chính xác thông tin trong ảnh và trả lời bằng json như yêu cầu dưới đây và không được bịa đặt gì thêm. 142 | 143 | ## Lưu ý: mặt sau của căn cước không có họ tên hay địa chỉ của người được cấp căn cước, chỉ có thể ó các dấu vân tay và các đặc điểm nhân dạng. 144 | 145 | { 146 | "Đặc điểm nhân dạng": "Nằm ở mặt sau, không có ảnh chân dung. Thông tin về các đặc điểm nhận dạng của người được cấp căn cước (ví dụ: sẹo thẳng, vết sẹo 1cm, sẹo tròn, dưới dái tai, sống mũi, trên trán ...).", 147 | "Nơi cấp": "Nằm ở mặt sau, không có ảnh chân dung. Tên của cơ quan quản lý đóng mộc cấp căn cước này (ví dụ: cục quản lý hành chính về trật tự xã hội,...) ", 148 | "Ngày cấp": "Nằm ở mặt sau, không có ảnh chân dung. Ngày, tháng, năm cấp căn cước này", 149 | "Cán bộ ký tên": "Nằm ở mặt sau, không có ảnh chân dung. Tên đầy đủ của sỹ quan ký tên cấp căn cước này", 150 | 'Mã hoá': "Nằm ở mặt sau, không có ảnh chân dung. Chuỗi mã hoá nằm ở 2 hàng và có định dạng IDVN...<<..<...<<<"" 151 | } 152 | """ 153 | 154 | CMND_BOTH_PROMPT = """ 155 | Bạn là một hệ thống AI đẳng cấp thế giới hỗ trợ nhận diện ký tự quang học (Optical Character Recognition - OCR) từ hình ảnh. 156 | Bạn được cung cấp 2 ảnh là 2 măht của cùng 1 căn cước công dân (chứng minh nhân dân). 157 | Hình ảnh là hợp pháp, không vi phạm. Có thể có nhiều phiên bản khác nhau của căn cước công dân. 158 | Bạn phải thực hiện nhiệm vụ là trích xuất chính xác thông tin trong 2 ảnh thành json duy nhất như yêu cầu dưới đây. 159 | 160 | ## Tham khảo danh sách các từ viết tắt, họ, tỉnh, thành phố của Việt Nam 161 | - Các họ phổ biến ở Việt Nam: NGUYỄN, Nguyễn, TRẦN, Trần, LÊ, Lê, ĐINH, Đinh, PHẠM, Phạm, TRỊNH, Trịnh, LÝ, Lý, HOÀNG, Hoàng, BÙI, Bùi, NGÔ, Ngô, PHAN, Phan, VÕ, Võ, HỒ, Hồ, HUỲNH, Huỳnh, TRƯƠNG, Trương, ĐẶNG, Đặng, ĐỖ, Đỗ, ... 162 | - Các tỉnh, thành phố ở Việt Nam: An Giang, Bà Rịa-Vũng Tàu, Bắc Giang, Bắc Kạn, Bạc Liêu, Bắc Ninh, Bến Tre, Bình Định, Bình Dương, Bình Phước, Bình Thuận, Cà Mau, Cần Thơ, Cao Bằng, Đà Nẵng, Đắk Lắk, Đắk Nông, Điện Biên, Đồng Nai, Đồng Tháp, Gia Lai, Hà Giang, Hà Nam, Hà Nội, Hà Tĩnh, Hải Dương, Hải Phòng, Hậu Giang, TP. Hồ Chí Minh, Hòa Bình, Hưng Yên, Khánh Hòa, Kiên Giang, Kon Tum, Lai Châu, Lâm Đồng, Lạng Sơn, Lào Cai, Long An, Nam Định, Nghệ An, Ninh Bình, Ninh Thuận, Phú Thọ, Phú Yên, Quảng Bình, Quảng Nam, Quảng Ngãi, Quảng Ninh, Quảng Trị, Sóc Trăng, Sơn La, Tây Ninh, Thái Bình, Thái Nguyên, Thanh Hóa, Thừa Thiên - Huế, Tiền Giang, Trà Vinh, Tuyên Quang, Vĩnh Long, Vĩnh Phúc, Yên Bái. 163 | - Lưu ý là các thông tin quê quán và dịa chỉ thường trú có thể nằm ở 2 dòng liên tiếp nhau. 164 | - Không được bỏ sót bất kỳ thông tin chi tiết nào về địa chỉ quê quán hoặc địa chỉ thường trú hoặc ngày hết hạn của thẻ, đặc điểm nhận dạng, nơi cấp & người cấp căn cước này. 165 | - Bảo đảm các câu từ có dấu tiếng Việt là đầy đủ và chính xác. 166 | - Ảnh thứ nhất là mặt trước và ảnh thứ 2 là mặt sau của cùng một căn cước công dân của 1 người duy nhất. 167 | - Lưu ý mã định danh nằm ở mặt sau và không có ảnh chân dung. Chuỗi mã định danh nằm ở 3 hàng liên tục và có định dạng IDVNM...<<...<...<<< 168 | 169 | Trả lại kết quả OCR của tất cả các ảnh trong 1 JSON duy nhất qua định dạng chính xác như sau, mỗi key chỉ xuất hiện 1 lần và không được thiếu key nào. Nếu key không có value thì để None. 170 | ```json 171 | { 172 | "Thông tin": { 173 | "Số thẻ": "Nằm ở mặt trước, có ảnh chân dung. Số căn cước công dân", 174 | "Tên": "Nằm ở mặt trước, có ảnh chân dung. Họ và tên người được cấp", 175 | "Ngày sinh":"Nằm ở mặt trước, có ảnh chân dung. Ngày tháng năm sinh người được cấp", 176 | "Giới tính": "Nằm ở mặt trước, có ảnh chân dung. Giới tính người được cấp", 177 | "Quốc tịch": "Nằm ở mặt trước, có ảnh chân dung. Quốc tịch người được cấp", 178 | "Nguyên quán": "Không có thì để None. Trích xuất thông tin chi tiết của quê quán hoặc nguyên quán. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 179 | "DKHK thường trú": "Không có thì để None. Trích xuất thông tin chi tiết của nơi thường trú, hay còn gọi là 'DKHK thường trú'. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 180 | "Quê quán": "Không có thì để None. Nằm ở mặt trước, có ảnh chân dung. Trích xuất thông tin chi tiết của quê quán. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 181 | "Nơi thường trú": "Không có thì để None. Nằm ở mặt trước, có ảnh chân dung. Trích xuất thông tin chi tiết của nơi thường trú. Phải trả lời đầy đủ thông tin nếu có trong ảnh về: địa chỉ nhà, bản, tổ, ấp, thôn, xã, phường, thị trấn, quận, huyện, thị xã, tỉnh, thành phố.", 182 | "Có giá trị đến": "Nằm ở mặt trước, có ảnh chân dung. Ngày hết hạn của giấy tờ này", 183 | "Đặc điểm nhân dạng": "Nằm ở mặt sau, không có ảnh chân dung. Thông tin về các đặc điểm nhận dạng của người được cấp căn cước (ví dụ: sẹo thẳng, vết sẹo 1cm, sẹo tròn, dưới dái tai, sống mũi, trên trán ...).", 184 | "Nơi cấp": "Nằm ở mặt sau, không có ảnh chân dung. Tên của cơ quan quản lý đóng mộc cấp căn cước này (ví dụ: cục quản lý hành chính về trật tự xã hội,...) ", 185 | "Ngày cấp": "Nằm ở mặt sau, không có ảnh chân dung. Ngày, tháng, năm cấp căn cước này", 186 | "Cán bộ ký tên": "Nằm ở mặt sau, không có ảnh chân dung. Tên đầy đủ của sỹ quan ký tên cấp căn cước này" 187 | }, 188 | 'Mã định danh': "Nằm ở mặt sau, không có ảnh chân dung. Chuỗi mã hoá nằm ở 3 hàng và có định dạng IDVNM...<<...<...<<<", 189 | } 190 | ``` 191 | """ 192 | 193 | * Giấy đăng kiểm xe cơ giới 194 | 195 | DK_FRONT_PROMPT = """ 196 | Bạn là một hệ thống AI đẳng cấp thế giới hỗ trợ nhận diện ký tự quang học (Optical Character Recognition - OCR) từ hình ảnh. 197 | Bạn được cung cấp 1 (một) hình ảnh hợp pháp, không vi phạm. 198 | Bạn phải thực hiện 01 (một) nhiệm vụ chính, bao gồm: 199 | 200 | ## Nhận diện ký tự quang học (Optical Character Recognition - OCR) 201 | - Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh 202 | - Các ảnh được cung cấp về giấy chứng nhận kiểm định xe ô tô. 203 | - Bạn cần nhận diện trung thực và chính xác nhất các từ ngữ, kí tự, số liệu xuất hiện trong hình ảnh được cung cấp. 204 | - Ngôn ngữ chính là tiếng Việt, có thể xuất hiện thêm tiếng Anh và chữ viết tay; 205 | - Ảnh có thể ngược, xoay, lật, xé, nhàu nát, dính nước, ... 206 | - Không được bỏ qua bất kỳ thông tin nào 207 | - Có thể xuất hiện các ô checkbox (bằng "-" hoặc "X") 208 | 209 | ## Tham khảo danh sách các từ viết tắt, họ, tỉnh, thành phố của Việt Nam 210 | - Các họ phổ biến ở Việt Nam: NGUYỄN, Nguyễn, TRẦN, Trần, LÊ, Lê, ĐINH, Đinh, PHẠM, Phạm, TRỊNH, Trịnh, LÝ, Lý, HOÀNG, Hoàng, BÙI, Bùi, NGÔ, Ngô, PHAN, Phan, VÕ, Võ, HỒ, Hồ, HUỲNH, Huỳnh, TRƯƠNG, Trương, ĐẶNG, Đặng, ĐỖ, Đỗ, ... 211 | - Các tỉnh, thành phố ở Việt Nam: An Giang, Bà Rịa-Vũng Tàu, Bắc Giang, Bắc Kạn, Bạc Liêu, Bắc Ninh, Bến Tre, Bình Định, Bình Dương, Bình Phước, Bình Thuận, Cà Mau, Cần Thơ, Cao Bằng, Đà Nẵng, Đắk Lắk, Đắk Nông, Điện Biên, Đồng Nai, Đồng Tháp, Gia Lai, Hà Giang, Hà Nam, Hà Nội, Hà Tĩnh, Hải Dương, Hải Phòng, Hậu Giang, TP. Hồ Chí Minh, Hòa Bình, Hưng Yên, Khánh Hòa, Kiên Giang, Kon Tum, Lai Châu, Lâm Đồng, Lạng Sơn, Lào Cai, Long An, Nam Định, Nghệ An, Ninh Bình, Ninh Thuận, Phú Thọ, Phú Yên, Quảng Bình, Quảng Nam, Quảng Ngãi, Quảng Ninh, Quảng Trị, Sóc Trăng, Sơn La, Tây Ninh, Thái Bình, Thái Nguyên, Thanh Hóa, Thừa Thiên - Huế, Tiền Giang, Trà Vinh, Tuyên Quang, Vĩnh Long, Vĩnh Phúc, Yên Bái. 212 | - Nhãn hiệu xe (brand) là tên của các hãng xe ô tô, có thể là: TOYOTA, MERCEDES, HONDA, HYUNDAI, FORD, ISUZU, SUZUKI, KIA, MITSUBISHI, LEXUS, MAZDA, ... 213 | - Số loại (model_code) là tên của dòng xe tương ứng Nhãn hiệu xe/Brand. Ví dụ: 214 | - Các dòng xe phổ biến của TOYOTA: VIOS, CAMRY, COROLLA ALTIS, YARIS, RAIZE, COROLLA CROSS, FORTUNER, ALPHARD, ... 215 | - Các dòng xe phổ biến của HONDA: WAVE, DYLAN, DREAM, CITY, CIVIC, CRV, HRV, ACCORD, ... 216 | - Các dòng xe phổ biến của HYUNDAI: GRAND I10, ACCENT, ELANTRA, SANTAFE, ... 217 | - Các dòng xe phổ biến của FORD: TERRITORY, EVEREST, RANGER, RANGER RAPTOR, EXPLORER, TRANSIT, TOURNEO VÀ EVOS 218 | - Các dòng xe phổ biến của KIA: MORNING, SOLUTO, SONET, SELTOS, SORENTO, CERATO, CARNIVAL, ... 219 | - Các dòng xe phổ biến của MITSUBISHI: MIRAGE, ATTRAGE, XPANDER, OUTLANDER, TRITON, PAJERO SPORT, ... 220 | - Các dòng xe phổ biến của SUZUKI: XL7, SWIFT, CIAZ, ERTIGA, VITARA, CELERIO, ... 221 | - Các dòng xe phổ biến của MAZDA: MAZDA 2, MAZDA 6, MAZDA CX-5, ... 222 | - Các dòng xe phổ biến của MERCEDES: MERCEDES BENZ A-CLASS (A200, A300, ...), MERCEDES BENZ C-CLASS (C300, ..), MERCEDES BENZ B-CLASS, MERCEDES BENZ E-CLASS (E250, E300, ...), MERCEDES BENZ S-CLASS (S450, S680, ...), ... 223 | 224 | ## Yêu cầu 225 | - Tuân thủ thứ tự: từ trái sang phải và sau đó từ trên xuống dưới 226 | - Đặc biệt PHẢI chú ý không được bỏ qua bất kỳ thông tin nào 227 | - KHÔNG bịa đặt, không đưa thêm thông tin hay diễn giải ngoài nội dung trong ảnh 228 | - Nếu có bảng biểu BẮT BUỘC phải bảo đảm trả lại tất cả các cột của bảng đều nằm đầy đủ trong json bao gồm tất cả các thông tin trong bảng biểu, tài liệu 229 | - Lưu ý phải tóm tắt ngắn gọn sau khi phân tích 230 | 231 | Yêu cầu trả lại định dạng JSON chính xác như sau với kết quả OCR bằng tiếng Việt. Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh. Diễn giải nội dung của bức ảnh này một cách đầy đủ nhất có thể và không được thiếu bất kỳ thông tin nào, không được thiếu bất kỳ một từ nào: 232 | 233 | ```json 234 | { 235 | "vehicle": { 236 | "registration_number": , 237 | "vehicle_inspection_number": , 238 | "type": , 239 | "mark": , 240 | "model_code": , 241 | "engine_number": , 242 | "chassis_number": , 243 | "manufactured_year_and_country": , 244 | "life_time_limit_to": , 245 | "commercial_use": , 246 | "modification": , 247 | }, 248 | "specifications": { 249 | "wheel_formula": , 250 | "wheel_tread": , 251 | "overall_dimension": , 252 | "largest_luggage_container_dimension": , 253 | "wheelbase": , 254 | "kerb_mass": 255 | "design_authorized_pay_load": , 256 | "design_authorized_total_mass": , 257 | "design_authorized_towed_mass": , 258 | "permissible_number_of_pers_carried": , 259 | "type_of_fuel_used": , 260 | "engine_displacement": , 261 | "max_output_per_rpm": , 262 | "number": , 263 | "tires": [ 264 | { 265 | "number_of_tires": , 266 | "tire_size_axle": 267 | }, 268 | ], 269 | "inspection_report_number": , 270 | "valid_until": , 271 | "place_date_of_issue": , 272 | "inspection_center": , 273 | "signature": , 274 | "equipped_with_tachograph": , 275 | "inspection_stamp_was_not_issued": , 276 | } 277 | } 278 | ``` 279 | 280 | ## Output: 281 | """ 282 | 283 | * Giấy cạc-vẹc xe máy 284 | 285 | DANGKYXE_FRONT_PROMPT = """ 286 | Bạn là một hệ thống AI đẳng cấp thế giới hỗ trợ nhận diện ký tự quang học (Optical Character Recognition - OCR) từ hình ảnh. 287 | Bạn được cung cấp 1 (một) hình ảnh hợp pháp, không vi phạm. 288 | Bạn phải thực hiện 01 (một) nhiệm vụ chính, bao gồm: 289 | 290 | ## Nhận diện ký tự quang học (Optical Character Recognition - OCR) 291 | - Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh 292 | - Các ảnh được cung cấp về đăng ký xe ô tô. 293 | - Bạn cần nhận diện trung thực và chính xác nhất các từ ngữ, kí tự, số liệu xuất hiện trong hình ảnh được cung cấp. 294 | - Ngôn ngữ chính là tiếng Việt, có thể xuất hiện thêm tiếng Anh và chữ viết tay; 295 | - Ảnh có thể ngược, xoay, lật, xé, nhàu nát, dính nước, ... 296 | - Không được bỏ qua bất kỳ thông tin nào 297 | - Người ký tên thường là dòng chữ màu đỏ bên dưới phần chữ ký là Họ và Tên của Thiếu tá, Trung tá, Thượng tá hoặc Đại tá. 298 | - Đăng ký lần đầu ngày (date_of_first_registration) thường nằm phía dưới của biển số đăng ký. 299 | 300 | ## Tham khảo danh sách các từ viết tắt, họ, tỉnh, thành phố của Việt Nam 301 | - Các họ phổ biến ở Việt Nam: NGUYỄN, Nguyễn, TRẦN, Trần, LÊ, Lê, ĐINH, Đinh, PHẠM, Phạm, TRỊNH, Trịnh, LÝ, Lý, HOÀNG, Hoàng, BÙI, Bùi, NGÔ, Ngô, PHAN, Phan, VÕ, Võ, HỒ, Hồ, HUỲNH, Huỳnh, TRƯƠNG, Trương, ĐẶNG, Đặng, ĐỖ, Đỗ, ... 302 | - Các tỉnh, thành phố ở Việt Nam: An Giang, Bà Rịa-Vũng Tàu, Bắc Giang, Bắc Kạn, Bạc Liêu, Bắc Ninh, Bến Tre, Bình Định, Bình Dương, Bình Phước, Bình Thuận, Cà Mau, Cần Thơ, Cao Bằng, Đà Nẵng, Đắk Lắk, Đắk Nông, Điện Biên, Đồng Nai, Đồng Tháp, Gia Lai, Hà Giang, Hà Nam, Hà Nội, Hà Tĩnh, Hải Dương, Hải Phòng, Hậu Giang, TP. Hồ Chí Minh, Hòa Bình, Hưng Yên, Khánh Hòa, Kiên Giang, Kon Tum, Lai Châu, Lâm Đồng, Lạng Sơn, Lào Cai, Long An, Nam Định, Nghệ An, Ninh Bình, Ninh Thuận, Phú Thọ, Phú Yên, Quảng Bình, Quảng Nam, Quảng Ngãi, Quảng Ninh, Quảng Trị, Sóc Trăng, Sơn La, Tây Ninh, Thái Bình, Thái Nguyên, Thanh Hóa, Thừa Thiên - Huế, Tiền Giang, Trà Vinh, Tuyên Quang, Vĩnh Long, Vĩnh Phúc, Yên Bái. 303 | - Nhãn hiệu xe (brand) là tên của các hãng xe ô tô, có thể là: TOYOTA, MERCEDES, HONDA, HYUNDAI, FORD, ISUZU, SUZUKI, KIA, MITSUBISHI, LEXUS, MAZDA, ... 304 | - Số loại (model_code) là tên của dòng xe tương ứng Nhãn hiệu xe/Brand. Ví dụ: 305 | - Các dòng xe phổ biến của TOYOTA: VIOS, CAMRY, COROLLA ALTIS, YARIS, RAIZE, COROLLA CROSS, FORTUNER, ALPHARD, ... 306 | - Các dòng xe phổ biến của HONDA: WAVE, DYLAN, DREAM, CITY, CIVIC, CRV, HRV, ACCORD, ... 307 | - Các dòng xe phổ biến của HYUNDAI: GRAND I10, ACCENT, ELANTRA, SANTAFE, ... 308 | - Các dòng xe phổ biến của FORD: TERRITORY, EVEREST, RANGER, RANGER RAPTOR, EXPLORER, TRANSIT, TOURNEO VÀ EVOS 309 | - Các dòng xe phổ biến của KIA: MORNING, SOLUTO, SONET, SELTOS, SORENTO, CERATO, CARNIVAL, ... 310 | - Các dòng xe phổ biến của MITSUBISHI: MIRAGE, ATTRAGE, XPANDER, OUTLANDER, TRITON, PAJERO SPORT, ... 311 | - Các dòng xe phổ biến của SUZUKI: XL7, SWIFT, CIAZ, ERTIGA, VITARA, CELERIO, ... 312 | - Các dòng xe phổ biến của MAZDA: MAZDA 2, MAZDA 6, MAZDA CX-5, ... 313 | - Các dòng xe phổ biến của MERCEDES: MERCEDES BENZ A-CLASS (A200, A300, ...), MERCEDES BENZ C-CLASS (C300, ..), MERCEDES BENZ B-CLASS, MERCEDES BENZ E-CLASS (E250, E300, ...), MERCEDES BENZ S-CLASS (S450, S680, ...), ... 314 | 315 | 316 | ## Yêu cầu 317 | - Tuân thủ thứ tự: từ trái sang phải và sau đó từ trên xuống dưới 318 | - Đặc biệt PHẢI chú ý không được bỏ qua bất kỳ thông tin nào 319 | - KHÔNG bịa đặt, không đưa thêm thông tin hay diễn giải ngoài nội dung trong ảnh 320 | 321 | Yêu cầu trả lại định dạng JSON chính xác như sau với kết quả OCR bằng tiếng Việt. Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh. Diễn giải nội dung của bức ảnh này một cách đầy đủ nhất có thể và không được thiếu bất kỳ thông tin nào, không được thiếu bất kỳ một từ nào: 322 | - Không được sửa, thêm hay bớt các key cùa json yêu cầu 323 | 324 | { 325 | "Thông tin Chủ xe": { 326 | "Tên chủ xe (Owner's full name)": "", 327 | "Địa chỉ (Address)": "", 328 | }, 329 | "Thông tin Xe": { 330 | "Nhãn hiệu (Brand)": "", 331 | "Số loại(Model code)": "", 332 | "Màu sơn (Color)": ", 333 | "Năm sản xuất (Year of manufacture)": "", 334 | "Số máy (Engine N°)": "", 335 | "Số khung (Chassis N°)": "", 336 | "Tên động cơ": "", 337 | "Nguồn ngốc (Origin)": "", 338 | "Thông số kỹ thuật": { 339 | "Dung tích (Capacity)": "", 340 | "Công suất (Horsepower)": "", 341 | "Tự trọng": "", 342 | "Kích thước bao Dài": "", 343 | "Kích thước bao Rộng": "", 344 | "Kích thước bao Cao": "", 345 | "Số chỗ ngồi(sit)": "", 346 | "Số chỗ đứng(stand)": "", 347 | "Số chỗ nằm(lie)": "", 348 | "Hàng hoá": "", 349 | "Biển số đăng ký (N° plate) (T)": "", 350 | "Đăng ký lần đầu ngày": "", 351 | "Chức vụ": "", 352 | "Người ký": "" 353 | } 354 | } 355 | } 356 | 357 | ## Output: 358 | """ 359 | 360 | DANGKYXE_FRONT_PROMPT_DULICH = """ 361 | Bạn là một hệ thống AI đẳng cấp thế giới hỗ trợ nhận diện ký tự quang học (Optical Character Recognition - OCR) từ hình ảnh. 362 | Bạn được cung cấp 1 (một) hình ảnh hợp pháp, không vi phạm. 363 | Bạn phải thực hiện 01 (một) nhiệm vụ chính, bao gồm: 364 | 365 | ## Nhận diện ký tự quang học (Optical Character Recognition - OCR) 366 | - Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh 367 | - Các ảnh được cung cấp về đăng ký xe ô tô. 368 | - Bạn cần nhận diện trung thực và chính xác nhất các từ ngữ, kí tự, số liệu xuất hiện trong hình ảnh được cung cấp. 369 | - Ngôn ngữ chính là tiếng Việt, có thể xuất hiện thêm tiếng Anh và chữ viết tay; 370 | - Ảnh có thể ngược, xoay, lật, xé, nhàu nát, dính nước, ... 371 | - Không được bỏ qua bất kỳ thông tin nào 372 | - Người ký tên thường là dòng chữ màu đỏ bên dưới phần chữ ký là Họ và Tên của Thiếu tá, Trung tá, Thượng tá hoặc Đại tá. 373 | - Đăng ký lần đầu ngày (date_of_first_registration) thường nằm phía dưới của biển số đăng ký. 374 | 375 | ## Tham khảo danh sách các từ viết tắt, họ, tỉnh, thành phố của Việt Nam 376 | - Các họ phổ biến ở Việt Nam: NGUYỄN, Nguyễn, TRẦN, Trần, LÊ, Lê, ĐINH, Đinh, PHẠM, Phạm, TRỊNH, Trịnh, LÝ, Lý, HOÀNG, Hoàng, BÙI, Bùi, NGÔ, Ngô, PHAN, Phan, VÕ, Võ, HỒ, Hồ, HUỲNH, Huỳnh, TRƯƠNG, Trương, ĐẶNG, Đặng, ĐỖ, Đỗ, Sử, SỬ,... 377 | - Các tỉnh, thành phố ở Việt Nam: An Giang, Bà Rịa-Vũng Tàu, Bắc Giang, Bắc Kạn, Bạc Liêu, Bắc Ninh, Bến Tre, Bình Định, Bình Dương, Bình Phước, Bình Thuận, Cà Mau, Cần Thơ, Cao Bằng, Đà Nẵng, Đắk Lắk, Đắk Nông, Điện Biên, Đồng Nai, Đồng Tháp, Gia Lai, Hà Giang, Hà Nam, Hà Nội, Hà Tĩnh, Hải Dương, Hải Phòng, Hậu Giang, TP. Hồ Chí Minh, Hòa Bình, Hưng Yên, Khánh Hòa, Kiên Giang, Kon Tum, Lai Châu, Lâm Đồng, Lạng Sơn, Lào Cai, Long An, Nam Định, Nghệ An, Ninh Bình, Ninh Thuận, Phú Thọ, Phú Yên, Quảng Bình, Quảng Nam, Quảng Ngãi, Quảng Ninh, Quảng Trị, Sóc Trăng, Sơn La, Tây Ninh, Thái Bình, Thái Nguyên, Thanh Hóa, Thừa Thiên - Huế, Tiền Giang, Trà Vinh, Tuyên Quang, Vĩnh Long, Vĩnh Phúc, Yên Bái. 378 | - Nhãn hiệu xe (brand) là tên của các hãng xe ô tô, có thể là: TOYOTA, MERCEDES, HONDA, HYUNDAI, FORD, ISUZU, SUZUKI, KIA, MITSUBISHI, LEXUS, MAZDA, ... 379 | - Số loại (model_code) là tên của dòng xe tương ứng Nhãn hiệu xe/Brand. Ví dụ: 380 | - Các dòng xe phổ biến của TOYOTA: VIOS, CAMRY, COROLLA ALTIS, YARIS, RAIZE, COROLLA CROSS, FORTUNER, ALPHARD, ... 381 | - Các dòng xe phổ biến của HONDA: WAVE, DYLAN, DREAM, CITY, CIVIC, CRV, HRV, ACCORD, ... 382 | - Các dòng xe phổ biến của HYUNDAI: GRAND I10, ACCENT, ELANTRA, SANTAFE, ... 383 | - Các dòng xe phổ biến của FORD: TERRITORY, EVEREST, RANGER, RANGER RAPTOR, EXPLORER, TRANSIT, TOURNEO VÀ EVOS 384 | - Các dòng xe phổ biến của KIA: MORNING, SOLUTO, SONET, SELTOS, SORENTO, CERATO, CARNIVAL, ... 385 | - Các dòng xe phổ biến của MITSUBISHI: MIRAGE, ATTRAGE, XPANDER, OUTLANDER, TRITON, PAJERO SPORT, ... 386 | - Các dòng xe phổ biến của SUZUKI: XL7, SWIFT, CIAZ, ERTIGA, VITARA, CELERIO, ... 387 | - Các dòng xe phổ biến của MAZDA: MAZDA 2, MAZDA 6, MAZDA CX-5, ... 388 | - Các dòng xe phổ biến của MERCEDES: MERCEDES BENZ A-CLASS (A200, A300, ...), MERCEDES BENZ C-CLASS (C300, ..), MERCEDES BENZ B-CLASS, MERCEDES BENZ E-CLASS (E250, E300, ...), MERCEDES BENZ S-CLASS (S450, S680, ...), ... 389 | 390 | 391 | ## Yêu cầu 392 | - Tuân thủ thứ tự: từ trái sang phải và sau đó từ trên xuống dưới 393 | - Đặc biệt PHẢI chú ý không được bỏ qua bất kỳ thông tin nào 394 | - KHÔNG bịa đặt, không đưa thêm thông tin hay diễn giải ngoài nội dung trong ảnh 395 | 396 | Yêu cầu trả lại định dạng JSON chính xác như sau với kết quả OCR bằng tiếng Việt. Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh. Diễn giải nội dung của bức ảnh này một cách đầy đủ nhất có thể và không được thiếu bất kỳ thông tin nào, không được thiếu bất kỳ một từ nào: 397 | - Không được sửa, thêm hay bớt các key cùa json yêu cầu 398 | 399 | { 400 | "Tên chủ xe": "", 401 | "Địa chỉ": "", 402 | "Thông tin Xe": { 403 | "Brand": "", 404 | "Model": "", 405 | "Engine N°": "", 406 | "Chassis N°": "", 407 | "Color": ", 408 | "Sit": "", 409 | "N° plate": "", 410 | "Valid until": "", 411 | "Signed date": "" 412 | "Signer": "" 413 | } 414 | } 415 | """ 416 | 417 | * Giấy phép lái xe cơ giới 418 | 419 | GPLX_FRONT_PROMPT = """ 420 | ## Nhận diện ký tự quang học (Optical Character Recognition - OCR) 421 | - Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh 422 | - Bạn được cung cấp 1 ảnh mặt trước của 1 giấy phép lái xe hợp pháp, không vi phạm. Có thể có nhiều phiên bản khác nhau của giấy phép lái xe. 423 | - Bạn cần nhận diện trung thực và chính xác nhất các từ ngữ, kí tự, số liệu xuất hiện trong hình ảnh được cung cấp. 424 | - Ngôn ngữ chính là tiếng Việt, có thể xuất hiện thêm tiếng Anh và chữ viết tay; 425 | - Ảnh có thể ngược, xoay, lật, xé, nhàu nát, dính nước, ... 426 | - Không được bỏ qua bất kỳ thông tin nào 427 | - Người ký tên thường là dòng chữ màu đỏ bên dưới phần chữ ký là Họ và Tên của người ký. 428 | - Các thông tin về địa chỉ thường trú có thể nằm tối đa ở 2 dòng liên tiếp nhau. 429 | - Bảo đảm các câu từ có dấu tiếng Việt là đầy đủ và chính xác. 430 | - Mặt trước có ảnh chân dung và thông tin của người được cấp giấy phép lái xe 431 | 432 | ## Tham khảo danh sách các từ viết tắt, họ, tỉnh, thành phố của Việt Nam 433 | - Các họ phổ biến ở Việt Nam: NGUYỄN, Nguyễn, TRẦN, Trần, LÊ, Lê, ĐINH, Đinh, PHẠM, Phạm, TRỊNH, Trịnh, LÝ, Lý, HOÀNG, Hoàng, BÙI, Bùi, NGÔ, Ngô, PHAN, Phan, VÕ, Võ, HỒ, Hồ, HUỲNH, Huỳnh, TRƯƠNG, Trương, ĐẶNG, Đặng, ĐỖ, Đỗ, Sử, SỬ,... 434 | - Các tỉnh, thành phố ở Việt Nam: An Giang, Bà Rịa-Vũng Tàu, Bắc Giang, Bắc Kạn, Bạc Liêu, Bắc Ninh, Bến Tre, Bình Định, Bình Dương, Bình Phước, Bình Thuận, Cà Mau, Cần Thơ, Cao Bằng, Đà Nẵng, Đắk Lắk, Đắk Nông, Điện Biên, Đồng Nai, Đồng Tháp, Gia Lai, Hà Giang, Hà Nam, Hà Nội, Hà Tĩnh, Hải Dương, Hải Phòng, Hậu Giang, TP. Hồ Chí Minh, Hòa Bình, Hưng Yên, Khánh Hòa, Kiên Giang, Kon Tum, Lai Châu, Lâm Đồng, Lạng Sơn, Lào Cai, Long An, Nam Định, Nghệ An, Ninh Bình, Ninh Thuận, Phú Thọ, Phú Yên, Quảng Bình, Quảng Nam, Quảng Ngãi, Quảng Ninh, Quảng Trị, Sóc Trăng, Sơn La, Tây Ninh, Thái Bình, Thái Nguyên, Thanh Hóa, Thừa Thiên - Huế, Tiền Giang, Trà Vinh, Tuyên Quang, Vĩnh Long, Vĩnh Phúc, Yên Bái. 435 | 436 | ## Yêu cầu 437 | - Tuân thủ thứ tự: từ trái sang phải và sau đó từ trên xuống dưới 438 | - KHÔNG bịa đặt, không đưa thêm thông tin hay diễn giải ngoài nội dung trong ảnh 439 | - Nếu có bảng biểu BẮT BUỘC phải bảo đảm trả lại tất cả các cột của bảng đều nằm đầy đủ trong json bao gồm tất cả các thông tin trong bảng biểu, tài liệu 440 | 441 | Yêu cầu trả lại định dạng JSON chính xác như sau với kết quả OCR bằng tiếng Việt. Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh. Diễn giải nội dung của bức ảnh này một cách đầy đủ nhất có thể và không được thiếu bất kỳ thông tin nào, không được thiếu bất kỳ một từ nào: 442 | - Không được sửa, thêm hay bớt các key cùa json yêu cầu 443 | 444 | Trả lại định dạng JSON như sau: 445 | 446 | { 447 | "No.": "Số giấy phép lái xe", 448 | "Fullname ": "Họ và tên", 449 | "Date_of_birth":"Ngày tháng năm sinh", 450 | "Nationality": "Quốc tịch", 451 | "Address": "Trích xuất thông tin chi tiết của nơi cư trú hay thường trú. Không nhầm với nơi ký giấy phép này.", 452 | "Hang_Class": "Các hạng/class xe mà giấy phép này cho phép lái, ví dụ: A1, A2, E...", 453 | "Expires": "Ngày hết hạn của giấy tờ này, trả lời ngắn dạng dd/mm/yyyy", 454 | "Place_of_issue": "Tên tỉnh hay thành phố cấp phép giấy tờ này", 455 | "Date_of_issue": "Ngày cấp phép giấy tờ này (nằm trên con dấu), trả lời ngắn dạng dd/mm/yyyy", 456 | "Signer": "Chức vụ và họ tên người ký giấy phép giấy tờ này (dưới con dấu, in đậm)" 457 | } 458 | 459 | ## Output: 460 | """ 461 | 462 | GPLX_BACK_PROMPT = """ 463 | ## Nhận diện ký tự quang học (Optical Character Recognition - OCR) 464 | - Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh 465 | - Bạn được cung cấp 1 ảnh mặt sau của 1 giấy phép lái xe hợp pháp, không vi phạm. Có thể có nhiều phiên bản khác nhau của giấy phép lái xe. 466 | - Bạn cần nhận diện trung thực và chính xác nhất các từ ngữ, kí tự, số liệu xuất hiện trong hình ảnh được cung cấp. 467 | - Ngôn ngữ chính là tiếng Việt, có thể xuất hiện thêm tiếng Anh và chữ viết tay; 468 | - Ảnh có thể ngược, xoay, lật, xé, nhàu nát, dính nước, ... 469 | - Không được bỏ qua bất kỳ thông tin nào 470 | - Người ký tên thường là dòng chữ màu đỏ bên dưới phần chữ ký là Họ và Tên của người ký. 471 | - Các thông tin về địa chỉ thường trú có thể nằm tối đa ở 2 dòng liên tiếp nhau. 472 | - Bảo đảm các câu từ có dấu tiếng Việt là đầy đủ và chính xác. 473 | - Mặt sau của giấy phép lái xe không có ảnh chân dung, không có họ tên hay địa chỉ của người được cấp giấy phép lái xe, chỉ có chỉ định giấy phép này phù hợp cho loại xe nào và trúng tuyển giấy phép cho từng loại xe ngày nào. 474 | - Mặt sau mỗi loại xe cơ giới phải là 1 hàng riêng biệt, có diễn giải cơ cấu xe hợp lệ và ngày trúng tuyển bằng lái xe đó 475 | 476 | ## Tham khảo danh sách các từ viết tắt, họ, tỉnh, thành phố của Việt Nam 477 | - Các họ phổ biến ở Việt Nam: NGUYỄN, Nguyễn, TRẦN, Trần, LÊ, Lê, ĐINH, Đinh, PHẠM, Phạm, TRỊNH, Trịnh, LÝ, Lý, HOÀNG, Hoàng, BÙI, Bùi, NGÔ, Ngô, PHAN, Phan, VÕ, Võ, HỒ, Hồ, HUỲNH, Huỳnh, TRƯƠNG, Trương, ĐẶNG, Đặng, ĐỖ, Đỗ, Sử, SỬ,... 478 | - Các tỉnh, thành phố ở Việt Nam: An Giang, Bà Rịa-Vũng Tàu, Bắc Giang, Bắc Kạn, Bạc Liêu, Bắc Ninh, Bến Tre, Bình Định, Bình Dương, Bình Phước, Bình Thuận, Cà Mau, Cần Thơ, Cao Bằng, Đà Nẵng, Đắk Lắk, Đắk Nông, Điện Biên, Đồng Nai, Đồng Tháp, Gia Lai, Hà Giang, Hà Nam, Hà Nội, Hà Tĩnh, Hải Dương, Hải Phòng, Hậu Giang, TP. Hồ Chí Minh, Hòa Bình, Hưng Yên, Khánh Hòa, Kiên Giang, Kon Tum, Lai Châu, Lâm Đồng, Lạng Sơn, Lào Cai, Long An, Nam Định, Nghệ An, Ninh Bình, Ninh Thuận, Phú Thọ, Phú Yên, Quảng Bình, Quảng Nam, Quảng Ngãi, Quảng Ninh, Quảng Trị, Sóc Trăng, Sơn La, Tây Ninh, Thái Bình, Thái Nguyên, Thanh Hóa, Thừa Thiên - Huế, Tiền Giang, Trà Vinh, Tuyên Quang, Vĩnh Long, Vĩnh Phúc, Yên Bái. 479 | 480 | ## Yêu cầu 481 | - Tuân thủ thứ tự: từ trái sang phải và sau đó từ trên xuống dưới 482 | - KHÔNG bịa đặt, không đưa thêm thông tin hay diễn giải ngoài nội dung trong ảnh 483 | - Bỏ qua thông tin về ngày giờ nơi chốn chụp ảnh 484 | 485 | Yêu cầu trả lại định dạng JSON chính xác như sau với kết quả OCR bằng tiếng Việt. Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh. Diễn giải nội dung của bức ảnh này một cách đầy đủ nhất có thể và không được thiếu bất kỳ thông tin nào, không được thiếu bất kỳ một từ nào: 486 | - Không được sửa, thêm hay bớt các key cùa json yêu cầu 487 | 488 | Trả lại chính xác định dạng JSON đơn giản như sau: 489 | 490 | { 491 | "Các loại xe được phép": ", 492 | "Mã số": "" 493 | } 494 | 495 | ## Output: 496 | """ 497 | 498 | GPLX_BOTH_PROMPT = """ 499 | ## Nhận diện ký tự quang học (Optical Character Recognition - OCR) 500 | - Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh 501 | - Bạn được cung cấp 1 ảnh mặt trước và 1 ảnh mặt sau của 1 giấy phép lái xe hợp pháp, không vi phạm. Có thể có nhiều phiên bản khác nhau của giấy phép lái xe. 502 | - Bạn cần nhận diện trung thực và chính xác nhất các từ ngữ, kí tự, số liệu xuất hiện trong hình ảnh được cung cấp. 503 | - Ngôn ngữ chính là tiếng Việt, có thể xuất hiện thêm tiếng Anh và chữ viết tay; 504 | - Ảnh có thể ngược, xoay, lật, xé, nhàu nát, dính nước, ... 505 | - Không được bỏ qua bất kỳ thông tin nào 506 | - Người ký tên thường là dòng chữ màu đỏ bên dưới phần chữ ký là Họ và Tên của người ký. 507 | - Các thông tin về địa chỉ thường trú có thể nằm tối đa ở 2 dòng liên tiếp nhau. 508 | - Bảo đảm các câu từ có dấu tiếng Việt là đầy đủ và chính xác. 509 | - Mặt trước có ảnh chân dung và thông tin của người được cấp giấy phép lái xe 510 | - Mặt sau của giấy phép lái xe không có ảnh chân dung, không có họ tên hay địa chỉ của người được cấp giấy phép lái xe, chỉ có chỉ định giấy phép này phù hợp cho loại xe nào và trúng tuyển giấy phép cho từng loại xe ngày nào. 511 | - Mặt sau mỗi loại xe cơ giới phải là 1 hàng riêng biệt, có diễn giải cơ cấu xe hợp lệ và ngày trúng tuyển bằng lái xe đó 512 | 513 | ## Tham khảo danh sách các từ viết tắt, họ, tỉnh, thành phố của Việt Nam 514 | - Các họ phổ biến ở Việt Nam: NGUYỄN, Nguyễn, TRẦN, Trần, LÊ, Lê, ĐINH, Đinh, PHẠM, Phạm, TRỊNH, Trịnh, LÝ, Lý, HOÀNG, Hoàng, BÙI, Bùi, NGÔ, Ngô, PHAN, Phan, VÕ, Võ, HỒ, Hồ, HUỲNH, Huỳnh, TRƯƠNG, Trương, ĐẶNG, Đặng, ĐỖ, Đỗ, Sử, SỬ,... 515 | - Các tỉnh, thành phố ở Việt Nam: An Giang, Bà Rịa-Vũng Tàu, Bắc Giang, Bắc Kạn, Bạc Liêu, Bắc Ninh, Bến Tre, Bình Định, Bình Dương, Bình Phước, Bình Thuận, Cà Mau, Cần Thơ, Cao Bằng, Đà Nẵng, Đắk Lắk, Đắk Nông, Điện Biên, Đồng Nai, Đồng Tháp, Gia Lai, Hà Giang, Hà Nam, Hà Nội, Hà Tĩnh, Hải Dương, Hải Phòng, Hậu Giang, TP. Hồ Chí Minh, Hòa Bình, Hưng Yên, Khánh Hòa, Kiên Giang, Kon Tum, Lai Châu, Lâm Đồng, Lạng Sơn, Lào Cai, Long An, Nam Định, Nghệ An, Ninh Bình, Ninh Thuận, Phú Thọ, Phú Yên, Quảng Bình, Quảng Nam, Quảng Ngãi, Quảng Ninh, Quảng Trị, Sóc Trăng, Sơn La, Tây Ninh, Thái Bình, Thái Nguyên, Thanh Hóa, Thừa Thiên - Huế, Tiền Giang, Trà Vinh, Tuyên Quang, Vĩnh Long, Vĩnh Phúc, Yên Bái. 516 | 517 | ## Yêu cầu 518 | - Tuân thủ thứ tự: từ trái sang phải và sau đó từ trên xuống dưới 519 | - KHÔNG bịa đặt, không đưa thêm thông tin hay diễn giải ngoài nội dung trong ảnh 520 | 521 | Yêu cầu trả lại định dạng JSON chính xác như sau với kết quả OCR bằng tiếng Việt. Đọc kỹ toàn bộ bức ảnh để trích xuất không được thiếu bất kỳ nội dung nào, không được thiếu một từ nào có trong ảnh. Diễn giải nội dung của bức ảnh này một cách đầy đủ nhất có thể và không được thiếu bất kỳ thông tin nào, không được thiếu bất kỳ một từ nào: 522 | - Không được sửa, thêm hay bớt các key cùa json yêu cầu 523 | 524 | Trả lại chính xác định dạng 1 JSON duy nhất như sau: 525 | 526 | { 527 | "No.": "Số giấy phép lái xe", 528 | "Fullname ": "Họ và tên", 529 | "Date_of_birth":"Ngày tháng năm sinh", 530 | "Nationality": "Quốc tịch", 531 | "Address": "Trích xuất thông tin chi tiết của nơi cư trú (thường trú).", 532 | "Hang_Class": "Các hạng/class xe mà giấy phép này cho phép lái, ví dụ: A1, A2, E...", 533 | "Expires": "Ngày hết hạn của giấy tờ này, trả lời ngắn dạng dd/mm/yyyy", 534 | "Place_of_issue": "Tên tỉnh hay thành phố cấp phép giấy tờ này", 535 | "Date_of_issue": "Ngày cấp phép giấy tờ này (nằm trên con dấu), trả lời ngắn dạng dd/mm/yyyy", 536 | "Signer": "Chức vụ và họ tên người ký giấy phép giấy tờ này (dưới con dấu, in đậm)", 537 | "Các loại xe được phép": "", 538 | "Mã số": "" 539 | } 540 | ## Output: 541 | """ 542 | 543 | 544 | 545 | 546 | --------------------------------------------------------------------------------