vision-reader
by JoshuaLam21
README.md
# vision-reader
给**没有图像能力的 LLM** 的"看图能力"工具:把图片的像素 + 坐标整理成模型可读的**文本**,让模型理解复杂图片(截图、文档、图表、UI 界面等)。
**用法一句话:`vision analyze 你的图片.png`,其余全部自动。** 内部自动完成 全图概览 → 自动挑选关注区域 → 编码细看 → OCR → 输出完整 Markdown 报告,不需要任何手动调度。
---
## 安装(约 2 分钟)
### 第 1 步:安装 uv(Python 包管理器,会自动带上 Python,无需手动装 Python)
**Windows**(任选其一):
```powershell
winget install astral-sh.uv
```
或
```powershell
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```
**macOS / Linux**:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```
装完重开终端,输入 `uv --version` 能输出版本号即成功。
### 第 2 步:获取项目并安装依赖
```bash
git clone https://github.com/JoshuaLam21/vision-reader.git
cd vision-reader
uv sync --extra dev --extra mcp
```
> ⏳ 首次安装需要下载 torch / easyocr 等依赖,**约几百 MB,请耐心等几分钟**,进度条走完即可。
### 第 3 步:验证安装成功
```bash
uv run vision demo
```
看到终端输出一份 Markdown 报告、并在 `demo/output/report.md` 生成文件,说明安装成功。
---
## 快速开始(30 秒上手)
### 看你自己的一张图
```bash
uv run vision analyze 你的图片.png --out report.md
```
打开 `report.md`,就是完整的图片理解报告(整体概览 + 局部细节 + OCR 文字 + 坐标索引)。
> 首次运行会自动下载 OCR 模型权重(约 60 MB,一次性,存到 `~/.EasyOCR`),请耐心等待。
### 没有图片?跑个演示
```bash
uv run vision demo
```
自动生成一张合成图并分析,输出到 `demo/output/`。
### 常用命令速查
| 想做什么 | 命令 |
|---|---|
| 一键分析图片(主用法) | `uv run vision analyze <图片>` |
| 分析并保存报告 | `uv run vision analyze <图片> --out report.md` |
| 只看全图概览 | `uv run vision overview <图片>` |
| 裁剪某区域细看 | `uv run vision crop <图片> --region 0.1,0.1,0.5,0.5` |
| 提取某区域文字 | `uv run vision ocr <图片> --region 0.1,0.1,0.5,0.5` |
| 跑完整演示 | `uv run vision demo` |
所有坐标都是**归一化坐标 (0~1)**,`0,0` 是左上角,`1,1` 是右下角。
---
## 常见问题(FAQ)
**Q:`uv` 命令找不到?**
安装 uv 后需要重开终端(让 PATH 生效);Windows 用户也可以重启一下终端窗口。
**Q:安装/下载很慢?**
首次 `uv sync` 要下载 torch(几百 MB),首次 `analyze` 要下载 OCR 模型(约 60 MB)。都是**一次性**的,之后秒开。网络慢可考虑配置镜像源。
**Q:`vision analyze` 报错?**
先跑 `uv run vision demo` 确认环境正常;如果 demo 正常而你自己的图报错,可能是图片路径含中文/空格——用引号包起来:`uv run vision analyze "我的 图片.png"`。
**Q:我想让 Claude / 我的 AI 直接"看图"?**
见下方 **MCP Server** 章节,配置一次后,AI 就能调用 `vision_analyze` 工具看你的图。
---
## CLI 用法
### 一键分析(推荐,主用法)
```bash
uv run vision analyze <图片> [--grid 8x8] [--top 3] [--out report.md] [--summary] [--no-ocr]
```
| 参数 | 说明 |
|---|---|
| `--grid NxM` | 全图概览网格,默认 8x8 |
| `--top N` | 自动细看的区域数,默认 3 |
| `--out 路径` | 报告保存路径(默认仅打印) |
| `--summary` | 输出 token 精简摘要(布局要点+区域要点+OCR 汇总,约省 80% token;适合大图/长上下文受限) |
| `--no-ocr` | 跳过 OCR |
内部自动流程:全图概览 → 按边缘密度排序挑选候选区域、膨胀并合并重叠 → 每个区域自动选编码器(颜色丰富用 `color_stats`,否则 `ascii_art`)→ 疑似文字区域自动 OCR → 汇总 Markdown 报告。
**报告开头自带"给模型的导读"**:说明坐标归一化、ASCII 字符含义、边缘密度解读、OCR 可能出错等,帮助模型正确解读像素统计,无需额外提示。
### 分步用法(高级)
```bash
uv run vision overview <图片> --grid 8x8 # 1. 全图 chunk 概览
uv run vision crop <图片> --region 0.1,0.1,0.5,0.5 --encode ascii_art --size 64 # 2. 裁剪+编码
uv run vision ocr <图片> --region 0.02,0.42,0.6,0.58 --engine easyocr --languages ch_sim,en # 3. OCR
uv run vision report obs1.json obs2.json --out report.md # 4. 汇总报告
```
`crop` 参数:`--scale` 放大倍数(默认 2.0)、`--encode` 编码器(`ascii_art` / `grayscale_grid` / `color_stats`)、`--color` 保留彩色、`--json` 输出 JSON 供 `report` 汇总。
---
## 三种编码器(模型按需自选)
| 名称 | 输出 | 特点 |
|---|---|---|
| `grayscale_grid` | 灰度数字网格(量化级数可调) | 最接近原始像素读数,token 消耗大 |
| `ascii_art` | 字符明暗密度图 | token 最省、最易读 |
| `color_stats` | 分块主色/亮度/边缘密度统计 | 适合颜色与结构判断 |
编码器可插拔:实现 `vision_reader/encoders/base.py` 的 `Encoder` 接口并加 `@register` 即可。
---
## Python 库用法
```python
from vision_reader import image_io
from vision_reader.analyzer import analyze
img = image_io.load_image("截图.png") # 支持路径 / base64 / bytes / ndarray
result = analyze(img, top_n=3, ocr=True) # 一键分析(无需调度)
print(result.to_report()) # 完整 Markdown 报告
# 需要精细控制时,可用分步 API:
from vision_reader import crop, overview
from vision_reader.encoders import encode
from vision_reader.ocr import recognize
chunks = overview.chunks(img, grid=(8, 8)) # 全图概览
cr = crop.region(img, 0.1, 0.1, 0.5, 0.5, scale=2.0) # 裁剪放大
print(encode(cr.image, name="grayscale_grid", grid_width=32)) # 编码细看
result = recognize(cr.image, engine="easyocr", languages=("ch_sim", "en")) # OCR
```
---
## OCR 引擎
- **默认 EasyOCR(ch_sim + en)**:pip 可装、纯 Python 生态、无需外部服务;首次使用会自动下载模型权重到 `~/.EasyOCR`。
- **PaddleOCR(可选占位)**:中文效果更优但依赖 PaddlePaddle(体积大)。当前为占位实现,接口已就绪:补全 `vision_reader/ocr/paddleocr_engine.py` 后,一行切换 `--engine paddleocr`。
---
## MCP Server(让 AI 直接看图)
把 vision-reader 封装为 MCP 工具,配置一次后,Claude Code / Reasonix / Cursor 等支持 MCP 的客户端里的 AI 就能调用工具看图。
### 第 0 步(可选):全局安装,注册时不用写路径
```bash
uv tool install . --extra mcp # 全局安装 vision / vision-mcp 命令(含依赖,约几百 MB,一次性)
vision-mcp # 测试:启动后不退出、无报错即正常(Ctrl+C 停止)
```
装完后 `vision-mcp` 是全局命令,注册配置只需一行(见第 3 步"方式一"),任何目录都能用。
### 第 1 步:确认已装 mcp 依赖
```bash
uv sync --extra mcp # 安装过(--extra dev --extra mcp)则跳过
```
### 第 2 步:测试 server 能启动
```bash
uv run python -m vision_reader.mcp_server
```
启动后不退出、无报错即为正常(按 `Ctrl+C` 停止)。
### 第 3 步:注册到客户端
**方式一:全局命令(推荐,做了第 0 步后适用)**——Claude Code 项目根目录 `.mcp.json`:
```json
{
"mcpServers": {
"vision-reader": {
"command": "vision-mcp"
}
}
}
```
**方式二:项目路径**(没做第 0 步;把 `<项目路径>` 换成你的实际路径):
```json
{
"mcpServers": {
"vision-reader": {
"command": "uv",
"args": ["--directory", "<项目路径>", "run", "python", "-m", "vision_reader.mcp_server"]
}
}
}
```
**Reasonix / Cursor**:同样以 stdio server 方式注册,指向上述 command/args。
### 工具清单
| 工具 | 说明 |
|---|---|
| `vision_analyze` | **【一键】自动分析整图**:概览+选区域+编码+OCR,返回完整 Markdown 报告(`summary=True` 返回精简摘要) |
| `vision_load_image` | 注册图片(路径或 base64),返回 `image_id` + 宽高 |
| `vision_overview` | 全图 chunk 概览(默认 8x8,可调 grid) |
| `vision_crop` | 按归一化坐标裁剪 + 编码(`region="x1,y1,x2,y2"`,编码器可换) |
| `vision_ocr` | 区域 OCR(返回文本 + 置信度 + 归一化 bbox) |
| `vision_list_encoders` / `vision_list_ocr_engines` | 查询可用的编码器 / OCR 引擎 |
**给 AI 的使用建议**:用户说"看这张图",直接调用 `vision_analyze` 一次即可,无需任何调度;需要精细控制时再用 `vision_load_image` + 分步工具(后续工具只传 `image_id`,避免重复传 base64 浪费 token)。OCR 引擎在 server 启动时预热,首次调用不卡顿。
### 验证接入成功
注册后在客户端里对 AI 说:**"分析这张图:<图片路径>"**。AI 应自动调用 `vision_analyze` 并返回一份 Markdown 报告(含整体概览、局部细节、OCR 文字、坐标索引)。如果 AI 说找不到工具,检查 `.mcp.json` 的 command/args 和路径是否正确,重启客户端生效。
---
## 接入你的 AI Agent(不用 MCP,bash 方式)
> 📖 **给 agent 的完整知识卡见 [`AGENT-GUIDE.md`](AGENT-GUIDE.md)**(六层知识 + prompt 模板 + 调用示例)。
> 🎯 **现成 skill 见 [`skills/vision-reader/SKILL.md`](skills/vision-reader/SKILL.md)**——直接复制到 `.claude/skills/` 或 Reasonix skills 目录即可用。
不想用 MCP 时,CLI 本身即工具形态,任何 agent 都可以通过 bash 直接调用。做法:把下面的说明写进你的 agent 的 skill / 命令配置:
```markdown
# 看图的工具(vision-reader)
当需要理解一张图片时:
1. `uv run vision analyze <img> --out report.md` → 一键自动分析,读 report.md 理解图片
2. 需要更细看某区域时:`uv run vision crop <img> --region x1,y1,x2,y2 --encode ascii_art`
3. 需要读文字时:`uv run vision ocr <img> --region x1,y1,x2,y2`
```
前提:agent 运行环境已安装 vision-reader(`uv sync --extra dev --extra mcp`,或全局 `uv tool install . --extra mcp` 后直接用 `vision analyze`)。要点:坐标一律用归一化 (0~1);token 预算有限时优先 `ascii_art`。
---
## 项目结构
```
vision_reader/
├── image_io.py # 图片加载(路径/base64/bytes/ndarray)
├── coordinates.py # 归一化坐标 ↔ 像素换算、越界处理
├── crop.py # 裁剪 + LANCZOS 放大 + 灰度化
├── overview.py # 全图 chunk 网格摘要
├── analyzer.py # 一键自动分析(概览→选区域→编码→OCR→报告)
├── report.py # 多次观察汇总为 Markdown
├── cli.py # CLI 入口(vision 命令)
├── mcp_server.py # MCP server(FastMCP + stdio)
├── demo_runner.py # demo 完整链路
├── encoders/ # 可插拔编码器(grayscale_grid/ascii_art/color_stats)
├── ocr/ # 可插拔 OCR(easyocr 默认 / paddleocr 占位)
└── synthetic.py # 合成测试图生成
tests/ # pytest 单测(全部基于合成图)
demo/ # demo 脚本与输出
```
---
## 测试
```bash
uv run pytest -q
```
全部测试基于合成图,可复现;EasyOCR 用例在模型下载失败时自动跳过。
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues