Tensorflow Lite介绍

简介Tensorflow Lite是针对移动设备和嵌入式设备的轻量化解决方案,占用空间小,低延迟。Tensorflow Lite在android8.1以上的设备上可以通过ANNA启用硬件加速。支持浮点运算和量化模型,并已针对移动平台进行优化,可以用来创建和运行自定义模型。开发者也可以在模型中添加自定义操作。FlatBuffer格式具有在移动设备运行更快的内核解释器支持通过Tensorflow训练好的模型转换为Tensorflow Lite格式(pd,h5等都可以)当支持所有优化操作时,模型小于300k,当仅支持inception v3和mobilenet模型优化时,模型小于200k预训练模型:inception v3:用于目标检测MobileNets:专门针对移动端的模型,具有低延迟,高速度,低内存,可用于图像识别,目标检测,图像分割,但是精度小于inception v3量化版本的MobileNets,通过将float-32转为int-8,在CPU上拥有更快的速度支持java,c++API以上谈到的预训练模型基于ImageNet数据集训练,支持1000种类别。如果此数据集不能满足你的项目需要,你需要准备自己的数据集和标签,使用迁移学习重新训练模型。模型结构Tensorflow Lite模型的数据格式与Tensorflow桌面端不同,需要使用Tensorflow Lite转换为.tflite格式,然后应用到移动端。模型结构:java-API:包装C++API,以便在android上使用java调用C++-API:加载Tensorflow Lite模型和解释器解释器:执行模型一系列核心操作,支持选择内核加载。全部加载300kb,不加载只有100kb在android8.1以上设备,可通过相关api进行硬件加速(硬件支持的情况下),否则在CPU执行转换模型格式Tensorflow Lite转换器支持以下格式:使用python API执行SavedModel保存的模型文件tf.keras保存的.h5模型文件转换后的GraphDef文件转换GraphDef文件Tensorflow模型一般保存为.pd或.pdtxt格式的文件,要转换为Tensorflow Lite支持的文件,首先需要进行frozen操作。此操作处理多个不同格式的文件:tf.GraphDef(pd,pdtxt):图文件,包含操作,张量,变量的定义checkpoint(.ckpt):包含变量,不包含解释器tensorflow lite(.tflite):序列化的FlatBuffer文件,包含所有需要的文件checkpoint文件包含训练权重,tf.graphdef文件包含图结构。冻结操作就是将上述文件进行合并操作使用命令行,执行该操作的示例如下:freeze_graph –input_graph=/demo/mobilenet_v1_224.pd--input_checkpoint=/demo/checkpoints/mobilenet-1001.ckpt--input_binary=True--output_graph=/demo/frozen_mobilenet_v1_224.pd--output_node_names=/demo/MobileNetV1/Predictions/Reshape_1input_binary:读取的文件是否是二进制文件,如:pd和pdtxt文件android端使用Tensorflow Lite可以使用android studio和源码编译两种方式,此处我们介绍第一种(由于你懂的原因,开vpn会比较顺利些)。安装android studioSDK大于26,NDK大于14导入工程项目,路径:tensorflow/lite/examples默认使用mobilenet模型,如要使用inception模型,先下载模型文件并拷贝至asset文件夹,然后修改Camera2BasicFragment文件:classifier = new ImageClassifierQuantizedMobileNet(getActivity())改为:classifier = new ImageClassifierFloatInception(getActivity())Tensorflow Lite转换器上图是Tensorflow Lite转换器的工作流程,清晰明了,就不做过多介绍了。此外,转换的方式有两种,python api的方式和命令行方式。从Session中导出GraphDef使用tf.Session将Tensorflow模型转为Tensorflow Lite模型import tensorflow as tfimg = tf.placeholder(name=“img”, dtype=tf.float32, shape=(1, 64, 64, 3))var = tf.get_variable(“weights”, dtype=tf.float32, shape=(1, 64, 64, 3))val = img + varout = tf.identity(val, name=“out”)with tf.Session() as sess: sess.run(tf.global_variables_initializer()) converter = tf.lite.TFLiteConverter.from_session(sess, [img], [out]) tflite_model = converter.convert() open(“converted_model.tflite”, “wb”).write(tflite_model)从file中导出GraphDef以下代码展示怎样将.pd或.pdtxt文件转为Tensorflow Lite模型支持的FlateBuffer格式文件。import tensorflow as tfgraph_def_file = “/path/to/Downloads/mobilenet_v1_1.0_224/frozen_graph.pb"input_arrays = [“input”]output_arrays = [“MobilenetV1/Predictions/Softmax”]converter = tf.lite.TFLiteConverter.from_frozen_graph( graph_def_file, input_arrays, output_arrays)tflite_model = converter.convert()open(“converted_model.tflite”, “wb”).write(tflite_model)将SaveModle导出import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)tflite_model = converter.convert()open(“converted_model.tflite”, “wb”).write(tflite_model)tf.keras文件导出import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_keras_model_file(“keras_model.h5”)tflite_model = converter.convert()open(“converted_model.tflite”, “wb”).write(tflite_model)量化模型import tensorflow as tfimg = tf.placeholder(name=“img”, dtype=tf.float32, shape=(1, 64, 64, 3))const = tf.constant([1., 2., 3.]) + tf.constant([1., 4., 4.])val = img + constout = tf.fake_quant_with_min_max_args(val, min=0., max=1., name=“output”)with tf.Session() as sess: converter = tf.lite.TFLiteConverter.from_session(sess, [img], [out]) converter.inference_type = tf.lite.constants.QUANTIZED_UINT8 input_arrays = converter.get_input_arrays() converter.quantized_input_stats = {input_arrays[0] : (0., 1.)} # mean, std_dev tflite_model = converter.convert() open(“converted_model.tflite”, “wb”).write(tflite_model)TensorFlow Lite Python解释器代码展示如何使用Tensorflow Lite解释器读取.tflite文件。import numpy as npimport tensorflow as tf# 加载模型并分配张量interpreter = tf.lite.Interpreter(model_path=“converted_model.tflite”)interpreter.allocate_tensors()# 获取输入输出张量input_details = interpreter.get_input_details()output_details = interpreter.get_output_details()# 随机生成测试数据,测试模型输出input_shape = input_details[0][‘shape’]input_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)interpreter.set_tensor(input_details[0][‘index’], input_data)interpreter.invoke()output_data = interpreter.get_tensor(output_details[0][‘index’])print(output_data)Tensorflow2.0转换器使用如图所示,Tensorflow2.0与之前相比,少了冻结graph模块,增加了Concrete Fn。生成concrete Fn为了将Tensorflow2.0模型转为Tensorflow Lite,模型需要导出concrete Fn。这是因为Tensorflow2.0中,eager execution是默认设置,虽然调试更加便利,但是它没有保存图,因为不能直接应用到移动设备。不过,可以使用tf.function包装,这样保存的模型就包含图,可以转换为Tensorflow Lite所需要的FlatBuffer格式文件。class BasicModel(tf.Module): def init(self): self.const = None @tf.function def pow(self, x): if self.const is None: self.const = tf.Variable(2.) return x ** self.constconcrete Fn声明的图可以被转换为Tensorflow Lite模型或者使用SaveModel导出。为了导出此方法,需要声明signature,使用方法如下:在tf.function中声明input_signature将tf.TensorSpec传值给get_concrete_funtion将input传值给get_concrete_funtionimport tensorflow as tfroot = tf.Module()# 初始化一次变量值root.var = None@tf.functiondef exported_function(x): if root.var is None: root.var = tf.Variable(tf.random.uniform([2, 2])) root.const = tf.constant([[37.0, -23.0], [1.0, 4.0]]) root.mult = tf.matmul(root.const, root.var) return root.mult * xroot.func = exported_functionconcrete_func = root.func.get_concrete_function( tf.TensorSpec([1, 1], tf.float32))Python api执行the TensorFlow Lite converterTensorflow2.0中转换Tensorflow Lite模型使用tf.lite.TFLiteConverter.from_concrete_function(),示例如下:import tensorflow as tf# 创建模型root = tf.train.Checkpoint()root.v1 = tf.Variable(3.)root.v2 = tf.Variable(2.)root.f = tf.function(lambda x: root.v1 * root.v2 * x)# 保存模型export_dir = “/tmp/test_saved_model"input_data = tf.constant(1., shape=[1, 1])to_save = root.f.get_concrete_function(input_data)tf.saved_model.save(root, export_dir, to_save)# 加载模型并获取concrete fn.model = tf.saved_model.load(export_dir)concrete_func = model.signatures[ tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]# 设置input shapeconcrete_func.inputs[0].set_shape(input_data.shape)# 转换模型converter = tf.lite.TFLiteConverter.from_concrete_function(concrete_func)tflite_model = converter.convert()TensorFlow Lite 推断TensorFlow Lite推断一般执行以下步骤:加载.tflite模型处理数据以适应模型input调用API,创建解析器,运行模型获取模型输出结果如何选择模型如图所示,大模型高精度,高延迟;小模型低精度,低延迟,模型的选择需要根据你的项目需求进行选择。 ...

