tf
— Tensor Flow¶
tf
模块能够在 OpenMV Cam 上执行量化的 TensorFlow Lite 模型(不支持 OpenMV Cam M4)。
您可以在 这里 了解如何创建自己的模型,以便在OpenMV Cam上运行。特别是:
或者,只需按照 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
对象,它可以在图像上操作。
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] 的顺序组织。