在邊緣端進行tensorflow模型的部署(小白初探)

1.配置tensorflow的環境

(我是安裝GPU版本的)

????????建議參考這個博主的文章,確實非常快速!

十分鐘安裝Tensorflow-gpu2.6.0+本機CUDA12 以及numpy+matplotlib各包版本協調問題_tensorflow cuda12-CSDN博客

2.學習自制數據集

(我這里的模型是用來做目標檢測的,所以就先使用labelimg制作了YOLO型的數據集,再使用Python進行格式轉換的)?

????????首先,使用檢測的攝像頭拍攝視頻。然后用Python代碼處理視頻,生成圖像數據:

import cv2
import os# 配置參數
video_path = r"D:\\TC264_Library-master(ADS1.9.4)\\SHangWeiJi\\tf_datas_01.avi"
output_dir = r"E:\\YOLO01\\img_Origin"
desired_fps = 10  # 目標提取幀率# 創建輸出目錄(如果不存在)
os.makedirs(output_dir, exist_ok=True)# 打開視頻文件
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():raise Exception(f"無法打開視頻文件:{video_path}")# 獲取視頻原始屬性
original_fps = cap.get(cv2.CAP_PROP_FPS)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
video_duration = total_frames / original_fpsprint(f"視頻信息:")
print(f"原始幀率:{original_fps:.2f} FPS")
print(f"總幀數:{total_frames}")
print(f"持續時間:{video_duration:.2f} 秒")# 計算幀間隔(根據原始幀率和目標幀率)
frame_interval = int(round(original_fps / desired_fps))
print(f"采樣間隔:每 {frame_interval} 幀保存一次")# 初始化計數器
count = 0
saved_count = 0while True:ret, frame = cap.read()if not ret:break# 按間隔保存幀if count % frame_interval == 0:# 生成帶序號的文件名(4位數字補零)filename = f"frame_{saved_count:04d}.jpg"output_path = os.path.join(output_dir, filename)# 保存圖像(質量參數75,可根據需要調整)cv2.imwrite(output_path, frame, [cv2.IMWRITE_JPEG_QUALITY, 75])saved_count += 1count += 1# 釋放資源
cap.release()
print(f"\n處理完成!共保存 {saved_count} 張圖像到:{output_dir}")

接著,進入labelimg進行標注。YOLO型數據變為TFRecord型數據的轉換代碼如下所示:?

import tensorflow as tfdef parse_tfrecord(example_proto):"""解析TFRecord特征描述"""feature_description = {'image': tf.io.FixedLenFeature([], tf.string),'bboxes': tf.io.VarLenFeature(tf.float32),'points': tf.io.VarLenFeature(tf.float32),'num_bboxes': tf.io.FixedLenFeature([], tf.int64),'num_points': tf.io.FixedLenFeature([], tf.int64)}parsed = tf.io.parse_single_example(example_proto, feature_description)# 解碼圖像image = tf.io.decode_raw(parsed['image'], tf.uint8)image = tf.reshape(image, [224, 224, 1])image = tf.cast(image, tf.float32) / 255.0# 解碼邊界框bboxes = tf.sparse.to_dense(parsed['bboxes'])bboxes = tf.reshape(bboxes, [parsed['num_bboxes'], 4])# 解碼關鍵點points = tf.sparse.to_dense(parsed['points'])points = tf.reshape(points, [parsed['num_points'], 4])return image, {'bbox': bboxes, 'points': points}def load_dataset(subset, batch_size=32):"""加載TFRecord數據集"""pattern = f"E:/TFRecordData/{subset}/{subset}_*.tfrecord"files = tf.data.Dataset.list_files(pattern)dataset = files.interleave(lambda x: tf.data.TFRecordDataset(x),cycle_length=tf.data.AUTOTUNE,num_parallel_calls=tf.data.AUTOTUNE)dataset = dataset.map(parse_tfrecord,num_parallel_calls=tf.data.AUTOTUNE)dataset = dataset.padded_batch(batch_size,padded_shapes=([224, 224, 1],{'bbox': [None, 4],'points': [None, 4]})).prefetch(tf.data.AUTOTUNE)return dataset# 使用示例
train_dataset = load_dataset("train")
val_dataset = load_dataset("val")
test_dataset = load_dataset("test")

