24资源网

24资源分享网,分享资源,收集整理资源,有态度的分享资源网

前言:近期,Tengine团队加班加点,好消息接踵而来,OpenCV 4.3.0发布,OPEN AI LAB AIoT智能开发平台Tengine与OpenCV合作共同加速边缘智能Tengine再获业界权威认可,正式加入ONNX官方认证,还有Tengine已经支持模型可视化工具Netron,欢迎各位开发者体验。https://github.com/OAID/Tengine接着上期分享的案例实操《Tengine快速上手系列教程&视频:物体检测应用入门(C++)》 本文分享的主题是:基于Python API的图片分类应用入门。Tengine快速上手教程:基于Python API的图片分类应用入门1Demo简介使用OpenCV对图片进行读取、预处理,并使用TenginePython接口进行分类,并将分类结果显示在图片上。此Demo目的是使EAIDK初学者了解学习运用TenginePython接口来进行初级的图片分类。2运行环境

(1)安装Protobuf

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.aarch64终端输入protoc–version,可以查看版本信息:protoc –versionlibprotoc 3.5.02)安装 python3-develsudo yum install python3-devel3)安装 numpynumpy 安装速度较慢,需耐心等待pip3 install numpy4)安装 Python3-OpenCVsudo yum install python3-opencv终端输入 python3,进入 Python,导入模块,无报错则安装成功:python3>>> import numpy>>> import cv2>>>5)安装 pyTengine通过安装包安装Tengine Python API并配置 Tengine库路径(pyTengine 安装包可从Tengine_Demo 包中获取,并在安装包同级目录下运行命令): pip3 install pytengine-1.0.1-py3-none-any.whl export LD_LIBRARY_PATH=/usr/local/AID/Tengine/lib/终端输入 python3,进入Python,导入Tengine无报错则安装成功: python3>>> import tengine>>>3Demo运行效果1)文件准备从Tengine_Demo包中获取以下文件◆ 模型文件:Tengine_Demo/models/ mobilenet.caffemodelTengine_Demo/models/ mobilenet_deploy.prototxt转换模型工具:Tengine_Demo/convert_tool/ convert_model_to_tmLabel 文件(标签文件):Tengine_Demo/labels/synset_words.txtDemo 脚本文件:Tengine_Demo/mobilenet_classify.py图片:Tengine_Demo/images/cat.jpg进入 Demo 目录cd /home/openailab/Demo创建 mobilenet_classify 目录并进入mkdir mobilenet_classifycd mobilenet_classifyDemo 脚本文件mobilenet_classify.pyconvert_model_to_tm放入 mobilenet_classify 目 录下;在 mobilenet_classify 目录下创建 models 目录mkdir models将模型文件、label 文件、图片放入 models 目录下在与 convert_model_to_tm 相同路径下执行模型转换工具,将 caffe 模型转换为 Tengine 模 型./convert_model_to_tm -f caffe -p models/mobilenet_deploy.prototxt -mmodels/mobilenet.caffemodel -o models/mobilenet.tmfile转换成功后的 Tengine 模型在 models 目录下2Demo 运行mobilenet_classify 目录下运行 Demo pthon3 mobilenet_classify.py结果如图 2 所示: 图2 Python Demo 运行效果图4Demo代码解析Demo通过调用TenginePythonAPI进行模型的读取、图的创建,并获取最终数据,其软件流程图如图3所示:图 3 Python Demo 软件流程图Demo 脚本名为 mobilenet_classify.py,导入所需的库:import timefrom tengine import tgimport numpy as npimport cv2定义模型文件、要分类的图片、识别次数、图片预处理的 mean scalemodel = models/mobilenet.tmfileimage = models/cat.jpgrepeat_count = 1scale = 0.017mean = [104.007, 116.669, 122.679]定义图片预处理方法parse_data,通过cv2读取图片并resize为模型所需的 224*224224*224*3),并将图片数据转为 chw3*224*224): def parse_data():img0 = cv2.imread(image, -1)img = cv2.resize(img0, (224, 224))input_data, input_0, input_1, input_2 = img, [], [], []input_data = (input_data – mean) * scalefor d in input_data.astype(np.float32).reshape((-1, 3)):input_0.append(d[0])input_1.append(d[1])input_2.append(d[2])input_data = input_0 + input_1 + input_2input_data = np.array(input_data)return input_data, img0定义分类方法 classify,调用图片预处理方法 parse_data 获取经过预处理后的数据;创建graph,指定模型类型为 Tengine,模型文件 mobilenet.tmfile;调用 graph preRun 进行内存空间的申请:def classify():image_data, img = parse_data()graph = tg.Graph(None, tengine, model)graph.preRun()调用 graph run 方法,开始运行模型文件,对图片数据进行分类,此方法设置 block=1,并指定 input_data 为经过预处理后的数据:max_time = 0min_time = Nonewhole_time1 = time.time()for i in range(repeat_count):time_1 = time.time()graph.run(block=1, input_data=image_data)time_2 = time.time()spend_time = time_2 – time_1计算运行耗时(平均每次耗时、每次最长耗时和最短耗时): if spend_time > max_time:max_time = spend_timeif i == 0:min_time = spend_timeif spend_time < min_time:min_time = spend_timewhole_time2 = time.time()avg_time = (whole_time2 – whole_time1) / repeat_countprint(Repeat {} times, avg time per run is {} ms.format(repeat_count, round(avg_time, 2)))print(max time is {} ms, min time is {} ms.format(round(max_time, 2), round(min_time, 2)))获取运行之后的输出 tensor(下标为 0 的输出 node 和此 node 的下标为 0 的输出 tensor),并将 output_tensor 中的数据通过 getbuffer 方法获取: output_tensor = graph.getOutputTensor(0, 0)data = output_tensor.getbuffer(float)读取 label 文件,通过 readlines 函数将类别信息存入 labels 列表;将输出数据(列表)的各个元素的 index、数据放入 pair 列表中,再将每个 pair 列表放入 pairs 列表,再按数据大小(分类的概率)排序(由大到小):t_list = data[0: 1000]with open(models/synset_words.txt, r) as f:labels = f.readlines()pairs = []for idx, k in enumerate(t_list):pair = [idx, k]pairs.append(pair)pairs.sort(key=lambda x: x[1], reverse=True)获取概率(数据值)最大的前五个数据的 index,并在 labels 中找到对应 index 的类别信息,将数据值和类别信息分别对应打印: print(*40)for i in range(5):idx = pairs[i][0]print((%.4f % t_list[idx]) + + labels[idx].replace(\n, ))print( * 40)通过 cv2 imshow 方法将图片展示出来,并将分类结果最高的标签通过 cv2 putText 方法写在图片上: cv2.putText(img, labels[pairs[0][0]], (30,30),cv2.FONT_HERSHEY_PLAIN, 2.0, (0, 0, 255), 2)cv2.imshow(image, img)k = cv2.waitKey(0)if k == 27:cv2.destroyAllWindows()调用 graph postRun 方法,释放占用的资源;最后,调用 classify 函数作为 Demo 的入口:graph.postRun()if __name__ == __main__:classify()

彩蛋来啦

一键模型转换工具:

省去编译转换工具的时间开箱即用,传送门:https://convertmodel.cn/点击阅读原文获取Tengine开源版本欢迎Git Clone!https://github.com/OAID/Tengine开发者技术交流群人数突破千(群号:829565581),群里各位大佬坐镇,日常技术讨(shui)论(qun),期待你的加入~~

      相关阅读

OPEN AI LAB(开放智能)专注边缘智能计算及应用,致力于推动芯片级算力、算法、工程产品化、行业应用完整产业链的深度协作,加速人工智能产业化部署和场景的边界拓展,赋能细分行业场景化快速实现+AI产品化落地,助力降本增效。

               
发表评论