diff options
| author | Michael Welter <michael@welter-4d.de> | 2022-05-18 22:15:02 +0200 | 
|---|---|---|
| committer | Michael Welter <michael@welter-4d.de> | 2022-05-19 20:47:11 +0200 | 
| commit | e3de47abc3eba2d1cebc94943a203623c6545f3f (patch) | |
| tree | 72716f134ddb363c17f00bee9d854beb9387b621 /tracker-neuralnet | |
| parent | e1d17f2d413de5f548931eaf9dfed2155e830096 (diff) | |
tracker/nn: Use postfix underscore to indicate class member variables
Diffstat (limited to 'tracker-neuralnet')
| -rw-r--r-- | tracker-neuralnet/ftnoir_tracker_neuralnet.cpp | 491 | ||||
| -rw-r--r-- | tracker-neuralnet/ftnoir_tracker_neuralnet.h | 113 | ||||
| -rw-r--r-- | tracker-neuralnet/lang/nl_NL.ts | 16 | ||||
| -rw-r--r-- | tracker-neuralnet/lang/ru_RU.ts | 16 | ||||
| -rw-r--r-- | tracker-neuralnet/lang/stub.ts | 16 | ||||
| -rw-r--r-- | tracker-neuralnet/lang/zh_CN.ts | 16 | 
6 files changed, 335 insertions, 333 deletions
diff --git a/tracker-neuralnet/ftnoir_tracker_neuralnet.cpp b/tracker-neuralnet/ftnoir_tracker_neuralnet.cpp index 352baf29..5439b38e 100644 --- a/tracker-neuralnet/ftnoir_tracker_neuralnet.cpp +++ b/tracker-neuralnet/ftnoir_tracker_neuralnet.cpp @@ -320,49 +320,49 @@ int enum_to_fps(int value)  Localizer::Localizer(Ort::MemoryInfo &allocator_info, Ort::Session &&session) : -    session{std::move(session)}, -    scaled_frame(input_img_height, input_img_width, CV_8U), -    input_mat(input_img_height, input_img_width, CV_32F) +    session_{std::move(session)}, +    scaled_frame_(INPUT_IMG_HEIGHT, INPUT_IMG_WIDTH, CV_8U), +    input_mat_(INPUT_IMG_HEIGHT, INPUT_IMG_WIDTH, CV_32F)  {      // Only works when input_mat does not reallocated memory ...which it should not.      // Non-owning memory reference to input_mat?      // Note: shape = (bach x channels x h x w) -    const std::int64_t input_shape[4] = { 1, 1, input_img_height, input_img_width }; -    input_val = Ort::Value::CreateTensor<float>(allocator_info, input_mat.ptr<float>(0), input_mat.total(), input_shape, 4); +    const std::int64_t input_shape[4] = { 1, 1, INPUT_IMG_HEIGHT, INPUT_IMG_WIDTH }; +    input_val_ = Ort::Value::CreateTensor<float>(allocator_info, input_mat_.ptr<float>(0), input_mat_.total(), input_shape, 4);      const std::int64_t output_shape[2] = { 1, 5 }; -    output_val = Ort::Value::CreateTensor<float>(allocator_info, results.data(), results.size(), output_shape, 2); +    output_val_ = Ort::Value::CreateTensor<float>(allocator_info, results_.data(), results_.size(), output_shape, 2);  }  std::pair<float, cv::Rect2f> Localizer::run(      const cv::Mat &frame)  { -    auto p = input_mat.ptr(0); +    auto p = input_mat_.ptr(0); -    cv::resize(frame, scaled_frame, { input_img_width, input_img_height }, 0, 0, cv::INTER_AREA); -    scaled_frame.convertTo(input_mat, CV_32F, 1./255., -0.5); +    cv::resize(frame, scaled_frame_, { INPUT_IMG_WIDTH, INPUT_IMG_HEIGHT }, 0, 0, cv::INTER_AREA); +    scaled_frame_.convertTo(input_mat_, CV_32F, 1./255., -0.5); -    assert (input_mat.ptr(0) == p); -    assert (!input_mat.empty() && input_mat.isContinuous()); -    assert (input_mat.cols == input_img_width && input_mat.rows == input_img_height); +    assert (input_mat_.ptr(0) == p); +    assert (!input_mat_.empty() && input_mat_.isContinuous()); +    assert (input_mat_.cols == INPUT_IMG_WIDTH && input_mat_.rows == INPUT_IMG_HEIGHT);      const char* input_names[] = {"x"};      const char* output_names[] = {"logit_box"};      Timer t; t.start(); -    session.Run(Ort::RunOptions{nullptr}, input_names, &input_val, 1, output_names, &output_val, 1); +    session_.Run(Ort::RunOptions{nullptr}, input_names, &input_val_, 1, output_names, &output_val_, 1); -    last_inference_time = t.elapsed_ms(); +    last_inference_time_ = t.elapsed_ms();      const cv::Rect2f roi = unnormalize(cv::Rect2f{ -        results[1], -        results[2], -        results[3]-results[1], // Width -        results[4]-results[2] // Height +        results_[1], +        results_[2], +        results_[3]-results_[1], // Width +        results_[4]-results_[2] // Height      }, frame.rows, frame.cols); -    const float score = sigmoid(results[0]); +    const float score = sigmoid(results_[0]);      return { score, roi };  } @@ -370,90 +370,91 @@ std::pair<float, cv::Rect2f> Localizer::run(  double Localizer::last_inference_time_millis() const  { -    return last_inference_time; +    return last_inference_time_;  }  PoseEstimator::PoseEstimator(Ort::MemoryInfo &allocator_info, Ort::Session &&_session)  -    : model_version{_session.GetModelMetadata().GetVersion()} -    , session{std::move(_session)} -    , allocator{session, allocator_info} +    : model_version_{_session.GetModelMetadata().GetVersion()} +    , session_{std::move(_session)} +    , allocator_{session_, allocator_info}  {      using namespace std::literals::string_literals; -    if (session.GetOutputCount() < 2) +    if (session_.GetOutputCount() < 2)          throw std::runtime_error("Invalid Model: must have at least two outputs"); -    // WARNING +    // WARNING UB .. but still ...      // If the model was saved without meta data, it seems the version field is uninitialized.      // In that case reading from it is UB. However, we will just get same arbitrary number      // which is hopefully different from the numbers used by models where the version is set. -    if (model_version != 2) -        model_version = 1; +    // I.e., this is what happended in practice so far. +    if (model_version_ != 2) +        model_version_ = 1; -    const cv::Size input_image_shape = get_input_image_shape(session); +    const cv::Size input_image_shape = get_input_image_shape(session_); -    scaled_frame = cv::Mat(input_image_shape, CV_8U); -    input_mat = cv::Mat(input_image_shape, CV_32F);  +    scaled_frame_ = cv::Mat(input_image_shape, CV_8U); +    input_mat_ = cv::Mat(input_image_shape, CV_32F);       {          const std::int64_t input_shape[4] = { 1, 1, input_image_shape.height, input_image_shape.width }; -        input_val.push_back( -            Ort::Value::CreateTensor<float>(allocator_info, input_mat.ptr<float>(0), input_mat.total(), input_shape, 4)); +        input_val_.push_back( +            Ort::Value::CreateTensor<float>(allocator_info, input_mat_.ptr<float>(0), input_mat_.total(), input_shape, 4));      }      {          const std::int64_t output_shape[2] = { 1, 3 }; -        output_val.push_back(Ort::Value::CreateTensor<float>( -            allocator_info, &output_coord[0], output_coord.rows, output_shape, 2)); +        output_val_.push_back(Ort::Value::CreateTensor<float>( +            allocator_info, &output_coord_[0], output_coord_.rows, output_shape, 2));      }      {          const std::int64_t output_shape[2] = { 1, 4 }; -        output_val.push_back(Ort::Value::CreateTensor<float>( -            allocator_info, &output_quat[0], output_quat.rows, output_shape, 2)); +        output_val_.push_back(Ort::Value::CreateTensor<float>( +            allocator_info, &output_quat_[0], output_quat_.rows, output_shape, 2));      }      size_t num_regular_outputs = 2; -    if (session.GetOutputCount() >= 3 && "box"s == session.GetOutputName(2, allocator)) +    if (session_.GetOutputCount() >= 3 && "box"s == session_.GetOutputName(2, allocator_))      {          const std::int64_t output_shape[2] = { 1, 4 }; -        output_val.push_back(Ort::Value::CreateTensor<float>( -            allocator_info, &output_box[0], output_box.rows, output_shape, 2)); +        output_val_.push_back(Ort::Value::CreateTensor<float>( +            allocator_info, &output_box_[0], output_box_.rows, output_shape, 2));          ++num_regular_outputs;          qDebug() << "Note: Legacy model output for face ROI is currently ignored";      } -    num_recurrent_states = session.GetInputCount()-1; -    if (session.GetOutputCount()-num_regular_outputs != num_recurrent_states) +    num_recurrent_states_ = session_.GetInputCount()-1; +    if (session_.GetOutputCount()-num_regular_outputs != num_recurrent_states_)          throw std::runtime_error("Invalid Model: After regular inputs and outputs the model must have equal number of inputs and outputs for tensors holding hidden states of recurrent layers.");      // Create tensors for recurrent state -    for (size_t i = 0; i < num_recurrent_states; ++i) +    for (size_t i = 0; i < num_recurrent_states_; ++i)      { -        const auto& input_info = session.GetInputTypeInfo(1+i); -        const auto& output_info = session.GetOutputTypeInfo(num_regular_outputs+i); +        const auto& input_info = session_.GetInputTypeInfo(1+i); +        const auto& output_info = session_.GetOutputTypeInfo(num_regular_outputs+i);          if (input_info.GetTensorTypeAndShapeInfo().GetShape() !=               output_info.GetTensorTypeAndShapeInfo().GetShape())              throw std::runtime_error("Invalid Model: Tensors for recurrent hidden states should have same shape on intput and output"); -        input_val.push_back(create_tensor(input_info, allocator)); -        output_val.push_back(create_tensor(output_info, allocator)); +        input_val_.push_back(create_tensor(input_info, allocator_)); +        output_val_.push_back(create_tensor(output_info, allocator_));      } -    for (size_t i = 0; i < session.GetInputCount(); ++i) +    for (size_t i = 0; i < session_.GetInputCount(); ++i)      { -        input_names.push_back(session.GetInputName(i, allocator)); +        input_names_.push_back(session_.GetInputName(i, allocator_));      } -    for (size_t i = 0; i < session.GetOutputCount(); ++i) +    for (size_t i = 0; i < session_.GetOutputCount(); ++i)      { -        output_names.push_back(session.GetOutputName(i, allocator)); +        output_names_.push_back(session_.GetOutputName(i, allocator_));      } -    qDebug() << "Model inputs: " << session.GetInputCount() << ", outputs: " << session.GetOutputCount() << ", recurrent states: " << num_recurrent_states; +    qDebug() << "Model inputs: " << session_.GetInputCount() << ", outputs: " << session_.GetOutputCount() << ", recurrent states: " << num_recurrent_states_; -    assert (input_names.size() == input_val.size()); -    assert (output_names.size() == output_val.size()); +    assert (input_names_.size() == input_val_.size()); +    assert (output_names_.size() == output_val_.size());  } @@ -464,9 +465,9 @@ int PoseEstimator::find_input_intensity_90_pct_quantile() const      float range[] = { 0, 256 };      const float* ranges[] = { range };      cv::Mat hist; -    cv::calcHist(&scaled_frame, 1,  channels, cv::Mat(), hist, 1, hist_size, ranges, true, false); +    cv::calcHist(&scaled_frame_, 1,  channels, cv::Mat(), hist, 1, hist_size, ranges, true, false);      int gray_level = 0; -    const int num_pixels_quantile = scaled_frame.total()*0.9f; +    const int num_pixels_quantile = scaled_frame_.total()*0.9f;      int num_pixels_accum = 0;      for (int i=0; i<hist_size[0]; ++i)      { @@ -498,33 +499,33 @@ std::optional<PoseEstimator::Face> PoseEstimator::run(      if (cropped.rows != patch_size || cropped.cols != patch_size)          return {}; -    auto p = input_mat.ptr(0); +    auto p = input_mat_.ptr(0); -    cv::resize(cropped, scaled_frame, scaled_frame.size(), 0, 0, cv::INTER_AREA); +    cv::resize(cropped, scaled_frame_, scaled_frame_.size(), 0, 0, cv::INTER_AREA);      // Automatic brightness amplification.      const int brightness = find_input_intensity_90_pct_quantile();      const double alpha = brightness<127 ? 0.5/std::max(5,brightness) : 1./255;      const double beta = -0.5; -    scaled_frame.convertTo(input_mat, CV_32F, alpha, beta); +    scaled_frame_.convertTo(input_mat_, CV_32F, alpha, beta); -    assert (input_mat.ptr(0) == p); -    assert (!input_mat.empty() && input_mat.isContinuous()); +    assert (input_mat_.ptr(0) == p); +    assert (!input_mat_.empty() && input_mat_.isContinuous());      Timer t; t.start();      try      { -        session.Run( +        session_.Run(              Ort::RunOptions{ nullptr },  -            input_names.data(),  -            input_val.data(),  -            input_val.size(),  -            output_names.data(),  -            output_val.data(),  -            output_val.size()); +            input_names_.data(),  +            input_val_.data(),  +            input_val_.size(),  +            output_names_.data(),  +            output_val_.data(),  +            output_val_.size());      }      catch (const Ort::Exception &e)      { @@ -532,14 +533,14 @@ std::optional<PoseEstimator::Face> PoseEstimator::run(          return {};      } -    for (size_t i = 0; i<num_recurrent_states; ++i) +    for (size_t i = 0; i<num_recurrent_states_; ++i)      {          // Next step, the current output becomes the input.          // Thus we realize the recurrent connection.          // Only swaps the internal pointers. There is no copy of data.          std::swap( -            output_val[output_val.size()-num_recurrent_states+i], -            input_val[input_val.size()-num_recurrent_states+i]); +            output_val_[output_val_.size()-num_recurrent_states_+i], +            input_val_[input_val_.size()-num_recurrent_states_+i]);      }      // FIXME: Execution time fluctuates wildly. 19 to 26 msec. Why? @@ -547,35 +548,35 @@ std::optional<PoseEstimator::Face> PoseEstimator::run(      //        issue. The ONNX api suggests that tensor are allocated in an      //        arena. Does that matter? Maybe the issue is something else? -    last_inference_time = t.elapsed_ms(); +    last_inference_time_ = t.elapsed_ms();      // Perform coordinate transformation.      // From patch-local normalized in [-1,1] to      // frame unnormalized pixel coordinatesettings.      const cv::Point2f center = patch_center +  -        (0.5f*patch_size)*cv::Point2f{output_coord[0], output_coord[1]}; +        (0.5f*patch_size)*cv::Point2f{output_coord_[0], output_coord_[1]}; -    const float size = patch_size*0.5f*output_coord[2]; +    const float size = patch_size*0.5f*output_coord_[2];      // Following Eigen which uses quat components in the order w, x, y, z.      quat rotation = {  -        output_quat[3],  -        output_quat[0],  -        output_quat[1],  -        output_quat[2] }; +        output_quat_[3],  +        output_quat_[0],  +        output_quat_[1],  +        output_quat_[2] }; -    if (model_version < 2) +    if (model_version_ < 2)      {          // Due to a change in coordinate conventions          rotation = world_to_image(rotation);      }      const cv::Rect2f outbox = { -        patch_center.x + (0.5f*patch_size)*output_box[0], -        patch_center.y + (0.5f*patch_size)*output_box[1], -        0.5f*patch_size*(output_box[2]-output_box[0]), -        0.5f*patch_size*(output_box[3]-output_box[1]) +        patch_center.x + (0.5f*patch_size)*output_box_[0], +        patch_center.y + (0.5f*patch_size)*output_box_[1], +        0.5f*patch_size*(output_box_[2]-output_box_[0]), +        0.5f*patch_size*(output_box_[3]-output_box_[1])      };      return std::optional<Face>({ @@ -587,9 +588,9 @@ std::optional<PoseEstimator::Face> PoseEstimator::run(  cv::Mat PoseEstimator::last_network_input() const  {      cv::Mat ret; -    if (!input_mat.empty()) +    if (!input_mat_.empty())      { -        input_mat.convertTo(ret, CV_8U, 255., 127.); +        input_mat_.convertTo(ret, CV_8U, 255., 127.);          cv::cvtColor(ret, ret, cv::COLOR_GRAY2RGB);      }      return ret; @@ -598,11 +599,11 @@ cv::Mat PoseEstimator::last_network_input() const  double PoseEstimator::last_inference_time_millis() const  { -    return last_inference_time; +    return last_inference_time_;  } -bool neuralnet_tracker::detect() +bool NeuralNetTracker::detect()  {      double inference_time = 0.; @@ -613,35 +614,35 @@ bool neuralnet_tracker::detect()      } };      // Note: BGR colors! -    if (!last_localizer_roi || !last_roi || -        iou(*last_localizer_roi,*last_roi)<0.25) +    if (!last_localizer_roi_ || !last_roi_ || +        iou(*last_localizer_roi_,*last_roi_)<0.25)      { -        auto [p, rect] = localizer->run(grayscale_); -        inference_time += localizer->last_inference_time_millis(); +        auto [p, rect] = localizer_->run(grayscale_); +        inference_time += localizer_->last_inference_time_millis();          if (p > 0.5 || rect.height < 5 || rect.width < 5)          { -            last_localizer_roi = rect; -            last_roi = rect; +            last_localizer_roi_ = rect; +            last_roi_ = rect;          }          else          { -            last_roi.reset(); -            last_localizer_roi.reset(); +            last_roi_.reset(); +            last_localizer_roi_.reset();          }      } -    if (!last_roi) +    if (!last_roi_)      {          draw_gizmos({}, {});          return false;      } -    auto face = poseestimator->run(grayscale_, *last_roi); -    inference_time += poseestimator->last_inference_time_millis(); +    auto face = poseestimator_->run(grayscale_, *last_roi_); +    inference_time += poseestimator_->last_inference_time_millis();      if (!face)      { -        last_roi.reset(); +        last_roi_.reset();          draw_gizmos(*face, {});          return false;      } @@ -653,7 +654,7 @@ bool neuralnet_tracker::detect()          //       been tweaked so that it works pretty well.          // In old behaviour  ROI is taken from the model outputs          const vec3 offset = rotate_vec(face->rotation, vec3{0.f, 0.1f*face->size, face->size*0.3f}); -        const float halfsize = face->size/float(settings.roi_zoom); +        const float halfsize = face->size/float(settings_.roi_zoom);          face->box = cv::Rect2f(              face->center.x + offset[0] - halfsize,              face->center.y + offset[1] - halfsize, @@ -662,14 +663,14 @@ bool neuralnet_tracker::detect()          );      } -    last_roi = ewa_filter(*last_roi, face->box, float(settings.roi_filter_alpha)); +    last_roi_ = ewa_filter(*last_roi_, face->box, float(settings_.roi_filter_alpha));      Affine pose = compute_pose(*face);      draw_gizmos(*face, pose);      { -        QMutexLocker lck(&mtx); +        QMutexLocker lck(&mtx_);          this->pose_ = pose;      } @@ -677,18 +678,18 @@ bool neuralnet_tracker::detect()  } -void neuralnet_tracker::draw_gizmos( +void NeuralNetTracker::draw_gizmos(      const std::optional<PoseEstimator::Face> &face,      const Affine& pose)  {      if (!is_visible_)          return; -    preview_.draw_gizmos(face, pose, last_roi, last_localizer_roi, world_to_image(pose.t, grayscale_.size(), intrinsics)); +    preview_.draw_gizmos(face, pose, last_roi_, last_localizer_roi_, world_to_image(pose.t, grayscale_.size(), intrinsics_)); -    if (settings.show_network_input) +    if (settings_.show_network_input)      { -        cv::Mat netinput = poseestimator->last_network_input(); +        cv::Mat netinput = poseestimator_->last_network_input();          preview_.overlay_netinput(netinput);      } @@ -696,13 +697,13 @@ void neuralnet_tracker::draw_gizmos(  } -Affine neuralnet_tracker::compute_pose(const PoseEstimator::Face &face) const +Affine NeuralNetTracker::compute_pose(const PoseEstimator::Face &face) const  {      // Compute the location the network outputs in 3d space.      const mat33 rot_correction = compute_rotation_correction(          normalize(face.center, grayscale_.rows, grayscale_.cols), -        intrinsics.focal_length_w); +        intrinsics_.focal_length_w);      const mat33 m = rot_correction * quaternion_to_mat33(          image_to_world(face.rotation)); @@ -721,18 +722,18 @@ Affine neuralnet_tracker::compute_pose(const PoseEstimator::Face &face) const      */      const vec3 face_world_pos = image_to_world( -        face.center.x, face.center.y, face.size, head_size_mm, +        face.center.x, face.center.y, face.size, HEAD_SIZE_MM,          grayscale_.size(), -        intrinsics); +        intrinsics_);      // But this is in general not the location of the rotation joint in the neck.      // So we need an extra offset. Which we determine by solving      // z,y,z-pos = head_joint_loc + R_face * offset      const vec3 pos = face_world_pos          + m * vec3{ -            static_cast<float>(settings.offset_fwd), -            static_cast<float>(settings.offset_up), -            static_cast<float>(settings.offset_right)}; +            static_cast<float>(settings_.offset_fwd), +            static_cast<float>(settings_.offset_up), +            static_cast<float>(settings_.offset_right)};      return { m, pos };  } @@ -843,13 +844,13 @@ float Preview::transform(float s) const  } -neuralnet_tracker::neuralnet_tracker() +NeuralNetTracker::NeuralNetTracker()  {      opencv_init();  } -neuralnet_tracker::~neuralnet_tracker() +NeuralNetTracker::~NeuralNetTracker()  {      requestInterruption();      wait(); @@ -858,22 +859,22 @@ neuralnet_tracker::~neuralnet_tracker()  } -module_status neuralnet_tracker::start_tracker(QFrame* videoframe) +module_status NeuralNetTracker::start_tracker(QFrame* videoframe)  {      videoframe->show(); -    videoWidget = std::make_unique<cv_video_widget>(videoframe); -    layout = std::make_unique<QHBoxLayout>(); -    layout->setContentsMargins(0, 0, 0, 0); -    layout->addWidget(&*videoWidget); -    videoframe->setLayout(&*layout); -    videoWidget->show(); -    num_threads = settings.num_threads; +    video_widget_ = std::make_unique<cv_video_widget>(videoframe); +    layout_ = std::make_unique<QHBoxLayout>(); +    layout_->setContentsMargins(0, 0, 0, 0); +    layout_->addWidget(&*video_widget_); +    videoframe->setLayout(&*layout_); +    video_widget_->show(); +    num_threads_ = settings_.num_threads;      start();      return status_ok();  } -bool neuralnet_tracker::load_and_initialize_model() +bool NeuralNetTracker::load_and_initialize_model()  {      const QString localizer_model_path_enc =          OPENTRACK_BASE_PATH+"/" OPENTRACK_LIBRARY_PATH "/models/head-localizer.onnx"; @@ -882,7 +883,7 @@ bool neuralnet_tracker::load_and_initialize_model()      try      { -        env = Ort::Env{ +        env_ = Ort::Env{              OrtLoggingLevel::ORT_LOGGING_LEVEL_ERROR,              "tracker-neuralnet"          }; @@ -890,17 +891,17 @@ bool neuralnet_tracker::load_and_initialize_model()          // Do thread settings here do anything?          // There is a warning which says to control number of threads via          // openmp settings. Which is what we do. -        opts.SetIntraOpNumThreads(num_threads); +        opts.SetIntraOpNumThreads(num_threads_);          opts.SetInterOpNumThreads(1); -        allocator_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); +        allocator_info_ = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); -        localizer.emplace( -            allocator_info,  -            Ort::Session{env, convert(localizer_model_path_enc).c_str(), opts}); +        localizer_.emplace( +            allocator_info_,  +            Ort::Session{env_, convert(localizer_model_path_enc).c_str(), opts}); -        poseestimator.emplace( -            allocator_info, -            Ort::Session{env, convert(poseestimator_model_path_enc).c_str(), opts}); +        poseestimator_.emplace( +            allocator_info_, +            Ort::Session{env_, convert(poseestimator_model_path_enc).c_str(), opts});      }      catch (const Ort::Exception &e)      { @@ -912,17 +913,17 @@ bool neuralnet_tracker::load_and_initialize_model()  } -bool neuralnet_tracker::open_camera() +bool NeuralNetTracker::open_camera()  { -    int rint = std::clamp(*settings.resolution, 0, (int)std::size(resolution_choices)-1); +    int rint = std::clamp(*settings_.resolution, 0, (int)std::size(resolution_choices)-1);      resolution_tuple res = resolution_choices[rint]; -    int fps = enum_to_fps(settings.force_fps); +    int fps = enum_to_fps(settings_.force_fps); -    QMutexLocker l(&camera_mtx); +    QMutexLocker l(&camera_mtx_); -    camera = video::make_camera(settings.camera_name); +    camera_ = video::make_camera(settings_.camera_name); -    if (!camera) +    if (!camera_)          return false;      video::impl::camera::info args {}; @@ -935,9 +936,9 @@ bool neuralnet_tracker::open_camera()      if (fps)          args.fps = fps; -    args.use_mjpeg = settings.use_mjpeg; +    args.use_mjpeg = settings_.use_mjpeg; -    if (!camera->start(args)) +    if (!camera_->start(args))      {          qDebug() << "neuralnet tracker: can't open camera";          return false; @@ -947,39 +948,39 @@ bool neuralnet_tracker::open_camera()  } -void neuralnet_tracker::set_intrinsics() +void NeuralNetTracker::set_intrinsics()  {      const int w = grayscale_.cols, h = grayscale_.rows; -    const double diag_fov = settings.fov * M_PI / 180.; +    const double diag_fov = settings_.fov * M_PI / 180.;      const double fov_w = 2.*atan(tan(diag_fov/2.)/sqrt(1. + h/(double)w * h/(double)w));      const double fov_h = 2.*atan(tan(diag_fov/2.)/sqrt(1. + w/(double)h * w/(double)h));      const double focal_length_w = 1. / tan(.5 * fov_w);      const double focal_length_h = 1. / tan(.5 * fov_h); -    intrinsics.fov_h = fov_h; -    intrinsics.fov_w = fov_w; -    intrinsics.focal_length_w = focal_length_w; -    intrinsics.focal_length_h = focal_length_h; +    intrinsics_.fov_h = fov_h; +    intrinsics_.fov_w = fov_w; +    intrinsics_.focal_length_w = focal_length_w; +    intrinsics_.focal_length_h = focal_length_h;  }  class GuardedThreadCountSwitch  { -    int old_num_threads_cv = 1; -    int old_num_threads_omp = 1; +    int old_num_threads_cv_ = 1; +    int old_num_threads_omp_ = 1;      public:          GuardedThreadCountSwitch(int num_threads)          { -            old_num_threads_cv = cv::getNumThreads(); -            old_num_threads_omp = omp_get_num_threads(); +            old_num_threads_cv_ = cv::getNumThreads(); +            old_num_threads_omp_ = omp_get_num_threads();              omp_set_num_threads(num_threads);              cv::setNumThreads(num_threads);          }          ~GuardedThreadCountSwitch()          { -            omp_set_num_threads(old_num_threads_omp); -            cv::setNumThreads(old_num_threads_cv); +            omp_set_num_threads(old_num_threads_omp_); +            cv::setNumThreads(old_num_threads_cv_);          }          GuardedThreadCountSwitch(const GuardedThreadCountSwitch&) = delete; @@ -987,11 +988,11 @@ class GuardedThreadCountSwitch  }; -void neuralnet_tracker::run() +void NeuralNetTracker::run()  { -    preview_.init(*videoWidget); +    preview_.init(*video_widget_); -    GuardedThreadCountSwitch switch_num_threads_to(num_threads); +    GuardedThreadCountSwitch switch_num_threads_to(num_threads_);      if (!open_camera())          return; @@ -1006,9 +1007,9 @@ void neuralnet_tracker::run()          is_visible_ = check_is_visible();          auto t = clk.now();          { -            QMutexLocker l(&camera_mtx); +            QMutexLocker l(&camera_mtx_); -            auto [ img, res ] = camera->get_frame(); +            auto [ img, res ] = camera_->get_frame();              if (!res)              { @@ -1047,7 +1048,7 @@ void neuralnet_tracker::run()          detect();          if (is_visible_) -            preview_.copy_to_widget(*videoWidget); +            preview_.copy_to_widget(*video_widget_);          update_fps(              std::chrono::duration_cast<std::chrono::milliseconds>( @@ -1056,7 +1057,7 @@ void neuralnet_tracker::run()  } -cv::Mat neuralnet_tracker::prepare_input_image(const video::frame& frame) +cv::Mat NeuralNetTracker::prepare_input_image(const video::frame& frame)  {      auto img = cv::Mat(frame.height, frame.width, CV_8UC(frame.channels), (void*)frame.data, frame.stride); @@ -1083,23 +1084,23 @@ cv::Mat neuralnet_tracker::prepare_input_image(const video::frame& frame)  } -void neuralnet_tracker::update_fps(double dt) +void NeuralNetTracker::update_fps(double dt)  {      const double alpha = dt/(dt + RC);      if (dt > 1e-6)      {          QMutexLocker lck{&stats_mtx_}; -        fps *= 1 - alpha; -        fps += alpha * 1./dt; +        fps_ *= 1 - alpha; +        fps_ += alpha * 1./dt;      }  } -void neuralnet_tracker::data(double *data) +void NeuralNetTracker::data(double *data)  {      Affine tmp = [&]()      { -        QMutexLocker lck(&mtx); +        QMutexLocker lck(&mtx_);          return pose_;      }(); @@ -1124,29 +1125,29 @@ void neuralnet_tracker::data(double *data)  } -Affine neuralnet_tracker::pose() +Affine NeuralNetTracker::pose()  { -    QMutexLocker lck(&mtx); +    QMutexLocker lck(&mtx_);      return pose_;  } -std::tuple<cv::Size,double, double> neuralnet_tracker::stats() const +std::tuple<cv::Size,double, double> NeuralNetTracker::stats() const  {      QMutexLocker lck(&stats_mtx_); -    return { resolution_, fps, inference_time_ }; +    return { resolution_, fps_, inference_time_ };  } -void neuralnet_dialog::make_fps_combobox() +void NeuralNetDialog::make_fps_combobox()  {      for (int k = 0; k < fps_MAX; k++)      {          const int hz = enum_to_fps(k);          const QString name = (hz == 0) ? tr("Default") : QString::number(hz); -        ui.cameraFPS->addItem(name, k); +        ui_.cameraFPS->addItem(name, k);      }  } -void neuralnet_dialog::make_resolution_combobox() +void NeuralNetDialog::make_resolution_combobox()  {      int k=0;      for (const auto [w, h] : resolution_choices) @@ -1154,125 +1155,125 @@ void neuralnet_dialog::make_resolution_combobox()          const QString s = (w == 0)               ? tr("Default")               : QString::number(w) + " x " + QString::number(h); -        ui.resolution->addItem(s, k++); +        ui_.resolution->addItem(s, k++);      }  } -neuralnet_dialog::neuralnet_dialog() : -    trans_calib(1, 2) +NeuralNetDialog::NeuralNetDialog() : +    trans_calib_(1, 2)  { -    ui.setupUi(this); +    ui_.setupUi(this);      make_fps_combobox();      make_resolution_combobox();      for (const auto& str : video::camera_names()) -        ui.cameraName->addItem(str); +        ui_.cameraName->addItem(str); -    tie_setting(settings.camera_name, ui.cameraName); -    tie_setting(settings.fov, ui.cameraFOV); -    tie_setting(settings.offset_fwd, ui.tx_spin); -    tie_setting(settings.offset_up, ui.ty_spin); -    tie_setting(settings.offset_right, ui.tz_spin); -    tie_setting(settings.show_network_input, ui.showNetworkInput); -    tie_setting(settings.roi_filter_alpha, ui.roiFilterAlpha); -    tie_setting(settings.use_mjpeg, ui.use_mjpeg); -	tie_setting(settings.roi_zoom, ui.roiZoom); -    tie_setting(settings.num_threads, ui.threadCount); -    tie_setting(settings.resolution, ui.resolution); -    tie_setting(settings.force_fps, ui.cameraFPS); +    tie_setting(settings_.camera_name, ui_.cameraName); +    tie_setting(settings_.fov, ui_.cameraFOV); +    tie_setting(settings_.offset_fwd, ui_.tx_spin); +    tie_setting(settings_.offset_up, ui_.ty_spin); +    tie_setting(settings_.offset_right, ui_.tz_spin); +    tie_setting(settings_.show_network_input, ui_.showNetworkInput); +    tie_setting(settings_.roi_filter_alpha, ui_.roiFilterAlpha); +    tie_setting(settings_.use_mjpeg, ui_.use_mjpeg); +	tie_setting(settings_.roi_zoom, ui_.roiZoom); +    tie_setting(settings_.num_threads, ui_.threadCount); +    tie_setting(settings_.resolution, ui_.resolution); +    tie_setting(settings_.force_fps, ui_.cameraFPS); -    connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK())); -    connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel())); -    connect(ui.camera_settings, SIGNAL(clicked()), this, SLOT(camera_settings())); +    connect(ui_.buttonBox, SIGNAL(accepted()), this, SLOT(doOK())); +    connect(ui_.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel())); +    connect(ui_.camera_settings, SIGNAL(clicked()), this, SLOT(camera_settings())); -    connect(&settings.camera_name, value_::value_changed<QString>(), this, &neuralnet_dialog::update_camera_settings_state); +    connect(&settings_.camera_name, value_::value_changed<QString>(), this, &NeuralNetDialog::update_camera_settings_state); -    update_camera_settings_state(settings.camera_name); +    update_camera_settings_state(settings_.camera_name); -    connect(&calib_timer, &QTimer::timeout, this, &neuralnet_dialog::trans_calib_step); -    calib_timer.setInterval(35); -    connect(ui.tcalib_button,SIGNAL(toggled(bool)), this, SLOT(startstop_trans_calib(bool))); +    connect(&calib_timer_, &QTimer::timeout, this, &NeuralNetDialog::trans_calib_step); +    calib_timer_.setInterval(35); +    connect(ui_.tcalib_button,SIGNAL(toggled(bool)), this, SLOT(startstop_trans_calib(bool))); -    connect(&tracker_status_poll_timer, &QTimer::timeout, this, &neuralnet_dialog::status_poll); -    tracker_status_poll_timer.setInterval(250); -    tracker_status_poll_timer.start(); +    connect(&tracker_status_poll_timer_, &QTimer::timeout, this, &NeuralNetDialog::status_poll); +    tracker_status_poll_timer_.setInterval(250); +    tracker_status_poll_timer_.start();  } -void neuralnet_dialog::doOK() +void NeuralNetDialog::doOK()  { -    settings.b->save(); +    settings_.b->save();      close();  } -void neuralnet_dialog::doCancel() +void NeuralNetDialog::doCancel()  {      close();  } -void neuralnet_dialog::camera_settings() +void NeuralNetDialog::camera_settings()  { -    if (tracker) +    if (tracker_)      { -        QMutexLocker l(&tracker->camera_mtx); -        (void)tracker->camera->show_dialog(); +        QMutexLocker l(&tracker_->camera_mtx_); +        (void)tracker_->camera_->show_dialog();      }      else -        (void)video::show_dialog(settings.camera_name); +        (void)video::show_dialog(settings_.camera_name);  } -void neuralnet_dialog::update_camera_settings_state(const QString& name) +void NeuralNetDialog::update_camera_settings_state(const QString& name)  {      (void)name; -    ui.camera_settings->setEnabled(true); +    ui_.camera_settings->setEnabled(true);  } -void neuralnet_dialog::register_tracker(ITracker * x) +void NeuralNetDialog::register_tracker(ITracker * x)  { -    tracker = static_cast<neuralnet_tracker*>(x); -    ui.tcalib_button->setEnabled(true); +    tracker_ = static_cast<NeuralNetTracker*>(x); +    ui_.tcalib_button->setEnabled(true);  } -void neuralnet_dialog::unregister_tracker() +void NeuralNetDialog::unregister_tracker()  { -    tracker = nullptr; -    ui.tcalib_button->setEnabled(false); +    tracker_ = nullptr; +    ui_.tcalib_button->setEnabled(false);  } -void neuralnet_dialog::status_poll() +void NeuralNetDialog::status_poll()  {      QString status; -    if (!tracker) +    if (!tracker_)      {          status = tr("Tracker Offline");      }      else      { -        auto [ res, fps, inference_time ] = tracker->stats(); +        auto [ res, fps, inference_time ] = tracker_->stats();          status = tr("%1x%2 @ %3 FPS / Inference: %4 ms").arg(res.width).arg(res.height).arg(int(fps)).arg(int(inference_time));      } -    ui.resolution_display->setText(status); +    ui_.resolution_display->setText(status);  } -void neuralnet_dialog::trans_calib_step() +void NeuralNetDialog::trans_calib_step()  { -    if (tracker) +    if (tracker_)      {          const Affine X_CM = [&]() {  -            QMutexLocker l(&calibrator_mutex); -            return tracker->pose(); +            QMutexLocker l(&calibrator_mutex_); +            return tracker_->pose();          }(); -        trans_calib.update(X_CM.R, X_CM.t); -        auto [_, nsamples] = trans_calib.get_estimate(); +        trans_calib_.update(X_CM.R, X_CM.t); +        auto [_, nsamples] = trans_calib_.get_estimate();          constexpr int min_yaw_samples = 15;          constexpr int min_pitch_samples = 12; @@ -1291,47 +1292,47 @@ void neuralnet_dialog::trans_calib_step()              const int nsamples_total = nsamples[0] + nsamples[1];              sample_feedback = tr("%1 samples. Over %2, good!").arg(nsamples_total).arg(min_samples);          } -        ui.sample_count_display->setText(sample_feedback); +        ui_.sample_count_display->setText(sample_feedback);      }      else          startstop_trans_calib(false);  } -void neuralnet_dialog::startstop_trans_calib(bool start) +void NeuralNetDialog::startstop_trans_calib(bool start)  { -    QMutexLocker l(&calibrator_mutex); +    QMutexLocker l(&calibrator_mutex_);      // FIXME: does not work ...        if (start)      {          qDebug() << "pt: starting translation calibration"; -        calib_timer.start(); -        trans_calib.reset(); -        ui.sample_count_display->setText(QString()); +        calib_timer_.start(); +        trans_calib_.reset(); +        ui_.sample_count_display->setText(QString());          // Tracker must run with zero'ed offset for calibration. -        settings.offset_fwd = 0; -        settings.offset_up = 0; -        settings.offset_right = 0; +        settings_.offset_fwd = 0; +        settings_.offset_up = 0; +        settings_.offset_right = 0;      }      else      { -        calib_timer.stop(); +        calib_timer_.stop();          qDebug() << "pt: stopping translation calibration";          { -            auto [tmp, nsamples] = trans_calib.get_estimate(); -            settings.offset_fwd = int(tmp[0]); -            settings.offset_up = int(tmp[1]); -            settings.offset_right = int(tmp[2]); +            auto [tmp, nsamples] = trans_calib_.get_estimate(); +            settings_.offset_fwd = int(tmp[0]); +            settings_.offset_up = int(tmp[1]); +            settings_.offset_right = int(tmp[2]);          }      } -    ui.tx_spin->setEnabled(!start); -    ui.ty_spin->setEnabled(!start); -    ui.tz_spin->setEnabled(!start); +    ui_.tx_spin->setEnabled(!start); +    ui_.ty_spin->setEnabled(!start); +    ui_.tz_spin->setEnabled(!start);      if (start) -        ui.tcalib_button->setText(tr("Stop calibration")); +        ui_.tcalib_button->setText(tr("Stop calibration"));      else -        ui.tcalib_button->setText(tr("Start calibration")); +        ui_.tcalib_button->setText(tr("Start calibration"));  } @@ -1339,4 +1340,4 @@ Settings::Settings() : opts("neuralnet-tracker") {}  } // neuralnet_tracker_ns -OPENTRACK_DECLARE_TRACKER(neuralnet_tracker, neuralnet_dialog, neuralnet_metadata) +OPENTRACK_DECLARE_TRACKER(NeuralNetTracker, NeuralNetDialog, NeuralNetMetadata) diff --git a/tracker-neuralnet/ftnoir_tracker_neuralnet.h b/tracker-neuralnet/ftnoir_tracker_neuralnet.h index 00b5f220..9b481186 100644 --- a/tracker-neuralnet/ftnoir_tracker_neuralnet.h +++ b/tracker-neuralnet/ftnoir_tracker_neuralnet.h @@ -107,14 +107,14 @@ class Localizer          double last_inference_time_millis() const;      private: -        inline static constexpr int input_img_width = 288; -        inline static constexpr int input_img_height = 224; -        Ort::Session session{nullptr}; +        inline static constexpr int INPUT_IMG_WIDTH = 288; +        inline static constexpr int INPUT_IMG_HEIGHT = 224; +        Ort::Session session_{nullptr};          // Inputs / outputs -        cv::Mat scaled_frame{}, input_mat{}; -        Ort::Value input_val{nullptr}, output_val{nullptr}; -        std::array<float, 5> results; -        double last_inference_time = 0; +        cv::Mat scaled_frame_{}, input_mat_{}; +        Ort::Value input_val_{nullptr}, output_val_{nullptr}; +        std::array<float, 5> results_; +        double last_inference_time_ = 0;  }; @@ -124,7 +124,6 @@ class PoseEstimator          struct Face          {              std::array<float,4> rotation; // Quaternion, (w, x, y, z) -            // The following quantities are defined wrt the image space of the input              cv::Rect2f box;              cv::Point2f center;              float size; @@ -132,7 +131,11 @@ class PoseEstimator          PoseEstimator(Ort::MemoryInfo &allocator_info,                          Ort::Session &&session); -        // Inference +        /** Inference +        * +        * Coordinates are defined wrt. the image space of the input `frame`. +        * X goes right, Z (depth) into the image, Y points down (like pixel coordinates values increase from top to bottom) +        */          std::optional<Face> run(const cv::Mat &frame, const cv::Rect &box);          // Returns an image compatible with the 'frame' image for displaying.          cv::Mat last_network_input() const; @@ -141,21 +144,21 @@ class PoseEstimator          // Operates on the private image data members          int find_input_intensity_90_pct_quantile() const; -        int64_t model_version = 0; -        Ort::Session session{nullptr}; -        Ort::Allocator allocator; +        int64_t model_version_ = 0;  // Queried meta data from the ONNX file +        Ort::Session session_{nullptr};  // ONNX's runtime context for running the model +        Ort::Allocator allocator_;   // Memory allocator for tensors          // Inputs -        cv::Mat scaled_frame{}, input_mat{}; -        std::vector<Ort::Value> input_val; -        std::vector<const char*> input_names; +        cv::Mat scaled_frame_{}, input_mat_{};  // Input. One is the original crop, the other is rescaled (?) +        std::vector<Ort::Value> input_val_;    // Tensors to put into the model +        std::vector<const char*> input_names_; // Refers to the names in the onnx model.           // Outputs -        cv::Vec<float, 3> output_coord{}; -        cv::Vec<float, 4> output_quat{}; -        cv::Vec<float, 4> output_box{}; -        std::vector<Ort::Value> output_val; -        std::vector<const char*> output_names; -        size_t num_recurrent_states = 0; -        double last_inference_time = 0; +        cv::Vec<float, 3> output_coord_{};  // 2d Coordinate and head size output. +        cv::Vec<float, 4> output_quat_{};   //  Quaternion output +        cv::Vec<float, 4> output_box_{};    // Bounding box output +        std::vector<Ort::Value> output_val_; // Tensors to put the model outputs in. +        std::vector<const char*> output_names_; // Refers to the names in the onnx model.  +        size_t num_recurrent_states_ = 0; +        double last_inference_time_ = 0;  }; @@ -186,20 +189,20 @@ private:  }; -class neuralnet_tracker : protected virtual QThread, public ITracker +class NeuralNetTracker : protected virtual QThread, public ITracker  {      Q_OBJECT  public: -    neuralnet_tracker(); -    ~neuralnet_tracker() override; +    NeuralNetTracker(); +    ~NeuralNetTracker() override;      module_status start_tracker(QFrame* frame) override;      void data(double *data) override;      void run() override;      Affine pose();      std::tuple<cv::Size, double, double> stats() const; -    QMutex camera_mtx; -    std::unique_ptr<video::impl::camera> camera; +    QMutex camera_mtx_; +    std::unique_ptr<video::impl::camera> camera_;  private:      bool detect(); @@ -213,58 +216,56 @@ private:      void update_fps(double dt);      Affine compute_pose(const PoseEstimator::Face &face) const; -    Settings settings; -    std::optional<Localizer> localizer; -    std::optional<PoseEstimator> poseestimator; -    Ort::Env env{nullptr}; -    Ort::MemoryInfo allocator_info{nullptr}; +    Settings settings_; +    std::optional<Localizer> localizer_; +    std::optional<PoseEstimator> poseestimator_; +    Ort::Env env_{nullptr}; +    Ort::MemoryInfo allocator_info_{nullptr}; -    CamIntrinsics intrinsics{}; +    CamIntrinsics intrinsics_{};      cv::Mat grayscale_;      std::array<cv::Mat,2> downsized_original_images_ = {}; // Image pyramid -    std::optional<cv::Rect2f> last_localizer_roi; -    std::optional<cv::Rect2f> last_roi; -    static constexpr float head_size_mm = 200.f; +    std::optional<cv::Rect2f> last_localizer_roi_; +    std::optional<cv::Rect2f> last_roi_; +    static constexpr float HEAD_SIZE_MM = 200.f;      mutable QMutex stats_mtx_; -    double fps = 0; +    double fps_ = 0;      double inference_time_ = 0;      cv::Size resolution_ = {};      static constexpr double RC = .25; -    int num_threads = 1; +    int num_threads_ = 1;      bool is_visible_ = true; -    QMutex mtx; // Protects the pose +    QMutex mtx_; // Protects the pose      Affine pose_;      Preview preview_; -    std::unique_ptr<cv_video_widget> videoWidget; -    std::unique_ptr<QHBoxLayout> layout; +    std::unique_ptr<cv_video_widget> video_widget_; +    std::unique_ptr<QHBoxLayout> layout_;  }; -class neuralnet_dialog : public ITrackerDialog +class NeuralNetDialog : public ITrackerDialog  {      Q_OBJECT  public: -    neuralnet_dialog(); +    NeuralNetDialog();      void register_tracker(ITracker * x) override;      void unregister_tracker() override;  private:      void make_fps_combobox();      void make_resolution_combobox(); -    Ui::Form ui; -    Settings settings; -     +    Ui::Form ui_; +    Settings settings_;      // Calibration code mostly taken from point tracker -    QTimer calib_timer; -    TranslationCalibrator trans_calib; -    QMutex calibrator_mutex; -    QTimer tracker_status_poll_timer; -    neuralnet_tracker* tracker = nullptr; -     +    QTimer calib_timer_; +    TranslationCalibrator trans_calib_; +    QMutex calibrator_mutex_; +    QTimer tracker_status_poll_timer_; +    NeuralNetTracker* tracker_ = nullptr;  private Q_SLOTS:      void doOK(); @@ -277,7 +278,7 @@ private Q_SLOTS:  }; -class neuralnet_metadata : public Metadata +class NeuralNetMetadata : public Metadata  {      Q_OBJECT      QString name() override { return QString("neuralnet tracker"); } @@ -287,6 +288,6 @@ class neuralnet_metadata : public Metadata  } // neuralnet_tracker_ns -using neuralnet_tracker_ns::neuralnet_tracker; -using neuralnet_tracker_ns::neuralnet_dialog; -using neuralnet_tracker_ns::neuralnet_metadata; +using neuralnet_tracker_ns::NeuralNetTracker; +using neuralnet_tracker_ns::NeuralNetDialog; +using neuralnet_tracker_ns::NeuralNetMetadata; diff --git a/tracker-neuralnet/lang/nl_NL.ts b/tracker-neuralnet/lang/nl_NL.ts index 92ad65f1..dbcd3c8c 100644 --- a/tracker-neuralnet/lang/nl_NL.ts +++ b/tracker-neuralnet/lang/nl_NL.ts @@ -114,37 +114,37 @@ Don't roll or change position.</source>      </message>  </context>  <context> -    <name>neuralnet_tracker_ns::neuralnet_dialog</name> +    <name>neuralnet_tracker_ns::NeuralNetDialog</name>      <message>          <source>Default</source>          <translation type="unfinished">Standaard</translation>      </message>      <message> -        <source>%1 yaw samples. Yaw more to %2 samples for stable calibration.</source> +        <source>Tracker Offline</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1 pitch samples. Pitch more to %2 samples for stable calibration.</source> +        <source>%1x%2 @ %3 FPS / Inference: %4 ms</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1 samples. Over %2, good!</source> +        <source>%1 yaw samples. Yaw more to %2 samples for stable calibration.</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Stop calibration</source> +        <source>%1 pitch samples. Pitch more to %2 samples for stable calibration.</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Start calibration</source> +        <source>%1 samples. Over %2, good!</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Tracker Offline</source> +        <source>Stop calibration</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1x%2 @ %3 FPS / Inference: %4 ms</source> +        <source>Start calibration</source>          <translation type="unfinished"></translation>      </message>  </context> diff --git a/tracker-neuralnet/lang/ru_RU.ts b/tracker-neuralnet/lang/ru_RU.ts index dfa7d042..a80c7e3d 100644 --- a/tracker-neuralnet/lang/ru_RU.ts +++ b/tracker-neuralnet/lang/ru_RU.ts @@ -114,37 +114,37 @@ Don't roll or change position.</source>      </message>  </context>  <context> -    <name>neuralnet_tracker_ns::neuralnet_dialog</name> +    <name>neuralnet_tracker_ns::NeuralNetDialog</name>      <message>          <source>Default</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1 yaw samples. Yaw more to %2 samples for stable calibration.</source> +        <source>Tracker Offline</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1 pitch samples. Pitch more to %2 samples for stable calibration.</source> +        <source>%1x%2 @ %3 FPS / Inference: %4 ms</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1 samples. Over %2, good!</source> +        <source>%1 yaw samples. Yaw more to %2 samples for stable calibration.</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Stop calibration</source> +        <source>%1 pitch samples. Pitch more to %2 samples for stable calibration.</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Start calibration</source> +        <source>%1 samples. Over %2, good!</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Tracker Offline</source> +        <source>Stop calibration</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1x%2 @ %3 FPS / Inference: %4 ms</source> +        <source>Start calibration</source>          <translation type="unfinished"></translation>      </message>  </context> diff --git a/tracker-neuralnet/lang/stub.ts b/tracker-neuralnet/lang/stub.ts index a74d272f..4cde86a9 100644 --- a/tracker-neuralnet/lang/stub.ts +++ b/tracker-neuralnet/lang/stub.ts @@ -114,37 +114,37 @@ Don't roll or change position.</source>      </message>  </context>  <context> -    <name>neuralnet_tracker_ns::neuralnet_dialog</name> +    <name>neuralnet_tracker_ns::NeuralNetDialog</name>      <message>          <source>Default</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1 yaw samples. Yaw more to %2 samples for stable calibration.</source> +        <source>Tracker Offline</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1 pitch samples. Pitch more to %2 samples for stable calibration.</source> +        <source>%1x%2 @ %3 FPS / Inference: %4 ms</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1 samples. Over %2, good!</source> +        <source>%1 yaw samples. Yaw more to %2 samples for stable calibration.</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Stop calibration</source> +        <source>%1 pitch samples. Pitch more to %2 samples for stable calibration.</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Start calibration</source> +        <source>%1 samples. Over %2, good!</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Tracker Offline</source> +        <source>Stop calibration</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1x%2 @ %3 FPS / Inference: %4 ms</source> +        <source>Start calibration</source>          <translation type="unfinished"></translation>      </message>  </context> diff --git a/tracker-neuralnet/lang/zh_CN.ts b/tracker-neuralnet/lang/zh_CN.ts index 9c936e5c..c3a91211 100644 --- a/tracker-neuralnet/lang/zh_CN.ts +++ b/tracker-neuralnet/lang/zh_CN.ts @@ -114,37 +114,37 @@ Don't roll or change position.</source>      </message>  </context>  <context> -    <name>neuralnet_tracker_ns::neuralnet_dialog</name> +    <name>neuralnet_tracker_ns::NeuralNetDialog</name>      <message>          <source>Default</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1 yaw samples. Yaw more to %2 samples for stable calibration.</source> +        <source>Tracker Offline</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1 pitch samples. Pitch more to %2 samples for stable calibration.</source> +        <source>%1x%2 @ %3 FPS / Inference: %4 ms</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1 samples. Over %2, good!</source> +        <source>%1 yaw samples. Yaw more to %2 samples for stable calibration.</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Stop calibration</source> +        <source>%1 pitch samples. Pitch more to %2 samples for stable calibration.</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Start calibration</source> +        <source>%1 samples. Over %2, good!</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>Tracker Offline</source> +        <source>Stop calibration</source>          <translation type="unfinished"></translation>      </message>      <message> -        <source>%1x%2 @ %3 FPS / Inference: %4 ms</source> +        <source>Start calibration</source>          <translation type="unfinished"></translation>      </message>  </context>  | 
