Meta-package that pulls DeepSeek.OCR2.Core plus offline assets packages.
$ dotnet add package DeepSeek.OCR2DeepSeek.OCR2 是一个高性能 OCR 识别库,基于 DeepSeek-OCR-2 模型构建,提供简洁的 .NET API 接口。
DeepSeekOcr2 / DeepSeekOcr2Session:一键启动/复用服务的便捷入口DeepSeekOcr2Client:执行 OCR 识别的客户端DeepSeekOcr2LocalServer:本地服务管理器(自动处理依赖和模型加载)推荐使用 DeepSeek.OCR2 包(自动包含所需依赖):
dotnet add package DeepSeek.OCR2
或者使用核心包(更小的包体,首次运行会自动下载所需组件):
dotnet add package DeepSeek.OCR2.Core
DeepSeek.OCR2.Core:核心客户端 + 自动环境配置(默认在线安装依赖)DeepSeek.OCR2:完整包 = Core + 离线资产包(Python / wheels / 模型)DeepSeek.OCR2.Assets.Python.win-x64:Windows 便携 Python 环境(可选)DeepSeek.OCR2.Assets.Wheels.win-x64:离线依赖包(可选)DeepSeek.OCR2.Assets.Model:模型快照(可选)DeepSeek.OCR2.Bundled:单包全量离线版本(包体较大,适合私有源)识别一张图片:
using DeepSeek.OCR2;
var result = await DeepSeekOcr2.RecognizeFileAsync(@"D:\test.jpg");
Console.WriteLine(result.Text);
多次调用时复用模型实例,速度更快:
using DeepSeek.OCR2;
await using var session = await DeepSeekOcr2.CreateSessionAsync();
var request = DeepSeekOcr2Request.FromFile(@"D:\test.jpg") with
{
Prompt = "<image>\nFree OCR."
};
var result = await session.Client.RecognizeAsync(request);
Console.WriteLine(result.Text);
using System;
using DeepSeek.OCR2;
var options = new DeepSeekOcr2LocalServerOptions
{
// 设备选择:"cpu" 或 "cuda"
Device = "cpu",
// 计算精度:"float32" 或 "float16"
DType = "float32",
// 超时设置
OcrRequestTimeout = TimeSpan.FromMinutes(30),
};
await using var session = await DeepSeekOcr2.CreateSessionAsync(options);
var result = await session.Client.RecognizeAsync(
DeepSeekOcr2Request.FromFile(@"D:\test.jpg")
);
OcrRequestTimeout:单次 OCR 请求超时(默认 30 分钟)BootstrapDownloadTimeout:首次启动时下载组件的超时时间StartupTimeout:等待服务启动的超时时间GPU 加速(需要 CUDA 环境):
var options = new DeepSeekOcr2LocalServerOptions
{
Device = "cuda", // 使用 GPU
DType = "float16", // 降低显存占用
};
自定义模型和端口:
var options = new DeepSeekOcr2LocalServerOptions
{
ModelName = "deepseek-ai/DeepSeek-OCR-2", // 模型名称
Host = "localhost", // 监听地址
Port = 0, // 0=自动找空闲端口
};
离线模式:
var options = new DeepSeekOcr2LocalServerOptions
{
OfflineWheelDirectory = @"C:\wheels", // 离线依赖目录
PreferOfflineWheels = true, // 强制使用离线依赖
};
Core 包会把默认配置模板拷贝到引用方输出目录:
DeepSeek.OCR2/templates/deepseek-ocr2.defaults.json只要你的输出目录下存在这些路径(由 DeepSeek.OCR2 meta 包或 DeepSeek.OCR2.Bundled 自动拷贝),运行时会自动优先使用离线资源:
DeepSeek.OCR2/bundled/python/.../python.exe 存在:优先使用随包 Python,不再下载DeepSeek.OCR2/bundled/wheels/win-x64/*.whl 存在:自动作为离线 wheel 源(--find-links)DeepSeek.OCR2/bundled/models/DeepSeek-OCR-2 存在且包含模型文件:当 ModelName 为默认值时,自动改为加载该离线目录目录结构(会被打入 .nupkg 并在引用方输出目录自动复制到 DeepSeek.OCR2/bundled/):
dotnet/src/DeepSeek.OCR2/Bundled/python/<rid>/<version>/...dotnet/src/DeepSeek.OCR2/Bundled/wheels/<rid>/*.whldotnet/src/DeepSeek.OCR2/Bundled/models/DeepSeek-OCR-2/...准备 bundled 资产(会下载大量内容):
pwsh .\dotnet\bundle\prepare-bundled-assets.ps1 -TorchPreset cpu -ModelId deepseek-ai/DeepSeek-OCR-2
随后打包:
pwsh .\dotnet\pack.ps1 -PackBundled
首次启动需要下载模型和依赖项,可能需要较长时间。后续运行将直接使用本地缓存,速度会快很多。
如果担心超时,可以调大超时时间:
var options = new DeepSeekOcr2LocalServerOptions
{
OcrRequestTimeout = TimeSpan.FromMinutes(60),
};
调试时如遇到内存相关错误提示:
如果设置 Device="cuda" 但报错,可能是因为:
Device="cpu" 或使用完整包自动配置 CUDA 环境DeepSeek.OCR2 在本地启动一个优化的推理服务,.NET 客户端通过本地 HTTP 接口调用:
session 模式可复用模型实例,大幅提升性能HTTP 接口:
GET /health:健康检查POST /ocr:执行 OCR 识别打包(输出到 dotnet/artifacts/):
pwsh .\dotnet\pack.ps1 -Configuration Release -Output artifacts
发布(推荐,脚本会打包、推送,并把内部依赖包设为 unlisted):
$env:NUGET_API_KEY = "<your-nuget-api-key>"
pwsh .\dotnet\publish-nuget.ps1 -Version x.y.z
如你在“系统环境变量/用户环境变量”里设置了 NUGET_API_KEY(或用 setx),需要重启当前终端/Visual Studio 才会生效。
如果 unlist 阶段返回 403,通常是 API Key 缺少 Unlist 权限,或当前账号不是这些包的 Owner。
跳过发布超大 bundled 包:
pwsh .\dotnet\publish-nuget.ps1 -Version x.y.z -IncludeBundled:$false
只推送(不做 unlist、不自动 pack,适合你自己控制流程):
$env:NUGET_API_KEY = "<your-nuget-api-key>"
pwsh .\dotnet\push.ps1
GitHub Actions 自动发布:
NUGET_API_KEYv* 会触发发布工作流git tag v0.3.8
git push origin v0.3.8