准备 - core:内置官方字符集(OLD/BETA)与 ModelMetadata::from_builtin_* 构造器 - ort:导出 Session、实现 Info、修正 cuda feature 接线、共享推理工具 - tract2:包名更名(原 ddddocr-tract 已被占用)并完成规范整改 - 集成测试按领域拆分(ocr / det / slide / common / api_surface) - 发布准备:Cargo.toml 元数据、workspace 版本 0.2.4、LICENSE/ NOTICE、README 模型下载说明
75 lines
2.6 KiB
Rust
75 lines
2.6 KiB
Rust
//! 外部视角 API 测试:验证 `ddddocr-tract2` 的公开类型与方法在外部 crate 中可正常使用。
|
|
|
|
use ddddocr_core::Resize;
|
|
use ddddocr_core::traits::{Info, Loader};
|
|
use ddddocr_core::types::AxisDim;
|
|
use ddddocr_tract2::loader::ModelLoader;
|
|
use ddddocr_tract2::{
|
|
DetRuntime, ModelMetadata, Normalization, OcrBuilder, OcrRuntime, Session, SlideResult, Slider,
|
|
};
|
|
use std::path::{Path, PathBuf};
|
|
|
|
fn model_path(name: &str) -> PathBuf {
|
|
Path::new(env!("CARGO_MANIFEST_DIR"))
|
|
.join("..")
|
|
.join("models")
|
|
.join(name)
|
|
}
|
|
|
|
/// 验证对外导出的类型(含 `Session` 与 core 便捷重导出)均可直接命名。
|
|
#[test]
|
|
fn public_types_are_nameable() {
|
|
let _: Option<Session> = None;
|
|
let _: Option<OcrBuilder> = None;
|
|
let _: Option<SlideResult> = None;
|
|
let _slider = Slider::new();
|
|
}
|
|
|
|
/// 验证构建器链式 API 可组合使用,且返回的会话类型可显式标注。
|
|
#[test]
|
|
fn loader_chain_builds_session() -> anyhow::Result<()> {
|
|
let path = model_path("common_sml2h3_f32.onnx");
|
|
assert!(path.exists(), "缺少测试模型: {}", path.display());
|
|
let _session: Session = ModelLoader::default().num_threads(4).build_for_path(path)?;
|
|
Ok(())
|
|
}
|
|
|
|
/// 验证 `Info` trait 能从真实会话中解析输入/输出信息。
|
|
#[test]
|
|
fn info_trait_returns_model_metadata() -> anyhow::Result<()> {
|
|
let path = model_path("common_sml2h3_f32.onnx");
|
|
assert!(path.exists(), "缺少测试模型: {}", path.display());
|
|
let session: Session = ModelLoader::default().build_for_path(path)?;
|
|
let metadata = ModelMetadata::from_static_slice(
|
|
&["a", "b"],
|
|
false,
|
|
Resize::DynamicWidth(64),
|
|
1,
|
|
Normalization::MinusOneToOne,
|
|
);
|
|
let ocr = OcrRuntime::new(session, metadata);
|
|
|
|
let inputs = ocr.input_info()?;
|
|
let outputs = ocr.output_info()?;
|
|
assert!(!inputs.is_empty());
|
|
assert!(!outputs.is_empty());
|
|
assert!(matches!(inputs[0].shape[0], AxisDim::Static(1)));
|
|
assert!(matches!(inputs[0].shape[2], AxisDim::Static(64)));
|
|
|
|
let model_info = ocr.model_info()?;
|
|
assert_eq!(model_info.inputs.len(), inputs.len());
|
|
assert_eq!(model_info.outputs.len(), outputs.len());
|
|
assert!(model_info.providers.is_none());
|
|
Ok(())
|
|
}
|
|
|
|
/// 验证检测运行时可以从构建的会话创建。
|
|
#[test]
|
|
fn det_runtime_builds_from_session() -> anyhow::Result<()> {
|
|
let path = model_path("common_det.onnx");
|
|
assert!(path.exists(), "缺少测试模型: {}", path.display());
|
|
let session: Session = ModelLoader::default().build_for_path(path)?;
|
|
let _det = DetRuntime::new(session);
|
|
Ok(())
|
|
}
|