部署yolo到k230教程

訓練:K230 借助 AICube部署AI 視覺模型 YOLO等教程_嘉楠 ai cube多標簽分類-CSDN博客K230模型訓練ai cube報錯生成部署文件異常_aicube部署模型顯示生成部署文件異常-CSDN博客

部署:

# 導入必要的庫和模塊
import os
import ujson          # 超快的JSON解析庫
import aicube         # AI加速庫
from media.sensor import *    # 攝像頭傳感器相關
from media.display import *   # 顯示相關
from media.media import *     # 媒體處理基礎庫
from time import *            # 時間相關
import nncase_runtime as nn   # 神經網絡運行時庫
import ulab.numpy as np       # 嵌入式優化的numpy替代庫
import time
import utime                  # 更精確的時間庫
import image                  # 圖像處理
import random
import gc                     # 垃圾回收
import utime# 顯示模式配置(LCD或HDMI)
display_mode="lcd"
if display_mode=="lcd":DISPLAY_WIDTH = ALIGN_UP(800, 16)  # 對齊到16的倍數(硬件要求)DISPLAY_HEIGHT = 480
else:DISPLAY_WIDTH = ALIGN_UP(1920, 16)DISPLAY_HEIGHT = 1080# RGB888輸出分辨率配置
OUT_RGB888P_WIDTH = ALIGN_UP(1080, 16)
OUT_RGB888P_HEIGH = 720# 預定義的80種顏色(ARGB格式),用于不同類別的檢測框顯示
# 顏色盤
color_four = [(255, 220, 20, 60), (255, 119, 11, 32), (255, 0, 0, 142), (255, 0, 0, 230),(255, 106, 0, 228), (255, 0, 60, 100), (255, 0, 80, 100), (255, 0, 0, 70),(255, 0, 0, 192), (255, 250, 170, 30), (255, 100, 170, 30), (255, 220, 220, 0),(255, 175, 116, 175), (255, 250, 0, 30), (255, 165, 42, 42), (255, 255, 77, 255),(255, 0, 226, 252), (255, 182, 182, 255), (255, 0, 82, 0), (255, 120, 166, 157),(255, 110, 76, 0), (255, 174, 57, 255), (255, 199, 100, 0), (255, 72, 0, 118),(255, 255, 179, 240), (255, 0, 125, 92), (255, 209, 0, 151), (255, 188, 208, 182),(255, 0, 220, 176), (255, 255, 99, 164), (255, 92, 0, 73), (255, 133, 129, 255),(255, 78, 180, 255), (255, 0, 228, 0), (255, 174, 255, 243), (255, 45, 89, 255),(255, 134, 134, 103), (255, 145, 148, 174), (255, 255, 208, 186),(255, 197, 226, 255), (255, 171, 134, 1), (255, 109, 63, 54), (255, 207, 138, 255),(255, 151, 0, 95), (255, 9, 80, 61), (255, 84, 105, 51), (255, 74, 65, 105),(255, 166, 196, 102), (255, 208, 195, 210), (255, 255, 109, 65), (255, 0, 143, 149),(255, 179, 0, 194), (255, 209, 99, 106), (255, 5, 121, 0), (255, 227, 255, 205),(255, 147, 186, 208), (255, 153, 69, 1), (255, 3, 95, 161), (255, 163, 255, 0),(255, 119, 0, 170), (255, 0, 182, 199), (255, 0, 165, 120), (255, 183, 130, 88),(255, 95, 32, 0), (255, 130, 114, 135), (255, 110, 129, 133), (255, 166, 74, 118),(255, 219, 142, 185), (255, 79, 210, 114), (255, 178, 90, 62), (255, 65, 70, 15),(255, 127, 167, 115), (255, 59, 105, 106), (255, 142, 108, 45), (255, 196, 172, 0),(255, 95, 54, 80), (255, 128, 76, 255), (255, 201, 57, 1), (255, 246, 0, 122),(255, 191, 162, 208)]# 配置文件路徑
root_path="/sdcard/mp_deployment_source/"
config_path=root_path+"deploy_config.json"
deploy_conf={}
debug_mode=1  # 調試模式開關# 性能分析工具類(上下文管理器)
class ScopedTiming:def __init__(self, info="", enable_profile=True):self.info = infoself.enable_profile = enable_profiledef __enter__(self):if self.enable_profile:self.start_time = time.time_ns()return selfdef __exit__(self, exc_type, exc_value, traceback):if self.enable_profile:elapsed_time = time.time_ns() - self.start_timeprint(f"{self.info} took {elapsed_time / 1000000:.2f} ms")# 讀取部署配置文件
def read_deploy_config(config_path):with open(config_path, 'r') as json_file:try:config = ujson.load(json_file)  # 使用ujson快速解析except ValueError as e:print("JSON 解析錯誤:", e)return config# 主檢測函數
def detection():print("det_infer start")# 加載部署配置deploy_conf=read_deploy_config(config_path)# 解析配置參數kmodel_name=deploy_conf["kmodel_path"]        # 模型文件路徑labels=deploy_conf["categories"]             # 類別標簽confidence_threshold= deploy_conf["confidence_threshold"]  # 置信度閾值nms_threshold = deploy_conf["nms_threshold"] # NMS閾值img_size=deploy_conf["img_size"]             # 模型輸入尺寸num_classes=deploy_conf["num_classes"]       # 類別數量nms_option = deploy_conf["nms_option"]       # NMS選項model_type = deploy_conf["model_type"]       # 模型類型(AnchorBaseDet等)# 錨點配置(如果是基于錨點的檢測模型)if model_type == "AnchorBaseDet":anchors = deploy_conf["anchors"][0] + deploy_conf["anchors"][1] + deploy_conf["anchors"][2]# 圖像預處理參數計算kmodel_frame_size = img_size  # 模型輸入尺寸frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH]  # 實際輸入尺寸strides = [8,16,32]  # 特征圖步長# 計算保持長寬比的縮放參數ori_w = OUT_RGB888P_WIDTHori_h = OUT_RGB888P_HEIGHwidth, height = kmodel_frame_sizeratiow = width / ori_wratioh = height / ori_hratio = min(ratiow, ratioh)  # 選擇較小比例保持長寬比new_w = int(ratio * ori_w)new_h = int(ratio * ori_h)# 計算填充參數(居中填充)dw = (width - new_w) / 2dh = (height - new_h) / 2top = int(round(dh - 0.1))bottom = int(round(dh + 0.1))left = int(round(dw - 0.1))right = int(round(dw - 0.1))# 初始化神經網絡推理組件kpu = nn.kpu()        # 創建KPU(神經網絡加速器)實例ai2d = nn.ai2d()      # 創建AI2D(圖像預處理加速器)實例# 加載kmodel模型文件kpu.load_kmodel(root_path+kmodel_name)# 配置AI2D預處理參數ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8)ai2d.set_pad_param(True, [0,0,0,0,top,bottom,left,right], 0, [114,114,114])  # 填充灰色ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel)# 構建AI2D預處理流水線ai2d_builder = ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], [1,3,height,width])# 初始化攝像頭傳感器sensor = Sensor(id = 1)sensor.reset()# 攝像頭參數配置sensor.set_hmirror(False)  # 水平鏡像關閉sensor.set_vflip(False)    # 垂直翻轉關閉# 配置顯示通道(YUV420格式)sensor.set_framesize(DISPLAY_WIDTH, DISPLAY_HEIGHT)sensor.set_pixformat(PIXEL_FORMAT_YUV_SEMIPLANAR_420)# 配置AI處理通道(RGB888格式)sensor.set_framesize(OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH, chn=CAM_CHN_ID_2)sensor.set_pixformat(PIXEL_FORMAT_RGB_888_PLANAR, chn=CAM_CHN_ID_2)# 綁定顯示層sensor_bind_info = sensor.bind_info(x=0, y=0, chn=CAM_CHN_ID_0)Display.bind_layer(**sensor_bind_info, layer=Display.LAYER_VIDEO1)# 初始化顯示設備if display_mode=="lcd":Display.init(Display.ST7701, to_ide=True)  # 7寸LCD屏else:Display.init(Display.LT9611, to_ide=True)  # HDMI輸出# 創建OSD層用于繪制檢測結果osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888)try:MediaManager.init()  # 初始化媒體系統sensor.run()         # 啟動攝像頭# 初始化AI2D輸入輸出張量ai2d_input_tensor = Noneai2d_output_tensor = nn.from_numpy(np.ones((1,3,width,height), dtype=np.uint8))# 主循環while True:with ScopedTiming("total", debug_mode > 0):# 捕獲圖像rgb888p_img = sensor.snapshot(chn=CAM_CHN_ID_2)if rgb888p_img.format() == image.RGBP888:# 轉換為numpy格式ai2d_input = rgb888p_img.to_numpy_ref()ai2d_input_tensor = nn.from_numpy(ai2d_input)# 執行預處理(縮放+填充)ai2d_builder.run(ai2d_input_tensor, ai2d_output_tensor)# 模型推理kpu.set_input_tensor(0, ai2d_output_tensor)kpu.run()# 獲取輸出results = []for i in range(kpu.outputs_size()):out_data = kpu.get_output_tensor(i)result = out_data.to_numpy().flatten()results.append(result)del out_data  # 及時釋放內存gc.collect()  # 垃圾回收# 后處理if model_type == "AnchorBaseDet":det_boxes = aicube.anchorbasedet_post_process(...)elif model_type == "GFLDet":det_boxes = aicube.gfldet_post_process(...)else:det_boxes = aicube.anchorfreedet_post_process(...)# 清空OSD層并繪制結果osd_img.clear()if det_boxes:for box in det_boxes:# 坐標轉換到顯示尺寸x1, y1, x2, y2 = box[2], box[3], box[4], box[5]w = (x2 - x1) * DISPLAY_WIDTH / OUT_RGB888P_WIDTHh = (y2 - y1) * DISPLAY_HEIGHT / OUT_RGB888P_HEIGH# 繪制矩形框osd_img.draw_rectangle(int(x1 * DISPLAY_WIDTH / OUT_RGB888P_WIDTH),int(y1 * DISPLAY_HEIGHT / OUT_RGB888P_HEIGH),int(w), int(h),color=color_four[box[0]][1:]  # 根據類別選擇顏色)# 顯示OSD層Display.show_image(osd_img, 0, 0, Display.LAYER_OSD3)gc.collect()rgb888p_img = None  # 釋放圖像引用except Exception as e:print(f"運行異常: {e}")finally:# 資源清理os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)del ai2d_input_tensordel ai2d_output_tensorsensor.stop()        # 停止攝像頭Display.deinit()     # 關閉顯示MediaManager.deinit()# 釋放媒體資源gc.collect()time.sleep(1)nn.shrink_memory_pool()  # 釋放神經網絡內存print("det_infer end")return 0if __name__=="__main__":detection()

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

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

