tf — Tensor Flow

tf 模块能够在 OpenMV Cam 上执行量化的 TensorFlow Lite 模型(不支持 OpenMV Cam M4)。

您可以在 这里 了解如何创建自己的模型,以便在OpenMV Cam上运行。特别是:

  • 支持的操作在 这里 中列出。

    • 请注意,TensorFlow Lite 操作是有版本的。如果操作后面没有版本号,则支持的最小和最大版本号为 1。如果操作后面有数字,则这些数字表示支持的最小和最大操作版本。

    • 如果你使用 Keras 生成模型,请注意只使用 TensorFlow Lite for Microcontrollers 支持的运算符。否则,你的模型将无法在 OpenMV Cam 上运行。

  • 按照 这里 的说明将你的模型转换为 FlatBuffer 格式。

  • 最后,按照 这里 的说明对你的模型进行量化。

或者,只需按照 Google 的深入指南 这里 。如果你在使用 Google 的深入指南时遇到问题,请联系 Google 寻求帮助。

最终的输出 .tflite 模型可以直接加载并在你的OpenMV Cam上运行。但是,模型及其所需的临时 RAM 必须适合于你的 OpenMV Cam 上可用的帧缓冲堆栈 RAM。

  • OpenMV Cam M7 有大约 384KB 的帧缓冲 RAM。请尽量保持你的模型及其所需的临时缓冲区在320KB以下。

  • OpenMV Cam H7 有大约 496KB 的帧缓冲 RAM。请尽量保持你的模型及其所需的临时缓冲区在400KB以下。

  • OpenMV Cam H7 Plus有大约 31MB 的帧缓冲 RAM。但是,运行大小接近该大小的模型将非常缓慢。

或者,你也可以将模型加载到 MicroPython 堆或 OpenMV Cam 帧缓冲区中。但是,这会大大限制所有 OpenMV Cam 上的模型大小。

函数

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 模型的路径。模型被加载到内存中,执行,并在一个函数调用中释放,以节省加载模型到 MicroPython 堆的开销。传递 "person_detection" 以从你的 OpenMV Cam 内部闪存加载内置的人员检测模型。

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.95 表示 95% 的重叠。

y_overlap 控制与下一个检测器区域的重叠百分比。值为零表示没有重叠。值为 0.95 表示 95% 的重叠。

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

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

path 是要在你的 OpenMV Cam 磁盘上执行的 .tflite 模型的路径。模型被加载到内存中,执行,并在一个函数调用中释放,以节省加载模型到 MicroPython 堆的开销。

roi 是感兴趣区域的矩形元组(x, y, w, h)。如果未指定,则等于图像矩形。仅操作 roi 内的像素。

tf.detect(path, img[, roi[, thresholds[, invert]]])

img 对象上执行 TensorFlow Lite 图像分割模型,并返回每个分割类输出的 image.blob 对象列表。例如,如果你有一个被分割成两个类的图像,则此方法将返回一个与请求的阈值匹配的两个 blob 列表的列表。

path 是要在你的 OpenMV Cam 磁盘上执行的 .tflite 模型的路径。模型被加载到内存中,执行,并在一个函数调用中释放,以节省加载模型到 MicroPython 堆的开销。

roi 是感兴趣区域的矩形元组(x, y, w, h)。如果未指定,则等于图像矩形。仅操作 roi 内的像素。

thresholds 必须是一个元组列表 [(lo, hi), (lo, hi), ..., (lo, hi)],定义你想要跟踪的颜色范围。你可以在一次调用中传递多达 32 个阈值元组。每个元组都需要包含两个值 - 最小灰度值和最大灰度值。只有落在这些阈值之间的像素区域才会被考虑。为了方便使用,此函数将自动修复交换的最小和最大值。如果元组太短,其余的阈值将被假定为最大范围。如果没有指定阈值,则假定为 (128, 255),这将检测分段图像中的“活动”像素区域。

invert 反转阈值操作,使得匹配像素不是在某些已知颜色范围内,而是在已知颜色范围之外。

tf.regression(path, array)

在传递的浮点数组上执行 TensorFlow Lite 回归模型,并返回一个新的浮点数组作为结果。此方法接受 1D/2D/3D 数组,其形状必须与网络的输入形状匹配。数组应按 [height][width][channel] 的顺序组织。

path 是要在你的 OpenMV Cam 磁盘上执行的 .tflite 模型的路径。模型被加载到内存中,执行,并在一个函数调用中释放,以节省加载模型到 MicroPython 堆的开销。

tf.load(path[, load_to_fb=False])

path 是要加载到 MicroPython 堆的内存中的 .tflite 模型的路径。

注意!OpenMV Cam M7 上的 MicroPython 堆仅为 ~50 KB,OpenMV Cam H7 上为 ~256 KB。

