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.
Giới thiệu
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.
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
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
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
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
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
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
Đượ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.
Xem trên YouTube: Mục tiêu nhỏ giữa mây
Không phát được video này
Đang phát: Mục tiêu nhỏ giữa mây
Video 1: Mục tiêu nhỏ giữa mây
Video 2: Người đạp xe địa hình
Video 3: Máy bay trên nền mây
Video 4: Phương tiện nhìn từ trên cao
Video 5: Máy bay có vệt khói
Video 6: Máy bay xuyên mây
Video 7: Mục tiêu nhỏ trên nền trời xanh
Video 8: Drone gần tòa nhà
Video 9: Mục tiêu nhỏ trong sương mờ
Video 10: Drone trên mái nhà
Video 11: Mục tiêu trong ảnh hồng ngoại
Video 12: Mục tiêu nhỏ trong ảnh hồng ngoại
Video 13: Bám mục tiêu nhỏ trên ảnh hồng ngoại
Video 14: Mục tiêu nhỏ với độ cơ động cao
Video 15: Bám đối tượng trên nền tảng phần cứng nhúng
Đá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.
Tích hợp ViAiTrackerLT vào ứng dụng C++ và tải về tài liệu kỹ thuật.
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.
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 đủ:
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
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.
| Phần cứng | Nền tảng / trình biên dịch | Cầ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 |
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
# 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
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/
├── CMakeLists.txt
├── src/
│ └── main.cpp
└── 3rdparty/
└── ViAiTracker/ gói SDK
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.
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)
cmake -B build -S . -DVIAI_BACKEND=NVIDIA -DTENSORRT_ROOT=C:/TensorRT-10
cmake --build build --config Release
| Tùy chọn | Mặc định | Mô tả |
|---|---|---|
VIAI_BACKEND | NVIDIA | Phần cứng: NVIDIA (TensorRT + CUDA) hoặc RKNN (NPU Rockchip). |
TENSORRT_ROOT | trống | Thư mục TensorRT (chứa include/ và lib/). Cần trên Windows và PC Linux; trên Jetson để trống. |
RKNN_ROOT | trống | Thư mục chứa librknnrt.so; để trống = tìm trong thư mục hệ thống (/usr/lib). |
OpenCV_DIR | trống | Biế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). |
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..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..exe (hoặc thêm thư mục của chúng vào PATH).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).LD_LIBRARY_PATH.librknnrt.so đặt trong /usr/lib.Khởi tạo bộ bám, chọn mục tiêu và bám trên từng khung hình video.
#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;
}
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óa | Mặc định | Ý nghĩa | setConfig() |
|---|---|---|---|
model | ts | ts - nhanh nhất, bs - chính xác hơn | không |
precision | fp16mix | fp32, fp16 (chỉ ts), fp16mix hoặc amp | không |
models_dir | models | Thư mục chứa tệp model .run; đường dẫn tương đối tính từ thư mục chứa tệp cfg | không |
device | 0 | Chỉ số GPU chạy model | không |
search_factor | 3.5 | Vù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ơn | có |
update_interval | 25 | Chu kỳ cập nhật template, tính bằng khung hình (chỉ bs) | có |
update_threshold | 0.6 | Score tối thiểu (0..1) để cập nhật template (chỉ bs) | có |
[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 kỹ thuật và phần mềm thử nghiệm ViAiTrackerLT
Đang được cập nhật
Đang được cập nhật
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.