OpenMV(一)–基础介绍与硬件架构
OpenMV(二)–IDE安装与固件下载
OpenMV(三)–实时获取摄像头图片
OpenMV(四)–STM32实现特征检测
OpenMV(五)–STM32实现人脸识别
本专栏基于以STM32H743为MCU的OpenMV-H7基板,结合OV7725卷帘快门摄像头进行相关机器视觉应用的开发。本篇博文主要介绍了怎么根据官方训练好的神经网络实现物体识别与手写数字识别的功能。
OpenMV内置了很多已经训练好的CNN神经网络,本小节根据官方基于CIFAR10数据集训练的CNN网络,进行十种物体的分类。CIFAR10是一个拥有十种物体的数据集,这十类分别是“飞机”, “汽车”, “鸟”, “猫”, “鹿”, “狗”, “青蛙”, “马”, “船”, “卡车”。
相关的构造函数非常简单,就是加载模型与返回预测结果:
net = nn.load(path)
从指定路径中加载.network的神经网络模型文件
net.forward(image, roi, softmax=False, dry_run=False)
在图像上运行神经网络并返回结果的浮点值表,每个值得范围是0~1,数值越大匹配度越高。
"""
物体识别例程
分类模型:训练好的CNN
数据集:CIFAR10
"""
# 导入相应的库
import sensor, image, time, os, nn
# 初始化摄像头
sensor.reset()
# 设置相机图像的对比度
sensor.set_contrast(3)
# 设置采集到照片的大小:320*240
sensor.set_framesize(sensor.QVGA)
# 设置采集到照片的格式:彩色图像
sensor.set_pixformat(sensor.RGB565)
# 设置128*128窗口
sensor.set_windowing((128, 128))
# 设置延时等待摄像头配置完成
sensor.skip_frames(time = 2000)
# 关闭自动摄像头增益
sensor.set_auto_gain(False)
sensor.set_auto_exposure(False)
# 加载训练好的网络
# 加载之前我们需要将官方的网络“cifar10.network”拷贝到OpenMV-H7的内存中
net = nn.load('/cifar10.network')
# 十种标签
labels = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
while(True):
# 拍摄图片并返回img
img = sensor.snapshot()
# 对于拍摄到的图片进行分类,返回浮点值列表,共有十个值,范围在0~1之间
out = net.forward(img)
# 挑选列表中的最大值
max_id = out.index(max(out))
# 将0-1之间的值扩大到百分制
score = int(out[max_id]*100)
# 60分以上算识别成功
if(score < 60):
score_str = "Nothing"
else:
score_str = "%s:%d%% "%(labels[max_idx], score)
# 显示分类结果
img.draw_string(0, 0, score_str, color = (255, 0, 0))
我们来看一下分类结果:
我在网页上找的一张青蛙的图片,可以看到预测为青蛙的概率为69%
OpenMV官方提供的一个手写数字识别例程是基于MINST手写数字数据集训练的,神经网络模型为Lenet模型,具体的实现可以参考我之前些的博客:动手学深度学习(PyTorch实现)(七)–LeNet模型。
构造函数与上一节物体识别的一样,也是加载模型与返回预测结果:
net = nn.load(path)
从指定路径中加载.network的神经网络模型文件
net.forward(image, roi, softmax=False, dry_run=False)
在图像上运行神经网络并返回结果的浮点值表,每个值得范围是0~1,数值越大匹配度越高。
"""
手写数字识别例程
分类模型:训练好的Lenet
数据集:MNIST
"""
# 导入相应的库
import sensor, image, time, os, nn
# 初始化摄像头
sensor.reset()
# 设置相机图像的对比度
sensor.set_contrast(3)
# 设置采集到照片的大小:320*240
sensor.set_framesize(sensor.QVGA)
# 设置采集到照片的格式:灰色图像
sensor.set_pixformat(sensor.GRAYSCALE)
# 设置128*128窗口
sensor.set_windowing((128, 128))
# 设置延时等待摄像头配置完成
sensor.skip_frames(time = 2000)
# 关闭自动摄像头增益
sensor.set_auto_gain(False)
sensor.set_auto_exposure(False)
# 加载Lenet网络模型
# 加载之前我们需要将官方的网络“lenet.network”拷贝到OpenMV-H7的内存中
net = nn.load('/lenet.network')
# 十个标签
labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
while(True):
# 拍摄图片并返回img
img = sensor.snapshot()
# copy()表示创建一个图像副本储存在MicroPython堆中而不是帧缓冲区
# 二值化是为了方便处理,阈值可以自己设定
out = net.forward(img.copy().binary([(150, 255)], invert=True))
# 挑选列表中的最大值
max_id = out.index(max(out))
# 将0-1之间的值扩大到百分制
score = int(out[max_id]*100)
# 70分以上算识别成功
if(score < 70):
score_str = "Nothing"
else:
score_str = "%s:%d%% "%(labels[max_idx], score)
# 显示分类结果
img.draw_string(0, 0, score_str, color = (255, 0, 0))