:mod:`tf` --- Tensor Flow ========================= .. module:: tf :synopsis: Tensor Flow ``tf`` 模块能够执行量化的TensorFlow Lite模型 在OpenMV Cam上(不支持OpenMV Cam M4)。 您可以阅读更多关于如何创建可以运行在OpenMV Cam上的自己的模型,`here `__. 特别的: * 支持的指令列出 `here `__. * 注意tensorflow lite操作是有版本要求的。 如果指令后面没有列出版本号,那么最小和最大版本支持是1. 如果指令后面有数字,这些数字表示指令支持的最小和最大版本。 * 如果你使用Keras来生成你的模型,请小心只使用 微控制器版本的tensorflow lite支持的指令。否则, 您的模型将无法运行您的OpenMV Cam。 * 按照说明将您的模型转换为FlatBuffer `here `__. * 最后,按照说明对模型进行量化 `here `__. 或者,只要遵循谷歌的深度的指南 `here `__. 如果您对谷歌的深度的指南有任何问题,请联系谷歌寻求帮助。 最终的输出``.tflite``模型可以让OpenMV Cam直接加载和运行。 也就是说,模型和模型的要求的初始RAM必须 符合在您的OpenMV Cam上可用的帧缓冲堆栈RAM。 * OpenMV Cam M7拥有约384KB帧缓冲内存。 请保证你的模型和它需要的初始RAM小于320KB。 * OpenMV Cam H7拥有约496KB帧缓冲内存。 请保证你的模型和它需要的初始RAM小于400KB。 * OpenMV Cam H7 Plus拥有约31MB的帧缓冲内存。 也就是说,运行一个接近这个尺寸的模型将会非常慢。 另外,还可以将模型加载到MicroPython堆或OpenMV Cam框架缓冲区中。 然而,这在很大程度上限制了所有OpenMV摄像机的模型大小。 函数 --------- .. function:: tf.classify(path, img, [roi, [min_scale=1.0, [scale_mul=0.5, [x_overlap=0, [y_overlap=0]]]]]) 在 ```img``` 上运行TensorFlow Lite图像分类模型,并返回一个 `tf_classification` 对象列表。 这个方法对图像使用可控滑动方式,执行多次模型(默认算法在整个图像帧上只执行网络一次)。 ``path`` 是OpenMV Cam的磁盘上的 ``.tflite`` 模型的路径。 为了节省内存,只通过这一个函数,模型被加载到内存中,执行并释放所有内存。 传递 ``"person_detection"`` 可以从你的OpenMV Cam的内部FLASH加载内置的人检测模型。 ``roi`` 是感兴趣区域矩形元组(x, y, w, h)。如果没有指定时,它等于图像的整个大小。 只有在 ``roi`` 内的像素才被操作。 ``min_scale`` 控制网络的缩放尺度。在默认值网络不缩放。 当值为0.5时,会允许检测大小为图像roi的50%的目标。 ``scale_mul`` 控制有多少种不同的缩放尺度可以检测出来。 滑动窗口方法的工作原理是将默认的尺度1乘以 ``scale_mul`` 同时结果大于 ``min_scale`` 。 ``scale_mul`` 的默认值是0.5,测试出每次变化可以减少50%的大小。但是,0.95只会减少5%的尺寸。 ``x_overlap`` 控制与下一个滑动窗口的区域检测器重叠的百分比。 值为0意味着没有重叠,0.95意味着95%的重叠。 ``y_overlap`` 控制与下一个滑动窗口的区域检测器重叠的百分比。 值为0意味着没有重叠,0.95意味着95%的重叠。 .. function:: tf.segment(path, img, [roi]) 在img上执行TensorFlow Lite图像分割模型, 返回一个灰度的 `image` 对象列表,对应每一个分割分类的输出通道。 为了节省内存,只通过这一个函数,模型被加载到内存中,执行并释放所有内存。 ``roi`` 是感兴趣区域矩形元组(x, y, w, h)。如果没有指定时,它等于图像的整个大小。 只有在 ``roi`` 内的像素才被操作。 .. function:: tf.load(path, [load_to_fb=False]) ``path`` 要加载的 ``.tflite`` 模型的路径,默认加载到MicroPython堆的内存中。 注意!MicroPython堆在OpenMV Cam M7上只有~ 50KB,在OpenMV Cam H7上只有~ 256KB。 传递 ``"person_detection"`` 可以从你的OpenMV Cam的内部FLASH加载内置的人检测模型。 这个内置的模型不使用任何Micropython堆内存。因为所有的权重保存在flash,可以和RAM一样访问。 ``load_to_fb`` 如果传递为True,将会使用预留部分的OpenMV Cam帧缓冲区,来存储TensorFlow Lite模型。 对于不能存储在Micropython堆栈大模型会得到最有效率执行性能,因为不用每次运行都从磁盘导入。 也就是说,帧缓冲所用到的空间将不能再用于其他算法。 返回一个可以操作图像的 `tf_model` 对象。 .. function:: tf.free_from_fb() 释放先前分配的 `tf_model` 对象,该对象创建时将 ``load_to_fb`` 设置为真。 注意,释放的顺序与分配的顺序相反。 class tf_classification -- tf 分类 检测结果 =========================================================== tf_classification对象由 `tf.classify()` 或 `tf_model.classify()` 返回。 构造函数 ------------ .. class:: tf.tf_classification() 请调用 `tf.classify()` 或 `tf_model.classify()` 来创建这个对象。 方法 ------- .. method:: tf_classification.rect() 返回tf_classification的边界框的矩形元组(x, y, w, h), 用于 `image` 方法,比如 `image.draw_rectangle()` 。 .. method:: tf_classification.x() 返回tf_classification的边界框x坐标(int)。 在对象上使用 ``[0]`` 也可以得到这个值。 .. method:: tf_classification.y() 返回tf_classification的边界框y坐标(int)。 在对象上使用 ``[1]`` 也可以得到这个值。 .. method:: tf_classification.w() 返回tf_classification的边界框w坐标(int)。 在对象上使用 ``[2]`` 也可以得到这个值。 .. method:: tf_classification.h() 返回tf_classification的边界框h坐标(int)。 在对象上使用 ``[3]`` 也可以得到这个值。 .. method:: tf_classification.classification_output() 返回分类标签得分的列表。这个列表的尺寸由你的模型的输出的通道尺寸决定。 例如, 一个理解1000个分类的mobilenet输出包含1000个分数的列表。 在python中使用 ``zip`` 可以组合分类的得分和分类的标签。 在对象上使用 ``[4]`` 也可以得到这个值。 class tf_model -- TensorFlow 模型 ================================== 如果您的模型大小足够小,并且您有足够的堆或帧缓冲区空间, 您可能希望直接将模型加载到内存中,以避免每次执行都从磁盘加载。 构造函数 ------------ .. class:: tf.tf_model() 请调用 `tf.load()` 来创建TensorFlow模型对象。 TensorFlow模型对象允许您从RAM执行一个模型,而不是从磁盘重复加载它。 方法 ------- .. method:: tf_model.len() 返回 `tf_model` 的大小,以字节为单位。 .. method:: tf_model.height() 返回模型的输入高度。您可以使用它来适当地调整输入图像的高度。 .. method:: tf_model.width() 返回模型的输入高度。您可以使用它来适当地调整输入图像的宽度。 .. method:: tf_model.channels() 返回模型中颜色通道的数量。 灰度是1,RGB是3。 .. method:: tf_model.classify(img, [roi, [min_scale=1.0, [scale_mul=0.5, [x_overlap=0, [y_overlap=0]]]]]) 在 ```img``` 上运行TensorFlow Lite图像分类模型,并返回一个 `tf_classification` 对象列表。 这个方法对图像使用可控滑动方式,执行多次模型(默认算法在整个图像帧上只执行网络一次)。 ``roi`` 是感兴趣区域矩形元组(x, y, w, h)。如果没有指定时,它等于图像的整个大小。 只有在 ``roi`` 内的像素才被操作。 ``min_scale`` 控制网络的缩放尺度。在默认值网络不缩放。 当值为0.5时,会允许检测大小为图像roi的50%的目标。 ``scale_mul`` 控制有多少种不同的缩放尺度可以检测出来。 滑动窗口方法的工作原理是将默认的尺度1乘以 ``scale_mul`` 同时结果大于 ``min_scale`` 。 ``scale_mul`` 的默认值是0.5,测试出每次变化可以减少50%的大小。但是,0.95只会减少5%的尺寸。 ``x_overlap`` 控制与下一个滑动窗口的区域检测器重叠的百分比。 值为0意味着没有重叠,0.95意味着95%的重叠。 ``y_overlap`` 控制与下一个滑动窗口的区域检测器重叠的百分比。 值为0意味着没有重叠,0.95意味着95%的重叠。 .. method:: tf_model.segment(img, [roi]) 在img上执行TensorFlow Lite图像分割模型, 返回一个灰度的 `image` 对象列表,对应每一个分割分类的输出通道。 为了节省内存,只通过这一个函数,模型被加载到内存中,执行并释放所有内存。 ``roi`` 是感兴趣区域矩形元组(x, y, w, h)。如果没有指定时,它等于图像的整个大小。 只有在 ``roi`` 内的像素才被操作。