日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

tengine简单安装_实操丨如何在EAIDK上部署Tengine开发AI应用之物体检测应用入门(C++)...

發(fā)布時(shí)間:2025/3/20 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tengine简单安装_实操丨如何在EAIDK上部署Tengine开发AI应用之物体检测应用入门(C++)... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言:近期推出的嵌入式AI系列直播公開課受到廣大開發(fā)者的喜愛,并收到非常多的反饋信息,其中對(duì)如何在EAIDK上面部署Tengine開發(fā)AI應(yīng)用感興趣的開發(fā)者不在少數(shù),我們將分2期以案例實(shí)操的形式詳細(xì)介紹。Tengine開源版本GitHub鏈接?https://github.com/OAID/Tengine歡迎Git?Clone!技術(shù)交流QQ群829565581,群里各位大佬坐鎮(zhèn),日常技術(shù)討(shui)論(qun)~~AI推動(dòng)了社會(huì)智能化的發(fā)展進(jìn)程,極大的提高了人們的工作效率,節(jié)省了工作時(shí)間。在AI賦能社會(huì)的同時(shí),作為開發(fā)者也要了解AI如何從0到1,1到2,乃至2到3等的過程。作為剛接觸AI開發(fā)的開發(fā)者而言,了解AI的開發(fā)框架是至關(guān)重要的。AI的開發(fā)是一項(xiàng)龐大的系統(tǒng)性的工程,開發(fā)人員需要掌握一定的數(shù)學(xué)原理,編程能力,建模能力與數(shù)據(jù)分析能力等。AI開發(fā)的整體框架如圖1所示:圖1?AI開發(fā)框架圖對(duì)于新開發(fā)者而言,先從相對(duì)簡(jiǎn)單的部署模型階段學(xué)習(xí),可以快速了解整個(gè)AI系統(tǒng)的運(yùn)作,以及了解AI如何在人們的日常生活中產(chǎn)生實(shí)際作用。

一、EAIDK常見的模型部署方式

對(duì)于現(xiàn)在市場(chǎng)上的AI框架而言,具有群雄爭(zhēng)鋒的局面,有Caffe,PyTorch,TensorFlow,MxNet,ONNX等一系列耳熟能詳?shù)挠?xùn)練與推理框架,但經(jīng)過這些訓(xùn)練框架所訓(xùn)練出的模型在性能,精度,以及不同平臺(tái)的適應(yīng)性也各有千秋。對(duì)于初學(xué)者而言,從推理框架入手是一種很好的選擇,在學(xué)習(xí)推理框架的同時(shí),可以幫助初學(xué)者了解AI的整套體系是如何運(yùn)作的。在選擇推理框架的時(shí)候需要結(jié)合現(xiàn)今模型部署的環(huán)境進(jìn)行考慮。往日的AI模型訓(xùn)練常見于PC端,其往往忽略運(yùn)行模型對(duì)于資源的調(diào)度,模型對(duì)于其加載設(shè)備功耗的使用。在AI的發(fā)展路程上,越來越多的開發(fā)者希望AI能融入我們的生活,所以對(duì)于PC端的推理框架部署則越來越不被人們所接受。AI從往日的PC端,需要漸漸的轉(zhuǎn)化到可移動(dòng)設(shè)備端。在現(xiàn)今生活中,通過社會(huì)各界不斷的努力,AI逐漸被人們所熟悉,例如人臉門禁檢測(cè)系統(tǒng),工業(yè)自動(dòng)化中的物體分揀檢測(cè)系統(tǒng),以及現(xiàn)在眾所周知的無人駕駛項(xiàng)目等一系列貼近人們生活的具體項(xiàng)目。EAIDK 常見的模型部署方式如下:◢?部署原始訓(xùn)練框架直接部署原始訓(xùn)練框架具有如下特點(diǎn):1)?需安裝如TensorFlow/PyTorch/Caffe等環(huán)境;2)?推理性能差;3)?很多冗余功能;4)?內(nèi)存占用大;?手動(dòng)模型重構(gòu)不依賴框架,手寫C/C++代碼,實(shí)現(xiàn)計(jì)算圖,并導(dǎo)入權(quán)重?cái)?shù)據(jù)。該種方法需要構(gòu)造者對(duì)模型有充分的了解。對(duì)初學(xué)者而言,有一定的技術(shù)難度。?使用TensorFlow-Lite/PyTorch-Mobile等訓(xùn)練框架的部署引擎除了直接部署原始的訓(xùn)練框架,訓(xùn)練框架也有一些部署引擎,如TensorFlow 訓(xùn)練框架有TensorFlow-Lite ,PyTorch 訓(xùn)練框架有PyTorch-Mobile. 使用這些部署引擎具有如下問題:1)?只支持自己框架訓(xùn)練的模型;2)?需要進(jìn)行模型轉(zhuǎn)換;3)?支持硬件/OS有限;?使用Tengine推理框架進(jìn)行部署Tengine推理框架具有如下特點(diǎn):1)?可以直接加載主流框架模型,也支持主流框架模型直接轉(zhuǎn)換為Tengine模型, Tengine提供一鍵轉(zhuǎn)換工具;2)?只依賴C/C++庫,無任何第三方庫依賴;3)?自帶圖像處理已支持圖像縮放、圖像像素格式轉(zhuǎn)換、旋轉(zhuǎn)、鏡像翻轉(zhuǎn)、映射、腐蝕膨脹、閾值處理、高斯模糊處理、圖像編解碼等;4)?自帶語音處理(Roadmap)支持FFT/IFFT、MFCC等信號(hào)處理方式,方便完成噪聲抑制、回聲清除等語音處理工作;5)?支持Android/Linux/RTOS/裸板環(huán)境;6) PyThon/C++/AAP 等API接口,方便不同語言調(diào)用;7)?高性能計(jì)算,在板子上也可以跑出炫酷的Demo;8)?無需手動(dòng)安裝,EAIDK自帶Tengine環(huán)境,直接使用即可??焖偕鲜纸坛?#xff1a;物體檢測(cè)應(yīng)用入門(C版本)