相關文章

Flask 應用封裝成 Docker 服務的完整技術指南

一、實現原理 容器化核心邏輯 Docker 通過將應用代碼、運行環境和依賴項打包成鏡像,實現環境一致性。Flask 應用容器化需包含: Python 基礎運行環境項目代碼及依賴庫(requirements.txt)WSGI服務器(如 Gunicorn&#xf…

windows上的 Vmware Workstation 環境搭建

本文的視頻版本:https://www.bilibili.com/video/BV1JhLRzyESh Vmware Workstation 是一款跨平臺的桌面級虛擬化軟件,可以使用 Vmware 創建虛擬機,我們一般使用 Linux 虛擬機(目前主流的 Linux 發行版是 Ubuntu)&…

Linux下終端命令行安裝常見字體示例

一、準備工作: 準備好要安裝的字體文件,如宋體、微軟雅黑(simsun.ttc、msyh.ttc)。進入字體路徑: /usr/share/fonts,使用root權限,新建一個目錄shell_fonts。 二、命令行安裝字體: 將要安裝…

CentOS中在線安裝Docker(超詳細)

1)檢查安裝docker的基本要求: 64位CPU架構的計算機,目前不支持32為CPU架構的計算機 系統的Linux內核版本為3.10及以上 開啟CGroups和namespace功能 2)使用命令查看當前系統的內核版本 [rootlocalhost ~]# uname -r 3.10.0-862…

