Rust實現FasterR-CNN目標檢測全流程

使用 Rust 和 FasterR-CNN 進行目標檢測 

FasterR-CNN 是目標檢測領域廣泛使用的深度學習模型。Rust 生態中可以通過 tch-rs(Torch 綁定)調用預訓練的 PyTorch 模型實現。以下為完整實現步驟:


環境準備

安裝 Rust 和必要的依賴:

cargo add tch
cargo add anyhow  # 錯誤處理

下載預訓練的 FasterR-CNN 模型(需 PyTorch 格式 .pt 文件),或使用 TorchScript 格式模型。示例中使用 fasterrcnn_resnet50_fpn


加載預訓練模型

use tch::{nn, Device, Tensor, Kind};fn load_model(model_path: &str) -> anyhow::Result<nn::Module> {let device = Device::cuda_if_available();let model = nn::Module::load(model_path, device)?;Ok(model)
}

圖像預處理

將輸入圖像轉換為模型需要的格式(歸一化 + 標準化):

use tch::vision::image;fn preprocess_image(img_path: &str) -> anyhow::Result<Tensor> {let image = image::load(img_path)?;let resized = image.resize(800, 800);  // FasterR-CNN 典型輸入尺寸let tensor = resized.to_kind(Kind::Float) / 255.0;let mean = Tensor::of_slice(&[0.485, 0.456, 0.406]).view([3, 1, 1]);let std = Tensor::of_slice(&[0.229, 0.224, 0.225]).view([3, 1, 1]);Ok((tensor - mean) / std)
}

運行推理

執行目標檢測并獲取結果:

fn run_detection(model: &nn::Module, input_tensor: &Tensor) -> anyhow::Result<(Tensor, Tensor)> {let output = model.forward_ts(&[input_tensor.unsqueeze(0)])?;let boxes = output.get(0).unwrap();let scores = output.get(1).unwrap();Ok((boxes, scores))
}

后處理與可視化

過濾低置信度檢測結果并繪制邊框:

use tch::IndexOp;fn filter_results(bboxes: &Tensor, scores: &Tensor, threshold: f64) -> Vec<(Vec<f64>, f64)> {let mut detections = Vec::new();for i in 0..scores.size()[0] {if scores.double_value(&[i]) > threshold {let bbox = bboxes.i(i).to_kind(Kind::Double).to_vec::<f64>().unwrap();detections.push((bbox, scores.double_value(&[i])));}}detections
}

使用 imageprocopencv-rust 繪制檢測框(需額外安裝依賴)。


完整流程示例

fn main() -> anyhow::Result<()> {let model = load_model("fasterrcnn.pt")?;let input = preprocess_image("input.jpg")?;let (bboxes, scores) = run_detection(&model, &input)?;let detections = filter_results(&bboxes, &scores, 0.7);for (bbox, score) in detections {println!("Detected: {:?} with score {:.2}", bbox, score);}Ok(())
}