二、Tengine 環(huán)境搭建

a.?Tengine預(yù)編譯庫

EAIDK自帶Tengine預(yù)編譯庫,無需手動(dòng)編譯。Tengine預(yù)編譯庫路徑:/usr/local/AID/Tengine/查看預(yù)編譯庫:[openailab@localhost ~]$ ls /usr/local/AID/Tengine/lib/libhclcpu.so libtengine.so[openailab@localhost ~]$ ls /usr/local/AID/Tengine/include/cpu_device.h tengine_c_api.h tengine_c_compat.h tengine_operations.h

b.?Tengine版本信息

輸入下列命令可以查看Tengine版本信息:sudo dnf info Tengine詳細(xì)信息如下:Name : tengineVersion : 1.7.1Release : 1.openailab.fc28Arch : aarch64Size : 5.8 MSource : tengine-1.7.1-1.openailab.fc28.src.rpmRepo : @SystemSummary : openailab tengine libraryURL : https://github.com/OAID/Tengine…EAIDK自帶Tengine版本為1.7.1,后續(xù)Demo也是基于Tengine1.7.1版本,如果查詢版本較低,需要輸入下列命令升級(jí)Tengine版本:sudo dnf updateTengine

三、Tengine物體檢測(cè)Demo(C++)

a.?Demo?簡(jiǎn)介

對(duì)EAIDK初學(xué)者進(jìn)行物體檢測(cè)的環(huán)境搭建與運(yùn)行,其目的是讓初學(xué)者對(duì)Tengine在物體檢測(cè)方面進(jìn)行學(xué)習(xí),為后期開發(fā)做好鋪墊.此指導(dǎo)教學(xué)為運(yùn)用EAIDK自帶后方攝像頭進(jìn)行圖像的拍攝,可對(duì)圖像中的物體進(jìn)行檢測(cè),例如人,瓶子等.在此教學(xué)中運(yùn)用了Tengine相關(guān)的函數(shù)以及運(yùn)用OpenCV對(duì)圖像檢測(cè)方面的前后處理進(jìn)行基礎(chǔ)的教學(xué)指導(dǎo).

b.?運(yùn)行環(huán)境

安裝環(huán)境需要在root權(quán)限下:sudo su

i.?安裝OpenCV

