本文檔基于瑞芯微RV1106的LockAI凌智視覺識別模塊,通過C++語言做的目標檢測實驗。
本文檔展示了如何使用 lockzhiner_vision_module::PaddleDet 類進行目標檢測,并通過lockzhiner_vision_module::Visualize 函數將檢測結果可視化。
源代碼網址:https://gitee.com/LockzhinerAI/LockzhinerVisionModule/tree/master/Cpp_example/D01_test_detection
1. 基礎知識講解
1.1 目標檢測的基本介紹
目標檢測是計算機視覺領域中的一個關鍵任務,它不僅需要識別圖像中存在哪些對象,還需要定位這些對象的位置。具體來說,目標檢測算法會輸出每個檢測到的對象的邊界框(Bounding Box)以及其所屬類別的概率或置信度得分。
應用場景:目標檢測技術廣泛應用于多個領域,包括但不限于安全監控、自動駕駛汽車、智能零售和醫療影像分析。
1.2 PaddleDetection 的基本介紹
PaddleDetection 是基于百度飛槳深度學習框架開發的一個高效的目標檢測庫,支持多種先進的目標檢測模型,如 YOLO 系列、SSD、Faster R-CNN、Mask R-CNN 等。它提供了簡單易用的接口,使得開發者能夠快速部署高性能的目標檢測應用。
特點:
高性能:優化了推理速度,在保持高精度的同時實現了快速響應。
靈活性:支持多種預訓練模型,可以根據具體需求選擇合適的模型架構。
易于集成:提供 C++ API,便于嵌入式系統或桌面應用程序中使用。
豐富的模型庫:涵蓋單階段(One-stage)和雙階段(Two-stage)檢測模型,滿足不同場景的需求。
適用場景:適用于需要對視頻流或圖像進行實時分析的應用場景,例如安防監控、智能交通系統、工業自動化等。
2. API 文檔
2.1 PaddleDetection 類
2.1.1 頭文件
#include
2.1.2 構造函數
lockzhiner_vision_module::PaddleDetection();
作用:
創建一個 PaddleDetection 對象,并初始化相關成員變量。
參數:
無
返回值:
無
2.1.3 Initialize函數
boolInitialize(conststd::string&model_path);
作用:
加載預訓練的 PaddleDetection 模型。
參數:
model_path:模型路徑,包含模型文件和參數文件。
返回值:
true:模型加載成功。
false:模型加載失敗。
2.1.4 SetThreshold函數
voidSetThreshold(floatscore_threshold=0.5,floatnms_threshold=0.3);
作用:
設置目標檢測的置信度閾值和NMS閾值。
參數:
score_threshold:置信度閾值,默認值為0.5。
nms_threshold:NMS閾值,默認值為0.3。
返回值:
無
2.1.5 Predict函數
std::vector<lockzhiner_vision_module::DetectionResult>Predict(constcv::Mat&image);
作用:
使用加載的模型對輸入圖像進行目標檢測,返回檢測結果。
參數:
input_mat (const cv::Mat&): 輸入的圖像數據,通常是一個 cv::Mat 變量。
返回值:
返回一個包含多個 DetectionResult 對象的向量,每個對象表示一個檢測結果。
2.2 DetectionResult 類
2.2.1 頭文件
#include
2.2.2 box函數
lockzhiner_vision_module::Rectbox()const;
作用:
獲取目標檢測結果的邊界框。
參數:
無
返回值:
返回一個 lockzhiner_vision_module::Rect 對象,表示目標檢測結果的邊界框。
2.2.3 score函數
floatscore()const;
作用:
獲取目標檢測結果的置信度得分。
參數:
無
返回值:
返回一個 float 類型的置信度得分。
2.2.4 label_id函數
作用:
獲取目標檢測結果的標簽ID。
參數:
無
返回值:
返回一個整數,表示目標檢測結果的標簽ID。
2.3 Visualize 函數
2.3.1 頭文件
#include
2.3.2 函數定義
voidlockzhiner_vision_module::Visualize(
constcv::Mat&input_mat,
cv::Mat&output_image,
conststd::vector<lockzhiner_vision_module::DetectionResult>&results,
conststd::vector<std::string>&labels={},
floatfont_scale=0.4
);
作用:
將目標檢測結果可視化到輸入圖像上,并返回可視化后的圖像。
參數:
input_mat (const cv::Mat&): 輸入圖像。
output_image (cv::Mat&): 輸出圖像,包含標注后的結果。
results (const std::vectorlockzhiner_vision_module::DetectionResult&): 檢測結果列表。
labels (const std::vectorstd::string&): 可選的標簽列表,用于標注類別名稱,默認為空。
font_scale (float): 字體大小比例,默認為 0.4。
返回值:
無
3. 示例代碼解析
3.1 流程圖
3.2 核心代碼解析
初始化模型
lockzhiner_vision_module::PaddleDetmodel;
if(!model.Initialize(argv[1])) {
std::cout<<"Failed to initialize model."<<std::endl;
return1;
}
模型推理
autoresults=model.Predict(input_mat);
可視化推理結果
cv::Matoutput_image;
lockzhiner_vision_module::Visualize(input_mat,output_image,results);
edit.Print(output_image);
3.3 完整代碼實現
#include
#include
#include
#include
#include
#include
usingnamespacestd::chrono;
intmain(intargc,char*argv[]) {
if(argc!=2) {
std::cerr<<"Usage: Test-PaddleDet model_path"<<std::endl;
return1;
}
// 初始化模型
lockzhiner_vision_module::PaddleDetmodel;
if(!model.Initialize(argv[1])) {
std::cout<<"Failed to initialize model."<<std::endl;
return1;
}
lockzhiner_vision_module::Editedit;
if(!edit.StartAndAcceptConnection()) {
std::cerr<<"Error: Failed to start and accept connection."<<std::endl;
returnEXIT_FAILURE;
}
std::cout<<"Device connected successfully."<<std::endl;
// 打開攝像頭
cv::VideoCapturecap;
cap.set(cv::CAP_PROP_FRAME_WIDTH,640);
cap.set(cv::CAP_PROP_FRAME_HEIGHT,480);
cap.open(0);
if(!cap.isOpened()) {
std::cerr<<"Error: Could not open camera."<<std::endl;
return1;
}
cv::Matinput_mat;
while(true) {
// 捕獲一幀圖像
cap>>input_mat;
if(input_mat.empty()) {
std::cerr<<"Warning: Captured an empty frame."<<std::endl;
continue;
}
// 調用模型進行預測
high_resolution_clock::time_pointstart_time=high_resolution_clock::now();
autoresults=model.Predict(input_mat);
high_resolution_clock::time_pointend_time=high_resolution_clock::now();
// 計算推理時間
autotime_span=duration_cast<milliseconds>(end_time-start_time);
std::cout<<"Inference time: "<<time_span.count()<<" ms"<<std::endl;
// 可視化結果
cv::Matoutput_image;
lockzhiner_vision_module::Visualize(input_mat,output_image,results);
edit.Print(output_image);
}
cap.release();
return0;
}
4. 編譯過程
4.1 編譯環境搭建
請確保你已經按照開發環境搭建指南正確配置了開發環境。
同時以正確連接開發板。
4.2 Cmake介紹
cmake_minimum_required(VERSION3.10)
project(D01_test_detection)
set(CMAKE_CXX_STANDARD17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 定義項目根目錄路徑
set(PROJECT_ROOT_PATH"${CMAKE_CURRENT_SOURCE_DIR}/../..")
message("PROJECT_ROOT_PATH = "${PROJECT_ROOT_PATH})
include("${PROJECT_ROOT_PATH}/toolchains/arm-rockchip830-linux-uclibcgnueabihf.toolchain.cmake")
# 定義 OpenCV SDK 路徑
set(OpenCV_ROOT_PATH"${PROJECT_ROOT_PATH}/third_party/opencv-mobile-4.10.0-lockzhiner-vision-module")
set(OpenCV_DIR"${OpenCV_ROOT_PATH}/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
set(OPENCV_LIBRARIES"${OpenCV_LIBS}")
# 定義 LockzhinerVisionModule SDK 路徑
set(LockzhinerVisionModule_ROOT_PATH"${PROJECT_ROOT_PATH}/third_party/lockzhiner_vision_module_sdk")
set(LockzhinerVisionModule_DIR"${LockzhinerVisionModule_ROOT_PATH}/lib/cmake/lockzhiner_vision_module")
find_package(LockzhinerVisionModule REQUIRED)
add_executable(Test-detection test_detection.cc)
target_include_directories(Test-detection PRIVATE${LOCKZHINER_VISION_MODULE_INCLUDE_DIRS})
target_link_libraries(Test-detection PRIVATE${OPENCV_LIBRARIES}${LOCKZHINER_VISION_MODULE_LIBRARIES})
install(
TARGETS Test-detection
RUNTIME DESTINATION .
)
4.3 編譯項目
使用 Docker Destop 打開 LockzhinerVisionModule 容器并執行以下命令來編譯項目
# 進入Demo所在目錄
cd/LockzhinerVisionModuleWorkSpace/LockzhinerVisionModule/Cpp_example/D01_test_detection
# 創建編譯目錄
rm-rfbuild &&mkdirbuild &&cdbuild
# 配置交叉編譯工具鏈
exportTOOLCHAIN_ROOT_PATH="/LockzhinerVisionModuleWorkSpace/arm-rockchip830-linux-uclibcgnueabihf"
# 使用cmake配置項目
cmake ..
# 執行編譯項目
make-j8&&makeinstall
在執行完上述命令后,會在build目錄下生成可執行文件。
5. 例程運行示例
5.1 運行
chmod777Test-detection
# 在實際應用的過程中LZ-Picodet需要替換為下載的或者你的rknn模型
./Test-detection LZ-Picodet
5.2 結果展示
可以看到我們正確識別了綠色的方塊,同時打印了標簽和置信度。
6. 總結
本文檔詳細介紹了目標檢測的基礎知識及 PaddleDetection 的基本概念,并提供了詳細的API文檔說明,幫助開發者理解和實現目標檢測與可視化功能。通過上述流程,可以構建高效的實時目標檢測系統,滿足多種應用場景的需求。
-
嵌入式系統
+關注
關注
41文章
3667瀏覽量
130915 -
AI
+關注
關注
87文章
34294瀏覽量
275476 -
視覺識別
+關注
關注
3文章
103瀏覽量
16978
發布評論請先 登錄
基于LockAI視覺識別模塊:C++圖像采集例程
基于LockAI視覺識別模塊:C++輪廓檢測
基于LockAI視覺識別模塊:C++條碼識別
基于LockAI視覺識別模塊:C++使用圖像的統計信息

基于LockAI視覺識別模塊:C++輪廓檢測

基于LockAI視覺識別模塊:C++同時識別輪廓和色塊

評論