武漢昊衡科技OLI光纖微裂紋檢測儀:高密度光器件的精準守護者

隨著AI技術應用越來越廣,算力需求激增,光通信系統正加速向小型化、高密度、多通道方向演進。硅光芯片、高速光模塊等核心器件內部的光纖通道數量成倍增加,波導結構愈發精細,傳統檢測手段因分辨率不足、效率低下,難以精…

Java數據結構——Stack

Stack 棧的概念和使用棧的概念棧的使用 棧的應用出棧元素序列有效的括號棧的壓入、彈出序列逆波蘭表達式最小棧 棧的概念和使用 棧的概念 棧(Stack):一種特殊的線性表,只允許再棧的一端進行插入和刪除元素,這一端點被稱為棧頂,另…

神經網絡與計算機視覺

2016 年,隨著 AlphaGo 在圍棋比賽中擊敗李世石,“人工智能”、“神經網絡”、“深度 學習”等字眼便越來越多的出現在大眾眼前,智能化好像成為一種不可逆轉的趨勢,帶給大家新奇感的同時也帶來了一絲憂懼:在不遠的未來,機器是否真的擁有思維和情感?《終結者》中天網大戰人…

VS2019 與gitcode團隊管理

1、安裝git 點擊下一步安裝即可 2、vs2019連接gitcode 然后更改本地的代碼添加文件等都可以進行遠程同步操作了