依據(jù)以下指令安裝OpenCV依賴庫sudo yum install opencvsudo yum install opencv-develii.?安裝Protobuf查詢相關(guān)protobuf:rpm -qa | grep protobuf,應(yīng)顯示如下:protobuf-3.5.0-4.fc28.aarch64protobuf-compiler-3.5.0-4.fc28.aarch64protobuf-devel-3.5.0-4.fc28.aarch64 如無上述顯示,則運(yùn)行如下指令:sudo dnf install protobuf-compiler-3.5.0-4.fc28.aarch64sudo dnf install protobuf-3.5.0-4.fc28.aarch64sudo dnf install protobuf-devel-3.5.0-4.fc28.aarch64iii.?安裝OpenCV?Video關(guān)聯(lián)庫yum install v4l-utils

c.?Demo?編譯與運(yùn)行效果

i.?創(chuàng)建目錄

目錄Demo下進(jìn)行編寫,其路徑:/home/openailab/Demo在上述文件夾下創(chuàng)建文件目錄如下:[openailab@localhost ~]$ mkdir mobilenetSSD在文件夾中放入獲取到的Tengine_Demo包中的mobilenet_ssd.cpp文件;創(chuàng)建models文件夾.將模型MobileNetSSD_deploy.caffemodel MobileNetSSD_deploy.prototxt 以及convert_model_to_tm 工具放入到models文件夾中。[openailab@localhost ~]$ cd mobilenetSSD[openailab@localhost ~]$ mkdir models

ii.?轉(zhuǎn)換模型

在models 文件夾中,執(zhí)行如下命令,將caffe模型轉(zhuǎn)換為Tengine模型。export LD_LIBRARY_PATH=/usr/local/AID/Tengine/lib/./convert_model_to_tm -f caffe -p models/MobileNetSSD_deploy.prototxt -m models/MobileNetSSD_deploy.caffemodel -o models/tm_mssd.tmfile轉(zhuǎn)換成功后的Tengine模型在models目錄下。

iii.?編譯

回到 mobilenetSSD 目錄,編譯可執(zhí)行文件。g++ mobilenet_ssd.cpp `pkg-config --libs --cflags opencv` -I /usr/local/AID/Tengine/include/ -L /usr/local/AID/Tengine/lib -l tengine -o mssd

iv.?設(shè)置多核運(yùn)行

設(shè)置高性能運(yùn)行程序可用以下環(huán)境變量來設(shè)定,默認(rèn)為1核運(yùn)行,可設(shè)置成6核運(yùn)行該程序:export TENGINE_CPU_LIST=0,1,2,3,4,5 v.?運(yùn)行運(yùn)行:./mssd運(yùn)行結(jié)果在EAIDK上顯示,如圖3所示:圖3?Demo 運(yùn)行效果

d.?Demo?代碼解析

