VIAITEC - Trang chủ

ViAiTrackerLT

Thư viện bám đối tượng thị giác dựa trên AI

Thư viện bám đối tượng ViAiTrackerLT được phát triển dựa trên trí tuệ nhân tạo, lõi thuật toán được tối ưu cho các phần cứng tăng tốc tính toán hiện đại như GPU NVIDIA và phần cứng nhúng có NPU. ViAiTrackerLT bám đối tượng thời gian thực, chính xác và ổn định trong thời gian dài, kể cả khi đối tượng có kích thước nhỏ và cơ động cao. Các thử nghiệm cho thấy ViAiTrackerLT đạt 200+ fps trên GPU NVIDIA và 100+ fps trên phần cứng nhúng có năng lực tính toán 2-6 TOPS. Sẵn sàng tích hợp vào nhiều nền tảng như rô bốt, UAV, UGV, USV và các hệ thống phòng không.

  • 200+ FPStrên hệ thống GPU NVIDIA
  • 100+ FPStrên thiết bị biên 2-6 TOPS
  • Đa nền tảngWindows · Linux · ARM64

Thư viện lõi C++ nhỏ gọn, biên dịch trực tiếp ra mã máy, đưa khả năng bám mục tiêu bằng AI vào ứng dụng của bạn - từ máy tính dùng GPU đến thiết bị nhúng biên.

01

Bám mục tiêu liên tục qua các khung hình

Giữ khóa ổn định trên mục tiêu trong chuỗi video dài, xử lý thay đổi kích thước, chuyển động nhanh và rung lắc camera mà không bị trôi sang nền.

02

Bám chính xác mục tiêu trên từng khung hình

Khung bao sát, chính xác trên từng khung hình giúp các khâu điều khiển phía sau - bộ ổn định camera (gimbal), hệ lái tự động hay phân tích hình ảnh - nhận số liệu sạch, ít dao động.

03

Tự động bám lại mục tiêu ngay khi mục tiêu xuất hiện trở lại sau khi mất bám

Khi mục tiêu bị che khuất hoặc ra khỏi khung hình, ViAiTrackerLT báo mất bám và phát hiện lại đúng mục tiêu ngay khi nó quay lại - không cần chọn lại thủ công.

04

Bám mục tiêu ổn định, kể cả trên ảnh nhiệt

Hoạt động trên video ảnh nhiệt (IR) lẫn ảnh thường, giữ khóa mục tiêu vào ban đêm, thiếu sáng và trong sương mù.

05

Bám đối tượng ngay cả khi đối tượng rất nhỏ

Giữ khóa ổn định trên mục tiêu ở xa chỉ chiếm vài điểm ảnh trong khung hình, phù hợp cho quan sát tầm xa.

06

Chạy thời gian thực trên phần cứng nhúng tài nguyên hạn chế

Được tối ưu cho bo mạch ARM64 nhỏ gọn chỉ có 2-6 TOPS, ViAiTrackerLT vẫn bám mục tiêu thời gian thực trên 100 FPS ngay trên thiết bị - không cần máy tính hay kết nối đám mây.

Video thực tế được xử lý bởi ViAiTrackerLT. Rê chuột lên một video để xem trước, bấm để phát trên cửa sổ chính.

Yêu cầu demo

Đánh giá ViAiTrackerLT trên phần cứng và video của chính bạn. Hãy cho chúng tôi biết về dự án, đội ngũ kỹ sư sẽ chuẩn bị gói dùng thử phù hợp.

  • Bộ phát triển phần mềm (SDK) bản dùng thử cho nền tảng của bạn (GPU hoặc thiết bị biên)
  • Tư vấn kỹ thuật cùng kỹ sư của chúng tôi
  • Báo cáo hiệu năng trên video mẫu của bạn

Trường bắt buộc

Tích hợp ViAiTrackerLT vào ứng dụng C++ và tải về tài liệu kỹ thuật.

1Cách ViAiTrackerLT làm việc

