太惊艳了,爆干几天几夜完成的实战模型:【猫狗大战】附资料
OpenMV 从入手到跑TensorFlow Lite神经网络进行垃圾分类
一、了解OpenMV 4 plus的构成
- 1.OpenMV 4 plus 的特点
- 1.1 硬件资源
- 1.2 引脚图
- 2.可用的学习资源
二、建议的学习路线
- 1.学习python基础语法
- 2.练习OpenMV的基础实验
- 2.1 安装软件
- 2.2 了解基础环境使用方法并连接设备
- 2.3 常用基础例程
- 2.3.1 查找例程方法
三、一点教程
- 1.常用的延时写法
- 2.如何 点亮or熄灭 一个LED灯
- 3.控制IO口输入输出
- 4.控制串口引脚输出信息
- 5.第一个图像例程HelloWord
- 6.单颜色识别例程
- 7.多颜色识别例程
- 8.【串口】多颜色识别-返回色块中心坐标
四、开启TensorFlow Lite神经网络之旅
- 1.TensorFlow Lite介绍
- 2.使用支持
- 3.使用OpenMV采集训练数据
- 4.上传Edge Impulse进行训练
- 4.1注册账号并创建Edge Impulse工程
- 4.2 上传训练集
- 4.3 生成特征
- 4.4 进行训练
- 5.在OpenMV上部署
五、错误情况问题 【更新时间2021-8-04】
- 1.“OSError” 错误
- 2.运行速度慢
- 3.“MemoryError” 内存不足
- 4.其他问题
- 5.解决问题一般思路
双十一福利:
领完再看!迪迦给大家准备的250G人工智能学习资料礼包(内含:两大Pytorch、TensorFlow实战框架视频、图像识别、OpenCV、计算机视觉、深度学习与神经网络等等等视频、代码、PPT以及深度学习书籍)
只需要你点个关注,然后扫码添加助手小姐姐VX即可无套路领取!
扫码添加即可
一、了解OpenMV 4 plus的构成
OpenMV 是一个开源项目,其使用stm32系列单片机作为主控单元,搭载摄像头,将python语言解析器移植到openMV的主控芯片运行,使其可以使用python语言做一些图像处理相关的工作。最常见的从 OpenMV 2 搭载的 stm32f4 到 OpenMV 3 的 stm32f7,再到 OpenMV 4 的 stm32H7 ,主频从180MHz一路升级到480MHz,内存也从256KB升级到1MB。而本次介绍的 OpenMV 4 plus版本在OpenMV 4的基础上外挂了32 MB 的 SRAM 和 32 MB 的 Flash,将可用性再次提升一个大的台阶。
1.OpenMV 4 plus 的特点
1.1 硬件资源
1.2 引脚图
2.可用的学习资源
二、建议的学习路线
1.学习python基础语法
2.练习OpenMV的基础实验
2.1 安装软件
2.2 了解基础环境使用方法并连接设备
之后打开刚安装好的OpenMV IDE,将OpenMV生成的U盘内的main.py文件拖至OpenMV IDE编辑器处打开该文件。
打开文件后,首先点击编辑器下方的连接图标,之后再点击编辑器下方运行按钮,OpenMV就会在OpenMV IDE的控制下执行编辑器打开的main.py文件,并在右侧显示摄像头传输的图像流。
点击下方的串行终端部分可看到OpenMV打印的提示信息,在默认例程中输出为图像流的帧率。
2.3 常用基础例程
2.3.1 查找例程方法
①在OpenMV IDE的 【文件->示例->openMV】中可找到带有的所有官方例程。
②在星瞳给出的教程文档中,有对官方例程的翻译和解释。【点此前往】
③当然是根据自己的需求去万能的百度了。。。
三、一点教程
在学习图像处理操作前,先学习一点基础操作知识。
1.常用的延时写法
延时函数依赖于time模块,所以在使用前应引入time模块。
import time # 导入库文件time.sleep(1) # 延时1s
time.sleep(0.5) # 延时0.5s [参数以秒为单位,可传入小数或整数]
time.sleep_ms(500) # 延时500ms
time.sleep_us(10) # 延时10us
2.如何 点亮or熄灭 一个LED灯
首先OpenMV 4 plus上搭载了一个全彩RGB灯和两个红外LED,一个RGB LED内部包含3个LED,但是两个红外LED是受一个端口控制的,那么OpenMV 4 plus上就总共有4个控制LED的端口,如下表所示。
在上表中可以看到在写法中都为“y = pyb.LED(x)”,可知LED的控制所依赖pyb模块,所以在程序的开始应先将pyb模块引入。控制LED灯点亮的方法为led_R.on(),熄灭的方法为led_R.off(),相应的使用示例如下。
import pyb,time # 导入库文件led_R = pyb.LED(1) # 定义红色LED控制
led_G = pyb.LED(2) # 定义绿色LED控制
led_B = pyb.LED(3) # 定义蓝色LED控制
led_IR = pyb.LED(4) # 定义红外LED控制while(True): # 死循环led_R.on() # 红色LED点亮led_G.on() # 绿色LED点亮led_B.on() # 蓝色LED点亮led_IR.on() # 红外LED点亮time.sleep_ms(500) # 延时0.5Sled_R.off() # 红色LED熄灭led_G.off() # 绿色LED熄灭led_B.off() # 蓝色LED熄灭led_IR.off() # 红外LED熄灭time.sleep_ms(500) # 延时0.5S
3.控制IO口输入输出
在上一个控制LED示例中并未通过直接控制IO口的方式去控制LED的状态,而是调用了pyb库中已经写好的接口实现控制目的,此讲来说一下如何直接控制一个IO口。首先IO的控制依赖Pin模块,而Pin模块又包含在pyb模块中,所以在程序开始要提前添加Pin模块【from pyb import Pin】。
学习过stm32单片机的同学都知道,在初始化一个IO口时,需要配置IO口的引脚编号、输入输出模式以及上下拉模式等,在使用STM32为主控单元的OpenMV中也是如此。如下表所示。
实际使用的例程如下:
from pyb import Pin # 引入Pin库p0_out = Pin('P0', Pin.OUT_PP) # 设置P0端口为推挽输出模式
p0_out.high() # 设置P0端口输出高电平
p0_out.low() # 设置P0端口输出低电平p1_in = Pin('P1', Pin.IN, Pin.PULL_UP) # 设置P1端口为上拉输入模式
p1_value = p1_in.value() # 获取P1端口的值,0或1,高电平为1,低电平为0
4.控制串口引脚输出信息
在OpenMV 4 Plus中,有两个串口可以使用,分别为串口1和串口三,引脚对应关系如下表所示。
常用的串口相关函数如下表。
对串口功能的使用也是依赖与pyb模块,在程序开始要提前添加pyb模块,使用示例如下。
from pyb import UART # 导入串口支持库文件uart = UART(3, 115200) # 创建串口3设备,并设置波特率为115200num = 132 # 随便定义一个数值变量
num_str = "[%d]" % num # 将数据转化为字符串用于输出
uart.write(fps_str+"\r\n") # 串口3输出【通过 P4端口】while(True):if uart.any()>0: # 如果串口接收到数据【通过 P5端口】str = uart.read() # 读取接收到的字符uart.write("redata:"+ str+ "\r\n") # 将收到的数据通过串口3输出【通过 P4端口】
5.第一个图像例程HelloWord
此例程为最基础的HelloWord级例程,内部包含了相关模块的依赖、摄像头的初始化、拍照并存放至缓存变量中以及打印图像的获取帧率。以后的所有有关图像处理的程序都将以此程序为基础进行编写。
import sensor, image, time # 引入此例程依赖的模块,sensor是与摄像头参数设置相关的模块,image是图像处理相关的模块,time时钟控制相关的模块。import相当于c语言的#include <>,模块相当于c语言的库。sensor.reset() # 复位并初始化摄像头,reset()是sensor模块里面的函数
sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式,有RGB565色彩图和GRAYSCALE灰度图两种
sensor.set_framesize(sensor.QVGA) # 将图像大小设置为QVGA (320x240)# 设置图像像素大小,QQVGA: 160x120,QQVGA2: 128x160,QVGA: 320x240,VGA: 640x480, QQCIF: 88x72,QCIF: 176x144,CIF: 352x288sensor.skip_frames(time = 2000) # 等待设置生效。
clock = time.clock() # 初始化时钟,并创建一个时钟对象来跟踪FPS帧率。while(True): # python while循环,一定不要忘记加冒号“:”clock.tick() # 更新FPS帧率时钟。img = sensor.snapshot() # 拍一张照片并返回图像。截取当前图像,存放于变量img中。注意python中的变量是动态类型,不需要声明定义,直接用即可。print(clock.fps()) # 打印当前的帧率。注意: 当连接电脑后,OpenMV会变成一半的速度。当不连接电脑,帧率会增加。
6.单颜色识别例程
在OpenMV IDE的菜单【文件->示例->OpenMV-ColotTracking】中依次找到例程,即为单颜色识别程序。
单颜色识别的程序如下所示,可知此程序就是在上一个HelloWord例程的基础上使用了find_blobs()方法对拍摄到的图片进行颜色的识别。
import sensor, image, timegreen_threshold = ( 0, 80, -70, -10, -0, 30) # 要识别的颜色LAB值sensor.reset() # 初始化sensor
sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式,有RGB565色彩图和GRAYSCALE灰度图两种
sensor.set_framesize(sensor.QVGA) # 使用QVGA的分辨率
sensor.skip_frames(10) # 等待设置生效。
sensor.set_auto_whitebal(False) # 关闭白平衡。白平衡是默认开启的,在颜色识别中,建议关闭白平衡。while(True):img = sensor.snapshot() # 拍一张照片并返回图像。blobs = img.find_blobs([green_threshold]) # 识别并返回结果【返回一个列表】if blobs: # 如果找到了目标颜色【即列表不为空】for b in blobs: # 遍历找到的目标颜色区域【因为可能存在不只一个颜色块】img.draw_rectangle(b[0:4]) # 用矩形标记出目标颜色区域img.draw_cross(b[5], b[6]) # 在目标颜色区域的中心画十字形标记print(b[5], b[6]) # 输出目标物体中心坐标【通过串行终端 USB设备】
其中find_blobs()方法的输入参数是一个LAB格式的颜色阈值,作为欲识别的颜色,返回值是一个包括识别到的每个色块对象的列表。返回值具体是个什么意思呢,首先是个列表,列表内的每个一条信息都是找到的一个色块的信息,此信息中又包含10个值,分别代表的意义如下表所示【假设列表中某条信息为b】。列表内信息值的使用除了可以用下标的方式取出,还可以通过[.变量名]的方式使用,如下表所示【假设列表中某条信息为b】:
那么具体的待识别LAB颜色阈值如何设置呢,可以使用OpenMV IDE中的“阈值编辑器”工具,对摄像头中拍摄的待识别图像进行LAB颜色阈值的调整。
选择帧缓冲区
比如说要识别图片中红色的颜色,那么拖动下面的LAB最大最小值,使右侧的串口中仅剩红色部分为白色,此时窗口下方的LAB阈值即为需要识别的颜色的LAB阈值。此处我调整的经验是,先将全部的最小值拖至最左侧,全部的最大值拖至最右侧,然后依次拖动LAB值,仅需一次完整过程即可将右侧图像仅剩待处理颜色块。【注意,白色部分是待识别的颜色】
将获得的LAB值复制,并粘贴值代码中的green_threshold=()括号内,即完成颜色的识别设置。此时运行程序,即可准确的将摄像头捕获的图像中的红色标注出来。
如果欲让OpenMV在不连接OpenMV IDE时也可以进行此程序功能,则可以在编辑器的菜单栏【工具->将打开的脚本文件保存到OpenMV Cam】中将程序代码保存到OpenMV中去。
7.多颜色识别例程
多颜色识别与单颜色识别基本上是一致的,都是使用了同一个方法find_blobs(),只不过将输入的阈值从一个增加至了多个,阈值的设置也与单颜色的设置相同,使用“阈值编辑器”依次将每种颜色的图像进行处理即可,调整后的识别效果如下。
多颜色识别代码,其中find_blobs()方法比单颜色识别程序中多了两个参数,pixels_threshold和area_threshold。其中pixels_threshold是设置边界框区域阈值,若一个色块的边界框区域小于 area_threshold ,则会被过滤掉。 pixel_threshold是设置像素数阈值,若一个色块的像素数小于 pixel_threshold ,则会被过滤掉。
import sensor, image, time, math# 多颜色识别最多可同时识别16种颜色
thresholds = [(0, 100, 13, 127, 34, 67), # 待识别颜色LAB阈值1(81, 100, -128, -13, 13, 53), # 待识别颜色LAB阈值2(38, 100, -87, 22, -98, -33)] # 待识别颜色LAB阈值3sensor.reset() # 初始化摄像头,reset()是sensor模块里面的函数
sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式,有RGB565色彩图和GRAYSCALE灰度图两种
sensor.set_framesize(sensor.QVGA) # 设置图像像素大小302*240
sensor.skip_frames(time = 2000) # 等待设置生效
sensor.set_auto_gain(False) # 颜色跟踪建议关闭自动增益
sensor.set_auto_whitebal(False) # 颜色跟踪建议关闭白平衡while(True):img = sensor.snapshot() # 拍照并获取图像for blob in img.find_blobs(thresholds, pixels_threshold=200, area_threshold=200): # 进行多颜色识别img.draw_rectangle(blob.rect()) # 框出识别到的色块img.draw_cross(blob.cx(), blob.cy()) # 标出色块中心点
8.【串口】多颜色识别-返回色块中心坐标
在上个示例中已实现颜色的识别和色块的框选,在教程的开始处还讲解了串口的使用方法,本示例将其组合至一起,实现将识别到每个颜色色块中心点的坐标通过串口发送出去。代码如下:
import sensor, image, time, math # 导入串口支持库文件
from pyb import UART # 导入串口支持库文件# 多颜色识别最多可同时识别16种颜色
thresholds = [(0, 100, 13, 127, 34, 67), # 待识别颜色LAB阈值1(81, 100, -128, -13, 13, 53), # 待识别颜色LAB阈值2(38, 100, -87, 22, -98, -33)] # 待识别颜色LAB阈值3sensor.reset() # 初始化摄像头,reset()是sensor模块里面的函数
sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式,有RGB565色彩图和GRAYSCALE灰度图两种
sensor.set_framesize(sensor.QVGA) # 设置图像像素大小302*240
sensor.skip_frames(time = 2000) # 等待设置生效
sensor.set_auto_gain(False) # 颜色跟踪建议关闭自动增益
sensor.set_auto_whitebal(False) # 颜色跟踪建议关闭白平衡uart = UART(3, 115200) # 创建串口3设备,并设置波特率为115200while(True):uart.write("-------------------------\r\n") # 串口3输出【通过 P4端口】img = sensor.snapshot() # 拍照并获取图像for blob in img.find_blobs(thresholds, pixels_threshold=200, area_threshold=200): # 进行多颜色识别img.draw_rectangle(blob.rect()) # 框出识别到的色块img.draw_cross(blob.cx(), blob.cy()) # 标出色块中心点Str_x = "[%3d]" % blob.cx() # 将中心点X坐标转为长度为3的字符串Str_y = "[%3d]" % blob.cy() # 将中心点y坐标转为长度为3的字符串if blob.code()==1: # 如果识别uart.write("red X:"+Str_x+" Y:"+Str_y+"\r\n") # 串口3输出【通过 P4端口】if blob.code()==2:uart.write("green X:"+Str_x+" Y:"+Str_y+"\r\n") # 串口3输出【通过 P4端口】if blob.code()==4:uart.write("blue X:"+Str_x+" Y:"+Str_y+"\r\n") # 串口3输出【通过 P4端口】uart.write("-------------------------\r\n\r\n") # 串口3输出【通过 P4端口】
在以上程序中,对于当前信息是什么颜色的,使用code()方法配合判断,code()方法返回的是用于识别的阈值列表中的颜色位置。即,本次识别使用的LAB颜色阈值在上面程序中thresholds列表中是第几个颜色。在上面程序中thresholds列表中有三个颜色,第一个是红色(0, 100, 13, 127, 34, 67),第二个是绿色(81, 100, -128, -13, 13, 53),第三个是蓝色(38, 100, -87, 22, -98, -33)。【(感谢网友的指导)所以,当code()方法返回1证明本次识别到的是红色,返回2证明本次识别到的是绿色,返回3证明本次识别到的是蓝色。但是在实际的使用中发现,识别蓝色的时候返回值为4,此处本人尚未查明原因,若有朋友知道诚邀指导。】
所以,当code()方法返回二进制00000001->十进制1,证明本次识别到的是红色;返回00000010->2,证明本次识别到的是绿色;返回00000100->4,证明本次识别到的是蓝色。
识别后在串口软件中打印的效果如下:
四、开启TensorFlow Lite神经网络之旅
本章对应星瞳视频教程:OpenMV 4 Plus 训练神经网络进行口罩识别
1.TensorFlow Lite介绍
以上谈到的预训练模型基于ImageNet数据集训练,支持1000种类别。如果此数据集不能满足你的项目需要,你需要准备自己的数据集和标签,使用迁移学习重新训练模型。
3.使用OpenMV采集训练数据
在进行神经网络模型训练前需要先将训练用的数据准备好,本次训练目的为垃圾分类,那么训练用的数据为图片。打开OpenMV IDE,在菜单处选择【工具->数据集编辑器->新数据集】。
自己随便选择一个位置创建文件夹命名为【数据集】(随便),并点击选择文件夹。
之后会进入如下界面,首先可以创建你想要分类的所有文件夹(也称为标签),之后依次在每个标签下拍下此类物品的各角度照片,建议在100张左右即可。
根据自己的所需,创建对应的标签并采集完足够的素材,展现效果如下:
4.上传Edge Impulse进行训练
4.1注册账号并创建Edge Impulse工程
打开Edge Impulse网站,注册就是一般流程没有什么特殊性,就不描述了。登陆成功后会跳转到创建工程页面,按下图步骤创建工程。
之后会进入指引页面,因为是外文网站,所以整个网页内容都是英文的,英语不好的小伙伴建议使用带网页翻译功能的浏览器为好,我用的是Google Chrome浏览器自带翻译插件。翻译后页面效果如下。
4.2 上传训练集
按照以下步骤,依次选择文件->设置输入标签->点击上传,完成一组标签内容的上传,重复此步骤,直至将采集到的全部的照片上传完毕。
上传完之后,再次点击左侧“数据采集”导航栏,重新进入上传数据页面,将会看到已上传的数据详情。
4.3 生成特征
首先点击左侧“创建冲动”导航按钮,进行输入数据对象、训练模型的选择,并点击保存,如下动图所示。【为方便处理,一般建议图像大小为96x96或160x160】
点击右侧图像导航栏按钮,选择RGB模式,点击保存,保存后会自动跳转至生成特征界面。
点击生成特征按钮,等待生成完毕,会显示右侧的生成特征的3维图像。如果显示失败,则证明采集的图像特征不明显,导致特征有重叠部分,则需要重新对训练的图像进行筛选后上传训练。
5.在OpenMV上部署
进入部署界面,选择生成OpenMV固件,点击构建,会自动下载生成的OpenMV代码和模型。
如果想让其输出的结果为中文,则可打开labels.txt文件,并将其内部的英文标签对应位置翻译为中文保存即可,修改完毕后效果如下。
识别出结果后,可修改代码通过串口输出识别到的结果给其他单片机使用,串口相关的具体代码已在文中有过说明,自己修改吧。
太惊艳了,爆干几天几夜完成的实战模型:【猫狗大战】附资料相关推荐
- android 卷轴动画,原来这种画卷展开的效果这么简单!三步即可做出来!太惊艳了...
原标题:原来这种画卷展开的效果这么简单!三步即可做出来!太惊艳了 我们在一些发布会或者开幕式上经常会看到这样的画卷展开效果,感觉特别惊艳,那么这种效果是怎么做出来的呢?其实很简单!我们用PPT就可以做 ...
- 【原创】用Matplotlib绘制的图表,真的是太惊艳了!!
当我们谈论Python中的数据可视化,Matplotlib是一个不可或缺的库.它强大的功能和灵活性使我们能够以各种方式轻松地呈现数据.然而,有时候,我们可能会忽视Matplotlib在创建视觉上令人惊 ...
- windowbuilder怎么加图片_一键制作音乐图片,这效果太惊艳了!微信这个功能简直是“宝藏”...
试过给视频添加音乐,那你有没有试过给图片添加音乐呢?如果没有试过的话,建议你可以试试,效果绝对让你惊艳.没有加音乐的图片就只是张图片,加了音乐之后,它就有了属于自己的故事~ 一.微信自带功能 不知道大 ...
- 全球首个AI女主播上岗了!太惊艳了!
来源:水木然 摘要:前不久,全球首个AI女主播诞生的消息走红网络!刚刚,这位AI女主播今天正式上岗了! 是不是非常惊艳? 如果不是专门解释,她极有可能被为是真人! 这位全球首个AI女主播的上岗,吸引了 ...
- 整个世界都是你的绿幕:这个视频抠图换背景的方法太惊艳了!
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:机器之心 | 参与:Racoon.张倩 绿幕是影视剧 ...
- 太惊艳了!互联网大佬女装之后,我差点没认出来!
点击"开发者技术前线",选择"星标" 在看|星标|留言, 真爱 素材来自:Face 女装大佬出自日本动漫中,特指扮女装特别像的男人. 最近女装换脸火了,我们来 ...
- 这个地球仪太惊艳了,陪孩子畅聊天文地理。
▲ 数据汪特别推荐 点击上图进入玩酷屋 一个人一旦对某事物有了浓厚的兴趣,就会主动去求知.去探索.去实践,并在求知.探索.实践中产生愉快的情绪和体验.所以,古今中外的教育家无不重视兴趣在智力开发中的作 ...
- 可视化实战,Python绘制出来的数据大屏真的太惊艳了!!
今天我们在进行一个Python数据可视化的实战练习,用到的模块叫做Panel,我们通过调用此模块来绘制动态可交互的图表以及数据大屏的制作,而本地需要用到的数据集,可在kaggle上面获取 https: ...
- Python让你成为AI 绘画大师,简直太惊艳了!(附代码))
作者 | 李秋键 责编 | 李雪敬 头图 | CSDN下载自视觉中国 引言:基于前段时间我在CSDN上创作的文章"CylcleGAN人脸转卡通图"的不足,今天给大家分享一个更加完美 ...
最新文章
- LeetCode实战:爬楼梯
- 网络风行者(KSpider)的规则体系结构
- mysql数据库开发规范_开发规范——MYSQL数据库
- python读取文件参数_Python 通过配置文件 读取参数进行
- mvc html.displayfor,我想了解@ Html.DisplayFor(modelItem = item.FirstName)中的lambda表达式...
- linux 使用spinlock的配对关系问题
- pytorch的两个函数 tensor.detach(),tensor.detach_(),tensor.clone() 的作用和区别
- 第二章 个体软件过程
- 制作vb dll的总结
- Java基础系列--instanceof关键字
- SourceAnalysis/Binder源码分析.md
- USB转RS422/485/232串口线异常问题记录
- 计算机自检后反复重启 主引导,电脑重装系统时,按错了意外重启然后就一直这样怎么办啊!...
- android解析json数据格式,Android编程解析Json格式数据的方法
- vue外卖十九:商家详情-底部购物车组件,购物车相关vuex状态设计、相关计算、清空购物车+滚动购物车
- apiCloud app调用浏览器打开网页的方法
- minMaxLoc opencv
- python数据挖掘需要学的内容
- mybatis从入门到精通(刘增辉著)-读书笔记第二章
- LVS 负载均衡群集----NAT模式
热门文章
- 实现猜数字游戏:随机生成一个1-100的整数,玩家在控制台输入数字,获得“大了”或“小了”反馈,直到猜中为止。
- MAC地址,IP地址以及ARP协议
- Glove词向量模型笔记
- java工厂实例1_盖浇饭案例
- ChatGPT:一个人机环境系统交互的初级产品
- 芯片市场对中国5G手机出货量月度计算
- 智能手机出货量持续下跌,5G或能挽救这个行业
- Matlab多元非线性回归(nlinfit 函数)
- 服务器静态页面分享微信,JS中静态页面如何实现微信分享功能
- 修改linux终端中的程序名字,在Ubuntu/Debian/Arch Linux/Fedora/OpenSUSE下更改主机名的方法...