此Demo通過調(diào)用Tengine各接口進(jìn)行讀取模型、圖的創(chuàng)建等功能,其軟件流程圖如圖4所示:圖 4 C++ Demo 流程圖庫文件包含#include #include #include #include #include "opencv2/opencv.hpp"#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp" #include #include "tengine_c_api.h"所需要包含的頭文件,可以對(duì)此Demo文件中所有到的函數(shù)進(jìn)行支持指定文件路徑int main(int argc, char* argv[]){int ret = -1;std::string model_file = "models/tm_mssd.tmfile ";model_file?為Tengine模型路徑,由convert?tool將caffe模型轉(zhuǎn)換為Tengine模型后放在與運(yùn)行文件同級(jí)的文件夾models下初始化Tengineif(init_tengine() < 0) {std::cout << " init tengine failed\n";return 1; }運(yùn)用init_Tengine函數(shù)來初始化Tengine,如果運(yùn)行失敗,則會(huì)返回-1,if函數(shù)則是判斷執(zhí)行此函數(shù)是否成功,不成功則返回 init?Tengine?failed創(chuàng)建Tengine圖graph_t graph = create_graph(nullptr, "tengine", model_file.c_str());if(graph == nullptr) {std::cout << "Create graph failed\n";std::cout << " ,errno: " << get_tengine_errno() << "\n";return 1; }create_graph為創(chuàng)建Tengine框架的運(yùn)行圖,可適用于多種框架。nullptr:內(nèi)容為空,首先建立空?qǐng)D,然后導(dǎo)入解析模型后的信息至Tengine的圖中tengine:模型類型,當(dāng)前測(cè)試為tengine模型proto_file:模型文件,如caffe為prototxt文件model_file:???模型文件,如caffe為 caffemodel文件獲取Tegnine?輸入節(jié)點(diǎn)的信息int node_idx = 0;int tensor_idx = 0;tensor_t input_tensor = get_graph_input_tensor(graph, node_idx, tensor_idx);if(input_tensor == nullptr) {std::printf("Cannot find input tensor,node_idx: %d,tensor_idx: %d\n", node_idx, tensor_idx);return -1; }get_graph_input_tensor函數(shù)是獲取Tengine?input節(jié)點(diǎn)信息函數(shù),其返回類型為tensor_t,包含tensor中所具有的所有信息,例如節(jié)點(diǎn)號(hào),節(jié)點(diǎn)尺寸,節(jié)點(diǎn)數(shù)據(jù)等,如返回為空,則表示無此節(jié)點(diǎn),獲取失敗Node_idx: Tengine graph節(jié)點(diǎn)標(biāo)號(hào),起始輸入節(jié)點(diǎn)為0;Tensor_idx:?Tengine?graph節(jié)點(diǎn)tensor標(biāo)號(hào),如果只有單輸入,則為0.設(shè)置節(jié)點(diǎn)信息與內(nèi)容int img_h = 300;int img_w = 300;int channel = 3;int img_size = img_h * img_w * channel;float* input_data = ( float* )malloc(sizeof(float) * img_size);img_h, img_w, channel 為圖片信息:寬,高,層數(shù)信息img_size: 像素點(diǎn)所占總字節(jié)數(shù)input_data為輸入到模型中的輸入數(shù)據(jù)變量,malloc為為input_data申請(qǐng)內(nèi)存int dims[] = {1, channel, img_h, img_w};set_tensor_shape(input_tensor, dims, 4);ret = prerun_graph(graph);if(ret != 0) {std::cout << "Prerun graph failed, errno: " << get_tengine_errno() << "\n";return 1; }dims[] 為輸入數(shù)據(jù)維度信息,因?yàn)槟P鸵鬄?維輸入數(shù)據(jù),所以在原圖像維度上增加一維,補(bǔ)1即可。當(dāng)設(shè)定好維度信息后,可用set_tensor_shape來設(shè)置輸入數(shù)據(jù)尺寸,input_tensor為所需要設(shè)置tensor,dims為維度信息,4表示設(shè)置多少個(gè)維度。prerun_graph函數(shù)則是對(duì)Tengine graph所有節(jié)點(diǎn)所需要的內(nèi)存空間進(jìn)行內(nèi)存申請(qǐng)。獲取圖像數(shù)據(jù)cv::Mat frame;cv::VideoCapture capture(0);運(yùn)用cv庫來讀取攝像頭數(shù)據(jù)。Frame為cv圖像數(shù)據(jù)變量名。VideoCapture函數(shù)接口可獲取攝像頭數(shù)據(jù)。capture(index)為連接攝像頭端口號(hào),此Demo中index =?0;如不知道開發(fā)板攝像頭信息,可用如下命令查詢查詢所有端口:ls /dev/video*?用命令來查詢端口設(shè)備信息:v4l2-ctl -d /dev/video4 --all再用如下命令指定攝像頭設(shè)備端口:v4l2-ctl -d /dev/video4注:具體端口號(hào)依照當(dāng)前環(huán)境來設(shè)置運(yùn)用while(1)來連續(xù)獲取圖像數(shù)據(jù),如下所示:while(1){capture >> frame;其中capture>>frame為逐幀讀取圖像數(shù)據(jù),然后就是對(duì)圖像進(jìn)行幀處理。圖像幀處理圖像幀處理為單獨(dú)函數(shù),在main函數(shù)外編寫,在main函數(shù)內(nèi)調(diào)用,調(diào)用函數(shù)如下:get_input_data_ssd(frame, input_data, img_h, img_w);傳入數(shù)據(jù)為frame一幀圖像,input_data?所需要保存處理后數(shù)據(jù)的內(nèi)存,img_h,img_w所需圖像的寬,高.void get_input_data_ssd(cv::Mat img, float* input_data, int img_h, int img_w) {cv::resize(img, img, cv::Size(img_h, img_w));img.convertTo(img, CV_32FC3);float* img_data = ( float* )img.data;int hw = img_h * img_w;float mean[3] = {127.5, 127.5, 127.5};for(int h = 0; h < img_h; h++) {for(int w = 0; w < img_w; w++) {for(int c = 0; c < 3; c++) {input_data[c * hw + h * img_w + w] = 0.007843 * (*img_data - mean[c]);img_data++; } } } }int main(){...}上述函數(shù)為圖像的單幀處理。因?yàn)閿z像頭讀入的數(shù)據(jù)尺寸不是符合模型要求,所以運(yùn)用resize函數(shù)來進(jìn)行尺寸調(diào)整。運(yùn)用OpenCV所讀入的數(shù)據(jù)類型為uint8,但是Tengine所需要的為float類型數(shù)據(jù),運(yùn)用convertTo函數(shù)可轉(zhuǎn)換數(shù)據(jù)類型至float類型。對(duì)數(shù)據(jù)進(jìn)行圖像預(yù)處理,進(jìn)行圖像每行,每列,每一層的循環(huán)來對(duì)單個(gè)數(shù)據(jù)進(jìn)行處理。上圖中的mean中有三個(gè)數(shù)值,此三個(gè)數(shù)值代表每一層中像素點(diǎn)所需要減去的數(shù)值,隨后對(duì)每一個(gè)像素點(diǎn)進(jìn)行擴(kuò)大或者縮小操作,乘以一個(gè)因子,此Demo中的因子為0.007843。每個(gè)模型的mean值與擴(kuò)大縮小因子都不同,因模型而定。傳入數(shù)據(jù)至Tengine框架set_tensor_buffer(input_tensor, input_data, img_size*sizeof(float));此函數(shù)為設(shè)置Tengine框架數(shù)據(jù),input_tensor為輸入tensor變量,input_data為輸入數(shù)據(jù),img_size*sizeof(float)為所傳入數(shù)據(jù)的總體大小。運(yùn)行Tenginerun_graph(graph, 1);用run_graph來啟動(dòng)Tengine 框架。Graph為前面所創(chuàng)建的Tengine框架。函數(shù)中的1為阻塞(需要配置Tengine graph信息),0為非阻塞(運(yùn)用wait graph來獲取Tengine graph結(jié)果)獲取輸出結(jié)果的tensor信息tensor_t out_tensor = get_graph_output_tensor(graph, 0, 0);int out_dim[4];ret = get_tensor_shape(out_tensor, out_dim, 4);if(ret <= 0) {std::cout << "get tensor shape failed, errno: " << get_tengine_errno() << "\n";return 1; }???運(yùn)用get_graph_output_tensor函數(shù)來獲取輸出結(jié)果的tensor信息。Graph為Tengine graph名字,0,0為所輸出節(jié)點(diǎn)的節(jié)點(diǎn)號(hào)。Out_dim為輸出數(shù)據(jù)的尺寸信息,在get_tensor_shape中告知此函數(shù)獲取多少維度的數(shù)據(jù)。輸出數(shù)據(jù)處理Mobilenet_ssd模型為檢測(cè)模型網(wǎng)絡(luò),對(duì)輸出數(shù)據(jù)進(jìn)行后處理可用于物體的檢測(cè)及其標(biāo)定。同預(yù)處理相似,在main函數(shù)中為調(diào)用函數(shù),具體實(shí)現(xiàn)在main函數(shù)之外。float* outdata = ( float* )get_tensor_buffer(out_tensor);int num = out_dim[1];float show_threshold = 0.5;post_process_ssd(frame, show_threshold, outdata, num);通過get_tensor_buffer輸出結(jié)果,賦值到outdata變量。Show_threahold為檢測(cè)閾值,當(dāng)大于此閾值時(shí)保留其結(jié)果,反之則剔除輸出結(jié)果。其具體數(shù)據(jù)處理在post_process_ssd函數(shù)中后處理函數(shù)-標(biāo)記框#include "tengine_c_api.h"struct Box{float x0;float y0;float x1;float y1;int class_idx;float score;};在函數(shù)外申明一個(gè)結(jié)構(gòu)體,結(jié)構(gòu)體中x0,y0為檢測(cè)框的左上角,x1,y1為檢測(cè)框的右下角。Class_idx為框的類型,score為標(biāo)記目標(biāo)的得分情況,與閾值相比較void post_process_ssd(cv::Mat img, float threshold, float* outdata, int num) {const char* class_names[] = {"background", "aeroplane", "bicycle", "bird","boat","bottle","bus", "car", "cat", "chair","cow", "diningtable", "dog", "horse","motorbike", "person", "pottedplant", "sheep", "sofa", “train", "tvmonitor"};int raw_h = img.size().height;int raw_w = img.size().width;std::vector boxes;int line_width = raw_w * 0.005;Class_names為所能檢測(cè)的類型種類。Raw_h與raw_w為原圖像的高與寬。Boxes存儲(chǔ)了最終結(jié)果的檢測(cè)信息。Line_width為所畫框的粗細(xì)for(int i = 0; i < num; i++) {if(outdata[1] >= threshold){Box box;box.class_idx = outdata[0];box.score = outdata[1];box.x0 = outdata[2] * raw_w;box.y0 = outdata[3] * raw_h;box.x1 = outdata[4] * raw_w;box.y1 = outdata[5] * raw_h;boxes.push_back(box);printf("%s\t:%.0f%%\n", class_names[box.class_idx], box.score * 100);printf("BOX:( %g , %g ),( %g , %g )\n", box.x0, box.y0, box.x1, box.y1);}outdata += 6; }此循環(huán)遍歷所有的輸出數(shù)據(jù),當(dāng)輸出數(shù)據(jù)中的分?jǐn)?shù)部分大于閾值時(shí),會(huì)把輸出數(shù)據(jù)中 相應(yīng)的標(biāo)記框的信息存入boxes變量中。后處理函數(shù)-畫框for(int i = 0; i < ( int )boxes.size(); i++) {Box box = boxes[i];cv::rectangle(img, cv::Rect(box.x0, box.y0, (box.x1 - box.x0), (box.y1 - box.y0)), cv::Scalar(255, 255, 0),line_width);std::ostringstream score_str;score_str << box.score;std::string label = std::string(class_names[box.class_idx]) + ": " + score_str.str();int baseLine = 0;cv::Size label_size = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);cv::rectangle(img,cv::Rect(cv::Point(box.x0, box.y0 - label_size.height),cv::Size(label_size.width, label_size.height + baseLine)),cv::Scalar(255, 255, 0), CV_FILLED);cv::putText(img, label, cv::Point(box.x0, box.y0), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0));} }int main(){...}首先遍歷boxes變量,對(duì)每一個(gè)結(jié)果進(jìn)行處理。對(duì)目標(biāo)用rectangle函數(shù)進(jìn)行畫框標(biāo)記Rect(x0,y0,長(zhǎng),寬,Scalar(框的顏色),框的粗細(xì))對(duì)所標(biāo)的框進(jìn)行類型的字符顯示,運(yùn)用string函數(shù)進(jìn)行字符串與分?jǐn)?shù)的合并其結(jié)果類似 person:0.982323。隨后對(duì)字體進(jìn)行大小,字符的設(shè)定,具體可對(duì)OpenCV中g(shù)etTextSize進(jìn)行查詢。隨后指定字符所在的位置與具體區(qū)域。最后運(yùn)用putText函數(shù)把字符信息打印到圖像上。完成1幀圖像處理release_graph_tensor(out_tensor);imshow("Mssd", frame);cv::waitKey(10);}當(dāng)處理完數(shù)據(jù)后則返回到main函數(shù),隨后進(jìn)行輸出節(jié)點(diǎn)的內(nèi)存釋放,運(yùn)用release_graph_tensor對(duì)指定tensor的內(nèi)存進(jìn)行釋放。Imshow函數(shù)則是OpenCV中顯示圖像的接口函數(shù),waitKey則是每幀間隔所需的間隔時(shí)間程序內(nèi)存釋放release_graph_tensor(input_tensor);ret = postrun_graph(graph);if(ret != 0) {std::cout << "Postrun graph failed, errno: " << get_tengine_errno() << "\n";return 1; }free(input_data);destroy_graph(graph);release_tengine();return 0; }當(dāng)程序結(jié)束時(shí),則需要對(duì)前期申請(qǐng)的內(nèi)存進(jìn)行釋放。release_graph_tensor對(duì)指定tensor進(jìn)行內(nèi)存釋放。postrun_graph函數(shù)則是對(duì)prerun_graph函數(shù)運(yùn)行時(shí)所申請(qǐng)的內(nèi)存進(jìn)行釋放。free函數(shù)則是對(duì)當(dāng)時(shí)申請(qǐng) 的輸入數(shù)據(jù)內(nèi)存進(jìn)行釋放。destroy_graph函數(shù)是對(duì)Tengine graph進(jìn)行銷毀處理,最后運(yùn)用release_Tengine對(duì)Tengine所有內(nèi)存進(jìn)行釋放。