3.模型訓練

然后,我們就可以美美地把自己的數據集導入到模型里面進行訓練了

我的模型訓練結果如下:

4.模型的部署

最后,按照單片機平臺的tflite_Micro的資源包配置嵌入式平臺的編譯環境,再把模型的tflite文件轉為C語言格式,一起導入工程代碼。

?

OK!博主的部署操作到這里就結束了,更多細節,還要到后面有時間了再補充。

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

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

相關文章

windows下使用nginx + waitress 部署django

架構介紹 linux一般采用nginx uwsgi部署django,在Windows下,可以取代uwsgi的選項包括Waitressa、Daphnea、Hypercoma和Gunicorna(通過WSLa 運行)。windows服務器一般采用nginx waitress 部署django,,他們的關系如下 django是WEB應用…

利用pnpm patch命令實現依賴包熱更新:精準打補丁指南

需求場景 在Element Plus的el-table組件二次開發中,需新增列顯示/隱藏控件功能。直接修改node_modules源碼存在兩大痛點: 團隊協作時修改無法同步 依賴更新導致自定義代碼丟失 解決方案選型 通過patch-package工具實現: 📦 非…

ThinkPad T520 無法讀到硬盤 問題排查思路

錯誤提示:2100:detection error on hdd0(Main hdd) 1、判斷錯誤提示含義 表示電腦在啟動時無法檢測到主硬盤(HDD0)。 2、 常見原因: 硬盤松動或接觸不良 → 特別是筆記本在移動或震動后,硬盤排線松了。 硬盤損壞 →…

Doris部署生產集群最低要求的部署方案

Doris生產集群最低部署方案(2025年4月版) 一、節點規劃與數量 1. FE節點(Frontend) 數量:至少 3個節點(1個Follower 2個 Observer),確保高可用(HA)。角色分…

游戲引擎學習第227天

今天的計劃 今天的工作重點是進行吸引模式(attract mode)的開發,主要是處理游戲的進出和其他一些小的細節問題,這些是之前想要整理和清理的部分。我做了一些工作,將游戲代碼中的不同部分分離到邏輯上獨立的區域&#…

spark-SQL數據加載和保存

數據加載與保存 通用方式: 通過 spark.read.load 和 df.write.save 實現數據加載與保存。可利用 format 指定數據格式,如 csv 、 jdbc 等; option 用于設置特定參數,像 jdbc 格式下的數據庫連接信息; load 和 save 則…

算法升級戰報:亞馬遜受眾定向工具實測點擊成本降37%

隨著廣告成本居高不下,精準投放成為賣家們繞不開的焦慮點。而最近一輪亞馬遜DSP廣告系統的算法升級,似乎正在給這場投放內卷帶來新的轉機。在這篇文章中,我們將基于實際測試數據,詳細解析亞馬遜受眾定向工具的表現,并復…

大帶寬服務器的優勢

大帶寬服務器最大的優勢就在于可以顯著提高數據傳輸的速度,這對于有著高流量應用和實時數據交換需求的企業來說,大帶寬服務器中的帶寬越大,所提供的數據傳輸速度就越快,同時網絡的延遲度也會變低,所以大帶寬服務器往往…