April 2, 2019 · 2 min · jiezi

如果你的公司还没有企业级班车应用,把这篇文章转给你老板

本文由云+社区发表越来越多的大型企业都开始为员工提供班车,解决员工上下班出行的问题,甚至有些高新技术园区也组织了园区车辆共享的一些新的出行方案。期间,企业从早期员工提供优质的班车服务,到提升班车的管理水平、优化车辆使用成本逐渐成为了主线。那么如何做到这些呢?企业级班车应用到底怎么做呢?首先,我们需要数据,而数据的采集离不开设备,比如刷卡设备,GPS设备总结来说,企业级班车应用的目标也还是在解决痛点员工痛点:出行便利问题、晚点率高等车难、站点设置不合理通勤时间长、线路超载管理痛点:业务规模大黑盒运营、不断增加的运营成本、难以管理的行车安全示意图从设备谈起可以这么说,在设备方面执行最好的还是各大城市公交系统的刷卡机,现在的刷卡机也带了GPS的功能。对于员工,我们通过GPS设备实时展示车辆所在位置,能够在等车这件事上给出预期,对于管理,我们在收集了GPS、刷卡数据后,对人、站、车三者的关系做一系列大数据分析,建立运营模型整体架构图我们可以通过在腾讯云上搭建GPS服务器来获取GPS信息image.png还有一些安全设备,比如车内的视频、车辆行驶记录、车辆前车过近监控等等设备有的时候也会出一些问题,也需要一系列的工具来监控他们,出现问题快速解决设备监控一般设备出问题,我们会认为是一下3种情况时间没变化,GPS也没变化,这种就说明设备关机或者坏掉了,没有数据上报时间有变化,GPS没变化,终端未定位时,会一直上传最后一条有效位置信息,这说明定位有问题如果都没有数据,那么就是这趟车或者这趟线没有设备被安装安全是第一安全也是运营中最重要的一环,目前班车通过智能硬件设备,对班车的超速、驾驶行为习惯进行监控和取证。超速,可以通过轨迹获取到班车的实时轨迹,对超速路段和速度都能够做到快速的取证超速情况危险驾驶:对于前车过近、压线行驶、疲劳驾驶进行监控后上报给班车管理员进行人工干预前车过近站点的合理性班车是会有很多线路、很多站点的,一条线路的确定要考虑多个因素:通勤时间、上座率、时间与空间的互补,一般来说,上班的点是比较固定的,那么以方向和区域来优化线路是可行的首先,我们得明确优化的方向和方法,拿深圳来说,我们的站点分布就像织网,大多数的站点分布在四个区域,东(市区、龙岗)、南(南山)、西(宝安)、北(龙华),如下图分布情况:站点分布图在优化的时候,可以合并、拆分、搭线三种方式来解决运载问题,科学合理的方式是以本区范围来做优化,同时还要考虑行车距离和行车时间,考虑的因素很多,所以要做到智能的推荐我们事先需要总结一些规律,我们发现一个比较有意思的问题,从区域的角度来看,每个区域的距离都可以用以下结论来套线路:方围2公里经过的线路(跨域带人)区域站点:方围1公里的站点(5-15分钟内可达)横向与纵向员工的体验其实员工需要的很简单,快速的查、实时的看,目前市面上很多的公交类或者地图类app都具备了这些,列如车来了,通过文本形式来展示状态车来了也列如地图类应用,通过地图显示来展示目前的状态腾讯班车此文已由作者授权腾讯云+社区发布搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

December 6, 2018 · 1 min · jiezi