use ort::{session::builder::SessionBuilder, value::Value};
use ndarray::Array;
use std::path::Path;

fn main() -> anyhow::Result<()> {
    ort::set_api(ort_tract::api());

    let mut session = SessionBuilder::new()?
        // путь к ONNX файлу
        .commit_from_file("./vision_model_int8.onnx")?;

    // 2) Загрузим картинку и конвертируем в тензор
    let img = image::open(Path::new("./example.png"))?
        .to_rgb8();
    let resized = image::imageops::resize(&img, 224, 224, image::imageops::FilterType::Nearest);

    let input_tensor: Vec<f32> = resized
        .pixels()
        .flat_map(|p| {
            let [r, g, b] = p.0;
            // нормализация в float 0.0–1.0
            vec![r as f32 / 255.0, g as f32 / 255.0, b as f32 / 255.0]
        })
        .collect();

    // ORT ожидaет форму, напр: [1, 3, H, W]
    let input_array = Array::from_shape_vec((1, 3, 224, 224), input_tensor)?;

    // 3) Создаём Ort Value
    let input_value = Value::from_array(input_array)?;

    // 4) Инференс
    let outputs = session.run(vec![("images", &input_value)])?;

    // 5) Забираем эмбеддинги/выход
    let embedding: Vec<f32> = outputs[0].try_extract_array()?.to_owned().into_raw_vec_and_offset().0;

    println!("Embeddings len: {}", embedding.len());
    Ok(())
}

Изменить пасту