ViAiTrackerLT là bộ theo dõi mục tiêu được chọn trước, không bao gồm bộ phát hiện đối tượng như ViAiDetect. Khung bao đối tượng ban đầu cho biết đối tượng cần theo dõi là gì. Sau đó, bộ theo dõi mục tiêu gọi hàm track cho mỗi khung hình và trả về thông tin của mục tiêu bao gồm khung bao và độ tin cậy.

Luồng xử lý của ViAiTracker: khung hình vào, khởi tạo với khung bao ban đầu, bám (định vị mục tiêu; nếu score chắc chắn thì ra kết quả ngay, nếu không thì dự đoán chuyển động và khôi phục mục tiêu), kết quả gồm khung bao và độ tin cậy.
Vuốt ngang để xem toàn bộ sơ đồ
2Lớp và cấu trúc dữ liệu

Thư viện gồm một lớp, ViAiTracker, và hai cấu trúc dữ liệu, ViAiTrackerConfig và ViAiTrackerResult. Tất cả nằm trong namespace ViAi và được khai báo trong một header duy nhất, ViAiTracker.h.

  • ViAiTracker (lớp) - bộ bám một đối tượng. Hàm tạo nạp model được chỉ định trong ViAiTrackerConfig; init() nhận khung hình đầu tiên và khung mục tiêu; track() định vị mục tiêu trên từng khung hình tiếp theo và trả về ViAiTrackerResult; config() / setConfig() đọc và thay đổi tham số bám ngay trong lúc bám. Đối tượng không sao chép được vì nó giữ engine của model và bộ nhớ GPU / NPU.
  • ViAiTrackerConfig (cấu trúc) - cấu hình của bộ bám, gồm hai nhóm. Nhóm model (model, precision, modelsDir, device) chọn model cần nạp và cố định khi bộ bám đã được tạo. Nhóm tham số bám (searchFactor, updateInterval, updateThreshold) thay đổi được bất cứ lúc nào bằng setConfig(). load() đọc cấu hình từ tệp ViAiTracker.cfg, validate() kiểm tra tính hợp lệ.
  • ViAiTrackerResult (cấu trúc) - kết quả của track() cho một khung hình: box là khung mục tiêu tính bằng pixel (x, y = góc trên bên trái, rộng, cao); score là độ tin cậy, 0..1 - giá trị thấp nghĩa là mục tiêu có thể đang bị che khuất hoặc đã mất.

Khai báo đầy đủ:

ViAiTracker.h
namespace ViAi {

/// @brief Everything the tracker needs: which model to load and the tracking parameters.
///
/// Each member matches a key of the [tracker] section of ViAiTracker.cfg (given in brackets). The model members
/// are fixed once a ViAiTracker is created; the tracking parameters can be changed at any time with
/// ViAiTracker::setConfig(). The defaults are the values the models were trained with.
struct ViAiTrackerConfig {
    // ------------------------------------------------------------------ model (fixed when the tracker is created)

    /// @brief [model] Model to run: "ts" - fastest; "bs" more accurate.
    std::string model = "ts";

    /// @brief [precision] Engine precision: "fp32", "fp16" (ts only), "fp16mix" or "amp").
    std::string precision = "fp16mix";

    /// @brief [models_dir] Folder holding the model file ViAiTracker_<model>_<precision>.run.
    ///
    /// A relative path in the cfg file is relative to the cfg file's folder.
    std::string modelsDir = "models";

    /// @brief [device] Index of the CUDA GPU that runs the model.
    int device = 0;

    // ------------------------------------------------------------------ tracking (can change while tracking)

    /// @brief [search_factor] Size of the search region, as a multiple of the target size.
    ///
    /// Every frame a square region of side searchFactor x sqrt(w x h) is cut around the previous target position.
    /// Larger values let the tracker follow faster motion but make the target smaller inside the fixed-size
    /// network input.
    float searchFactor = 3.5f;

    /// @brief [update_interval] Online template update period, in frames (bs only; no effect on ts).
    ///
    /// Every updateInterval frames the current target appearance replaces the second template (if the score
    /// reaches updateThreshold).
    int updateInterval = 25;

