tf — 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摄像机的模型大小。

函数

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_scalescale_mul 的默认值是0.5,测试出每次变化可以减少50%的大小。但是,0.95只会减少5%的尺寸。

x_overlap 控制与下一个滑动窗口的区域检测器重叠的百分比。 值为0意味着没有重叠,0.95意味着95%的重叠。

y_overlap 控制与下一个滑动窗口的区域检测器重叠的百分比。 值为0意味着没有重叠,0.95意味着95%的重叠。

tf.segment(path, img[, roi])

在img上执行TensorFlow Lite图像分割模型, 返回一个灰度的 image 对象列表,对应每一个分割分类的输出通道。

为了节省内存,只通过这一个函数,模型被加载到内存中,执行并释放所有内存。

roi 是感兴趣区域矩形元组(x, y, w, h)。如果没有指定时,它等于图像的整个大小。 只有在 roi 内的像素才被操作。

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 对象。

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() 来创建这个对象。

方法

tf_classification.rect()

返回tf_classification的边界框的矩形元组(x, y, w, h), 用于 image 方法,比如 image.draw_rectangle()

tf_classification.x()

返回tf_classification的边界框x坐标(int)。

在对象上使用 [0] 也可以得到这个值。

tf_classification.y()

返回tf_classification的边界框y坐标(int)。

在对象上使用 [1] 也可以得到这个值。

tf_classification.w()

返回tf_classification的边界框w坐标(int)。

在对象上使用 [2] 也可以得到这个值。

tf_classification.h()

返回tf_classification的边界框h坐标(int)。

在对象上使用 [3] 也可以得到这个值。

tf_classification.classification_output()

返回分类标签得分的列表。这个列表的尺寸由你的模型的输出的通道尺寸决定。 例如, 一个理解1000个分类的mobilenet输出包含1000个分数的列表。 在python中使用 zip 可以组合分类的得分和分类的标签。

在对象上使用 [4] 也可以得到这个值。

class tf_model – TensorFlow 模型

如果您的模型大小足够小,并且您有足够的堆或帧缓冲区空间, 您可能希望直接将模型加载到内存中,以避免每次执行都从磁盘加载。

构造函数

class tf.tf_model

请调用 tf.load() 来创建TensorFlow模型对象。 TensorFlow模型对象允许您从RAM执行一个模型,而不是从磁盘重复加载它。

方法

tf_model.len()

返回 tf_model 的大小,以字节为单位。

tf_model.height()

返回模型的输入高度。您可以使用它来适当地调整输入图像的高度。

tf_model.width()

返回模型的输入高度。您可以使用它来适当地调整输入图像的宽度。

tf_model.channels()

返回模型中颜色通道的数量。 灰度是1,RGB是3。

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_scalescale_mul 的默认值是0.5,测试出每次变化可以减少50%的大小。但是,0.95只会减少5%的尺寸。

x_overlap 控制与下一个滑动窗口的区域检测器重叠的百分比。 值为0意味着没有重叠,0.95意味着95%的重叠。

y_overlap 控制与下一个滑动窗口的区域检测器重叠的百分比。 值为0意味着没有重叠,0.95意味着95%的重叠。

tf_model.segment(img[, roi])

在img上执行TensorFlow Lite图像分割模型, 返回一个灰度的 image 对象列表,对应每一个分割分类的输出通道。

为了节省内存,只通过这一个函数,模型被加载到内存中,执行并释放所有内存。

roi 是感兴趣区域矩形元组(x, y, w, h)。如果没有指定时,它等于图像的整个大小。 只有在 roi 内的像素才被操作。