MaixCAM MaixPy 使用 AI 模型进行物体分类

物体分类概念

比如眼前有两张图片,一张图里面是苹果,另一张是飞机,物体分类的任务就是把两张图分别依次输入给 AI 模型,模型会依次输出两个结果,一个是苹果,一个是飞机。

MaixPy 中使用物体分类

MaixPy 默认提供了 imagenet 数据集训练得到的 1000分类模型,可以直接使用:

from maix import camera, display, image, nn

classifier = nn.Classifier(model="/root/models/mobilenetv2.mud", dual_buff = True)
cam = camera.Camera(classifier.input_width(), classifier.input_height(), classifier.input_format())
disp = display.Display()

while 1:
    img = cam.read()
    res = classifier.classify(img)
    max_idx, max_prob = res[0]
    msg = f"{max_prob:5.2f}: {classifier.labels[max_idx]}"
    img.draw_string(10, 10, msg, image.COLOR_RED)
    disp.show(img)

效果视频:

这里使用了摄像头拍摄图像,然后传给 classifier进行识别,得出结果后,将结果显示在屏幕上。

更多 API 使用参考 maix.nn 模块的文档。

dual_buff 双缓冲区加速

你可能注意到这里模型初始化使用了dual_buff(默认值就是 True),使能 dual_buff 参数可以加快运行效率,提高帧率,具体原理和使用注意点见 dual_buff 介绍

使用 MaixHub 训练自己的分类模型

如果你想训练特定图像的分类模型,请到MaixHub 学习并训练分类模型,创建项目时选择分类模型,然后上传图片训练即可,无需搭建训练环境也无需花钱购买昂贵的GPU,快速一键训练。

离线训练自己的分类模型

离线训练需要自己搭建环境,请自行搜索 PyTorch 分类模型训练 Mobilenet等相关关键字进行参考。
训练好模型后导出 onnx 格式的模型,然后参考 MaixCAM 模型转换文档 转换为 MaixCAM 支持的模型格式,最后使用上面的nn.Classifier类加载模型即可。

这里分类模型可以是 mobilenet 也可以是 其它模型比如 Resnet 等,模型转换时最好提取 softmax前一层作为最后的输出层,因为classifier.classify(img, softmax=True) 识别函数的softmax参数默认为True,即会对结果计算一次softmax,所以模型就不用softmax这一层了,当然如果模型包含了softmax层,也可以指定不再执行一遍softmaxclassifier.classify(img, softmax=False)