Tensorflow目标检测接口配合tflite量化模型(二)

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
模型训练 PAI-DLC,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: Tensorflow目标检测接口配合tflite量化模型

转pb文件


使用export_inference_graph.py(在object detection目录下)导出pb文件:


python export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path=ssd_mobilenet_v2_coco.config \   
--trained_checkpoint_prefix=training//model.ckpt-30000 \   
--output_directory models_trained/


测试pb模型:


import tensorflow as tf
import cv2
import os
import time
import numpy as np
from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util
videofile='/home/zyl/Documents/caffe/examples/MobileNet-SSD/videos/20180813140109903.avi'
cap=cv2.VideoCapture(videofile)
MODEL_NUM_CLASSES=3
MODEL_LABEL_MAP ='/home/zyl/data/dms_tf/label_map.pbtxt'
MODEL_PB='/home/zyl/data/dms_tf/model2/export_result/frozen_inference_graph.pb'
# read graph model
with tf.gfile.GFile(MODEL_PB,'rb') as fd:
    _graph=tf.GraphDef()
    _graph.ParseFromString(fd.read())
    tf.import_graph_def(_graph,name='')
# get the default graph model
detection_graph=tf.get_default_graph()
# read labelmap
label_map=label_map_util.load_labelmap(MODEL_LABEL_MAP)
categories=label_map_util.convert_label_map_to_categories(label_map,MODEL_NUM_CLASSES)
category_index=label_map_util.create_category_index(categories)
with tf.Session(graph=detection_graph) as sess:
    while(cap.isOpened()):
        ret,frame=cap.read()
        frame_np_expanded=np.expand_dims(frame,axis=0)
        image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
        boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
        scores = detection_graph.get_tensor_by_name('detection_scores:0')
        classes = detection_graph.get_tensor_by_name('detection_classes:0')
        num_detections = detection_graph.get_tensor_by_name('num_detections:0')
        t1=time.time()
        (boxes,scores,classes,num_detections)=sess.run([boxes,scores,classes,num_detections], \
        feed_dict={image_tensor:frame_np_expanded})
        vis_util.visualize_boxes_and_labels_on_image_array(frame,np.squeeze(boxes),
        np.squeeze(classes).astype(np.int32),np.squeeze(scores),category_index,
        use_normalized_coordinates=True,line_thickness=6)
        t2=time.time()
        print('FPS:',1/(t2-t1))
        cv2.imshow('MobilenetTF',frame)
        if cv2.waitKey(1)&0xff ==27:
            break
    cap.release()


转tflite文件

因为要使用toco,这里我们需要从源码中编译tensorflow库,新建Python环境,并激活环境,基操不再累赘


安装bazel

首先安装依赖包:


sudo apt-get install pkg-config zip g++ zlib1g-dev unzip


然后下载bazel二进制文件:这里以bazel-0.15.0-installer-linux-x86_64.sh为例说明

修改权限并安装:


chmod +x bazel-0.15.0-installer-linux-x86_64.sh
./bazel-0.15.0-installer-linux-x86_64.sh --user


–user 选项会将bazel安装在$HOME/bin目录下, 显示如下,表示安装成功


20200420163602975.png

设置环境变量


vim ~/.bashrc


在末尾添加


export PATH="$PATH:$HOME/bin"


下载TensorFlow源码并配置构建


mkdir C:\tensorflow-build
cd C:\tensorflow-build
git clone https://github.com/tensorflow/tensorflow.git 
cd tensorflow 
git checkout r1.13   # 签出TensorFlow v1.13的分支


接下来,我们将使用configure.py脚本配置TensorFlow构建


python ./configure.py


接下来,配置系统会给出各种询问,以确认编译时的配置参数,下面挑选比较重要的几个参数解释如下(有默认值的直接回车,Y/n的直接选择n,我是这样做的):


yhilly@ubuntu:~/tensorflow$ ./configure 
You have bazel 0.9.0 installed.
Please specify the location of python. [Default is /home/yhilly/anaconda3/envs/tensorflow/bin/python]:


上面的提示是Bazel让我们选择Python的安装路径,只要确保是Anaconda的Python路径即可,直接按一系列的回车键(Enter)表示使用默认值


Do you wish to build TensorFlow with jemalloc as malloc support? [Y/n]: 
jemalloc as malloc support will be enabled for TensorFlow.


上面的选项表示是否使用jemalloc代替传统的malloc来管理内存?Jemalloc是杰森·埃文斯(Jason Evans)于2006年开发的用以取代传统低性能的malloc内存管理模块而开发的一款内存管理模块[4]。埃文斯并非等闲之辈,他是FreeBSD项目(一种类UNIX操作系统)的重要维护者之一

Jemalloc先被Firefox浏览器采用,后来又被Facebook在其自己的各类应用上广泛使用,一战成名。好技术当然要用!直接按回车,确认默认值Y(默认值通常就是被大写的选项)


