前言:近期,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.0

(2)安装 python3-devel

sudo yum install python3-devel

(3)安装 numpynumpy 安装速度较慢,需耐心等待

pip3 install numpy

(4)安装 Python3-OpenCV

sudo 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_tm◆ Label 文件(标签文件):Tengine_Demo/labels/synset_words.txt◆ Demo 脚本文件:Tengine_Demo/mobilenet_classify.py◆ 图片:Tengine_Demo/images/cat.jpg进入 Demo 目录

cd /home/openailab/Demo

创建 mobilenet_classify 目录并进入

mkdir mobilenet_classifycd mobilenet_classify

Demo 脚本文件mobilenet_classify.py和convert_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 目录下(2)Demo 运行在 mobilenet_classify 目录下运行 Demo

pthon3 mobilenet_classify.py

结果如图 2 所示: 图2 Python Demo 运行效果图4Demo代码解析此Demo通过调用Tengine的Python API进行模型的读取、图的创建,并获取最终数据,其软件流程图如图3所示:图 3 Python Demo 软件流程图Demo 脚本名为 mobilenet_classify.py,导入所需的库:

import timefrom tengine import tgimport numpy as npimport cv2

定义模型文件、要分类的图片、识别次数、图片预处理的 mean 和 scale:

model = 'models/mobilenet.tmfileimage = 'models/cat.jpg'repeat_count = 1scale = 0.017mean = [104.007, 116.669, 122.679]

定义图片预处理方法parse_data,通过cv2读取图片并resize为模型所需的 224*224(224*224*3),并将图片数据转为 chw(3*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/点击欢迎Git Clone!https://github.com/OAID/Tengine开发者技术交流群人数突破千(群号:829565581),群里各位大佬坐镇,日常技术讨(shui)论(qun),期待你的加入~~

相关阅读

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

thinkcmf5调用指定分类的二级_Tengine快速上手系列教程amp;视频:基于Python API的图片分类应用入门丨附彩蛋...相关推荐

  1. thinkcmf5调用指定分类的二级_python机器学习API介绍11: 伯努利贝叶斯分类器

    BernoulliNB是伯努利贝叶斯分类器,它是假设模型的条件概率分布满足对应的二次项分布,其原型为: class sklearn.naive_bayes.BernoulliNB(alpha=1.0, ...

  2. ectouch手机商城首页调用指定分类下的商品

    ECTouch是国内市面上唯一开源的ECSHOP移动商城系统,为广大电商以最低的成本快速搭建移动商城.最近最一商城实例,手机版首页需要调用指定分类下的商品,ECtouch商城默认好像没有此调用方式,只 ...

  3. ecshop调用指定分类(包含子分类)下所有产品的评论信息

    调用指定分类(包含子分类)下所有产品的评论信息,使用了ecshop系统自带的函数get_children($cat_id)调用指定分类下所有子分类的id,该自带函数在文件include/lib_com ...

  4. zblog php 指定分类,zblogPHP如何调用指定分类的置顶文章

    站长圈子里可真是人人都是产品经理啊,各种奇葩的需求都会碰到,今天有个老哥就咨询我zblogphp程序如何调用指定分类的置顶文章,也不知道是应用在他网站的哪个模块区域了. 扯远了说正事,直接上代码{fo ...

  5. spring cloud 快速上手系列 -> 02-配置中心 Config -> 022-Config客户端

    spring cloud 快速上手系列 系列说明:快速上手,一切从简,搭建一个简单的微服务框架,让新手可以在这个基础框架上做各种学习.研究. 02-配置中心 Config 022-Config客户端 ...

  6. P4 Tutorial 快速上手 (1) 教程库简介

    P4 Tutorial 快速上手 (1) 教程库简介 提示:本系列仅适用于软件交换机BMv2 P4 Tutorial 快速上手系列 (2) 文章目录 P4 Tutorial 快速上手 (1) 教程库简 ...

  7. spring cloud 快速上手系列 -> 04-网关 Gateway -> 041-空的工程

    spring cloud 快速上手系列 系列说明:快速上手,一切从简,搭建一个简单的微服务框架,让新手可以在这个基础框架上做各种学习.研究. 04-网关 Gateway 041-空的工程 1,说明 网 ...

  8. 【快速上手系列】五分钟即可学会的easyUI的简单使用教程

    [快速上手系列]五分钟即可学会的easyUI的简单使用教程 一个简单方便的前端框架 引入文件 引入两个css样式和三个js <!--引入easyUI的样式 --> <link hre ...

  9. 【快速上手系列】使用Springboot集成Swagger2的简单使用测试

    [快速上手系列]使用Springboot集成Swagger2的简单使用测试 简介 Swagger2是为了解决企业中接口(api)中定义统一标准规范的文档生成工具. 尤其是前后端分离时对一些业务接口也不 ...

最新文章

  1. OSChina 周一乱弹 —— 六天颓废一天看剧
  2. WordPress 5.1 发布,监控古老 PHP 版本、编辑器性能提升
  3. 创业——不可忽视的创业计划书!!!
  4. react的详细知识讲解!
  5. 国内up300.net网盘无法使用的解决办法
  6. Python 字串处理
  7. 向内存中连续存入数据_实例35_在Excel中按条件筛选数据并存入新的表
  8. zabbix数据库优化
  9. 开启 ASA 5505 snmp协议
  10. 重装服务器,解决怪问题
  11. 大二 数据结构 期末复习题(仅供参考)
  12. 划分计算机发展的四个阶段主要依据,计算机的发展划分为4个阶段,分别为什么、什么、什么和什么。...
  13. 关闭msmpeng_关闭Windows Defender与性能提升测试
  14. android su文件,Android su开放root权限
  15. oracle grant all语句,Oracle 生成批量 Grant 语句的 SQL
  16. 学习matlab(七)——符号计算
  17. CPU频率与内存频率的关系
  18. 总结高精度定位难点与解决办法
  19. Git的基本概念和SourceTree的使用
  20. Python Flask开源博客系统Blog_mini

热门文章

  1. mac rails mysql_MAC下Rails连接mysql出现 dyld: Symbol not found: _mysql_get_client_info 的解决办法...
  2. Windows下创建PXE网络安装Linux[Redhat AS5.5]IBM X3650
  3. python中的for A in B for i in range()
  4. 孙立岩 python-basic: 用于学习python基础的课件(161718)
  5. fasta和fastq格式文件的shell小练习 http://www.bio-info-trainee.com/3575.html
  6. 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来
  7. Linux命令grep
  8. java类和接口实例_Java定义泛型接口和类的方法实例分析
  9. glog 报错解决: /bin/bash: aclocal-1.14: command not found
  10. 机器人 瓷砖墙面清洗_瓷砖铺贴注意事项有哪些?