    /// @brief [update_threshold] Minimum score (0..1) a frame must reach to be used for a template update (bs only).
    ///
    /// Avoids learning a template from a frame where the target is occluded or lost.
    float updateThreshold = 0.6f;

    /// @brief Reads the [tracker] section of a ViAiTracker.cfg file.
    ///
    /// Other sections belong to the application and are skipped.
    /// @param path Path of the cfg file; relative paths inside it are resolved against its folder.
    /// @return The configuration, already checked with validate().
    /// @throws std::runtime_error if the file cannot be read, or [tracker] has an unknown key or an invalid value.
    static ViAiTrackerConfig load(const std::string& path);

    /// @brief Checks the model / precision combination and the parameter ranges.
    /// @throws std::runtime_error with a readable message on the first problem found.
    void validate() const;
};

/// @brief Output of ViAiTracker::track() for one frame.
struct ViAiTrackerResult {
    /// @brief Estimated target box in image pixels (x, y = top-left corner, width, height).
    cv::Rect2f box;

    /// @brief Tracking confidence, 0..1. Low values mean the target is probably occluded or lost.
    float score = 0;
};

/// @brief Single-object tracker.
///
/// Usage: construct from a ViAiTrackerConfig, call init() with the target box on the first frame, then track()
/// on every following frame.
class ViAiTracker {
public:
    /// @brief Loads the model named by the configuration.
    /// @param config Model, precision, models folder, device and tracking parameters.
    /// @throws std::runtime_error if the configuration is invalid, the model file is missing or cannot be loaded.
    explicit ViAiTracker(const ViAiTrackerConfig& config);

    /// @brief Releases the engines and the GPU / NPU memory.
    ~ViAiTracker();

    ViAiTracker(const ViAiTracker&) = delete;
    ViAiTracker& operator=(const ViAiTracker&) = delete;

    /// @brief Starts tracking a target.
    /// @param bgr Image containing the target, BGR 8UC3 as delivered by OpenCV.
    /// @param box Target box in pixels (x, y = top-left corner, width, height).
    void init(const cv::Mat& bgr, const cv::Rect2f& box);

    /// @brief Locates the target in the next frame.
    /// @param bgr Next video frame, BGR 8UC3.
    /// @return Target box and confidence score.
    ViAiTrackerResult track(const cv::Mat& bgr);

    /// @brief Current configuration.
    /// @return Reference to the configuration used by track().
    const ViAiTrackerConfig& config() const;

    /// @brief Changes the tracking parameters (searchFactor, updateInterval, updateThreshold); takes effect from
    /// the next track() call.
    /// @param config New configuration; its model members must equal the current ones.
    /// @throws std::runtime_error if a model member differs (create a new tracker for another model) or a
    /// parameter is out of range.
    void setConfig(const ViAiTrackerConfig& config);

private:
    /// @brief Gives VIAITEC's internal tools (src/ViAiTrackerDev.h) read access to the implementation.
    friend struct ViAiTrackerDevAccess;

    /// @brief Implementation (model description, engines, tracking state), defined in ViAiTracker.cpp.
    struct Impl;

    /// @brief Owns the implementation.
    std::unique_ptr<Impl> impl_;
};

}  // namespace ViAi
3Tích hợp vào ứng dụng
3.1Kết nối thư viện và build dự án

ViAiTrackerLT được giao dưới dạng SDK đã biên dịch sẵn: một header (ViAiTracker.h) và một thư viện cho mỗi nền tảng (thư viện tĩnh .lib trên Windows, thư viện động .so trên Linux), dùng được với mọi IDE hỗ trợ C++17.

Yêu cầu
  • Trình biên dịch C++17: MSVC 2019 trở lên (Windows x64), GCC 9 trở lên (Linux x86_64 và ARM64).
  • CMake 3.16 trở lên, OpenCV 4.x (core, imgproc, videoio).
  • Thư viện chạy của phần cứng mà tracker sử dụng:
Phần cứngNền tảng / trình biên dịchCần link thêm
GPU NVIDIA
VIAI_BACKEND=NVIDIA
Windows x64: MSVC 2019 / 2022
Linux x86_64 (PC): GCC 9+
NVIDIA Jetson (AGX Orin, Orin NX...), Linux ARM64: GCC 9+ (JetPack)
TensorRT 10 (nvinfer), CUDA 12 runtime (cudart), OpenCV
NPU Rockchip
VIAI_BACKEND=RKNN
Linux ARM64: GCC 9+RKNN runtime (librknnrt.so, rknn_api.h), OpenCV
Gói SDK
ViAiTrackerLT SDK
ViAiTracker/
├── include/
│   └── ViAiTracker.h          header (toàn bộ API)
├── lib/
│   ├── ViAiTracker.lib        Windows, Release
│   ├── ViAiTrackerd.lib       Windows, Debug
│   └── libViAiTracker.so      Linux
├── models/                    tệp *.model, chuyển thành *.run trên máy chạy
├── ViAiTrackerModelBuilder    công cụ tạo tệp *.run
└── ViAiTracker.cfg            cấu hình mẫu
Chuẩn bị máy Linux (Ubuntu)
bash
# trình biên dịch, CMake, OpenCV
sudo apt-get install build-essential cmake libopencv-dev

# PC NVIDIA (x86_64): cài CUDA Toolkit 12 và TensorRT 10 của NVIDIA,
#                     rồi truyền -DTENSORRT_ROOT=<thư mục TensorRT> cho CMake
# NVIDIA Jetson:      CUDA và TensorRT có sẵn trong JetPack - không cần cài thêm
# Rockchip RK3588:    chép librknnrt.so của RKNN runtime vào /usr/lib
Kết nối vào dự án của bạn

Chép thư mục SDK vào dự án (ví dụ vào 3rdparty/) rồi khai báo trong CMakeLists.txt - dùng chung cho mọi nền tảng.

