thinkcmf5调用指定分类的二级_Tengine快速上手系列教程amp;视频:基于Python API的图片分类应用入门丨附彩蛋...
(1)安装Protobuf
sudo dnf install protobuf-compiler-3.5.0-4.fc28.aarch64
sudo dnf install protobuf-3.5.0-4.fc28.aarch64
sudo dnf install protobuf-devel-3.5.0-4.fc28.aarch64
终端输入protoc--version,可以查看版本信息:
protoc --version
libprotoc 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_classify
cd 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 -m
models/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 time
from tengine import tg
import numpy as np
import cv2
定义模型文件、要分类的图片、识别次数、图片预处理的 mean 和 scale:
model = 'models/mobilenet.tmfile
image = 'models/cat.jpg'
repeat_count = 1
scale = 0.017
mean = [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) * scale
for 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_2
input_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 = 0
min_time = None
whole_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_time
if i == 0:
min_time = spend_time
if spend_time < min_time:
min_time = spend_time
whole_time2 = time.time()
avg_time = (whole_time2 - whole_time1) / repeat_count
print('Repeat {} times, avg time per run is {} ms'.format(repeat_c
ount, 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的图片分类应用入门丨附彩蛋...相关推荐
- thinkcmf5调用指定分类的二级_python机器学习API介绍11: 伯努利贝叶斯分类器
BernoulliNB是伯努利贝叶斯分类器,它是假设模型的条件概率分布满足对应的二次项分布,其原型为: class sklearn.naive_bayes.BernoulliNB(alpha=1.0, ...
- ectouch手机商城首页调用指定分类下的商品
ECTouch是国内市面上唯一开源的ECSHOP移动商城系统,为广大电商以最低的成本快速搭建移动商城.最近最一商城实例,手机版首页需要调用指定分类下的商品,ECtouch商城默认好像没有此调用方式,只 ...
- ecshop调用指定分类(包含子分类)下所有产品的评论信息
调用指定分类(包含子分类)下所有产品的评论信息,使用了ecshop系统自带的函数get_children($cat_id)调用指定分类下所有子分类的id,该自带函数在文件include/lib_com ...
- zblog php 指定分类,zblogPHP如何调用指定分类的置顶文章
站长圈子里可真是人人都是产品经理啊,各种奇葩的需求都会碰到,今天有个老哥就咨询我zblogphp程序如何调用指定分类的置顶文章,也不知道是应用在他网站的哪个模块区域了. 扯远了说正事,直接上代码{fo ...
- spring cloud 快速上手系列 -> 02-配置中心 Config -> 022-Config客户端
spring cloud 快速上手系列 系列说明:快速上手,一切从简,搭建一个简单的微服务框架,让新手可以在这个基础框架上做各种学习.研究. 02-配置中心 Config 022-Config客户端 ...
- P4 Tutorial 快速上手 (1) 教程库简介
P4 Tutorial 快速上手 (1) 教程库简介 提示:本系列仅适用于软件交换机BMv2 P4 Tutorial 快速上手系列 (2) 文章目录 P4 Tutorial 快速上手 (1) 教程库简 ...
- spring cloud 快速上手系列 -> 04-网关 Gateway -> 041-空的工程
spring cloud 快速上手系列 系列说明:快速上手,一切从简,搭建一个简单的微服务框架,让新手可以在这个基础框架上做各种学习.研究. 04-网关 Gateway 041-空的工程 1,说明 网 ...
- 【快速上手系列】五分钟即可学会的easyUI的简单使用教程
[快速上手系列]五分钟即可学会的easyUI的简单使用教程 一个简单方便的前端框架 引入文件 引入两个css样式和三个js <!--引入easyUI的样式 --> <link hre ...
- 【快速上手系列】使用Springboot集成Swagger2的简单使用测试
[快速上手系列]使用Springboot集成Swagger2的简单使用测试 简介 Swagger2是为了解决企业中接口(api)中定义统一标准规范的文档生成工具. 尤其是前后端分离时对一些业务接口也不 ...
最新文章
- OSChina 周一乱弹 —— 六天颓废一天看剧
- WordPress 5.1 发布,监控古老 PHP 版本、编辑器性能提升
- 创业——不可忽视的创业计划书!!!
- react的详细知识讲解!
- 国内up300.net网盘无法使用的解决办法
- Python 字串处理
- 向内存中连续存入数据_实例35_在Excel中按条件筛选数据并存入新的表
- zabbix数据库优化
- 开启 ASA 5505 snmp协议
- 重装服务器,解决怪问题
- 大二 数据结构 期末复习题(仅供参考)
- 划分计算机发展的四个阶段主要依据,计算机的发展划分为4个阶段,分别为什么、什么、什么和什么。...
- 关闭msmpeng_关闭Windows Defender与性能提升测试
- android su文件,Android su开放root权限
- oracle grant all语句,Oracle 生成批量 Grant 语句的 SQL
- 学习matlab(七)——符号计算
- CPU频率与内存频率的关系
- 总结高精度定位难点与解决办法
- Git的基本概念和SourceTree的使用
- Python Flask开源博客系统Blog_mini
热门文章
- mac rails mysql_MAC下Rails连接mysql出现 dyld: Symbol not found: _mysql_get_client_info 的解决办法...
- Windows下创建PXE网络安装Linux[Redhat AS5.5]IBM X3650
- python中的for A in B for i in range()
- 孙立岩 python-basic: 用于学习python基础的课件(161718)
- fasta和fastq格式文件的shell小练习 http://www.bio-info-trainee.com/3575.html
- 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来
- Linux命令grep
- java类和接口实例_Java定义泛型接口和类的方法实例分析
- glog 报错解决: /bin/bash: aclocal-1.14: command not found
- 机器人 瓷砖墙面清洗_瓷砖铺贴注意事项有哪些?