注意事項

  1. 模型需提前轉換為 TorchScript 格式(通過 Python 的 torch.jit.script
  2. GPU 加速需配置 CUDA 環境
  3. 輸入圖像尺寸應與模型訓練時一致
  4. COCO 數據集的類別標簽需單獨加載

Rust 生態的計算機視覺庫(如 cv)可進一步簡化圖像操作,但 tch-rs 目前是調用 PyTorch 模型的最成熟方案。

Polars 支持各種文件格式

Polars 支持各種文件格式、包括 CSV、Parquet 和 JSON

use polars::prelude::*;fn main() -> Result<()> {// Create a DataFrame with 4 names, ages, and citieslet df = df!["name" => &["周杰倫", "力辣", "張慧費", "王菲"],"age" => &[55, 60, 70, 67],"city" => &["New York", "Los Angeles", "Chicago", "San Francisco"]]?;// Display the DataFrameprintln!("{:?}", df);Ok(())
}

集成Polars和Pyo3構建

在Rust中集成Polars(數據框庫)和Pyo3(Python綁定)構建Web服務,可以通過以下方法實現:

創建基礎Rust項目

使用Cargo初始化新項目,添加必要的依賴。Cargo.toml需要包含以下依賴項:

[dependencies]
actix-web = "4"  # Web框架
polars = { version = "0.28", features = ["lazy"] }  # 數據處理
pyo3 = { version = "0.18", features = ["extension-module"] }  # Python集成
tokio = { version = "1", features = ["full"] }  # 異步運行時

實現P

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

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

相關文章

Github 2025-07-03Go開源項目日報Top10

根據Github Trendings的統計,今日(2025-07-03統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Go項目10JavaScript項目2Go編程語言:構建簡單、可靠和高效的軟件 創建周期:3474 天開發語言:Go協議類型:BSD 3-Clause “New” or “Revise…

XML Schema 安裝使用教程

一、XML Schema 簡介 XML Schema&#xff08;XSD&#xff0c;全稱 XML Schema Definition&#xff09;是用于定義 XML 文檔結構、數據類型和數據約束的標準方式。它比 DTD 更加強大&#xff0c;支持數據類型、默認值、命名空間等&#xff0c;是企業級 XML 應用推薦的驗證方式。…

【字節跳動】數據挖掘面試題0008:計算西瓜視頻內容好評率

文章大綱題目描述題目描述 西瓜視頻近期開展了”2020百大人氣創作者”優質內容扶持項目&#xff0c;鼓勵用戶產出優質的視頻內容。 現需要統計2020年11月01日至2020年11月30日期間創作的視頻中&#xff0c; “科技”大類下“數碼測評"子類的視頻好評率&#xff08;好評率好…

Linux 進程控制:全面深入剖析進程創建、終止、替換與等待

文章目錄引言一、進程創建&#xff1a;fork()系統調用的奧秘1.1 fork()的基本原理1.2 代碼示例與解讀1.3 寫時復制&#xff08;COW&#xff09;優化二、進程終止&#xff1a;exit()與_exit()的抉擇2.1 exit()和_exit()的區別2.2 代碼示例與分析三、進程替換&#xff1a;exec()函…

PJSIP 中的 TCP 傳輸配置指南

PJSIP 支持通過 TCP 傳輸 SIP 消息&#xff0c;相比 UDP 提供了更可靠的傳輸機制。以下是關于在 PJSIP 中使用 TCP 的詳細指南。1. 創建 TCP 傳輸基本 TCP 傳輸配置cpjsua_transport_config tcp_cfg; pjsua_transport_config_default(&tcp_cfg); tcp_cfg.port 5060; // SI…

小菜狗的云計算之旅,今天學習MySQL數據庫基礎知識及操作

目錄 一、概述 數據庫概念 數據庫的類型 關系型數據庫模型 關系數據庫相關概念 二、安裝 1、mariadb安裝 2、mysql安裝 3、啟動并開機自啟 4、本地連接&#xff08;本地登錄&#xff09; 三、mysql數據庫配置與命令 yum安裝后生成的目錄 mysql服務器的啟動腳本 數…

為什么是直接在**原型(prototype)上**添加函數

這是一個非常經典、核心的 JavaScript 面向對象編程問題&#xff1a;> 為什么是直接在**原型&#xff08;prototype&#xff09;上**添加函數&#xff0c;而不是在類/構造函數內部直接添加&#xff1f;你提到的代碼中&#xff1a;javascript function TopSearchComponent() …

深入理解 classnames:React 動態類名管理的最佳實踐

在現代前端開發中&#xff0c;我們經常需要根據組件的狀態、屬性或用戶交互來動態切換 CSS 類名。雖然 JavaScript 提供了多種方式來處理字符串拼接&#xff0c;但隨著應用復雜性的增加&#xff0c;傳統的類名管理方式很快就會變得混亂不堪。這時&#xff0c;classnames 庫就像…

C++系列(七):深度探索C++內存 --- 分區、堆棧、new/delete與高效編程實踐

引言 程序運行的本質是對數據的處理&#xff0c;而內存則是程序執行的核心舞臺。理解內存的物理與邏輯分區&#xff0c;是掌握程序底層行為、編寫高效可靠代碼的關鍵基石。內存并非混沌一片&#xff0c;而是被嚴格劃分為代碼區、全局區、棧區和堆區。每個區域擁有獨特的生命周…

微信小程序71~80

1.總結小程序生命周期 小程序冷啟動&#xff0c;鉤子函數執行的順序保留當前頁面&#xff0c;進入下一個頁面&#xff0c;鉤子函數執行的順序銷毀當前頁面&#xff0c;進入下一個頁面&#xff0c;鉤子函數執行的順序小程序熱啟動&#xff0c;鉤子函數執行的順序 2.使用Componen…

[Pytest][Part 3]檢測python package狀態

目錄 實現需求1&#xff1a; 檢查python package狀態——pkg_resource hook實現自動檢測包狀態 conftest.py hook鉤子函數 Part1: https://blog.csdn.net/x1987200567/article/details/144915315?spm1001.2014.3001.5501 從這里開始逐個實現Part1中的需求 實現需求1&a…

自定義時間范圍選擇組件使用教程(基于 Vue 3 + Element Plus)

&#x1f553; 自定義時間范圍選擇組件使用教程&#xff08;基于 Vue 3 Element Plus&#xff09;? 一個靈活實用的時間范圍選擇器&#xff0c;支持開始時間、結束時間、快捷時間選項、本地雙向綁定、插槽擴展等功能。–&#x1f4d8; 一、功能介紹 該組件基于 Element Plus …

YOLOv8 模型轉換 ONNX 后 C# 調用異常:一個參數引發的跨平臺適配難題

一、問題背景&#xff1a;從 Python 訓練到 C# 部署的跨平臺需求 作為一名 C# 開發者&#xff0c;我在完成 YOLOv8 模型訓練&#xff08;使用 Ultralytics 官方框架&#xff0c;訓練數據為自定義目標檢測數據集&#xff0c;輸入尺寸 640x640&#xff0c;訓練輪次 100 輪&#…

Apache Cloudberry 亮相 2025 IvorySQL 生態大會暨 PostgreSQL 高峰論壇

6 月 27 日至 28 日&#xff0c;IvorySQL 2025 生態大會暨 PostgreSQL 高峰論壇在泉城濟南順利召開。本屆大會由 IvorySQL 開源數據庫社區主辦、瀚高基礎軟件股份有限公司承辦&#xff0c;吸引了來自國內外的數據庫技術專家、開發者與開源愛好者齊聚一堂&#xff0c;聚焦數據庫…

CMake之CMakeLists.txt語法規則

本文主要參考正點原子的應用開發手冊&#xff0c;僅作為本人學習筆記使用。 目錄 cmake 的使用方法其實還是非常簡單的&#xff0c;重點在于編寫 CMakeLists.txt&#xff0c;CMakeLists.txt 的語法規則也簡單&#xff0c;并沒有 Makefile的語法規則那么復雜難以理解&#xff01…

Mysql專題復習

重點內容&#xff1a;1. Mysql架構&#xff1a;客戶端 Server層 存儲引擎2. 索引數據結構&#xff1a;B樹4. 索引優化&#xff1a;覆蓋索引、排序、JOIN、分頁&#xff1b; COUNT; 索引下推&#xff1b;單/雙路排序5. 數據庫事務&#xff1b; 鎖&#xff1b;隔離級別&#xff…

CLIP的tokenizer詳解

一、bytes_to_unicodedef bytes_to_unicode():"""Returns list of utf-8 byte and a corresponding list of unicode strings.The reversible bpe codes work on unicode strings.This means you need a large # of unicode characters in your vocab if you wa…

【如何判斷Linux系統是Ubuntu還是CentOS】

要確定您的操作系統是 Ubuntu 還是 CentOS&#xff0c;可以通過以下方法快速檢查&#xff1a; 方法 1&#xff1a;通過終端命令&#xff08;推薦&#xff09; 在終端中執行以下命令之一&#xff1a; 查看 /etc/os-release 文件 cat /etc/os-releaseUbuntu 特征&#xff1a;顯示…

RISCV Linux 虛擬內存精講系列二 -- Linux 入口 head.S

通過 Linux 的構建系統&#xff0c;即 Linux 源代碼的根目錄下的 Makefile&#xff0c;能夠找到 vmlinux 的鏈接文件&#xff0c;從而能夠查看其入口代碼 head.S:_start&#xff0c; 如下&#xff1a; Linux 構建系統主Makefile: vmlinux.lds: head.S: 找到該入口后&#xff0c…

springAI學習:Advisors

spring AI Advisors類似于攔截器&#xff0c;會對請求的prompt做出特定的修改和增強&#xff08;比如傳入歷史溝通記錄、搜索信息等等&#xff09;&#xff0c;以達到完善prompt的目的。通過Advisors API&#xff0c;開發人員可以創建更為復雜、可重用、可維護的AI組件。下面介…