ai — AI人工智能

ai 模块能够执行量化的yolov5模型或其他AI模型 在znzpi AI相机上(可用运行软件推理,但强烈建议使用硬件推理RKNN)。

您可以阅读更多关于如何创建可以运行在znzpi AI相机上的自己的模型,here . 特别的:

  • 支持的指令列出 here .

    • 注意yolov5操作是有版本要求的。 如果指令后面没有列出版本号,那么最小和最大版本支持是1. 如果指令后面有数字,这些数字表示指令支持的最小和最大版本。

    • 如果你使用自己的训练环境来生成你的模型,请小心只使用硬件不支持的的指令。否则, 您的模型将无法放在您的znzpiAI相机上运行。我们提供了一个yolov5训练和验证环境的docker,按照AI训练文档可以生成一个用于目标检测,并可以在板上运行的模型

  • 按照说明将您的模型转换为硬件需要的rknn模型 here

  • 最后,按照说明对模型进行量化 here

或者,只要遵循谷歌的深度的指南 here. 如果您对谷歌的深度的指南有任何问题,请联系谷歌寻求帮助。

最终的输出``.rknn`` 模型可以让znzpi AI相机直接加载和运行。 也就是说,模型和模型的要求的初始RAM必须 符合在您的znzpi AI相机上可用的帧缓冲堆栈RAM。

  • znzpi AI相机拥有约32MB帧缓冲内存。 请保证你的模型和它需要的初始RAM小于16MB。

  • znzpi AI相机拥有约32MB帧缓冲内存。 请保证你的模型和它需要的初始RAM小于16MB。

  • znzpi AI相机拥有约32MB帧缓冲内存。 请保证你的模型和它需要的初始RAM小于16MB。

另外,还可以将模型加载到MicroPython堆或znzpi AI相机框架缓冲区中。 然而,这在很大程度上限制了所有znzpi AI相机sensor的模型大小。

函数

ai.classify(img[, roi[, min_scale=1.0[, scale_mul=0.5[, x_overlap=0[, y_overlap=0]]]]])

img 上运行AI图像分类模型,并返回一个 ai_classification 对象列表。 这个方法对图像使用可控滑动方式,执行多次模型(默认算法在整个图像帧上只执行网络一次)。

znzpi AI相机的磁盘上的 .rknn 模型的路径需要通过 load 加载。 为了节省内存,只通过这一个函数,模型被加载到内存中,执行并释放所有内存。 传递 "person_detection" 可以从你的znzpi AI相机的内部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%的重叠。

ai.segment(img[, roi])

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

模型必须使用 load.rknn 模型加载,默认加载到MicroPython堆的内存中。

roi 代表感兴趣区域的元组(x,y,w,h).如果没有指定,它等于整个图像。只有 roi 中像素才会参与运算

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

img 对象执行 yolov5 的图像分割模型。.rknn 必须通过 load 提前加载, 并返回一个对应每个分割的 image.blob 对象列表。例如,如果你有一个需要分割为两个分割类的对象。这个方法将返回一个含有两个与之阈值匹配的对象列表。

模型必须使用 load.rknn 模型加载,默认加载到MicroPython堆的内存中。

roi 代表感兴趣区域的元组(x,y,w,h).如果没有指定,它等于整个图像。只有 roi 中像素才会参与运算

thresholds 必须是一个 [(lo, hi), (lo, hi), ..., (lo, hi)] 的列表,来定义需要追踪的颜色范围。你可一次传一个32 个阈值元组。 每个元组需要包含2个值一个最小一个最大灰度值。只有落在其阈值范围的像素才会被处理。为了易用,这个函数将自动交换最小和最大值。如果元组太短,则剩余的阈值将假定为可用的最小最大值。如果没有阈值指定,则假定为(128,255) 来作为检测 活跃像素分割范围

invert 反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。

ai.regression(array)

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

模型必须使用 load.rknn 模型加载,默认加载到MicroPython堆的内存中。

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

path 要加载的 .rknn 模型的路径,默认加载到MicroPython堆的内存中。如果path是一个文件路径,代表其是用户自定义的模型。如果使用下面的模型标识,如 FACE_DETECTION 则表示使用内置的模型。

注意!MicroPython堆在znzpi AI相机上的尺寸。

