OpenMV:19OpenMV4 Plus训练神经网络进行口罩识别


注意: 只有 OpenMV4 Plus可以自己训练神经网络,其他版本的性能不够

本节讲解如何使用edgeimpulse.com网站来自行训练神经网络模型,进而实现机器学习的功能

edgeimpulse.com是一个在线网站,是一个为嵌入式产品非常快速地生成嵌入式上面使用的神经网络的模型,非常地易用且快速,大概只需要5min左右就可以训练出一个OpenMV4 Plus上使用的模型

机器学习有什么用? 利用机器学习我们可以知道OpenMV里面的图像是什么,比如图像里有没有人(进行人检测),或者是知道我们图像里的人是否有戴口罩(进行口罩识别),也可以利用机器学习来分辨一些其他物品和图片(是水杯还是矿泉水拼,电池还是烟头…),可以分辨一切你想要的东西,但是前提是训练好一个合适的模型

看完了上述部分,那么我们到底该如何使用OpenMV来训练神经网络模型

  1. 采集: 我们需要利用OpenMV的IDE来采集我们的数据集,根据经验,每一个分类至少需要100张左右的数据集进行训练
  2. 上传: 将我们在OpenMV的IDE中采集到的图像上传到edgeimpulse的在线网站上
  3. 训练:edgeimpulse的网站上进行在线训练模型
  4. 下载: 将我们训练好的模型和生产的代码下载到OpenMV中,直接运行即可

以 “口罩识别” 为例

1.采集

打开OpenMV的IDE——>菜单栏——>工具——>数据集编辑器——>新数据集

新建一个文件夹命名,再打开即可

数据集编辑器新建文件夹,我们新建两个文件夹并且分类

2.连接

  1. 连接OpenMV
  2. 点击IDE中的连接
  3. 然后运行
  4. 点击OpenMV的左侧菜单栏中的”数据采集“按钮(按钮图标是个照片),点一下就会保存一张图片,会按顺序依次命名
  5. 我们可以保存多个角度,戴眼镜或不戴眼镜等多种照片
  6. 可以男女都采集一次,让男女都可以识别到,保证训练集的多样化
  7. 如果发现采集过程中人脸跑出了图像外,可以对该张图像右键——>删除
  8. **采集图像时人物的背景最好是纯色的!**这样训练出的模型特征会比较明显,准确率会高一点

3.训练

将我们的数据集上传到edgeimpulse的网站上进行在线训练

复制API KEY

上传照片

注意!!!

我们用星瞳科技的方法上传API可能输出现创建SSL上下文错误的问题,因此我们直接自行上传文件夹即可
OpenMV:19OpenMV4 Plus训练神经网络进行口罩识别
有几个标签文件夹就分几次上传,记得要自己输入标签!

模型创建

生成神经网络

训练神经网络

右边会显示工作的进度

测试神经网络

我们先进行Model testing,下方的文件都是我们的测试集(最开始被分出来的20%),我们利用我们刚刚训练出的模型来对测试集进行测试
OpenMV:19OpenMV4 Plus训练神经网络进行口罩识别

此处我们发现有一张图片是不确定的,我们可以找到这张图片:右键——>show classification查看训练结果
OpenMV:19OpenMV4 Plus训练神经网络进行口罩识别

我们发现跳回了刚刚说的Live classification实时分类!其实就是这个意思啦,这张有0.74认为是戴口罩,有0.26认为是不戴口罩(因为头发都遮住了大半张脸)
OpenMV:19OpenMV4 Plus训练神经网络进行口罩识别

备份保存

通过Versioning设置版本
可以在这里进行版本的保存,可以在以后的工作直接回来使用这个
不保存的话,下次训练出来的模型就会覆盖当前模型!

OpenMV:19OpenMV4 Plus训练神经网络进行口罩识别

4.下载

利用Deployment对训练好的模型进行导出
选择OpenMV——>Bulid,生成后会自动地下载下来
OpenMV:19OpenMV4 Plus训练神经网络进行口罩识别

下载后我们发现它生成了三个文件

将三个文件拷贝到OpenMV内置的flash中
.py文件在IDE中打开

代码分析

# Edge Impulse - OpenMV Image Classification Example

import sensor, image, time, os, tf # os是与文件相关的类     tf是用到神经网络的类 

# 设置感光元件
sensor.reset()                         # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565)    # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA)      # Set frame size to QVGA (320x240)
sensor.set_windowing((240, 240))       # Set 240x240 window.
sensor.skip_frames(time=2000)          # Let the camera adjust.

# 设置神经网络的模型——>这就是我们刚刚训练出的模型文件,已经保存到u盘中了
net = "trained.tflite"

# labels获取神经网络的标签 
labels = [line.rstrip('\n') for line in open("labels.txt")] 
    # line.rstrip('\n')表示如果遇到换行符"\n",就把换行符从labels中删掉
    # 因为我们保存的labels文件中有换行符,因此得删掉

clock = time.clock()
while(True):
    clock.tick()

    img = sensor.snapshot()

    # 在采集到的照片中进行tf.classify()的分类
    for obj in tf.classify(net, img, min_scale=1.0, scale_mul=0.8, x_overlap=0.5, y_overlap=0.5):
            # tf.classify()会返回OpenMV视野中识别到的物体的列表
            # 返回obj.rect()是物体对应的框框  obj.output()是这个物体对应的每个标签的得分
            
        print("**********\nPredictions at [x=%d,y=%d,w=%d,h=%d]" % obj.rect())
        
        img.draw_rectangle(obj.rect())
        
        #我们可以打印每个标签的得分
        print(obj.output())
        
        # 将得分和标签一一对应,返回一个列表
        predictions_list = list(zip(labels, obj.output()))
                # zip()表示把标签labels和得分obj.output()一一对应
                    # 会打印出如[('face',0.9411765),('mask',0.0627451)]
        
        # 将得分输出
        for i in range(len(predictions_list)):
            print("%s = %f" % (predictions_list[i][0], predictions_list[i][1]))
            
            if predictions_list[0][1]>0.8:
                img.draw_string(0,0, 'face')
            else:
                img.draw_string(0,0, 'mask')
                              
    print(clock.fps(), "fps")

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年3月28日
下一篇 2023年3月28日

相关推荐