基于C++和人工智能(DeepSeek)實踐

基于C++和人工智能(如DeepSeek)實踐

以下是基于C++和人工智能(如DeepSeek或其他AI框架)的實際應用示例,涵蓋不同領域和技術方向,供參考:

基于C++和人工智能(如DeepSeek或其他AI框架)的實際應用示例

圖像識別與處理

  1. 人臉檢測:使用OpenCV和DNN模塊加載預訓練的Caffe模型,實現實時人臉檢測。
  2. 圖像分類:基于TensorFlow C++ API部署ResNet模型,對圖像進行分類。
  3. 目標跟蹤:結合OpenCV和KCF算法實現視頻中的多目標跟蹤。
  4. 風格遷移:調用LibTorch(PyTorch C++)實現藝術風格遷移。
  5. 超分辨率重建:使用ONNX Runtime部署ESRGAN模型提升圖像分辨率。

自然語言處理

  1. 文本分類:利用FastText的C++接口實現新聞分類。
  2. 情感分析:通過BERT的C++推理庫(如Hugging Face的Transformers)分析評論情感。
  3. 機器翻譯:集成Facebook的Fairseq庫實現多語言翻譯。
  4. 命名實體識別:使用CRF++工具包從文本中提取實體。
  5. 語音識別:調用DeepSpeech的C++ API將語音轉為文本。

    關鍵工具與庫

    • 深度學習框架:LibTorch、TensorFlow C++ API、ONNX Runtime
    • 傳統機器學習:Shark ML、Dlib、MLpack
    • 計算機視覺:OpenCV、Intel OpenVINO
    • NLP:FastText、CRF++
    • 部署工具:Docker、CMake

    每個示例需結合具體場景調整模型選擇和代碼實現,建議優先使用成熟的推理庫(如ONNX Runtime)以提升部署效率。實際開發中需注意內存管理、多線程優化等C++特性。

    使用OpenCV和DNN模塊加載Caffe模型進行人臉檢測

    OpenCV的DNN模塊支持加載預訓練的Caffe模型進行人臉檢測。以下是一個完整的示例代碼,使用res10_300x300_ssd_iter_140000_fp16.caffemodel模型檢測人臉,并擴展到25個示例的邏輯框架。

    #include <opencv2/opencv.hpp>
    #include <opencv2/dnn.hpp>
    #include <iostream>
    #include <vector>using namespace cv;
    using namespace dnn;
    using namespace std;void detectFaces(Net& net, Mat& frame, float confidenceThreshold = 0.5) {Mat blob = blobFromImage(frame, 1.0, Size(300, 300), Scalar(104, 177, 123));net.setInput(blob);Mat detections = net.forward();for (int i = 0; i < detections.size[2]; i++) {float confidence = detections.at<float>(0, 0, i, 2);if (confidence > confidenceThreshold) {int x1 = static_cast<int>(detections.at<float>(0, 0, i, 3) * frame.cols);int y1 = static_cast<int>(detections.at<float>(0, 0, i, 4) * frame.rows);int x2 = static_cast<int>(detections.at<float>(0, 0, i, 5) * frame.cols);int y2 = static_cast<int>(detections.at<float>(0, 0, i, 6) * frame.rows);rectangle(frame, Point(x1, y1), Point(x2, y2), Scalar(0, 255, 0), 2);putText(frame, format("Face %.2f", confidence), Point(x1, y1 - 5), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1);}}
    }int main() {// 加載模型string model = "res10_300x300_ssd_iter_140000_fp16.caffemodel";string config = "deploy.prototxt";Net net = readNetFromCaffe(config, model);// 示例1: 從攝像頭實時檢測VideoCapture cap(0);if (!cap.isOpened()) {cerr << "Cannot open camera" << endl;return -1;}Mat frame;while (true) {cap >> frame;if (frame.empty()) break;detectFaces(net, frame);imshow("Face Detection", frame);if (waitKey(1) == 27) break; // ESC退出}// 示例2-25: 批量處理圖像文件vector<string> imagePaths = {"image1.jpg", "image2.jpg", ..., "image25.jpg"};for (const auto& path : imagePaths) {Mat img = imread(path);if (img.empty()) continue;detectFaces(net, img);imshow(path, img);waitKey(0);}return 0;
    }
    

    關鍵步驟說明

    1. 模型準備
      下載Caffe模型文件(.caffemodel)和配置文件(.prototxt)。推薦使用OpenCV提供的res10_300x300_ssd_iter_140000_fp16.caffemodel,該模型在WIDER FACE數據集上訓練,適用于實時檢測。

    2. 網絡加載
      使用readNetFromCaffe加載模型和配置文件:

      Net net = readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel");
      
    3. 圖像預處理
      將輸入圖像轉換為Blob格式,并進行歸一化:

      Mat blob = blobFromImage(frame, 1.0, Size(300, 300), Scalar(104, 177, 123));
      
    4. 推理與后處理
      模型輸出包含檢測框的坐標和置信度,需過濾低置信度結果并繪制矩形框:

      if (confidence > threshold) {rectangle(frame, Point(x1, y1), Point(x2, y2), Scalar(0, 255, 0), 2);
      }
      

    擴展應用示例

    1. 視頻文件處理
      替換攝像頭輸入為視頻文件路徑:

      VideoCapture cap("video.mp4");
      
    2. 批量圖像處理
      遍歷文件夾中的圖像并保存結果:

      vector<String> filenames;
      glob("images/*.jpg", filenames);
      for (const auto& filename : filenames) {Mat img = imread(filename);detectFaces(net, img);imwrite("output_" + filename, img);
      }
      
    3. 性能優化
      啟用GPU加速(需編譯OpenCV with CUDA):

      net.setPreferableBackend(DNN_BACKEND_CUDA);
      net.setPreferableTarget(DNN_TARGET_CUDA);
      
    常見問題解決
    • 模型下載失敗
      從OpenCV官方GitHub倉庫下載模型文件,或使用備用鏈接:
      res10_300x300_ssd_iter_140000.caffemodel

    • 檢測精度低
      調整置信度閾值(默認0.5),或嘗試其他模型如opencv_face_detector_uint8.pb(TensorFlow格式)。

    • 實時性不足
      縮小輸入圖像尺寸(如改為Size(150, 150)),但會降低檢測精度。

    通過上述方法,可以靈活調整代碼以適應不同場景需求,如實時攝像頭檢測、批量圖像處理或視頻分析。

    部署ResNet模型的基本實例

    TensorFlow C++ API 提供了一種在本地環境中高效運行深度學習模型的方式。以下是使用 TensorFlow C++ API 部署 ResNet 模型進行圖像分類的詳細步驟。

    環境準備

    確保系統已安裝以下依賴項:

    • TensorFlow C++ 庫(可從官方源碼編譯或下載預編譯版本)
    • OpenCV(用于圖像處理)
    • CMake(用于構建項目)

    在 Ubuntu 系統中,可以通過以下命令安裝 OpenCV 和 CMake:

    sudo apt-get install libopencv-dev cmake
    

    加載預訓練的 ResNet 模型

    下載預訓練的 ResNet 模型(如 ResNet50),并將其保存為 .pb.h5 格式。使用 TensorFlow Python API 將模型轉換為凍結圖格式(.pb):

    import tensorflow as tf
    model = tf.keras.applications.ResNet50(weights='imagenet')
    tf.saved_model.save(model, 'resnet50_saved_model')
    

    構建 C++ 項目

    創建 CMakeLists.txt 文件以配置項目:

    cmake_minimum_required(VERSION 3.10)
    project(resnet_classification)find_package(OpenCV REQUIRED)
    include_directories(${OpenCV_INCLUDE_DIRS})add_executable(resnet_classification src/main.cpp)
    target_link_libraries(resnet_classification ${OpenCV_LIBS} tensorflow_cc)
    

    編寫 C++ 代碼

    以下是一個完整的 C++ 示例代碼,加載 ResNet 模型并對單張圖像進行分類:

    #include <tensorflow/cc/client/client_session.h>
    #include <tensorflow/cc/ops/standard_ops.h>
    #include <tensorflow/core/framework/tensor.h>
    #include <opencv2/opencv.hpp>using namespace tensorflow;
    using namespace tensorflow::ops;int main() {// 加載模型SavedModelBundle bundle;SessionOptions session_options;RunOptions run_options;Status status = LoadSavedModel(session_options, run_options, "resnet50_saved_model",{"serve"}, &bundle);if (!status.ok()) {std::cerr << "Failed to load model: " << status << std::endl;return -1;}// 加載并預處理圖像cv::Mat image = cv::imread("example.jpg");cv::resize(image, image, cv::Size(224, 224));cv::cvtColor(image, image, cv::COLOR_BGR2RGB);image.convertTo(image, CV_32F, 1.0 / 255.0);// 創建輸入張量Tensor input_tensor(DT_FLOAT, TensorShape({1, 224, 224, 3}));auto input_data = input_tensor.flat<float>().data();std::memcpy(input_data, image.data, 224 * 224 * 3 * sizeof(float));// 運行模型std::vector<Tensor> outputs;status = bundle.session->Run({{"input_1:0", input_tensor}},{"predictions/Softmax:0"}, {}, &outputs);if (!status.ok()) {std::cerr << "Failed to run model: " << status << std::endl;return -1;}// 解析輸出auto output_data = outputs[0].flat<float>();int max_index = 0;float max_prob = output_data(0);for (int i = 1; i < output_data.size(); ++i) {if (output_data(i) > max_prob) {max_prob = output_data(i);max_index = i;}}std::cout << "Predicted class: " << max_index << " with probability: " << max_prob << std::endl;return 0;
    }
    

    多圖像批量處理

    對于批量處理 25 張圖像,可以通過擴展輸入張量的維度來實現:

    // 創建輸入張量(批量大小為 25)
    Tensor input_tensor(DT_FLOAT, TensorShape({25, 224, 224, 3}));
    auto input_data = input_tensor.flat<float>().data();// 加載并預處理 25 張圖像
    std::vector<cv::Mat> images;
    for (int i = 0; i < 25; ++i) {cv::Mat image = cv::imread("example_" + std::to_string(i) + ".jpg");cv::resize(image, image, cv::Size(224, 224));cv::cvtColor(image, image, cv::COLOR_BGR2RGB);image.convertTo(image, CV_32F, 1.0 / 255.0);std::memcpy(input_data + i * 224 * 224 * 3, image.data, 224 * 224 * 3 * sizeof(float));
    }
    

    性能優化
    1. 多線程處理:使用 OpenMP 或 TBB 并行加載和預處理圖像。
    2. GPU 加速:在 SessionOptions 中配置 GPU 選項:
    session_options.config.mutable_gpu_options()->set_allow_growth(true);
    

    1. 模型量化:將模型轉換為 FP16 或 INT8 以減少推理時間。

    錯誤處理

    在關鍵步驟中添加錯誤檢查:

    if (image.empty()) {std::cerr << "Failed to load image" << std::endl;return -1;
    }
    

    完整示例項目結構

    resnet_classification/
    ├── CMakeLists.txt
    ├── src/
    │   └── main.cpp
    ├── resnet50_saved_model/
    │   ├── saved_model.pb
    │   └── variables/
    └── images/├── example_0.jpg├── example_1.jpg└── ...
    

    以上內容提供了從環境配置到實際部署的完整流程,適用于對 25 張圖像進行批量分類的場景。

    基于C++結合OpenCV和KCF算法實現

    以下是基于C++結合OpenCV和KCF算法實現多目標跟蹤的簡化示例框架,OpenCV已內置KCF等跟蹤算法,可直接調用API實現。示例分為目標初始化、跟蹤循環和結果顯示三部分。


    KCF多目標跟蹤框架

    #include <opencv2/opencv.hpp>
    #include <opencv2/tracking.hpp>
    #include <vector>int main() {// 讀取視頻cv::VideoCapture video("input.mp4");if (!video.isOpened()) return -1;// 存儲跟蹤器與目標框std::vector<cv::Ptr<cv::Tracker>> trackers;std::vector<cv::Rect> targets;// 第一幀初始化目標cv::Mat frame;video.read(frame);// 示例:手動選擇多個ROI(實際可替換為自動檢測)cv::selectROIs("Select Targets", frame, targets);if (targets.empty()) return -1;// 為每個目標創建KCF跟蹤器for (const auto& roi : targets) {cv::Ptr<cv::Tracker> tracker = cv::TrackerKCF::create();tracker->init(frame, roi);trackers.push_back(tracker);}// 跟蹤循環while (video.read(frame)) {for (size_t i = 0; i < trackers.size(); ++i) {cv::Rect bbox;if (trackers[i]->update(frame, bbox)) {cv::rectangle(frame, bbox, cv::Scalar(0, 255, 0), 2);}}cv::imshow("Tracking", frame);if (cv::waitKey(30) == 27) break;}return 0;
    }
    

    關鍵點說明

    1. 目標初始化

      • 使用selectROIs交互式選擇多個目標區域(ROI),實際應用中可替換為目標檢測算法(如YOLO、SSD)的輸出。
      • 每個ROI對應一個獨立的KCF跟蹤器。
    2. 跟蹤器創建

      • OpenCV的TrackerKCF::create()初始化KCF算法實例。
      • 調用init()方法綁定目標區域與第一幀圖像。
    3. 實時更新與繪制

      • 在循環中調用update()方法更新目標位置,成功時返回true并更新邊界框。
      • 使用rectangle()繪制跟蹤結果。

    擴展優化方向

    • 自動目標檢測
      替換手動ROI選擇,集成深度學習模型(如OpenCV的dnn模塊)實現自動初始化:

      // 偽代碼示例:使用YOLO檢測目標
      cv::dnn::Net net = cv::dnn::readNet("yolov3.weights", "yolov3.cfg");
      std::vector<cv::Rect> detectTargets(cv::Mat frame) {

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/news/917149.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/news/917149.shtml
    英文地址,請注明出處:http://en.pswp.cn/news/917149.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    書生浦語第五期L0G1000

    完成 視頻課程學習&#xff0c;并在 https://chat.intern-ai.org.cn/ 平臺中實踐提示詞技巧&#xff0c;與 InternLM 和 InternVL 各完成 10 次對話記錄在飛書文檔中。 參加 浦語提示詞工程論文分類打榜賽&#xff0c;分數超過 40 分 InternLM InternVL 浦語提示詞工程論文分…

    SpringCloud(一)微服務基礎認識

    1、介紹微服務架構是一種架構模式&#xff0c;它提倡將原本獨立的單體應用&#xff0c;拆分成多個小型服務。這些小型服務各 自獨立運行&#xff0c;服務與服務間的通信采用輕量級通信機制&#xff08;一般基于HTTP協議的RESTful API&#xff09; &#xff0c;達到互相協調、互…

    MaxKB+MinerU:通過API實現PDF文檔解析并存儲至知識庫

    MinerU是一款開源的高質量數據提取工具&#xff0c;能夠將PDF文檔轉換為Markdown和JSON格式。2025年6月13日&#xff0c;MinerU發布了v2.0版本&#xff0c;相較于v1.0版本實現了架構和功能的全面重構與升級。在優化代碼結構和交互方式的同時&#xff0c;v2.0版本還集成了小參數…

    一文了解 `package.json` 和 `package-lock.json`文件

    所有使用 npm 或 yarn&#xff08;部分場景&#xff09;管理依賴的 JavaScript/Node.js 項目都會存在**的核心文件–package.json 和 package-lock.json&#xff0c;無論項目類型是 Vue、React、Angular&#xff0c;還是純 Node.js 后端項目、普通 JavaScript 工具庫等。 所以這…

    【AI論文】大語言模型量化的幾何原理:將GPTQ視為Babai最近平面算法

    摘要&#xff1a;將大型語言模型&#xff08;LLMs&#xff09;的權重從16位量化到更低位寬&#xff0c;是實際部署大規模Transformer模型到更具性價比的加速器上的通用方法。GPTQ已成為大語言模型規模下一站式訓練后量化的標準方法之一。然而&#xff0c;其內部工作原理被描述為…

    數據處理四件套:NumPy/Pandas/Matplotlib/Seaborn速通指南

    點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生專屬優惠。 數據清洗 特征可視化 Kaggle數據集實操 讀者收獲&#xff1a;1周內具備數據預處理能力 數…

    計算機系統層次結構

    計算機系統通過多層抽象&#xff0c;平衡硬件效率與軟件靈活性&#xff0c;各層以獨立語言和功能構成有機整體。一、層次劃分&#xff08;從底層到頂層&#xff09;層級名稱特點實現方式第1級微程序機器層硬件直接執行微指令&#xff08;如微操作控制信號&#xff09;。物理硬件…

    04 基于sklearn的機械學習-梯度下降(上)

    梯度下降一 、為什么要用到梯度下降&#xff1f;正規方程的缺陷&#xff1a;非凸函數問題&#xff1a;損失函數非凸時&#xff0c;導數為0會得到多個極值點&#xff08;非唯一解&#xff09;計算效率低&#xff1a;逆矩陣運算時間復雜度 O(n3)&#xff0c;特征量翻倍時計算時間…

    淘寶 API HTTP/2 多路復用與連接優化實踐:提升商品數據采集吞吐量

    一、引言?隨著電商行業的蓬勃發展&#xff0c;對淘寶平臺商品數據的采集需求日益增長。無論是市場調研公司分析市場趨勢、電商平臺整合商品資源&#xff0c;還是商家進行競品分析&#xff0c;都需要高效、穩定地獲取大量淘寶商品數據。然而&#xff0c;傳統的 HTTP 協議在面對…

    javascript中call、apply 和 bind 的區別詳解

    文章目錄深入淺出&#xff1a;JavaScript 中的 call、apply 和 bind一、三位魔法師的共同使命二、各顯神通的魔法師們1. call - 即時通訊專家2. apply - 批量處理高手3. bind - 預約服務大師三、魔法師們的對比表格四、魔法師們的實際應用1. 借用方法2. 函數柯里化3. 事件處理五…

    【PHP】接入百度AI開放平臺人臉識別API,實現人臉對比

    目錄 一、需求 二、準備工作 1、申請服務 2、創建應用&#xff0c;獲取開發密鑰 3、官方開發文檔 4、測試人像圖片 三、PHP接入 1、鑒權&#xff0c;獲取access_token 2、人臉對比 四、完整代碼 一、需求 現在人臉識別、人臉對比技術越來越成熟&#xff0c;使用越來越…

    【東楓科技】DreamHAT+

    DreamHAT 是一款頂部附加硬件 (HAT) 套件&#xff0c;可為 Raspberry Pi 提供 60GHz 毫米波雷達供您使用。 全尺寸 HAT 包含一個英飛凌 BGT60TR13C 芯片&#xff0c;具有單個發射天線和三個接收器&#xff08;TX/RX&#xff09;&#xff0c;通過 GPIO 引腳和 SPI 連接到 Raspbe…

    Spring Boot + MongoDB:從零開始手動配置 MongoConfig 實戰

    前言 你以為只要寫上 spring.data.mongodb.*,就能一勞永逸,MongoDB 立馬聽話?別天真,這只是入門級操作,像是拿個自動擋鑰匙,開個小車溜達溜達,遠遠算不上高手操作。當項目需求變得復雜,連接字符串需要靈活配置,或者多數據源并行作戰時,自動配置的魔法顯得捉襟見肘。…

    建筑節能目標下,樓宇自控系統以高效運行助力節能減碳

    隨著全球氣候變化問題日益嚴峻&#xff0c;節能減排已成為各國政府和企業的重要任務。在建筑領域&#xff0c;樓宇自控系統&#xff08;Building Automation System, BAS&#xff09;作為實現建筑節能目標的關鍵技術&#xff0c;正發揮著越來越重要的作用。根據中國政府發布的《…

    LOVON——面向足式Open-Vocabulary的VLN導航:LLM做任務分解、YOLO11做目標檢測,最后L2MM將指令和視覺映射為動作,且解決動態模糊

    前言 因為項目需要(比如我們在做的兩個展廳講解訂單)&#xff0c;近期我一直在研究VLN相關&#xff0c;有些工作哪怕暫時還沒開源(將來可能會開源)&#xff0c;但也依然會解讀&#xff0c;比如好處之一是構建完整的VLN知識體系&#xff0c;本文便是其中一例 我在解讀過程中&am…

    在線免費的AI文本轉語音工具TTSMaker介紹

    TTSMaker是一個在線的文本轉語音工具&#xff0c; 支持多語言和中文方言&#xff0c;不同的語言和方言單次轉換的字符上限從200-10000 不同&#xff0c;轉換的效果還不錯&#xff0c;聽不出明顯的AI痕跡。 工具的網址是&#xff1a;https://ttsmaker.cn/。 工具的界面如上&…

    【AI問答】PromQL中interval和rate_interval的區別以及Grafana面板的配置建議

    問題1&#xff1a;interval和rate_interval的區別 在PromQL中確實有 $__rate_interval 這個特殊的變量&#xff0c;它與 $__interval 有不同的用途和計算方式。 $__interval vs $__rate_interval 1. $__interval 含義&#xff1a;Grafana計算出的基本時間間隔計算方式&#xff…

    STM32學習記錄--Day5

    今天了解了&#xff1a;中斷中斷有多個類別包括&#xff1a;USART中斷&#xff0c;I2C中斷等&#xff1b;并通過NVIC來分配中斷的優先級EXTIEXTI的內部結構&#xff1a;EXTI線&#x1f527; ??一、EXTI系統核心架構??1. ??中斷源輸入&#xff08;左上區域&#xff09;??…

    CentOS7下同步時間的幾種方式(NTP 、Chrony和systemd-timesyncd)

    文章目錄前言一、NTP (Network Time Protocol) & ntpd1.原理2. 安裝與配置(ntp 包)3.NTPd 優缺點對比二、Chrony1.原理2.安裝與配置 (chrony 包)3. 優點4. 缺點三、systemd-timesyncd1.原理2.安裝與配置 (systemd 自帶)3. 優點4. 缺點四、手動同步工具1.ntpdate(已廢棄&…

    Web3:在 VSCode 中基于 Foundry 快速構建 Solidity 智能合約本地開發環境

    相關文章推薦鏈接Web3專欄https://blog.csdn.net/qq_42392981/category_13016259.html在 VSCode 中基于 Foundry 快速構建 Solidity 智能合約本地開發環境引言1. 開發環境準備&#xff08;Windows&#xff09;1.1 安裝 VSCode1.2 安裝推薦插件1.3 安裝 Foundry1.4 驗證 Forge 和…