传递下面的标识可以从你的znzpi AI相机的内部FLASH加载内置的人检测模型。 这个内置的模型不使用任何Micropython堆内存。因为所有的权重保存在flash,可以和RAM一样访问。

FACE_DETECTION = 1, 人脸检测

FACE_LANDMARK_68 = 2, 暂不支持

FACE_RECOGNIZE = 3, 暂不支持

FACE_ANALYZE = 4, 暂不支持

OBJECT_DETECTION = 5, 目标检测

POSE_BODY = 6, 暂不支持

POSE_FINGER_21 = 7, 暂不支持

FACE_LANDMARK_5 = 8, 暂不支持

HEAD_DETECTION = 9, 暂不支持

CARPLATE_DETECTION = 10,暂不支持

CARPLATE_ALIGN = 11, 暂不支持

CARPLATE_RECOG = 12, 暂不支持

OBJECT_TRACK = 13, 暂不支持

POSE_FINGER_3 = 14, 暂不支持

FACE_LIVENESS = 15, 暂不支持

FACE_COMPARE 暂不支持

load_to_fb 如果传递为True,将会使用预留部分的znzpi AI相机帧缓冲区,来存储yolov5模型。 对于不能存储在Micropython堆栈大模型会得到最有效率执行性能,因为不用每次运行都从磁盘导入。 也就是说,帧缓冲所用到的空间将不能再用于其他算法。

返回一个可以操作图像的 ai_model 对象。

ai.free_from_fb()

释放先前分配的 ai_model 对象,该对象创建时将 load_to_fb 设置为真。

注意,释放的顺序与分配的顺序相反。

ai_classification类 – ai分类 检测结果

ai_classification对象由 ai.classify()ai_model.classify() 返回。

构造函数

class ai.ai_classification

请调用 ai.classify()ai_model.classify() 来创建这个对象。

方法

rect()

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

x()

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

您也可以通过索引 [0] 取得这个值。

y()

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

您也可以通过索引 [1] 取得这个值。

w()

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

您也可以通过索引 [2] 取得这个值。

h()

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

您也可以通过索引 [3] 取得这个值。

classification_output()

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

您也可以通过索引``[4]`` 取得这个值。

ai_model类 – Yolov5 模型

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

构造函数

class ai.ai_model

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

方法

len()

反面模型的字节尺寸。

ram()

返回模型需要的RMA的字节数。

input_height()

返回模型的输入高度。你可用其作为输入图像的高度。

input_width()

反面模型的输入宽度,你可用其作为输入图像的宽度

input_channels()

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

input_datatype()

返回模型的输入书类型(一个 “uint8” “”int8”, or “float”字符串)

input_scale()

返回模型的输入的缩放

input_zero_point()

返回模型的输出零点。

output_height()

返回模型的输出高度,你可用其作为输出图像的高度。

output_width()

返回模型的输出宽度,你可用其作为输出图像的宽度

output_channels()

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

output_datatype()

返回模型的输出数据类型(一个 “uint8” “”int8”, or “float”字符串)

output_scale()

返回模型的输出缩放

output_zero_point()

返回模型的输出零点。

classify(img[, roi[, min_scale=1.0[, scale_mul=0.5[, x_overlap=0[, y_overlap=0]]]]])

img 上运行AI图像分类模型,并返回一个 ai_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%的重叠。

segment(img[, roi])

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

roi 代表感兴趣区域的元组(x,y,w,h).如果没有指定,它等于整个图像。只有 roi 中像素才会参与运算

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

img 对象执行 yolov5 的图像分割模型。并返回一个对应每个分割的 image.blob 对象列表。例如,如果你有一个需要分割为两个分割类的对象。这个方法将返回一个含有两个与之阈值匹配的对象列表。

roi 代表感兴趣区域的元组(x,y,w,h).如果没有指定,它等于整个图像。只有 roi 中像素才会参与运算

thresholds 必须是一个 [(lo, hi), (lo, hi), ..., (lo, hi)] 的列表,来定义需要追踪的颜色范围。你可一次传一个32 个阈值元组。 每个元组需要包含2个值一个最小一个最大灰度值。只有落在其阈值范围的像素才会被处理。为了易用,这个函数将自动交换最小和最大值。如果元组太短,则剩余的阈值将假定为可用的最小最大值。如果没有阈值指定,则假定为(128,255) 来作为检测 活跃像素分割范围

invert 反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。

regression(array)

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