my_app
my_app/
├── CMakeLists.txt
├── src/
│   └── main.cpp
└── 3rdparty/
    └── ViAiTracker/           gói SDK
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(my_app CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(OpenCV REQUIRED COMPONENTS core imgproc videoio)

# Gói ViAiTracker: include/ViAiTracker.h và lib/ (ViAiTracker.lib trên Windows, libViAiTracker.so trên Linux)
set(VIAI_DIR ${CMAKE_SOURCE_DIR}/3rdparty/ViAiTracker)
# Phần cứng: NVIDIA (TensorRT + CUDA) hoặc RKNN (NPU Rockchip)
set(VIAI_BACKEND "NVIDIA" CACHE STRING "NVIDIA or RKNN")

if(WIN32)
    # Windows: thư viện tĩnh ViAiTracker.lib (cấu hình Debug: ViAiTrackerd.lib)
    add_library(ViAiTracker STATIC IMPORTED)
    set_target_properties(ViAiTracker PROPERTIES
        IMPORTED_LOCATION ${VIAI_DIR}/lib/ViAiTracker.lib
        IMPORTED_LOCATION_DEBUG ${VIAI_DIR}/lib/ViAiTrackerd.lib)
else()
    # Linux: thư viện động libViAiTracker.so
    add_library(ViAiTracker SHARED IMPORTED)
    set_target_properties(ViAiTracker PROPERTIES
        IMPORTED_LOCATION ${VIAI_DIR}/lib/libViAiTracker.so)
endif()
set_property(TARGET ViAiTracker PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${VIAI_DIR}/include)

if(VIAI_BACKEND STREQUAL "NVIDIA")
    find_package(CUDAToolkit REQUIRED)
    # Thư mục TensorRT (include/, lib/)
    set(TENSORRT_ROOT "" CACHE PATH "TensorRT root")
    find_library(NVINFER NAMES nvinfer_10 nvinfer HINTS ${TENSORRT_ROOT}/lib REQUIRED)
    set(VIAI_DEPS ${NVINFER} CUDA::cudart)
else()
    # Thư mục chứa rknn_api.h và librknnrt.so (ví dụ runtime trong SDK của Rockchip)
    set(RKNN_ROOT "" CACHE PATH "RKNN runtime root")
    find_library(RKNNRT NAMES rknnrt HINTS ${RKNN_ROOT}/lib /usr/lib REQUIRED)
    set(VIAI_DEPS ${RKNNRT})
endif()
set_property(TARGET ViAiTracker PROPERTY INTERFACE_LINK_LIBRARIES "${OpenCV_LIBS};${VIAI_DEPS}")

add_executable(my_app src/main.cpp)
target_link_libraries(my_app PRIVATE ViAiTracker)
if(NOT WIN32)
    # Linux: tìm libViAiTracker.so đặt cạnh tệp chạy khi chạy chương trình
    set_target_properties(my_app PROPERTIES BUILD_RPATH "$ORIGIN" INSTALL_RPATH "$ORIGIN")
endif()

Dự án không dùng CMake (qmake, .vcxproj...): thêm thư mục include/ của SDK vào đường dẫn include và link ViAiTracker.lib / libViAiTracker.so cùng các thư viện phần cứng ở mục Yêu cầu.

Build
Linux (bash)
cd my_app && mkdir build && cd build

# NVIDIA (PC hoặc Jetson)
cmake .. -DCMAKE_BUILD_TYPE=Release -DVIAI_BACKEND=NVIDIA -DTENSORRT_ROOT=/opt/TensorRT
# Rockchip RK3588
cmake .. -DCMAKE_BUILD_TYPE=Release -DVIAI_BACKEND=RKNN

make -j$(nproc)
Windows (cmd / PowerShell)
cmake -B build -S . -DVIAI_BACKEND=NVIDIA -DTENSORRT_ROOT=C:/TensorRT-10
cmake --build build --config Release
Tùy chọn CMake
Tùy chọnMặc địnhMô tả
VIAI_BACKENDNVIDIAPhần cứng: NVIDIA (TensorRT + CUDA) hoặc RKNN (NPU Rockchip).
TENSORRT_ROOTtrốngThư mục TensorRT (chứa include/ và lib/). Cần trên Windows và PC Linux; trên Jetson để trống.
RKNN_ROOTtrốngThư mục chứa librknnrt.so; để trống = tìm trong thư mục hệ thống (/usr/lib).
OpenCV_DIRtrốngBiến chuẩn của CMake: thư mục chứa OpenCVConfig.cmake khi OpenCV không cài vào hệ thống (thường gặp trên Windows).
Lưu ý khi build
  • Windows: dùng trình biên dịch MSVC (Visual Studio, hoặc kit MSVC trong Qt Creator / CLion); MinGW không link được thư viện build bằng MSVC.
  • Windows, Debug và Release: cấu hình Debug link ViAiTrackerd.lib, các cấu hình khác (Release, RelWithDebInfo) link ViAiTracker.lib – CMakeLists.txt ở trên đã làm sẵn việc này. Thư viện dùng runtime C++ dạng động (/MD, /MDd), là mặc định của Visual Studio và CMake. Dùng lẫn bản Debug/Release hoặc đặt runtime tĩnh (/MT) sẽ gây lỗi link, thường là LNK2038.
Lưu ý khi chạy
  • Tệp model: tạo tệp .run trên chính máy chạy bằng ViAiTrackerModelBuilder rồi đặt vào thư mục modelsDir. Tệp .run khóa theo máy, chép sang máy khác sẽ không chạy.
  • Windows: đặt DLL của TensorRT, CUDA runtime và OpenCV cạnh tệp .exe (hoặc thêm thư mục của chúng vào PATH).
  • Linux: chép libViAiTracker.so vào cạnh tệp chạy - CMakeLists.txt ở trên đã cho chương trình tìm thư viện ở đó (RPATH $ORIGIN).
  • Linux PC: cài TensorRT, CUDA và OpenCV vào hệ thống, hoặc khai báo thư mục của chúng trong LD_LIBRARY_PATH.
  • Jetson: TensorRT và CUDA có sẵn trong JetPack. RK3588: librknnrt.so đặt trong /usr/lib.
3.2Chương trình mẫu

Khởi tạo bộ bám, chọn mục tiêu và bám trên từng khung hình video.

main.cpp
#include "ViAiTracker.h"
#include <opencv2/videoio.hpp>

int main()
{
    // Khởi tạo (nạp model một lần)
    ViAi::ViAiTrackerConfig cfg = ViAi::ViAiTrackerConfig::load("ViAiTracker.cfg");
    // hoặc gán trong code: cfg.model = "ts"; cfg.precision = "fp16mix"; cfg.modelsDir = "models";
    ViAi::ViAiTracker tracker(cfg);   // báo std::runtime_error nếu thiếu model / cấu hình sai

    cv::VideoCapture cap("input.mp4");
    cv::Mat frame;
    cap.read(frame);

    // Chọn mục tiêu (1 lần, sau khi người dùng click hoặc từ bộ phát hiện)
    tracker.init(frame, cv::Rect2f(420, 260, 64, 48));

    // Vòng lặp bám (mỗi khung hình)
    while (cap.read(frame)) {
        const ViAi::ViAiTrackerResult r = tracker.track(frame);
        if (r.score >= 0.3f) {
            // r.box - vị trí mục tiêu (x, y, w, h), đơn vị pixel
        } else {
            // độ tin cậy thấp: mục tiêu có thể bị che hoặc mất
        }
    }
    return 0;
}
3.3Tệp cấu hình ViAiTracker.cfg

ViAiTrackerConfig::load() đọc mục [tracker] của tệp này (dạng INI: khóa = giá trị, chú thích bắt đầu bằng ;). Các mục khác thuộc về ứng dụng của bạn và được bỏ qua. Khóa nào không ghi sẽ dùng giá trị mặc định.

KhóaMặc địnhÝ nghĩasetConfig()
modeltsts - nhanh nhất, bs - chính xác hơnkhông
precisionfp16mixfp32, fp16 (chỉ ts), fp16mix hoặc ampkhông
models_dirmodelsThư mục chứa tệp model .run; đường dẫn tương đối tính từ thư mục chứa tệp cfgkhông
device0Chỉ số GPU chạy modelkhông
search_factor3.5Vùng tìm kiếm = search_factor x kích thước mục tiêu; lớn hơn thì bám được mục tiêu chuyển động nhanh hơncó
update_interval25Chu kỳ cập nhật template, tính bằng khung hình (chỉ bs)có
update_threshold0.6Score tối thiểu (0..1) để cập nhật template (chỉ bs)có
ViAiTracker.cfg
[tracker]
; Model: ts (nhanh nhất) | bs (chính xác hơn)
model = ts
; Độ chính xác: fp32 | fp16 (chỉ ts) | fp16mix | amp
precision = fp16mix
; Thư mục chứa tệp model .run (tương đối theo thư mục chứa tệp này)
models_dir = models
; Chỉ số GPU
device = 0
; Vùng tìm kiếm = search_factor x kích thước mục tiêu
search_factor = 3.5
; Cập nhật template (chỉ bs): mỗi update_interval khung hình, nếu score > update_threshold
update_interval = 25
update_threshold = 0.6

Tài liệu & phần mềm

Tài liệu kỹ thuật và phần mềm thử nghiệm ViAiTrackerLT

Tài liệu

    Phần mềm

      Cần đăng nhập tài khoản khách hàng để tải. VIAITEC duyệt từng yêu cầu và gửi liên kết tải qua email; liên kết chỉ tải được 1 lần, hiệu lực 24 giờ. Cần hỗ trợ? Liên hệ chúng tôi.

      Yêu cầu tải:

      Cho chúng tôi biết ngắn gọn mục đích sử dụng. VIAITEC duyệt từng yêu cầu và gửi liên kết tải qua email; liên kết chỉ tải được 1 lần, hiệu lực 24 giờ.