载入中...
搜索中...
未找到
SmrOnnxRunner.cpp
浏览该文件的文档.
2
3#include "common/Diagnostic.h"
4
5#include <cstring>
6#include <fstream>
7#include <vector>
8
9namespace eve::animation {
10namespace {
11
12tensor::OnnxNamedTensor makeF32(const char* name, std::vector<int64_t> shape, const std::vector<float>& data) {
13 tensor::OnnxNamedTensor named;
14 named.name = name;
15 named.tensor.element = tensor::OnnxElement::Float32;
16 named.tensor.shape = std::move(shape);
17 named.tensor.bytes.resize(data.size() * sizeof(float));
18 if (!data.empty()) std::memcpy(named.tensor.bytes.data(), data.data(), named.tensor.bytes.size());
19 return named;
20}
21
22} // namespace
23
24Result<void> SmrOnnxRunner::load(std::span<const uint8_t> bytes) {
25 auto loaded = tensor::OnnxModel::load(bytes);
26 if (!loaded.ok()) return Result<void>::failure(loaded.status());
27 model_ = std::move(loaded.value());
28 return Result<void>::success();
29}
30
32 std::ifstream file(path, std::ios::binary | std::ios::ate);
33 if (!file) {
34 return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "SmrOnnxRunner: open failed", path));
35 }
36 const auto size = static_cast<std::streamoff>(file.tellg());
37 if (size <= 0) {
39 Diagnostic::error(DiagnosticCode::InvalidArgument, "SmrOnnxRunner: empty file", path));
40 }
41 std::vector<uint8_t> bytes(static_cast<size_t>(size));
42 file.seekg(0);
43 if (!file.read(reinterpret_cast<char*>(bytes.data()), static_cast<std::streamsize>(bytes.size()))) {
44 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Failed, "SmrOnnxRunner: read failed", path));
45 }
46 return load(bytes);
47}
48
50 if (!model_) return {};
51 return model_->info();
52}
53
55 if (!model_) {
56 return Result<std::vector<float>>::failure(
58 }
59 if (features.frames <= 0 || features.joints <= 0) {
60 return Result<std::vector<float>>::failure(
61 Diagnostic::error(DiagnosticCode::InvalidArgument, "SmrOnnxRunner: empty features"));
62 }
63 const int64_t T = features.frames;
64 const int64_t J = features.joints;
65 const int64_t S = std::max(features.sensors, 1);
66 const int64_t P = std::max(features.pairs, 1);
67
68 std::vector<tensor::OnnxNamedTensor> feeds;
69 feeds.push_back(makeF32("source_rot6d", {1, T, J, 6}, features.sourceRot6d));
70 feeds.push_back(makeF32("source_geom", {1, S, 7}, features.sourceGeom));
71 feeds.push_back(makeF32("target_geom", {1, S, 7}, features.targetGeom));
72 feeds.push_back(makeF32("source_dmi", {1, T, P, 10}, features.sourceDmi));
73
74 const std::string outName = "target_rot6d";
75 auto ran = model_->run(feeds, std::span<const std::string>(&outName, 1));
76 if (!ran.ok()) return Result<std::vector<float>>::failure(ran.status());
77 if (ran.value().empty()) {
78 return Result<std::vector<float>>::failure(
79 Diagnostic::error(DiagnosticCode::Failed, "SmrOnnxRunner: missing output"));
80 }
81 const auto& bytes = ran.value()[0].tensor.bytes;
82 std::vector<float> out(bytes.size() / sizeof(float));
83 if (!out.empty()) std::memcpy(out.data(), bytes.data(), out.size() * sizeof(float));
84 return Result<std::vector<float>>::success(std::move(out));
85}
86
87} // namespace eve::animation
Stable, structured diagnostics shared by engine modules.
filesystem::File * file
ShaderImageInput shape
std::uint64_t bytes
std::string name
std::string path
Definition PlayHost.cpp:110
float size
Definition TreeMesh.cpp:156
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
tensor::OnnxModelInfo info() const
Info.
Result< void > loadFile(const std::string &path)
Loads file.
Result< void > load(std::span< const uint8_t > bytes)
Loads .
Result< std::vector< float > > run(const SmrFeatureBatch &features) const
Run.
static Result< std::unique_ptr< OnnxModel > > load(std::span< const uint8_t > bytes)
Import bounded in-memory ONNX ModelProto; copies all retained data.
Definition OnnxModel.cpp:13
Packed MeshRet-style features for one retarget inference window.
Definition SmrFeatures.h:15
std::vector< float > targetGeom
[S*7]
Definition SmrFeatures.h:23
std::vector< float > sourceRot6d
[T*J*6]
Definition SmrFeatures.h:21
std::vector< float > sourceDmi
[T*P*10]
Definition SmrFeatures.h:24
std::vector< float > sourceGeom
[S*7]
Definition SmrFeatures.h:22
Owning admission report; unsupported nodes remain inspectable but cannot execute.
Definition OnnxModel.h:48