@@ -465,6 +465,75 @@ Json run_transcribe(trtmc::ITask& task, const Json& request, const Timing& timin
465465 });
466466}
467467
468+ template <class T >
469+ void write_binary_artifact (const std::string& path, const T* values, std::uint64_t count) {
470+ if (count > static_cast <std::uint64_t >(std::numeric_limits<std::streamsize>::max ()) / sizeof (T))
471+ throw std::runtime_error (" binary artifact is too large" );
472+ std::ofstream output (path, std::ios::binary);
473+ output.exceptions (std::ios::badbit | std::ios::failbit);
474+ output.write (reinterpret_cast <const char *>(values),
475+ static_cast <std::streamsize>(count * sizeof (T)));
476+ output.close ();
477+ }
478+
479+ Json run_geometry (trtmc::ITask& task, const Json& request, const Timing& timing) {
480+ auto & interface = require_interface<trtmc::IMonocularGeometry>(task, " IMonocularGeometry" );
481+ const auto path = request.at (" image_path" ).get <std::string>();
482+ std::optional<Image> cached;
483+ if (!timing.asset_loading_included )
484+ cached = read_image (path);
485+ auto invoke = [&]() {
486+ std::optional<Image> loaded;
487+ if (!cached)
488+ loaded = read_image (path);
489+ const auto & image = cached ? *cached : *loaded;
490+ return interface.estimate_geometry (image.pixels .data (), image.height , image.width );
491+ };
492+ std::optional<trtmc::GeometryResult> last;
493+ for (int index = 0 ; index < timing.warmup ; ++index)
494+ last = invoke ();
495+ Json observations = Json::array ();
496+ for (int index = 0 ; index < timing.iterations ; ++index) {
497+ last.reset ();
498+ const auto started = Clock::now ();
499+ auto result = invoke ();
500+ const auto wall_ms = elapsed_ms (started);
501+ last.emplace (std::move (result));
502+ observations.push_back ({{" runtime_e2e_wall_ms" , wall_ms},
503+ {" geometry_images" , 1 },
504+ {" geometry_pixels" , last->depth .size ()}});
505+ }
506+ if (last->height <= 0 || last->width <= 0 )
507+ throw std::runtime_error (" monocular geometry returned invalid dimensions" );
508+ const auto pixels = static_cast <std::size_t >(last->height ) * last->width ;
509+ if (last->points .size () != pixels * 3 || last->depth .size () != pixels ||
510+ last->mask .size () != pixels)
511+ throw std::runtime_error (" monocular geometry returned inconsistent output shapes" );
512+ const auto prefix = request.at (" _artifact_prefix" ).get <std::string>();
513+ write_binary_artifact (prefix + " .points.f32" , last->points .data (), last->points .size ());
514+ write_binary_artifact (prefix + " .depth.f32" , last->depth .data (), last->depth .size ());
515+ write_binary_artifact (prefix + " .mask.u8" , last->mask .data (), last->mask .size ());
516+ Json intrinsics = Json::array ();
517+ for (int row = 0 ; row < 3 ; ++row)
518+ intrinsics.push_back ({last->intrinsics [row * 3 ], last->intrinsics [row * 3 + 1 ],
519+ last->intrinsics [row * 3 + 2 ]});
520+ return {{" observations" , std::move (observations)},
521+ {" output_summary" ,
522+ {{" geometry_images" , 1 },
523+ {" geometry_pixels" , pixels},
524+ {" height" , last->height },
525+ {" width" , last->width },
526+ {" point_shape" , {last->height , last->width , 3 }},
527+ {" valid_pixels" , std::count (last->mask .begin (), last->mask .end (), std::uint8_t {1 })},
528+ {" normalized_intrinsics" , std::move (intrinsics)},
529+ {" units" , " meters" },
530+ {" camera_axes" , {" right" , " down" , " forward" }},
531+ {" intrinsics_coordinates" , " normalized_uv" },
532+ {" points_artifact" , prefix + " .points.f32" },
533+ {" depth_artifact" , prefix + " .depth.f32" },
534+ {" valid_mask_artifact" , prefix + " .mask.u8" }}}};
535+ }
536+
468537Json run_segment (trtmc::ITask& task, const Json& request, const Timing& timing) {
469538 auto & interface = require_interface<trtmc::ISegmentation>(task, " ISegmentation" );
470539 const Image image = read_image (request.at (" image_path" ).get <std::string>());
@@ -2894,17 +2963,6 @@ Json run_track_pose(const trtmc::Model& model, const Json& request, const Timing
28942963 });
28952964}
28962965
2897- template <class T >
2898- void write_binary_artifact (const std::string& path, const T* values, std::uint64_t count) {
2899- if (count > static_cast <std::uint64_t >(std::numeric_limits<std::streamsize>::max ()) / sizeof (T))
2900- throw std::runtime_error (" binary artifact is too large" );
2901- std::ofstream output (path, std::ios::binary);
2902- output.exceptions (std::ios::badbit | std::ios::failbit);
2903- output.write (reinterpret_cast <const char *>(values),
2904- static_cast <std::streamsize>(count * sizeof (T)));
2905- output.close ();
2906- }
2907-
29082966Json run_geometry (const trtmc::Model& model, const Json& request, const Timing& timing,
29092967 const std::string& task_id) {
29102968 const auto task = task_for_operation<trtmc::ImageToMetricGeometry>(model, task_id);
@@ -3796,6 +3854,7 @@ Json execute(const Json& request, const std::string& output_path) {
37963854 {" classify" , run_classify},
37973855 {" detect" , run_detect},
37983856 {" extract_features" , run_extract_features},
3857+ {" geometry" , run_geometry},
37993858 {" disparity" , run_disparity},
38003859 {" rerank" , run_rerank},
38013860 {" encode" , run_encode},
0 commit comments