Retto provides several feature flags to customize your build:
Cargo.toml
[dependencies]retto-core = { version = "0.1.5", features = [ "serde", # Enable JSON serialization support "backend-ort", # Enable ONNX Runtime backend (CPU) "hf-hub", # Enable HuggingFace Hub model loading]}
The backend-ort feature is required for using the default ONNX Runtime worker. Additional backend features are available for GPU acceleration (see Backends).
use retto_core::prelude::*;use std::fs;fn main() -> Result<(), Box<dyn std::error::Error>> { // Configure the session let cfg = RettoSessionConfig { worker_config: RettoOrtWorkerConfig::default(), ..Default::default() }; // Create the session let mut session = RettoSession::new(cfg)?; // Load and process an image let image_data = fs::read("sample.png")?; let result = session.run(image_data)?; // Print recognized text println!("Found {} text regions", result.rec_result.0.len()); for (i, rec) in result.rec_result.0.iter().enumerate() { println!("Region {}: {} (confidence: {:.2})", i + 1, rec.text, rec.score); } Ok(())}
For real-time feedback during OCR processing, use run_stream:
use retto_core::prelude::*;use std::sync::mpsc;let (tx, rx) = mpsc::channel::<RettoWorkerStageResult>();// Run OCR in streaming modesession.run_stream(image_data, tx)?;// Process results as they arrivefor stage in rx { match stage { RettoWorkerStageResult::Det(det) => { println!("Detection complete: {} regions found", det.0.len()); } RettoWorkerStageResult::Cls(cls) => { println!("Classification complete"); } RettoWorkerStageResult::Rec(rec) => { println!("Recognition complete"); for r in &rec.0 { println!(" - {}", r.text); } } }}
From the test suite in session.rs:206, here’s how Retto handles rotated text:
use retto_core::prelude::*;use image::{ImageFormat, RgbImage};use std::io::Cursor;let text = "玩原神玩的";let (w, h) = (200.0, 50.0);// Create test image (implementation details omitted)let image: RgbImage = create_rotated_text_image(text, 180.0, w, h);// Encode to PNGlet mut buf = Vec::new();image.write_to(&mut Cursor::new(&mut buf), ImageFormat::Png)?;// Run OCRlet cfg = RettoSessionConfig { worker_config: RettoOrtWorkerConfig::default(), ..Default::default()};let mut session = RettoSession::new(cfg)?;let result = session.run(buf)?;// Verify resultsassert_eq!(result.cls_result.0[0].label.label, 180);assert_eq!(result.rec_result.0[0].text, text);
The session is not thread-safe by default. If you need to process multiple images concurrently, create separate sessions or use proper synchronization.