{"id":30183492,"url":"https://github.com/rednote-hilab/dots.ocr","last_synced_at":"2026-04-10T10:03:16.921Z","repository":{"id":307286075,"uuid":"1028989499","full_name":"rednote-hilab/dots.ocr","owner":"rednote-hilab","description":"Multilingual Document Layout Parsing in a Single Vision-Language Model","archived":false,"fork":false,"pushed_at":"2026-03-19T17:15:55.000Z","size":50984,"stargazers_count":8087,"open_issues_count":173,"forks_count":728,"subscribers_count":53,"default_branch":"master","last_synced_at":"2026-03-20T09:06:02.172Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rednote-hilab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-30T11:03:59.000Z","updated_at":"2026-03-20T08:02:51.000Z","dependencies_parsed_at":"2025-08-21T05:47:12.543Z","dependency_job_id":null,"html_url":"https://github.com/rednote-hilab/dots.ocr","commit_stats":null,"previous_names":["rednote-hilab/dots.ocr"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rednote-hilab/dots.ocr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rednote-hilab%2Fdots.ocr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rednote-hilab%2Fdots.ocr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rednote-hilab%2Fdots.ocr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rednote-hilab%2Fdots.ocr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rednote-hilab","download_url":"https://codeload.github.com/rednote-hilab/dots.ocr/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rednote-hilab%2Fdots.ocr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31637748,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-12T11:02:08.363Z","updated_at":"2026-04-10T10:03:16.909Z","avatar_url":"https://github.com/rednote-hilab.png","language":"Python","readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/rednote-hilab/dots.ocr/master/assets/logo.png\" width=\"300\"/\u003e\n\u003cp\u003e\n\n\u003ch1 align=\"center\"\u003e\ndots.ocr\n\u003c/h1\u003e\n\n[![HuggingFace](https://img.shields.io/badge/HuggingFace%20Weights-black.svg?logo=HuggingFace)](https://huggingface.co/rednote-hilab/dots.mocr)\n[![Arxiv](https://img.shields.io/badge/arXiv-Paper-B31B1B.svg?logo=arxiv)](https://arxiv.org/abs/2512.02498)\n\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://dotsocr.xiaohongshu.com\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\u003cstrong\u003e🖥️ Live Demo\u003c/strong\u003e\u003c/a\u003e | \n  \u003ca href=\"assets/wechat.jpg\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\u003cstrong\u003e💬 WeChat\u003c/strong\u003e\u003c/a\u003e | \n  \u003ca href=\"https://www.xiaohongshu.com/user/profile/683ffe42000000001d021a4c\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\u003cstrong\u003e📕 rednote\u003c/strong\u003e\u003c/a\u003e | \n  \u003ca href=\"https://x.com/rednotehilab\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\u003cstrong\u003e🐦 X\u003c/strong\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003c/div\u003e\n\n\n\n## Introduction\n\n**dots.ocr** Designed for universal accessibility, it possesses the capability to recognize virtually any human script. Beyond achieving state-of-the-art (SOTA) performance in standard multilingual document parsing among models of comparable size, dots.ocr-1.5 excels at converting structured graphics (e.g., charts and diagrams) directly into SVG code, parsing web screens and spotting scene text. \n\n## News \n* ```2026.03.19 ``` We have rebranded `dots.ocr-1.5` as [dots.mocr](https://github.com/rednote-hilab/dots.mocr). For technical details, please refer to our [paper](https://arxiv.org/abs/2603.13032v1). The model weights are available on Hugging Face: [dots.mocr](https://huggingface.co/rednote-hilab/dots.mocr) and [dots.mocr-svg](https://huggingface.co/rednote-hilab/dots.mocr-svg).\n* ```2025.10.31 ``` 🚀 We release [dots.ocr.base](https://huggingface.co/rednote-hilab/dots.ocr.base), foundation VLM focus on OCR tasks, also the base model of [dots.ocr](https://huggingface.co/rednote-hilab/dots.ocr). Try it out!\n* ```2025.07.30 ``` 🚀 We release [dots.ocr](https://huggingface.co/rednote-hilab/dots.ocr), — a multilingual documents parsing model based on 1.7b llm, with SOTA performance.\n\n\n\n\n## Evaluation\n\n### 1. Document Parsing\n\n#### 1.1 Elo Score of different bench between latest models\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003emodels\u003c/th\u003e\n      \u003cth\u003eolmOCR-Bench\u003c/th\u003e\n      \u003cth\u003eOmniDocBench (v1.5)\u003c/th\u003e\n      \u003cth\u003eXDocParse\u003c/th\u003e\n      \u003cth\u003eAverage\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eMonkeyOCR-pro-3B\u003c/td\u003e\n      \u003ctd\u003e895.0\u003c/td\u003e\n      \u003ctd\u003e811.3\u003c/td\u003e\n      \u003ctd\u003e637.1\u003c/td\u003e\n      \u003ctd\u003e781.1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eGLM-OCR\u003c/td\u003e\n      \u003ctd\u003e884.2\u003c/td\u003e\n      \u003ctd\u003e972.6\u003c/td\u003e\n      \u003ctd\u003e820.7\u003c/td\u003e\n      \u003ctd\u003e892.5\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ePaddleOCR-VL-1.5\u003c/td\u003e\n      \u003ctd\u003e897.3\u003c/td\u003e\n      \u003ctd\u003e997.9\u003c/td\u003e\n      \u003ctd\u003e866.4\u003c/td\u003e\n      \u003ctd\u003e920.5\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eHuanyuanOCR\u003c/td\u003e\n      \u003ctd\u003e997.6\u003c/td\u003e\n      \u003ctd\u003e1003.9\u003c/td\u003e\n      \u003ctd\u003e951.1\u003c/td\u003e\n      \u003ctd\u003e984.2\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003edots.ocr\u003c/td\u003e\n      \u003ctd\u003e1041.1\u003c/td\u003e\n      \u003ctd\u003e1027.2\u003c/td\u003e\n      \u003ctd\u003e1190.3\u003c/td\u003e\n      \u003ctd\u003e1086.2\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003c!-- Highlighting dots.mocr row with bold tags --\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003cstrong\u003edots.mocr\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e1104.4\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e1059.0\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e1210.7\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e1124.7\u003c/strong\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eGemini 3 Pro\u003c/td\u003e\n      \u003ctd\u003e1180.4\u003c/td\u003e\n      \u003ctd\u003e1128.0\u003c/td\u003e\n      \u003ctd\u003e1323.7\u003c/td\u003e\n      \u003ctd\u003e1210.7\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\u003e **Notes:** \n\u003e - Results for Gemini 3 Pro, PaddleOCR-VL-1.5, and GLM-OCR were obtained via APIs, while HuanyuanOCR results were generated using local inference.\n\u003e - The Elo score evaluation was conducted using Gemini 3 Flash. The prompt can be found at: [Elo Score Prompt](tools/elo_score_prompt.py). These results are consistent with the findings on [ocrarena](https://www.ocrarena.ai/battle).\n\n\n#### 1.2 olmOCR-bench\n\u003ctable\u003e\n    \u003cthead\u003e\n        \u003ctr\u003e\n            \u003cth\u003eModel\u003c/th\u003e\n            \u003cth\u003eArXiv\u003c/th\u003e\n            \u003cth\u003eOld scans math\u003c/th\u003e\n            \u003cth\u003eTables\u003c/th\u003e\n            \u003cth\u003eOld scans\u003c/th\u003e\n            \u003cth\u003eHeaders \u0026 footers\u003c/th\u003e\n            \u003cth\u003eMulti column\u003c/th\u003e\n            \u003cth\u003eLong tiny text\u003c/th\u003e\n            \u003cth\u003eBase\u003c/th\u003e\n            \u003cth\u003eOverall\u003c/th\u003e\n        \u003c/tr\u003e\n    \u003c/thead\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eMistral OCR API\u003c/td\u003e\n            \u003ctd\u003e77.2\u003c/td\u003e\n            \u003ctd\u003e67.5\u003c/td\u003e\n            \u003ctd\u003e60.6\u003c/td\u003e\n            \u003ctd\u003e29.3\u003c/td\u003e\n            \u003ctd\u003e93.6\u003c/td\u003e\n            \u003ctd\u003e71.3\u003c/td\u003e\n            \u003ctd\u003e77.1\u003c/td\u003e\n            \u003ctd\u003e99.4\u003c/td\u003e\n            \u003ctd\u003e72.0±1.1\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eMarker 1.10.1\u003c/td\u003e\n            \u003ctd\u003e83.8\u003c/td\u003e\n            \u003ctd\u003e66.8\u003c/td\u003e\n            \u003ctd\u003e72.9\u003c/td\u003e\n            \u003ctd\u003e33.5\u003c/td\u003e\n            \u003ctd\u003e86.6\u003c/td\u003e\n            \u003ctd\u003e80.0\u003c/td\u003e\n            \u003ctd\u003e85.7\u003c/td\u003e\n            \u003ctd\u003e99.3\u003c/td\u003e\n            \u003ctd\u003e76.1±1.1\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eMinerU 2.5.4*\u003c/td\u003e\n            \u003ctd\u003e76.6\u003c/td\u003e\n            \u003ctd\u003e54.6\u003c/td\u003e\n            \u003ctd\u003e84.9\u003c/td\u003e\n            \u003ctd\u003e33.7\u003c/td\u003e\n            \u003ctd\u003e96.6\u003c/td\u003e\n            \u003ctd\u003e78.2\u003c/td\u003e\n            \u003ctd\u003e83.5\u003c/td\u003e\n            \u003ctd\u003e93.7\u003c/td\u003e\n            \u003ctd\u003e75.2±1.1\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eDeepSeek-OCR\u003c/td\u003e\n            \u003ctd\u003e77.2\u003c/td\u003e\n            \u003ctd\u003e73.6\u003c/td\u003e\n            \u003ctd\u003e80.2\u003c/td\u003e\n            \u003ctd\u003e33.3\u003c/td\u003e\n            \u003ctd\u003e96.1\u003c/td\u003e\n            \u003ctd\u003e66.4\u003c/td\u003e\n            \u003ctd\u003e79.4\u003c/td\u003e\n            \u003ctd\u003e99.8\u003c/td\u003e\n            \u003ctd\u003e75.7±1.0\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eNanonets-OCR2-3B\u003c/td\u003e\n            \u003ctd\u003e75.4\u003c/td\u003e\n            \u003ctd\u003e46.1\u003c/td\u003e\n            \u003ctd\u003e86.8\u003c/td\u003e\n            \u003ctd\u003e40.9\u003c/td\u003e\n            \u003ctd\u003e32.1\u003c/td\u003e\n            \u003ctd\u003e81.9\u003c/td\u003e\n            \u003ctd\u003e93.0\u003c/td\u003e\n            \u003ctd\u003e99.6\u003c/td\u003e\n            \u003ctd\u003e69.5±1.1\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003ePaddleOCR-VL*\u003c/td\u003e\n            \u003ctd\u003e85.7\u003c/td\u003e\n            \u003ctd\u003e71.0\u003c/td\u003e\n            \u003ctd\u003e84.1\u003c/td\u003e\n            \u003ctd\u003e37.8\u003c/td\u003e\n            \u003ctd\u003e97.0\u003c/td\u003e\n            \u003ctd\u003e79.9\u003c/td\u003e\n            \u003ctd\u003e85.7\u003c/td\u003e\n            \u003ctd\u003e98.5\u003c/td\u003e\n            \u003ctd\u003e80.0±1.0\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eInfinity-Parser 7B*\u003c/td\u003e\n            \u003ctd\u003e84.4\u003c/td\u003e\n            \u003ctd\u003e83.8\u003c/td\u003e\n            \u003ctd\u003e85.0\u003c/td\u003e\n            \u003ctd\u003e47.9\u003c/td\u003e\n            \u003ctd\u003e88.7\u003c/td\u003e\n            \u003ctd\u003e84.2\u003c/td\u003e\n            \u003ctd\u003e86.4\u003c/td\u003e\n            \u003ctd\u003e99.8\u003c/td\u003e\n            \u003ctd\u003e82.5±?\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eolmOCR v0.4.0\u003c/td\u003e\n            \u003ctd\u003e83.0\u003c/td\u003e\n            \u003ctd\u003e82.3\u003c/td\u003e\n            \u003ctd\u003e84.9\u003c/td\u003e\n            \u003ctd\u003e47.7\u003c/td\u003e\n            \u003ctd\u003e96.1\u003c/td\u003e\n            \u003ctd\u003e83.7\u003c/td\u003e\n            \u003ctd\u003e81.9\u003c/td\u003e\n            \u003ctd\u003e99.7\u003c/td\u003e\n            \u003ctd\u003e82.4±1.1\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eChandra OCR 0.1.0*\u003c/td\u003e\n            \u003ctd\u003e82.2\u003c/td\u003e\n            \u003ctd\u003e80.3\u003c/td\u003e\n            \u003ctd\u003e88.0\u003c/td\u003e\n            \u003ctd\u003e50.4\u003c/td\u003e\n            \u003ctd\u003e90.8\u003c/td\u003e\n            \u003ctd\u003e81.2\u003c/td\u003e\n            \u003ctd\u003e92.3\u003c/td\u003e\n            \u003ctd\u003e99.9\u003c/td\u003e\n            \u003ctd\u003e83.1±0.9\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003edots.ocr\u003c/td\u003e\n            \u003ctd\u003e82.1\u003c/td\u003e\n            \u003ctd\u003e64.2\u003c/td\u003e\n            \u003ctd\u003e88.3\u003c/td\u003e\n            \u003ctd\u003e40.9\u003c/td\u003e\n            \u003ctd\u003e94.1\u003c/td\u003e\n            \u003ctd\u003e82.4\u003c/td\u003e\n            \u003ctd\u003e81.2\u003c/td\u003e\n            \u003ctd\u003e99.5\u003c/td\u003e\n            \u003ctd\u003e79.1±1.0\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003edots.mocr\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003cstrong\u003e85.9\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003cstrong\u003e85.5\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003cstrong\u003e90.7\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd\u003e48.2\u003c/td\u003e\n            \u003ctd\u003e94.0\u003c/td\u003e\n            \u003ctd\u003e\u003cstrong\u003e85.3\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd\u003e81.6\u003c/td\u003e\n            \u003ctd\u003e99.7\u003c/td\u003e\n            \u003ctd\u003e\u003cstrong\u003e83.9±0.9\u003c/strong\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\u003e **Note:**\n\u003e - The metrics are from [olmocr](https://github.com/allenai/olmocr), and our own internal evaluations.\n\u003e - We delete the Page-header and Page-footer cells in the result markdown.\n\n\n#### 1.3 Other Benchmarks\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eModel Type\u003c/th\u003e\n      \u003cth\u003eMethods\u003c/th\u003e\n      \u003cth\u003eSize\u003c/th\u003e\n      \u003cth\u003eOmniDocBench(v1.5)\u003cbr\u003eTextEdit↓\u003c/th\u003e\n      \u003cth\u003eOmniDocBench(v1.5)\u003cbr\u003eRead OrderEdit↓\u003c/th\u003e\n      \u003cth\u003epdf-parse-bench\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003c!-- GeneralVLMs Group (Reversed Order, 3 rows) --\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"3\"\u003e\u003cstrong\u003eGeneralVLMs\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003eGemini-2.5 Pro\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e0.075\u003c/td\u003e\n      \u003ctd\u003e0.097\u003c/td\u003e\n      \u003ctd\u003e9.06\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eQwen3-VL-235B-A22B-Instruct\u003c/td\u003e\n      \u003ctd\u003e235B\u003c/td\u003e\n      \u003ctd\u003e0.069\u003c/td\u003e\n      \u003ctd\u003e0.068\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e9.71\u003c/strong\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003egemini3pro\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e0.066\u003c/td\u003e\n      \u003ctd\u003e0.079\u003c/td\u003e\n      \u003ctd\u003e9.68\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003c!-- SpecializedVLMs Group (Reversed Order, 12 rows) --\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"12\"\u003e\u003cstrong\u003eSpecializedVLMs\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003eMistral OCR\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e0.164\u003c/td\u003e\n      \u003ctd\u003e0.144\u003c/td\u003e\n      \u003ctd\u003e8.84\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eDeepseek-OCR\u003c/td\u003e\n      \u003ctd\u003e3B\u003c/td\u003e\n      \u003ctd\u003e0.073\u003c/td\u003e\n      \u003ctd\u003e0.086\u003c/td\u003e\n      \u003ctd\u003e8.26\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eMonkeyOCR-3B\u003c/td\u003e\n      \u003ctd\u003e3B\u003c/td\u003e\n      \u003ctd\u003e0.075\u003c/td\u003e\n      \u003ctd\u003e0.129\u003c/td\u003e\n      \u003ctd\u003e9.27\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eOCRVerse\u003c/td\u003e\n      \u003ctd\u003e4B\u003c/td\u003e\n      \u003ctd\u003e0.058\u003c/td\u003e\n      \u003ctd\u003e0.071\u003c/td\u003e\n      \u003ctd\u003e--\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eMonkeyOCR-pro-3B\u003c/td\u003e\n      \u003ctd\u003e3B\u003c/td\u003e\n      \u003ctd\u003e0.075\u003c/td\u003e\n      \u003ctd\u003e0.128\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eMinerU2.5\u003c/td\u003e\n      \u003ctd\u003e1.2B\u003c/td\u003e\n      \u003ctd\u003e0.047\u003c/td\u003e\n      \u003ctd\u003e0.044\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ePaddleOCR-VL\u003c/td\u003e\n      \u003ctd\u003e0.9B\u003c/td\u003e\n      \u003ctd\u003e0.035\u003c/td\u003e\n      \u003ctd\u003e0.043\u003c/td\u003e\n      \u003ctd\u003e9.51\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eHunyuanOCR\u003c/td\u003e\n      \u003ctd\u003e0.9B\u003c/td\u003e\n      \u003ctd\u003e0.042\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ePaddleOCR-VL1.5\u003c/td\u003e\n      \u003ctd\u003e0.9B\u003c/td\u003e\n      \u003ctd\u003e0.035\u003c/td\u003e\n      \u003ctd\u003e0.042\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eGLMOCR\u003c/td\u003e\n      \u003ctd\u003e0.9B\u003c/td\u003e\n      \u003ctd\u003e0.04\u003c/td\u003e\n      \u003ctd\u003e0.043\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003edots.ocr\u003c/td\u003e\n      \u003ctd\u003e3B\u003c/td\u003e\n      \u003ctd\u003e0.048\u003c/td\u003e\n      \u003ctd\u003e0.053\u003c/td\u003e\n      \u003ctd\u003e9.29\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003cu\u003e\u003cstrong\u003edots.mocr\u003c/strong\u003e\u003c/u\u003e\u003c/td\u003e\n      \u003ctd\u003e3B\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e0.031\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e0.029\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e9.54\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003e **Note:**\n\u003e - Metrics are sourced from [OmniDocBench](https://github.com/opendatalab/OmniDocBench) and other model publications. [pdf-parse-bench](https://github.com/phorn1/pdf-parse-bench) results are reproduced by Qwen3-VL-235B-A22B-Instruct.\n\u003e - Formula and Table metrics for OmniDocBench1.5 are omitted due to their high sensitivity to detection and matching protocols.\n\n\n### 2. Structured Graphics Parsing\nVisual languages (e.g., charts, graphics, chemical formulas, logos) encapsulate dense human knowledge. **dots.mocr** unifies the interpretation of these elements by parsing them directly into **SVG code**.\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth rowspan=\"2\" style=\"text-align: left;\"\u003eMethods\u003c/th\u003e\n      \u003cth colspan=\"3\"\u003eUnisvg\u003c/th\u003e\n      \u003cth rowspan=\"2\"\u003eChartmimic\u003c/th\u003e\n      \u003cth rowspan=\"2\"\u003eDesign2Code\u003c/th\u003e\n      \u003cth rowspan=\"2\"\u003eGenexam\u003c/th\u003e\n      \u003cth rowspan=\"2\"\u003eSciGen\u003c/th\u003e\n      \u003cth rowspan=\"2\"\u003eChemDraw\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eLow-Level\u003c/th\u003e\n      \u003cth\u003eHigh-Level\u003c/th\u003e\n      \u003cth\u003eScore\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd style=\"text-align: left;\"\u003eOCRVerse\u003c/td\u003e\n      \u003ctd\u003e0.632\u003c/td\u003e\n      \u003ctd\u003e0.852\u003c/td\u003e\n      \u003ctd\u003e0.763\u003c/td\u003e\n      \u003ctd\u003e0.799\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e-\u003c/td\u003e\n      \u003ctd\u003e0.881\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd style=\"text-align: left;\"\u003eGemini 3 Pro\u003c/td\u003e\n      \u003ctd\u003e0.563\u003c/td\u003e\n      \u003ctd\u003e0.850\u003c/td\u003e\n      \u003ctd\u003e0.735\u003c/td\u003e\n      \u003ctd\u003e0.788\u003c/td\u003e\n      \u003ctd\u003e0.760\u003c/td\u003e\n      \u003ctd\u003e0.756\u003c/td\u003e\n      \u003ctd\u003e0.783\u003c/td\u003e\n      \u003ctd\u003e0.839\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd style=\"text-align: left;\"\u003edots.mocr\u003c/td\u003e\n      \u003ctd\u003e0.850\u003c/td\u003e\n      \u003ctd\u003e0.923\u003c/td\u003e\n      \u003ctd\u003e0.894\u003c/td\u003e\n      \u003ctd\u003e0.772\u003c/td\u003e\n      \u003ctd\u003e0.801\u003c/td\u003e\n      \u003ctd\u003e0.664\u003c/td\u003e\n      \u003ctd\u003e0.660\u003c/td\u003e\n      \u003ctd\u003e0.790\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd style=\"text-align: left;\"\u003e\u003cstrong\u003edots.mocr-svg\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e0.860\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e0.931\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e0.902\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e0.905\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e0.834\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e0.8\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e0.797\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003e0.901\u003c/strong\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\u003e **Note:**\n\u003e - We use the ISVGEN metric from [UniSVG](https://ryanlijinke.github.io/) to evaluate the parsing result. For benchmarks that do not natively support image parsing, we use the original images as input, and calculate the ISVGEN score between the rendered output and the original image. \n\u003e - [OCRVerse](https://github.com/DocTron-hub/OCRVerse) results are derived from various code formats (e.g., SVG, Python), whereas results for Gemini 3 Pro and dots.mocr are based specifically on SVG code.\n\u003e - Due to the capacity constraints of a 3B-parameter VLM, dots.mocr may not excel in all tasks yet like svg. To complement this, we are simultaneously releasing dots.mocr-svg. We plan to further address these limitations in future updates.\n\n\n### 3. General Vision Tasks\n\n\u003ctable\u003e\n    \u003cthead\u003e\n        \u003ctr\u003e\n            \u003cth\u003eModel\u003c/th\u003e\n            \u003cth\u003eCharXiv_descriptive\u003c/th\u003e\n            \u003cth\u003eCharXiv_reasoning\u003c/th\u003e\n            \u003cth\u003eOCR_Reasoning\u003c/th\u003e\n            \u003cth\u003einfovqa\u003c/th\u003e\n            \u003cth\u003edocvqa\u003c/th\u003e\n            \u003cth\u003eChartQA\u003c/th\u003e\n            \u003cth\u003eOCRBench\u003c/th\u003e\n            \u003cth\u003eAI2D\u003c/th\u003e\n            \u003cth\u003eCountBenchQA\u003c/th\u003e\n            \u003cth\u003erefcoco\u003c/th\u003e\n        \u003c/tr\u003e\n    \u003c/thead\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eQwen3vl-2b-instruct\u003c/td\u003e\n            \u003ctd\u003e62.3\u003c/td\u003e\n            \u003ctd\u003e26.8\u003c/td\u003e\n            \u003ctd\u003e-\u003c/td\u003e\n            \u003ctd\u003e72.4\u003c/td\u003e\n            \u003ctd\u003e93.3\u003c/td\u003e\n            \u003ctd\u003e-\u003c/td\u003e\n            \u003ctd\u003e85.8\u003c/td\u003e\n            \u003ctd\u003e76.9\u003c/td\u003e\n            \u003ctd\u003e88.4\u003c/td\u003e\n            \u003ctd\u003e-\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eQwen3vl-4b-instruct\u003c/td\u003e\n            \u003ctd\u003e76.2\u003c/td\u003e\n            \u003ctd\u003e39.7\u003c/td\u003e\n            \u003ctd\u003e-\u003c/td\u003e\n            \u003ctd\u003e80.3\u003c/td\u003e\n            \u003ctd\u003e95.3\u003c/td\u003e\n            \u003ctd\u003e-\u003c/td\u003e\n            \u003ctd\u003e88.1\u003c/td\u003e\n            \u003ctd\u003e84.1\u003c/td\u003e\n            \u003ctd\u003e84.9\u003c/td\u003e\n            \u003ctd\u003e-\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003edots.mocr\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd\u003e77.4\u003c/td\u003e\n            \u003ctd\u003e55.3\u003c/td\u003e\n            \u003ctd\u003e22.85\u003c/td\u003e\n            \u003ctd\u003e73.76\u003c/td\u003e\n            \u003ctd\u003e91.85\u003c/td\u003e\n            \u003ctd\u003e83.2\u003c/td\u003e\n            \u003ctd\u003e86.0\u003c/td\u003e\n            \u003ctd\u003e82.16\u003c/td\u003e\n            \u003ctd\u003e94.46\u003c/td\u003e\n            \u003ctd\u003e80.03\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\n# Quick Start\n## 1. Installation\n### Install dots.mocr\n```shell\nconda create -n dots_mocr python=3.12\nconda activate dots_mocr\n\ngit clone https://github.com/rednote-hilab/dots.mocr.git\ncd dots.mocr\n\n# Install pytorch, see https://pytorch.org/get-started/previous-versions/ for your cuda version\n# pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cu128\n# install flash-attn==2.8.0.post2 for faster inference\npip install -e .\n```\n\nIf you have trouble with the installation, try our [Docker Image](https://hub.docker.com/r/rednotehilab/dots.ocr) for an easier setup, and follow these steps:\n\n\n### Download Model Weights\n\u003e 💡**Note:** Please use a directory name without periods (e.g., `DotsMOCR` instead of `dots.mocr`) for the model save path. This is a temporary workaround pending our integration with Transformers.\n```shell\npython3 tools/download_model.py\n\n# with modelscope\npython3 tools/download_model.py --type modelscope\n```\n\n\n## 2. Deployment\n### vLLM inference\nWe highly recommend using vLLM for deployment and inference. **Since vLLM version 0.11.0, Dots OCR has been officially integrated into vLLM with verified performance** and you can use vLLM docker image directly (e.g, `vllm/vllm-openai:v0.11.0`) to deploy the model server.\n\n```shell\n# Launch vLLM model server\n## dots.mocr\nCUDA_VISIBLE_DEVICES=0 vllm serve rednote-hilab/dots.mocr --tensor-parallel-size 1 --gpu-memory-utilization 0.9 --chat-template-content-format string --served-model-name model --trust-remote-code\n\n## dots.mocr-svg\nCUDA_VISIBLE_DEVICES=0 vllm serve rednote-hilab/dots.mocr-svg --tensor-parallel-size 1 --gpu-memory-utilization 0.9 --chat-template-content-format string --served-model-name model --trust-remote-code\n\n# vLLM API Demo\n# See dots_mocr/model/inference.py and dots_mocr/utils/prompts.py for details on parameter and prompt settings \n# that help achieve the best output quality.\n## document parsing\npython3 ./demo/demo_vllm.py --prompt_mode prompt_layout_all_en \n## web parsing \npython3 ./demo/demo_vllm.py --prompt_mode prompt_web_parsing --image_path ./assets/showcase/origin/webpage_1.png\n## scene spoting\npython3 ./demo/demo_vllm.py --prompt_mode prompt_scene_spotting --image_path ./assets/showcase/origin/scene_1.jpg\n## image parsing with svg code\npython3 ./demo/demo_vllm_svg.py --prompt_mode prompt_image_to_svg \n## general qa\npython3 ./demo/demo_vllm_general.py\n```\n\n### Hugginface inference\n```shell\npython3 demo/demo_hf.py\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eHugginface inference details\u003c/b\u003e\u003c/summary\u003e\n\n```python\nimport torch\nfrom transformers import AutoModelForCausalLM, AutoProcessor, AutoTokenizer\nfrom qwen_vl_utils import process_vision_info\nfrom dots_mocr.utils import dict_promptmode_to_prompt\n\nmodel_path = \"./weights/DotsMOCR\"\nmodel = AutoModelForCausalLM.from_pretrained(\n    model_path,\n    attn_implementation=\"flash_attention_2\",\n    torch_dtype=torch.bfloat16,\n    device_map=\"auto\",\n    trust_remote_code=True\n)\nprocessor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)\n\nimage_path = \"demo/demo_image1.jpg\"\nprompt = \"\"\"Please output the layout information from the PDF image, including each layout element's bbox, its category, and the corresponding text content within the bbox.\n\n1. Bbox format: [x1, y1, x2, y2]\n\n2. Layout Categories: The possible categories are ['Caption', 'Footnote', 'Formula', 'List-item', 'Page-footer', 'Page-header', 'Picture', 'Section-header', 'Table', 'Text', 'Title'].\n\n3. Text Extraction \u0026 Formatting Rules:\n    - Picture: For the 'Picture' category, the text field should be omitted.\n    - Formula: Format its text as LaTeX.\n    - Table: Format its text as HTML.\n    - All Others (Text, Title, etc.): Format their text as Markdown.\n\n4. Constraints:\n    - The output text must be the original text from the image, with no translation.\n    - All layout elements must be sorted according to human reading order.\n\n5. Final Output: The entire output must be a single JSON object.\n\"\"\"\n\nmessages = [\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\n                    \"type\": \"image\",\n                    \"image\": image_path\n                },\n                {\"type\": \"text\", \"text\": prompt}\n            ]\n        }\n    ]\n\n# Preparation for inference\ntext = processor.apply_chat_template(\n    messages, \n    tokenize=False, \n    add_generation_prompt=True\n)\nimage_inputs, video_inputs = process_vision_info(messages)\ninputs = processor(\n    text=[text],\n    images=image_inputs,\n    videos=video_inputs,\n    padding=True,\n    return_tensors=\"pt\",\n)\n\ninputs = inputs.to(\"cuda\")\n\n# Inference: Generation of the output\ngenerated_ids = model.generate(**inputs, max_new_tokens=24000)\ngenerated_ids_trimmed = [\n    out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)\n]\noutput_text = processor.batch_decode(\n    generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False\n)\nprint(output_text)\n\n```\n\n\u003c/details\u003e\n\n### Hugginface inference with CPU\nPlease refer to [CPU inference](https://github.com/rednote-hilab/dots.ocr/issues/1#issuecomment-3148962536)\n\n\n## 3. Document Parse\n**Based on vLLM server**, you can parse an image or a pdf file using the following commands:\n```bash\n\n# Parse all layout info, both detection and recognition\n# Parse a single image\npython3 dots_mocr/parser.py demo/demo_image1.jpg\n# Parse a single PDF\npython3 dots_mocr/parser.py demo/demo_pdf1.pdf  --num_thread 64  # try bigger num_threads for pdf with a large number of pages\n\n# Layout detection only\npython3 dots_mocr/parser.py demo/demo_image1.jpg --prompt prompt_layout_only_en\n\n# Parse text only, except Page-header and Page-footer\npython3 dots_mocr/parser.py demo/demo_image1.jpg --prompt prompt_ocr\n\n\n```\n**Based on Transformers**, you can parse an image or a pdf file using the same commands above, just add `--use_hf true`. \n\n\u003e Notice: transformers is slower than vllm, if you want to use demo/* with transformers，just add `use_hf=True` in `DotsMOCRParser(..,use_hf=True)`\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eOutput Results\u003c/b\u003e\u003c/summary\u003e\n\n1.  **Structured Layout Data** (`demo_image1.json`): A JSON file containing the detected layout elements, including their bounding boxes, categories, and extracted text.\n2.  **Processed Markdown File** (`demo_image1.md`): A Markdown file generated from the concatenated text of all detected cells.\n    *   An additional version, `demo_image1_nohf.md`, is also provided, which excludes page headers and footers for compatibility with benchmarks like Omnidocbench and olmOCR-bench.\n3.  **Layout Visualization** (`demo_image1.jpg`): The original image with the detected layout bounding boxes drawn on it.\n\n\u003c/details\u003e\n\n\n## 4. Demo\nHave fun with the [live demo](https://dotsocr.xiaohongshu.com/).\n\n\n### Examples for document parsing\n\u003cimg src=\"assets/showcase/result/formula1.png\" alt=\"formula1.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/table3.png\" alt=\"table3.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/Tibetan.png\" alt=\"Tibetan.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/tradition_zh.png\" alt=\"tradition_zh.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/nl.png\" alt=\"nl.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/kannada.png\" alt=\"kannada.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/russian.png\" alt=\"russian.png\" border=\"0\" /\u003e\n\n\n### Examples for image parsing\n\u003cimg src=\"assets/showcase/result/svg_1.png\" alt=\"svg_1.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/svg_2.png\" alt=\"svg_2.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/svg_4.png\" alt=\"svg_4.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/svg_5.png\" alt=\"svg_5.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/svg_6.png\" alt=\"svg_6.png\" border=\"0\" /\u003e\n\n\u003e **Note:**\n\u003e - Inferenced by dots.mocr-svg\n\n### Example for web parsing\n\u003cimg src=\"assets/showcase/result/webpage_1.png\" alt=\"webpage_1.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/webpage_2.png\" alt=\"webpage_2.png\" border=\"0\" /\u003e\n\n### Examples for scene spotting\n\u003cimg src=\"assets/showcase/result/scene_1.png\" alt=\"scene_1.png\" border=\"0\" /\u003e\n\u003cimg src=\"assets/showcase/result/scene_2.png\" alt=\"scene_2.png\" border=\"0\" /\u003e\n\n\n# Limitation \u0026 Future Work\n\n- **Complex Document Elements:**\n  - **Table\u0026Formula**: The extraction of complex tables and mathematical formulas persists as a difficult task given the model's compact architecture.\n  - **Picture**: We have adopted an SVG code representation for parsing structured graphics; however, the performance has yet to achieve the desired level of robustness.\n\n- **Parsing Failures:** While we have reduced the rate of parsing failures compared to the previous version, these issues may still occur occasionally. We remain committed to further resolving these edge cases in future updates. \n\n\n# Citation\n\n```BibTeX\n@misc{zheng2026multimodalocrparsedocuments,\n      title={Multimodal OCR: Parse Anything from Documents}, \n      author={Handong Zheng and Yumeng Li and Kaile Zhang and Liang Xin and Guangwei Zhao and Hao Liu and Jiayu Chen and Jie Lou and Jiyu Qiu and Qi Fu and Rui Yang and Shuo Jiang and Weijian Luo and Weijie Su and Weijun Zhang and Xingyu Zhu and Yabin Li and Yiwei ma and Yu Chen and Zhaohui Yu and Guang Yang and Colin Zhang and Lei Zhang and Yuliang Liu and Xiang Bai},\n      year={2026},\n      eprint={2603.13032},\n      archivePrefix={arXiv},\n      primaryClass={cs.CV},\n      url={https://arxiv.org/abs/2603.13032}, \n}\n```\n\n```BibTeX\n@misc{li2025dotsocrmultilingualdocumentlayout,\n      title={dots.ocr: Multilingual Document Layout Parsing in a Single Vision-Language Model}, \n      author={Yumeng Li and Guang Yang and Hao Liu and Bowen Wang and Colin Zhang},\n      year={2025},\n      eprint={2512.02498},\n      archivePrefix={arXiv},\n      primaryClass={cs.CV},\n      url={https://arxiv.org/abs/2512.02498}, \n}\n```\n","funding_links":[],"categories":["光学字符识别OCR","Python"],"sub_categories":["资源传输下载"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frednote-hilab%2Fdots.ocr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frednote-hilab%2Fdots.ocr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frednote-hilab%2Fdots.ocr/lists"}