精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用 C++ 部署 YOLO 目標檢測模型

開發
本文將向你展示如何僅使用OpenCV庫在C++中運行YOLO模型。本文介紹的是如何在CPU上運行YOLOv11模型,而不是GPU。

歸功于Ultralytics,在Python中運行目標檢測模型已經變得非常容易,但在C++中運行YOLO模型呢?本文將向你展示如何僅使用OpenCV庫在C++中運行YOLO模型。本文介紹的是如何在CPU上運行YOLOv11模型,而不是GPU。在GPU上運行模型需要安裝CUDA、CUDNN等,這些步驟可能會讓人感到困惑且耗時。我將在未來寫另一篇文章,介紹如何在支持CUDA的情況下運行YOLO模型。

目前,你只需要安裝OpenCV庫。如果還沒有安裝,可以學習這個鏈接安裝:https://www.youtube.com/watch?v=CnXUTG9XYGI&t=159s。

1. 克隆ultralytics/yolov11倉庫以導出為ONNX模型

  • 創建一個新文件夾,并隨意命名。打開終端并將yolov11倉庫克隆到此文件夾中。我們將使用此倉庫將模型導出為onnx格式。
git clone https://github.com/ultralytics/ultralytics

  • 我將使用yolov11s.pt模型,但你可以使用自定義的yolov11模型,過程不會改變。你可以從這個鏈接(https://github.com/ultralytics/ultralytics)下載預訓練模型,或者使用自己的模型。

現在讓我們將使用下面命令將模型導出為onnx。在模型轉換過程中有不同的參數可以設置,你可以查看第二部分代碼中的model.export中的常用參數及解釋。

from ultralytics import YOLO
 
# 加載一個模型,路徑為 YOLO 模型的 .pt 文件
model = YOLO("/path/to/best.pt")
 
# 導出模型,格式為 ONNX
model.export(format="onnx")
model.export(
    format="onnx",      # 導出格式為 ONNX
    imgsz=(640, 640),   # 設置輸入圖像的尺寸
    keras=False,        # 不導出為 Keras 格式
    optimize=False,     # 不進行優化 False, 移動設備優化的參數,用于在導出為TorchScript 格式時進行模型優化
    half=False,         # 不啟用 FP16 量化
    int8=False,         # 不啟用 INT8 量化
    dynamic=False,      # 不啟用動態輸入尺寸
    simplify=True,      # 簡化 ONNX 模型
    opset=None,         # 使用最新的 opset 版本
    workspace=4.0,      # 為 TensorRT 優化設置最大工作區大小(GiB)
    nms=False,          # 不添加 NMS(非極大值抑制)
    batch=1,            # 指定批處理大小
    device="cpu"        # 指定導出設備為CPU或GPU,對應參數為"cpu" , "0"
)

2. 創建TXT文件以存儲YOLO模型標簽

這一步非常簡單,你只需要創建一個txt文件來存儲標簽。如果你像我一樣使用預訓練的YOLO模型,你可以直接從這個鏈接下載txt文件:https://github.com/amikelive/coco-labels/blob/master/coco-labels-2014_2017.txt。

如果你有自定義模型,那么創建一個新的txt文件并在其中寫入你的標簽,并可以隨意命名此文件。

3. 創建CMakeLists.txt文件

現在,讓我們創建一個CMakeLists.txt文件。使用CMake編譯C++程序時需要此文件。如果你從我分享的鏈接安裝了OpenCV,你應該已經安裝了CMake。

cmake_minimum_required(VERSION 3.10)
project(cpp-yolo-detection) # your folder name here


# Find OpenCV
set(OpenCV_DIR C:/Libraries/opencv/build) # path to opencv
find_package(OpenCV REQUIRED)


add_executable(object-detection object-detection.cpp) # your file name


# Link OpenCV libraries
target_link_libraries(object-detection ${OpenCV_LIBS})

4. 代碼

最后,這是最后一步。我使用了這個倉庫中的代碼,但我修改了一些部分并添加了注釋,以幫助你更好地理解。

#include <fstream>
#include <opencv2/opencv.hpp>




// Load labels from coco-classes.txt file
std::vector<std::string> load_class_list()
{
    std::vector<std::string> class_list;
    // change this txt file  to your txt file that contains labels 
    std::ifstream ifs("C:/Users/sirom/Desktop/cpp-ultralytics/coco-classes.txt");
    std::string line;
    while (getline(ifs, line))
    {
        class_list.push_back(line);
    }
    return class_list;
}


// Model 
void load_net(cv::dnn::Net &net)
{   
    // change this path to your model path 
    auto result = cv::dnn::readNet("C:/Users/sirom/Desktop/cpp-ultralytics/yolov5s.onnx");


    std::cout << "Running on CPU/n";
    result.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
    result.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
 
    net = result;
}


const std::vector<cv::Scalar> colors = {cv::Scalar(255, 255, 0), cv::Scalar(0, 255, 0), cv::Scalar(0, 255, 255), cv::Scalar(255, 0, 0)};


// You can change this parameters to obtain better results
const float INPUT_WIDTH = 640.0;
const float INPUT_HEIGHT = 640.0;
const float SCORE_THRESHOLD = 0.5;
const float NMS_THRESHOLD = 0.5;
const float CONFIDENCE_THRESHOLD = 0.5;


struct Detection
{
    int class_id;
    float confidence;
    cv::Rect box;
};


// yolov5 format
cv::Mat format_yolov5(const cv::Mat &source) {
    int col = source.cols;
    int row = source.rows;
    int _max = MAX(col, row);
    cv::Mat result = cv::Mat::zeros(_max, _max, CV_8UC3);
    source.copyTo(result(cv::Rect(0, 0, col, row)));
    return result;
}


// Detection function
void detect(cv::Mat &image, cv::dnn::Net &net, std::vector<Detection> &output, const std::vector<std::string> &className) {
    cv::Mat blob;


    // Format the input image to fit the model input requirements
    auto input_image = format_yolov5(image);
    
    // Convert the image into a blob and set it as input to the network
    cv::dnn::blobFromImage(input_image, blob, 1./255., cv::Size(INPUT_WIDTH, INPUT_HEIGHT), cv::Scalar(), true, false);
    net.setInput(blob);
    std::vector<cv::Mat> outputs;
    net.forward(outputs, net.getUnconnectedOutLayersNames());


    // Scaling factors to map the bounding boxes back to original image size
    float x_factor = input_image.cols / INPUT_WIDTH;
    float y_factor = input_image.rows / INPUT_HEIGHT;
    
    float *data = (float *)outputs[0].data;


    const int dimensions = 85;
    const int rows = 25200;
    
    std::vector<int> class_ids; // Stores class IDs of detections
    std::vector<float> confidences; // Stores confidence scores of detections
    std::vector<cv::Rect> boxes;   // Stores bounding boxes


   // Loop through all the rows to process predictions
    for (int i = 0; i < rows; ++i) {


        // Get the confidence of the current detection
        float confidence = data[4];


        // Process only detections with confidence above the threshold
        if (confidence >= CONFIDENCE_THRESHOLD) {
            
            // Get class scores and find the class with the highest score
            float * classes_scores = data + 5;
            cv::Mat scores(1, className.size(), CV_32FC1, classes_scores);
            cv::Point class_id;
            double max_class_score;
            minMaxLoc(scores, 0, &max_class_score, 0, &class_id);


            // If the class score is above the threshold, store the detection
            if (max_class_score > SCORE_THRESHOLD) {


                confidences.push_back(confidence);
                class_ids.push_back(class_id.x);


                // Calculate the bounding box coordinates
                float x = data[0];
                float y = data[1];
                float w = data[2];
                float h = data[3];
                int left = int((x - 0.5 * w) * x_factor);
                int top = int((y - 0.5 * h) * y_factor);
                int width = int(w * x_factor);
                int height = int(h * y_factor);
                boxes.push_back(cv::Rect(left, top, width, height));
            }
        }


        data += 85;
    }


    // Apply Non-Maximum Suppression
    std::vector<int> nms_result;
    cv::dnn::NMSBoxes(boxes, confidences, SCORE_THRESHOLD, NMS_THRESHOLD, nms_result);


    // Draw the NMS filtered boxes and push results to output
    for (int i = 0; i < nms_result.size(); i++) {
        int idx = nms_result[i];


        // Only push the filtered detections
        Detection result;
        result.class_id = class_ids[idx];
        result.confidence = confidences[idx];
        result.box = boxes[idx];
        output.push_back(result);


        // Draw the final NMS bounding box and label
        cv::rectangle(image, boxes[idx], cv::Scalar(0, 255, 0), 3);
        std::string label = className[class_ids[idx]];
        cv::putText(image, label, cv::Point(boxes[idx].x, boxes[idx].y - 5), cv::FONT_HERSHEY_SIMPLEX, 2, cv::Scalar(255, 255, 255), 2);
    }
}




int main(int argc, char **argv)
{   
    // Load class list 
    std::vector<std::string> class_list = load_class_list();


    // Load input image
    std::string image_path = cv::samples::findFile("C:/Users/sirom/Desktop/cpp-ultralytics/test2.jpg");
    cv::Mat frame = cv::imread(image_path, cv::IMREAD_COLOR);


    // Load the  modeL
    cv::dnn::Net net;
    load_net(net);


    // Vector to store detection results
    std::vector<Detection> output;
    // Run detection on the input image
    detect(frame, net, output, class_list);


    // Save the result to a file
    cv::imwrite("C:/Users/sirom/Desktop/cpp-ultralytics/result.jpg", frame);


    while (true)
    {       
        // display image
        cv::imshow("image",frame);


        // Exit the loop if any key is pressed
        if (cv::waitKey(1) != -1)
        {
            std::cout << "finished by user\n";
            break;
        }
    }


    std::cout << "Processing complete. Image saved /n";
    return 0;
}

5. 編譯并運行代碼

mkdir build
cd build 
cmake ..
cmake --build .
.\Debug\object-detection.exe
責任編輯:趙寧寧 來源: 小白玩轉Python
相關推薦

2025-01-14 08:30:00

YOLO目標檢測YOLOv8

2024-11-29 16:10:31

2024-10-09 17:02:34

2024-07-30 09:50:00

深度學習目標檢測

2024-11-27 16:06:12

2024-09-09 16:35:10

YOLO模型

2023-12-05 15:44:46

計算機視覺FastAPI

2025-01-22 11:10:34

2020-11-24 17:25:19

模型人工智能深度學習

2024-06-21 10:40:00

計算機視覺

2010-01-26 13:36:27

C++設計

2024-08-20 09:30:00

2011-04-11 09:23:27

設計目標原則C++

2010-01-21 16:45:02

C++設計目標

2011-05-31 17:59:48

C++

2025-01-06 08:20:00

YOLOv11目標檢測Python

2024-10-29 16:18:32

YOLOOpenCV

2025-02-11 08:30:00

2024-07-03 10:46:10

2024-07-22 11:14:36

點贊
收藏

51CTO技術棧公眾號

国产一级淫片免费| 91免费版看片| 凹凸精品一区二区三区| 五月综合激情| 亚洲成人免费在线视频| 成年人在线观看视频免费| 精品黄色免费中文电影在线播放| 国产高清不卡二三区| 欧美在线视频在线播放完整版免费观看 | 91浏览器在线视频| 成人黄色在线观看| 欧美a∨亚洲欧美亚洲| 欧美a级成人淫片免费看| 亚洲国产欧美一区| 午夜天堂在线视频| 奇米777日韩| 夜夜精品浪潮av一区二区三区| 欧美午夜精品久久久久久蜜| 亚洲av永久无码国产精品久久| 美女被久久久| 九九热精品视频| 国产精品毛片一区二区| 日本99精品| 欧美日韩一区二区三区在线看| 黄色一级在线视频| 午夜羞羞小视频在线观看| 9色porny自拍视频一区二区| 成人信息集中地欧美| 国产精品第6页| 亚洲综合国产激情另类一区| 欧美成人免费全部观看天天性色| 亚洲欧美va天堂人熟伦| 欧美电影免费网站| 日韩欧美亚洲一区二区| 日本黄色的视频| 日韩欧美精品一区二区综合视频| 精品福利在线视频| 日本道在线视频| 麻豆网站在线免费观看| 欧美经典一区二区| 日本不卡一二三区| 韩国福利在线| 久久精品日韩一区二区三区| 国产在线观看一区| 人成网站在线观看| 成人黄色av电影| 国产精品永久入口久久久| 午夜久久久久久久久久| 国产精品资源在线| 91精品国产综合久久久久久丝袜| 国产乱淫片视频| 国产一区二区在线观看视频| 成人精品视频久久久久| 国产一区二区自拍视频| 极品美女销魂一区二区三区免费 | 丁香社区五月天| 国产精品试看| 国产91精品网站| 日本三级一区二区三区| 九九精品视频在线看| 成人激情黄色网| 国产成人毛毛毛片| 懂色av噜噜一区二区三区av| 国产精品手机视频| 四虎精品成人影院观看地址| 91看片淫黄大片一级| 欧美日韩一区二| 尤物视频在线免费观看| 专区另类欧美日韩| 国产二区视频在线| 亚洲综合电影| 欧美日本免费一区二区三区| 久久精品一二三四| www.国产精品一区| 亚洲免费伊人电影在线观看av| av电影在线不卡| 久久久久国产精品| 91福利视频网| 91久久久久国产一区二区| 国产一区二区三区香蕉| 国产伦精品一区二区三区高清| 四虎成人免费在线| 国产精品美女久久久久aⅴ| 午夜久久久久久久久久久| 99久久精品免费看国产小宝寻花 | 中文字幕欧美人妻精品一区| 日本亚洲欧洲无免费码在线| 精品日韩成人av| 国产精品毛片一区二区| 综合国产在线| 人妖精品videosex性欧美| 国产精品一区二区av白丝下载 | 日韩**一区毛片| 亚洲一区亚洲二区亚洲三区| 性插视频在线观看| 1区2区3区国产精品| 欧美 丝袜 自拍 制服 另类| av在线播放一区| 日韩视频一区二区三区在线播放 | 国产日产一区 | 韩国av一区二区三区在线观看| 国产伦精品一区二区三区高清 | 亚洲图片你懂的| 国产成人无码精品久久久性色| 精品久久99| 亚洲激情在线视频| a在线视频播放观看免费观看| 久久成人国产| 97伦理在线四区| h网站视频在线观看| 五月天丁香久久| 韩国三级丰满少妇高潮| 亚洲精品1区2区| 青青草国产精品一区二区| 国产精品无码在线播放| 久久久久国产精品麻豆| 国产美女作爱全过程免费视频| 中文字幕不卡三区视频| 欧美成人精品福利| 手机看片国产日韩| 亚洲影音先锋| 国产日韩欧美一区二区| 中文字幕免费高清电视剧网站在线观看 | 五月天婷亚洲天综合网鲁鲁鲁| 成人福利影视| 日韩精品资源二区在线| 国产又色又爽又高潮免费| 美女国产精品| 日韩动漫在线观看| 午夜欧美巨大性欧美巨大| 亚洲国产精品一区二区三区| 久久艹精品视频| 国产综合久久久久久鬼色| 亚洲精品成人a8198a| 亚洲高清一区二区三区| 天天爱天天做天天操| 成人影院入口| 亚洲第一页中文字幕| 人妻人人澡人人添人人爽| 久久成人麻豆午夜电影| 一本色道久久99精品综合| 日本成人片在线| 亚洲欧美一区二区三区在线| 日本一级一片免费视频| 成人毛片老司机大片| 国产精品裸体瑜伽视频| 欧美尿孔扩张虐视频| 456国产精品| 久久久pmvav| 日本久久一区二区三区| 免费看黄色的视频| 三级不卡在线观看| 色一情一乱一伦一区二区三欧美 | 国产国语性生话播放| 99成人精品| 日本精品一区| 欧洲亚洲精品| 欧美精品手机在线| 亚洲乱熟女一区二区| 亚洲成a人v欧美综合天堂| 国产精品久久久久久亚洲色| 麻豆精品网站| 亚洲午夜精品久久久久久浪潮| 精品乱码一区二区三区四区| 久久久91精品国产| 亚洲精品无amm毛片| 精品福利在线观看| 国产一二三四区在线| 国产在线播放一区三区四| 大伊香蕉精品视频在线| 亚洲综合福利| 成人性生交大片免费观看嘿嘿视频| 欧美另类tv| 亚洲天堂免费观看| 国产精品久久久久久无人区| 亚洲va中文字幕| 公侵犯人妻一区二区三区| 精品一区二区三区免费播放| 免费人成在线观看视频播放| 免费看av成人| 亚洲最大成人免费视频| 新版的欧美在线视频| 中文字幕在线视频日韩| 亚洲经典一区二区三区| 91久久精品一区二区三区| www.超碰在线观看| 久久婷婷一区二区三区| 激情在线观看视频| 男人的天堂成人在线| 欧美日韩在线免费观看视频| 秋霞影视一区二区三区| 国产日韩在线视频| 在线黄色的网站| 久久高清视频免费| 精品美女视频在线观看免费软件| 欧美一级二级三级蜜桃| 欧美亚洲自拍偷拍| 久久不射热爱视频精品| 成人精品在线播放| 欧美最猛黑人xxxxx猛交| 国产suv精品一区二区68| 91蝌蚪porny九色| 奇米777在线| 日韩av二区在线播放| 日韩欧美猛交xxxxx无码| 国内精品久久久久久99蜜桃| 97人摸人人澡人人人超一碰| 日韩美女在线看免费观看| 久久99青青精品免费观看| 黄色大片在线看| 欧美mv日韩mv国产网站| 91theporn国产在线观看| 欧美视频不卡中文| 精品久久免费视频| 亚洲视频综合在线| 九一在线免费观看| 99久久国产综合色|国产精品| 国产毛片久久久久久| 麻豆国产精品一区| 一本综合精品| 欧美乱做爰xxxⅹ久久久| 欧美国产一级| 特级西西444www大精品视频| 亚洲男人都懂第一日本| 国产精品日韩一区二区三区| 国产精品麻豆| 国产日韩欧美中文| 97成人超碰| 国产激情久久久| 成人在线爆射| 欧美一区三区三区高中清蜜桃| 密臀av在线| 久久久久久久影院| 日本性爱视频在线观看| 欧美成人三级视频网站| 国产在线激情视频| 久久精品国产欧美激情| 日本在线观看网站| www.亚洲人.com| 男人在线资源站| 最近的2019中文字幕免费一页| 国产三级视频在线| 国产亚洲精品一区二555| 国际av在线| 夜夜嗨av色一区二区不卡| 国产中文字幕在线看| 亚洲天堂av在线免费观看| 国产乱视频在线观看| 在线观看欧美日韩| 色影视在线观看| 久久人人爽亚洲精品天堂| 麻豆免费在线视频| 久久影视电视剧免费网站清宫辞电视| 巨大荫蒂视频欧美大片| 欧美成人黄色小视频| 欧美精品videosex| 88国产精品欧美一区二区三区| 国产社区精品视频| 秋霞午夜一区二区| av亚洲一区| 18成人免费观看网站下载| 国产精品乱战久久久| 精品国产乱码一区二区三区四区| 天海翼精品一区二区三区| 日本福利一区二区三区| 日韩一区电影| 日本中文字幕一级片| 国产毛片一区| 中文字幕永久视频| 国产精品一区二区三区乱码| 国产伦精品一区二区三区精品| 2020国产精品自拍| 久久久久麻豆v国产| 一区二区三区91| 久久亚洲电影天堂| 日本天堂在线观看| 成人自拍视频在线| 美女露出粉嫩尿囗让男人桶| av不卡在线播放| 精品一区二区三区蜜桃在线| 《视频一区视频二区| 亚洲欧美日韩国产另类专区| 中文字幕一区二区三区有限公司 | 欧美精品videos另类日本| 黄色av电影在线观看| 裸体女人亚洲精品一区| 国产视频二区在线观看| 久久久久www| 国产免费拔擦拔擦8x在线播放 | 在线视频亚洲欧美| 永久免费网站在线| 清纯唯美亚洲激情| 清纯唯美激情亚洲| 欧美日韩精品久久久免费观看| 天天综合精品| 少妇性饥渴无码a区免费| 久久99久国产精品黄毛片色诱| 中文字幕天堂av| 中文字幕一区二区三区乱码在线 | 免费在线观看a视频| 亚洲综合免费观看高清完整版| 自拍偷拍校园春色| 亚洲国产高潮在线观看| 免费黄色在线| 国产91精品在线播放| 国产精品巨作av| 午夜啪啪福利视频| 日韩二区在线观看| 好吊色视频一区二区三区| 亚洲精品视频在线| 亚洲在线视频播放| 精品亚洲精品福利线在观看| 午夜成年人在线免费视频| 国产剧情日韩欧美| 精品国产一区一区二区三亚瑟| 免费看又黄又无码的网站| 国产成人av网站| 欧美精品久久久久久久久46p| 在线观看日韩电影| 欧美3p视频在线观看| 性视频1819p久久| 国产精品中文字幕制服诱惑| 91免费网站视频| 精品一区二区三区免费观看| 97人妻人人揉人人躁人人| 日韩欧美综合在线视频| 亚洲欧美日韩成人在线| 97精品在线观看| 风间由美一区二区av101| 日本天堂免费a| 国产老肥熟一区二区三区| 久久国产高清视频| 欧美区在线观看| 黄页视频在线播放| 亚洲一区二区三区久久| 亚洲自拍偷拍网| 九九久久久久久| 亚洲人被黑人高潮完整版| 91片黄在线观看喷潮| 最新国产成人av网站网址麻豆| 蜜桃视频成人m3u8| 亚洲成人网上| 蜜桃av一区二区| 亚洲波多野结衣| 日韩视频在线一区二区| 国产桃色电影在线播放| 国产精品v欧美精品v日韩| 亚洲国产一区二区精品专区| 日本不卡视频一区| 精品露脸国产偷人在视频| 天堂在线中文资源| 日韩av第一页| 成人在线丰满少妇av| 午夜精品免费看| 亚洲男人都懂的| 免费av一级片| 日韩av电影在线网| 成人无号精品一区二区三区| 日韩高清第一页| 亚洲综合区在线| 亚洲aⅴ乱码精品成人区| 国产成人涩涩涩视频在线观看| 成人毛片免费看| 天堂av.com| 性做久久久久久免费观看| 全色精品综合影院| 国产精品吴梦梦| 欧美全黄视频| 99re久久精品国产| 欧美视频一区在线观看| 成人video亚洲精品| 亚洲激情男女视频| 深爱五月激情网| 欧美色网一区二区| 日本最新在线视频| 国产精品一区二区三| 国产一区日韩| 天堂在线精品视频| 亚洲国产视频直播| 啊v视频在线| 99久热re在线精品视频| 亚久久调教视频| 91香蕉视频在线播放| 亚洲精品短视频| 国产精品欧美一区二区三区不卡 | 蜜桃传媒视频麻豆一区| 久久精品免费看| 国产手机在线视频| 久久九九全国免费精品观看| 欧美一级二级三级视频| 亚洲精品久久久中文字幕| 亚洲国产综合91精品麻豆| av资源种子在线观看| 国产在线一区二区三区四区| 久久精品国产**网站演员| 日韩精品成人一区| 久久久精品在线| 欧美日韩国产高清电影| 精品一区二区三区四区五区六区| 欧美片在线播放|