Python類和對象四(十三)

魔法方法: 按位運算 按位于運算 只要相同才是1 或運算: 只要某個位是1結果就是1 、 按位非 將結果取反 按位異或: 左移和右移運算符: 右移兩位 右移動n位,就是除以2的n次方 左移兩位: 左移n位就是乘…

如何設置極狐GitLab 議題截止日?

極狐GitLab 是 GitLab 在中國的發行版,關于中文參考文檔和資料有: 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 截止日期 (BASIC ALL) 可以在議題中使用截止日期,來跟蹤截止日期并確保功能按時交付。用戶至少需要報告者權限才…

如何在 Conda 環境中降級 Python 版本:詳細指南

如何在 Conda 環境中降級 Python 版本:詳細指南 Python 版本的管理在開發過程中至關重要,特別是在處理不同項目需求時。對于使用 Conda 環境的 Python 程序員來說,版本管理不僅僅是安裝不同的 Python 版本,還涉及到依賴關系的兼容…

【隨筆】地理探測器原理與運用

文章目錄 一、作者與下載1.1 軟件作者1.2 軟件下載 二、原理簡述2.1 空間分異性與地理探測器的提出2.2 地理探測器的數學模型2.21 分異及因子探測2.22 交互作用探測2.23 風險區與生態探測 三、使用:excel 一、作者與下載 1.1 軟件作者 作者: DOI: 10.…

使用達夢官方管理工具SQLark快速生成數據庫ER圖并導出

在數據庫設計與開發中,實體-關系圖(ER 圖)作為數據建模的核心工具,能夠直觀呈現表結構、字段屬性及表間關系,是團隊溝通和文檔維護的重要工具。然而,對于許多使用達夢數據庫的開發者來說,可用的…

單精度浮點運算/定點運算下 MATLAB (VS) VIVADO

VIVADO中單精度浮點數IP核計算結果與MATLAB單精度浮點數計算結果的對比 MATLAB定點運算仿真,對比VIVADO計算的結果 目錄 前言 一、VIVADO與MATLAB單精度浮點數運算結果對比 二、MATLAB定點運算仿真 總結 前言 本文介紹了怎么在MATLAB中使用單精度浮點數進行運算…

力扣-141.環形鏈表

題目描述 給你一個鏈表的頭節點 head ,判斷鏈表中是否有環。 如果鏈表中存在環 ,則返回 true 。 否則,返回 false 。 class Solution { public:bool hasCycle(ListNode *head) {ListNode *fast head;ListNode *slow head;while (fast! n…

RESTful學習筆記(一)

Web發展 一、API 程序硬件接口(Application Programming Interface),是預先定義好的邏輯函數,軟件系統不同組成部分銜接的約定,直接調用函數,無序訪問代碼細節,分為SDK和Web應用接口兩類 SDK…

SD2351核心板:重構AI視覺產業價值鏈的“超級節點”

在AI視覺技術狂飆突進的當下,一個吊詭的現象正在浮現:一方面,學術界不斷刷新著ImageNet等基準測試的精度紀錄;另一方面,產業界卻深陷“算法有、場景無,技術強、落地難”的怪圈。明遠智睿SD2351核心板的問世…

【數據結構】紅黑樹原理及實現

目錄 一. 紅黑樹的概念1. 紅黑樹的規則思考 2. 紅黑樹的效率 二.紅黑樹的實現1. 紅黑樹的結構2. 紅黑樹的插入3. 紅黑樹的平衡調整情況1:變色情況2:單旋變色情況3:雙旋變色 4. 紅黑樹插入及平衡調整代碼實現5.紅黑樹的驗證 一. 紅黑樹的概念 …

時間復雜度分析

復雜度分析的必要性: 當給我們一段代碼時,我們是以什么準則來判斷代碼效率的高低呢?每一段代碼都會消耗一段時間,或占據一段數據空間,那么自然是在實現相同功能的情況下,代碼所耗時間最少,所占…

L1-1、Prompt 是什么?為什么它能“控制 AI”?

*Prompt 入門 L1-1 想象一下,你只需輸入一句話,AI 就能自動為你寫一篇文案、生成一份報告、甚至規劃你的創業計劃。這種“對話即編程”的背后魔法,就是 Prompt 的力量。 🔍 一、Prompt 的定義與由來 Prompt(提示詞&am…