我正在尝试使用 tract_onnx 将使用 onnxruntime 的 Python 脚本转换为 Rust。我正在尝试实现的特定 POC 是来自 ONNX Model Zoo的rothe_vgg.py
脚本。该脚本使用三个模型:
- 超人脸检测 (
version-RFB-320.onnx
) vgg_ilsvrc_16_age_imdb_wiki.onnx
以及vgg_ilsvrc_16_gender_imdb_wiki.onnx
年龄和性别模型
目前,我正在尝试第一个检测人脸的模型。我可以让示例 Python 代码工作:
face_detector_onnx = "models/version-RFB-320.onnx"
face_detector = ort.InferenceSession(face_detector_onnx)
def faceDetector(orig_image, threshold = 0.7):
image = cv2.cvtColor(orig_image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (320, 240))
image_mean = np.array([127, 127, 127])
image = (image - image_mean) / 128
image = np.transpose(image, [2, 0, 1])
image = np.expand_dims(image, axis=0)
image = image.astype(np.float32)
input_name = face_detector.get_inputs()[0].name
confidences, boxes = face_detector.run(None, {input_name: image})
boxes, labels, probs = predict(orig_image.shape[1], orig_image.shape[0], confidences, boxes, threshold)
return boxes, labels, probs
我的 tract_onnx 翻译基于onnx-mobilenet-v2 示例。我的版本目前看起来像这样:
let model = onnx()
.model_for_path("version-RFB-320.onnx")?
.with_input_fact(
0,
InferenceFact::dt_shape(f32::datum_type(), tvec!(1, 3, 240, 320)),
)?
.into_optimized()?
.into_runnable()?;
let image = image::open("bruce.jpg").unwrap().to_rgb8();
let resized = image::imageops::resize(&image, 240, 320, ::image::imageops::FilterType::Triangle);
let image: Tensor = tract_ndarray::Array4::from_shape_fn((1, 3, 240, 320), |(_, c, y, x)| {
resized[(x as _, y as _)][c] as f32 / 255.0
}).into();
let result = model.run(tvec!(image))?;
我在将调整大小的图像转换为张量时遇到了问题:
thread 'main' panicked at 'Image index (240, 0) out of bounds (240, 320)'.
这是没有正确尺寸或每个尺寸的正确顺序的问题吗?我错过了什么吗?
我知道我还没有实现其他翻译,这是我的下一个问题:如何正确规范化image_mean
、转置和扩展维度?