華為OD機試真題——阿里巴巴找黃金寶箱 IV(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式! 華為OD機試真題《阿里巴巴找黃金寶箱 IV》: 目錄 題目名稱&…

C++零基礎實踐教程

模塊一:準備工作與第一個程序 (熱身) 在正式編寫代碼之前,我們需要了解為什么要學習 C,并搭建好我們的開發環境。然后,我們將編寫并運行第一個簡單的 C 程序。 1. 為什么選擇 C? 你可能聽說過很多編程語言&#xff…

6 CMD 與 PowerShell 指令大全、C 程序終端運行、字符編碼切換指南

1 CMD 與 PowerShell 常用指令 在命令行環境中高效運行程序,掌握終端的基本操作命令至關重要。無論是 Windows 系統下的 CMD(命令提示符)還是 PowerShell,它們都配備了一系列實用的命令,助力我們管理文件、執行程序以及…

Linux——共享內存

目錄 一、共享內存概念 二、共享內存的一些函數 2.1 shmget 創建共享內存 2.2 shmat 訪問共享內存 2.3 shmdt 解除共享內存的映射 2.4 shnctl 刪除共享內存段 三、共享內存 3.1 創建測試進程 3.2 使用循環測試 ?編輯 3.3 共享內存寫入程序 3.4 帶有信號量的共享內…

數啟新疆,智領未來!2025新疆數字經濟發展戰略研討會在烏市啟幕

2025年4月20日,由新疆維吾爾自治區數字經濟聯合會主辦、中鈞科技有限公司承辦的"2025新疆數字經濟發展戰略研討會"將在烏魯木齊水磨溝區金正大廈三層會議中心隆重召開。 作為本年度新疆數字經濟領域規格最高的行業盛會,會議將匯聚自治區14個廳…

Nginx:輕量級高性能的Web服務器與反向代理服務器

目錄 一.引言 二.Nginx的核心特點 2.1高性能與高并發 2.2低資源消耗 2.3功能豐富 2.4高度擴展性 三.Nginx的應用場景 3.1靜態資源服務器 3.2反向代理服務器 3.3API網關 3.4Nginx的配置與使用 四.總結 一.引言 在互聯網高速發展的今天,Web服務器的性能與…

嵌入式Linux設備使用Go語言快速構建Web服務,實現設備參數配置管理方案探究

本文探討,利用Go語言及gin框架在嵌入式Linux設備上高效搭建Web服務器,以實現設備參數的網頁配置。通過gin框架,我們可以在幾分鐘內創建一個功能完善的管理界面,方便對諸如集中器,集線器等沒有界面的嵌入式設備的管理。…

KALI搭建log4j2靶場及漏洞復現全流程

這里使用了兩臺KALI虛擬機,一臺用于安裝靶場環境,一臺用于攻擊 一、Docker的安裝(靶機) 1、Linux內核版本查看 #安裝docker要求內核版本kerner>3.10 #為此,先檢查當前Linux系統的內核版本 uname -a 2、Linux apt…

學習筆記—C++—模板初階

目錄 模板初階 泛型編程 函數模板 模版概念 函數模版格式 模版的原理 函數模板的實例化 模版參數的匹配規則 類模板 模板初階 泛型編程 使用函數重載雖然可以實現,但是有一下幾個不好的地方: 1. 重載的函數僅僅是類型不同,代碼復…

Docker 中多個容器之間的通信

在 Docker 中,多個容器之間的通信可以通過以下幾種主要方式實現,具體選擇取決于網絡需求、隔離性及管理復雜度: 一、自定義 Bridge 網絡(推薦) 通過創建自定義的 Docker 網絡,容器可以加入同一網絡并通過容…

Day1-初次接觸UFS

經過導師初次介紹,了解工作以芯片測試為主,需堅持學習,小白大致需3-6月入門。整體學習應分為3大塊,UFS協議占40%(3-4h),C技能占40%(3-4h),工具或業務占20%(1-2h&#xff…

【LeetCode 熱題100】二叉樹構造題精講:前序 + 中序建樹 有序數組構造 BST(力扣105 / 108)(Go語言版)

🌱 二叉樹構造題精講:前序 中序建樹 & 有序數組構造 BST 本文圍繞二叉樹的兩類構造類題目展開解析: 從前序與中序遍歷序列構造二叉樹 將有序數組轉換為二叉搜索樹 我們將從「已知遍歷構造樹」和「平衡構造 BST」兩個角度,拆…