传递 "person_detection" 以从你的 OpenMV Cam 内部闪存加载内置的人员检测模型。此内置模型不使用任何 Micropython 堆,因为所有权重都存储在可以像 RAM 一样访问的闪存中。

load_to_fb 如果传递为 True,则会将一部分 OpenMV Cam 帧缓冲堆栈保留用于存储 TensorFlow Lite 模型。对于无法适应堆的大型模型,通过一次从磁盘加载到帧缓冲器内存,然后重复执行模型来获得最有效的执行性能。但是,使用的帧缓冲器空间将不再可用于其他算法。

返回一个 tf_model 对象,它可以在图像上操作。

tf.free_from_fb()

释放之前使用 load_to_fb 设置为 True 创建的已分配的 tf_model 对象。

注意,释放是按分配的相反顺序进行的。

class tf_classification – tf 分类检测结果

tf_classification 对象由 tf.classify()tf_model.classify() 返回。

构造函数

class tf.tf_classification

请调用 tf.classify()tf_model.classify() 来创建此对象。

方法

rect()

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

x()

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

您也可以对该对象执行 [0] 来获取此值。

y()

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

您也可以对该对象执行 [1] 来获取此值。

w()

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

您也可以对该对象执行 [2] 来获取此值。

h()

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

您也可以对该对象执行 [3] 来获取此值。

classification_output()

返回分类标签分数的列表。此列表的大小由你的模型输出通道大小确定。例如,mobilenet 为所有 mobilenet 所理解的 1000 个类别输出一个包含 1000 个分类分数的列表。在 Python 中使用 zip 将分类分数结果与分类标签组合起来。

您也可以对该对象执行 [4] 来获取此值。

class tf_model – TensorFlow 模型

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

构造函数

class tf.tf_model

请调用 tf.load() 来创建 TensorFlow 模型对象。TensorFlow 模型对象允许你从 RAM 中执行模型,而不是每次都从磁盘加载它。

方法

len()

返回模型的大小(以字节为单位)。

ram()

返回模型的所需空闲 RAM(以字节为单位)。

input_height()

返回模型的输入高度。你可以使用此值来适当调整输入图像的高度。

input_width()

返回模型的输入宽度。你可以使用此值来适当调整输入图像的宽度。

input_channels()

返回模型中的输入颜色通道数。

input_datatype()

返回模型的输入数据类型(这是一个字符串,”uint8”、”int8” 或 “float”)。

input_scale()

返回模型的输入比例。

input_zero_point()

返回模型的输出零点。

output_height()

返回模型的输出高度。你可以使用此值来适当调整输出图像的高度。

output_width()

返回模型的输出宽度。你可以使用此值来适当调整输出图像的宽度。

output_channels()

返回模型中的输出颜色通道数。

output_datatype()

返回模型的输出数据类型(这是一个字符串,”uint8”、”int8” 或 “float”)。

output_scale()

返回模型的输出比例。

output_zero_point()

返回模型的输出零点。

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.95 表示 95% 的重叠。

y_overlap 控制与下一个检测器区域的重叠百分比。值为零表示没有重叠。值为 0.95 表示 95% 的重叠。

segment(img[, roi])

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

roi 是感兴趣区域的矩形元组(x, y, w, h)。如果未指定,则等于图像矩形。仅操作 roi 内的像素。

detect(img[, roi[, thresholds[, invert]]])

img 对象上执行 TensorFlow Lite 图像分割模型,并返回每个分割类输出的 image.blob 对象列表。例如,如果你有一个被分割成两个类的图像,则此方法将返回一个与请求的阈值匹配的两个 blob 列表的列表。

roi 是感兴趣区域的矩形元组(x, y, w, h)。如果未指定,则等于图像矩形。仅操作 roi 内的像素。

thresholds 必须是一个元组列表 [(lo, hi), (lo, hi), ..., (lo, hi)],定义你想要跟踪的颜色范围。你可以在一次调用中传递多达 32 个阈值元组。每个元组都需要包含两个值 - 最小灰度值和最大灰度值。只有落在这些阈值之间的像素区域才会被考虑。为了方便使用,此函数将自动修复交换的最小和最大值。如果元组太短,其余的阈值将被假定为最大范围。如果没有指定阈值,则假定为 (128, 255),这将检测分段图像中的“活动”像素区域。

invert 反转阈值操作,使得匹配像素不是在某些已知颜色范围内,而是在已知颜色范围之外。

regression(array)

在传递的浮点数组上执行 TensorFlow Lite 回归模型,并返回一个新的浮点数组作为结果。此方法接受 1D/2D/3D 数组,其形状必须与网络的输入形状匹配。数组应按 [height][width][channel] 的顺序组织。