Do you wish to build TensorFlow with Google Cloud Platform support? [Y/n]: n
No Google Cloud Platform support will be enabled for TensorFlow.


这个选项是询问是否采用Google云平台来支持TensorFlow。这个云平台国内通常无法访问,建议输入“n”。有条件的读者,可直接按回车确认使用


Do you wish to build TensorFlow with Hadoop File System support? [Y/n]: n
No Hadoop File System support will be enabled for TensorFlow.


这个选项是询问是否使用Hadoop 文件系统(HDFS)来支持TensorFlow。如果搭建了Hadoop集群,有读取HDFS数据需求的用户,可以回车确认。如果没有需求,手动输入“n”


Do you wish to build TensorFlow with XLA JIT support? [y/N]: n
No XLA JIT support will be enabled for TensorFlow.


这个选项是询问是否开启XLA JIT编译支持。XLA(Accelerated Linear Algebra/加速线性代数)目前还是TensorFlow的实验项目,XLA 使用 JIT(Just in Time,即时编译)技术来分析用户在运行时(runtime)创建的 TensorFlow 图,专门用于实际运行时的维度和类型。作为新技术,这项编译技术还不成熟,爱折腾的可以选y


Do you wish to build TensorFlow with CUDA support? [y/N]: 
No CUDA support will be enabled for TensorFlow.


这个选项是询问是否使用CUDA。CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。如果用户配备有NVIDIA的GPU,可以选择“y”,如果仅使用TensorFlow的CPU版本,回车确认“N” (这里只是为了使用toco转换模型,为了节省时间,选择N)


编译源文件


在配置完毕Bazel的编译选项之后,接下来就可以使用如下指令编译TensorFlow的源代码:


bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package


如果想获得GPU支持,则需要加入编译选项“–config=cuda”


bazel build --config=opt --config=cuda --define=no_tensorflow_py_deps=true //tensorflow/tools/pip_package:build_pip_package


现在已经创建了包构建器,让我们使用它来构建实际的TensorFlow wheel文件


bazel-bin/tensorflow/tools/pip_package/build_pip_package  ~/tensorflow_pkg


下面我们要做的工作就是,利用pip来安装我们亲手编译的TensorFlow二进制文件


pip  install  ~/tensorflow_pkg/<Paste full .whl filename here>.whl


让我们通过打开Python shell来确保正确安装:


python


打开Python后,发出以下命令:


>>> import tensorflow as tf
>>> tf.__version__


如果一切都已正确安装,它将以已安装的TensorFlow版本响应


生成TF Lite模型


前面frozen的pb模型直接转换会报错,需使用export_tflite_ssd_graph.py进行优化后再转换。将object_detection/export_tflite_ssd_graph.py拷贝到训练目录,运行:


python export_tflite_ssd_graph.py \
    --pipeline_config_path=ssd_mobilenet_v2_coco.config \
    --trained_checkpoint_prefix=models_trained/model.ckpt-30000\
    --output_directory=models


生成冻结后的模型,再转换为对应的TF Lite模型,包括float类型的(模型更大,更准确)和量化后uint8类型的模型(模型更小,但准确率不高)

float32型:


bazel-bin/tensorflow/lite/toco/toco \
--input_file=/home/zyl/Documents/tfmodels/dms/models/tflite_graph.pb \
--input_format=TENSORFLOW_GRAPHDEF  \
--output_format=TFLITE  \
--output_file=/home/zyl/Documents/tfmodels/dms/models/litefloat_zyl.tflite \
--inference_type=FLOAT \
--input_arrays=normalized_input_image_tensor \
--output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' \
--input_shapes=1,300,300,3 \
--mean_values=128 \
--std_dev_values=128 \
--default_ranges_min=0 \
--allow_custom_ops


uint8量化:


bazel-bin/tensorflow/lite/toco/toco \
--graph_def_file=/home/zyl/data/dms_tf/model1/tflite_graph.pb  \
--output_file=/home/zyl/data/dms_tf/model1/tflite_model/model1.tflite \
--input_shapes=1,300,300,3 \
--input_arrays=normalized_input_image_tensor \
--output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' \
--inference_type=QUANTIZED_UINT8 \
--mean_values=128 \
--std_dev_values=128 \
--default_ranges_min=0 \
--default_ranges_max=6 \
--change_concat_input_ranges=False \
--allow_custom_ops


调用TensorFlow Lite模型


wget https://raw.githubusercontent.com/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi/master/TFLite_detection_image.py --no-check-certificate
wget https://raw.githubusercontent.com/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi/master/TFLite_detection_video.py --no-check-certificate
wget https://raw.githubusercontent.com/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi/master/TFLite_detection_webcam.py --no-check-certificate


使用这三个脚本可以实现不同场景的调用

有关在运行脚本的使用的-h选项的更多信息,请在调用脚本时使用该选项。例:


python TFLite_detection_image.py -h
相关实践学习
MySQL基础-学生管理系统数据库设计
本场景介绍如何使用DMS工具连接RDS,并使用DMS图形化工具创建数据库表。
目录
相关文章
|
14天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
60 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
2月前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
57 0
|
2月前
|
C# 开发者 前端开发
揭秘混合开发新趋势:Uno Platform携手Blazor,教你一步到位实现跨平台应用,代码复用不再是梦!
【8月更文挑战第31天】随着前端技术的发展,混合开发日益受到开发者青睐。本文详述了如何结合.NET生态下的两大框架——Uno Platform与Blazor,进行高效混合开发。Uno Platform基于WebAssembly和WebGL技术,支持跨平台应用构建;Blazor则让C#成为可能的前端开发语言,实现了客户端与服务器端逻辑共享。二者结合不仅提升了代码复用率与跨平台能力,还简化了项目维护并增强了Web应用性能。文中提供了从环境搭建到示例代码的具体步骤,并展示了如何创建一个简单的计数器应用,帮助读者快速上手混合开发。
45 0
|
2月前
|
UED 开发工具 iOS开发
Uno Platform大揭秘:如何在你的跨平台应用中,巧妙融入第三方库与服务,一键解锁无限可能,让应用功能飙升,用户体验爆棚!
【8月更文挑战第31天】Uno Platform 让开发者能用同一代码库打造 Windows、iOS、Android、macOS 甚至 Web 的多彩应用。本文介绍如何在 Uno Platform 中集成第三方库和服务,如 Mapbox 或 Google Maps 的 .NET SDK,以增强应用功能并提升用户体验。通过 NuGet 安装所需库,并在 XAML 页面中添加相应控件,即可实现地图等功能。尽管 Uno 平台减少了平台差异,但仍需关注版本兼容性和性能问题,确保应用在多平台上表现一致。掌握正确方法,让跨平台应用更出色。
34 0
|
2月前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
39 0
|
2月前
|
前端开发 开发者 设计模式
揭秘Uno Platform状态管理之道:INotifyPropertyChanged、依赖注入、MVVM大对决,帮你找到最佳策略!
【8月更文挑战第31天】本文对比分析了 Uno Platform 中的关键状态管理策略,包括内置的 INotifyPropertyChanged、依赖注入及 MVVM 框架。INotifyPropertyChanged 方案简单易用,适合小型项目;依赖注入则更灵活,支持状态共享与持久化,适用于复杂场景;MVVM 框架通过分离视图、视图模型和模型,使状态管理更清晰,适合大型项目。开发者可根据项目需求和技术栈选择合适的状态管理方案,以实现高效管理。
32 0
|
2月前
|
Apache 开发者 Java
Apache Wicket揭秘:如何巧妙利用模型与表单机制,实现Web应用高效开发?
【8月更文挑战第31天】本文深入探讨了Apache Wicket的模型与表单处理机制。Wicket作为一个组件化的Java Web框架,提供了多种模型实现,如CompoundPropertyModel等,充当组件与数据间的桥梁。文章通过示例介绍了模型创建及使用方法,并详细讲解了表单组件、提交处理及验证机制,帮助开发者更好地理解如何利用Wicket构建高效、易维护的Web应用程序。
25 0
|
2月前
|
机器学习/深度学习 API TensorFlow
深入解析TensorFlow 2.x中的Keras API:快速搭建深度学习模型的实战指南
【8月更文挑战第31天】本文通过搭建手写数字识别模型的实例,详细介绍了如何利用TensorFlow 2.x中的Keras API简化深度学习模型构建流程。从环境搭建到数据准备,再到模型训练与评估,展示了Keras API的强大功能与易用性,适合初学者快速上手。通过简单的代码,即可完成卷积神经网络的构建与训练,显著降低了深度学习的技术门槛。无论是新手还是专业人士,都能从中受益,高效实现模型开发。
17 0
|
2月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
全面解析TensorFlow Lite:从模型转换到Android应用集成,教你如何在移动设备上轻松部署轻量级机器学习模型,实现高效本地推理
【8月更文挑战第31天】本文通过技术综述介绍了如何使用TensorFlow Lite将机器学习模型部署至移动设备。从创建、训练模型开始,详细演示了模型向TensorFlow Lite格式的转换过程,并指导如何在Android应用中集成该模型以实现预测功能,突显了TensorFlow Lite在资源受限环境中的优势及灵活性。
65 0
|
2月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
TensorFlow Serving 部署指南超赞!让机器学习模型上线不再困难,轻松开启高效服务之旅!
【8月更文挑战第31天】TensorFlow Serving是一款高性能开源服务系统,专为部署机器学习模型设计。本文通过代码示例详细介绍其部署流程:从安装TensorFlow Serving、训练模型到配置模型服务器与使用gRPC客户端调用模型,展示了一站式模型上线解决方案,使过程变得简单高效。借助该工具,你可以轻松实现模型的实际应用。
24 0
下一篇
无影云桌面