點(diǎn)擊獲取Tengine開源版本

歡迎Git Clone!

https://github.com/OAID/Tengine
歡迎您加入EAIDK開發(fā)者大本營(yíng),

里面不僅有EAIDK大神

更有大量神秘大牛等你勾搭哦!

———————————————

?EAIDK開發(fā)者大本營(yíng)?

(QQ群:625546458)

總結(jié)

以上是生活随笔為你收集整理的tengine简单安装_实操丨如何在EAIDK上部署Tengine开发AI应用之物体检测应用入门(C++)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩中文国产 | 丰满少妇高潮一区二区 | 99久久婷婷国产一区二区三区 | xxxx毛片| 久久久剧场 | 国产成人免费av一区二区午夜 | 日本在线观看视频网站 | 日皮毛片| 国产在线高潮 | 自拍视频一区二区 | 精品国内自产拍在线观看视频 | 亚洲熟妇av一区二区三区漫画 | 国产三级久久久久 | a级片视频网站 | 欧美黑人又粗又大又爽免费 | 欧美中文字幕一区二区 | 人妻91麻豆一区二区三区 | 精品国产91乱码一区二区三区 | 超碰免费成人 | 国产精品www | 男生插女生视频 | 青青青免费视频观看在线 | 亚洲免费久久 | www.涩涩爱| 亚洲国产18| 性生活视频播放 | av嫩草| 乱人伦中文字幕 | 美女福利视频在线观看 | 特级西西444www高清大视频 | 99视频精品免费 | 黄av资源| 国产精品久久久久永久免费看 | 天天色一色| www国产视频 | 国产人妻人伦精品1国产丝袜 | 欧美国产日韩一区二区三区 | 国产日韩欧美精品在线观看 | 成人久久18免费网站图片 | 乱色欧美| 僵尸叔叔在线观看国语高清免费观看 | 日日爱视频 | 日本妇女毛茸茸 | 亚洲欧美精品久久 | 国产精品老女人 | 欧美黄色免费网站 | 国产主播福利在线 | 日韩在线视频在线 | av黄色国产 | 天天操天天干天天干 | 97中文字幕在线观看 | 欧美午夜精品久久久久久人妖 | 天天爱天天操 | 国产成人精品视频ⅴa片软件竹菊 | 在线亚洲+欧美+日本专区 | 成人国产精品免费 | 国产精品成久久久久三级 | 在线免费看av片 | av中文字幕一区 | 午夜黄网| 三级黄色免费片 | www.999av| 欧洲自拍一区 | 丰满护士巨好爽好大乳 | 91精品国产电影 | free性娇小hd第一次 | 国产视频日韩 | 美景之屋电影免费高清完整韩剧 | 久久精品资源 | 男人天堂视频网 | 一本色道久久综合亚洲 | 日本免费三区 | 日韩毛片儿| 欧美日韩中日 | 日韩av不卡一区 | 夫妻性生活自拍 | 欧美成人精品激情在线视频 | 国产精品一区二区三区在线免费观看 | 亚洲小视频网站 | 一本一道人人妻人人妻αv 九一在线视频 | 中文字幕av一区二区三区 | 欧美精品久久久 | 福利在线免费视频 | 一级免费看 | 日本在线观看视频网站 | 亚洲29p | 国产麻豆免费视频 | 精品视频第一页 | 精品成人网 | 中文字幕精品一二三四五六七八 | 97视频播放 | av黄在线观看 | 亚洲天堂自拍 | 香蕉视频最新网址 | 欧美第一页在线 | 爱爱高潮视频 | 精品无码一区二区三区电影桃花 | 97少妇| 中文字幕在线观看国产 |