当前位置: 首页 > news >正文

基于MaixBit(K210芯片)的图像识别猜拳手势博弈装置

本文介绍了一种基于嵌入式平台开发的图像识别部署装置,其主要功能包括实现机器与人的“猜拳博弈”,其组成分为三个部分:

  1. 手势检测数据集

  1. 图像识别模型训练

  1. 模型格式部署

  1. maixbit开发板部署

手势检测数据集:本项目的数据集包括三种标签:石头,剪刀,布。数据集采用的是自己采集,自行采集数据集有两个优点:1.对最终的部署于maixbit开发板进行识别更加具有针对性;2.可以任意控制数据集的数量。

如上图所示:maixpy提供了线上的数据集制作平台,进行训练集以及验证集的编写,通过手动标注数据集,由于本项目中所使用的是图像分类的识别模型,不需要进行手动标注。

数据集的样本采集方式使用手机端进行直接的训练样本采集,上传至maixHub的后端服务器,图像样本以及对应的标签。

选取模型进行模型的训练,使用的分类模型为mobilenet,进行数据集的拟合。

踩坑经验:数据集三种标签的样本采集数量应该严格相等,同时尽可能数量多,不低于80张采集样本图片。模型选择方面,仅支持官方推荐的几种模型,也是因为芯片的RAM较小,并且其中固件占据了太多部分的内存。

选择部署方式,本项目最终部署的平台是maixBit开发板,因此适用于nncase的部署方式,如果选择部署于树莓派与安卓平台时,可以选择ncnn的部署方式。

配置项选择全部结束,创建训练任务,日志平台进行训练日志的监控,主要包括损失函数loss的下降趋势监控,以及模型acc准确率的显示等,训练完成的模型进行终端部署相关操作。

maixhub帮助我们实现了一个初步的推理代码,实现部署直接应用模型,即可实现调用maixbit开发进行模型的图像识别。

import sensor, image, lcd, time
import KPU as kpu
import gc, sysinput_size = (224, 224)
labels = ['cloth', 'Scissors', 'Stone']def lcd_show_except(e):import uioerr_str = uio.StringIO()sys.print_exception(e, err_str)err_str = err_str.getvalue()img = image.Image(size=input_size)img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))lcd.display(img)def main(labels = None, model_addr="/sd/m.kmodel", sensor_window=input_size, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):sensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.set_windowing(sensor_window)sensor.set_hmirror(sensor_hmirror)sensor.set_vflip(sensor_vflip)sensor.run(1)lcd.init(type=1)lcd.rotation(lcd_rotation)lcd.clear(lcd.WHITE)if not labels:with open('labels.txt','r') as f:exec(f.read())if not labels:print("no labels.txt")img = image.Image(size=(320, 240))img.draw_string(90, 110, "no labels.txt", color=(255, 0, 0), scale=2)lcd.display(img)return 1try:img = image.Image("startup.jpg")lcd.display(img)except Exception:img = image.Image(size=(320, 240))img.draw_string(90, 110, "loading model...", color=(255, 255, 255), scale=2)lcd.display(img)try:task = Nonetask = kpu.load(model_addr)while(True):img = sensor.snapshot()t = time.ticks_ms()fmap = kpu.forward(task, img)t = time.ticks_ms() - tplist=fmap[:]pmax=max(plist)max_index=plist.index(pmax)img.draw_string(0,0, "%.2f : %s" %(pmax, labels[max_index].strip()), scale=2, color=(255, 0, 0))img.draw_string(0, 200, "t:%dms" %(t), scale=2, color=(255, 0, 0))lcd.display(img)except Exception as e:raise efinally:if not task is None:kpu.deinit(task)if __name__ == "__main__":try:# main(labels=labels, model_addr=0x300000)main(labels=labels, model_addr="/sd/model-26548.kmodel")except Exception as e:sys.print_exception(e)lcd_show_except(e)finally:gc.collect()

maixbit开发使用摄像头以及LCD屏幕进行图像的结果显示,包括实时视频检测的结果以及模型识别的推理时间,进行显示。

maix bit主板示意图如下图所示:

maix bit开发板示意图

maix bit开发板的内部包含KPU神经网络处理器,类似华为的NPU芯片,可以加快模型的推理速度。

目前手上有可以识别石头剪刀布三种手势的模型设备,需要进行人机交互层面的实现工作。

选取上电运行的主界面图片:

具体需要实现的交互功能为根据人的手势,识别其具体的手势类别,再做出相应的手势反应。

主界面的上电运行图片进行实际的切分,分为剪刀图片,石头图片以及布图片:

三种手势图片

图片进行显示预处理,maix bit开发板的显示屏采用的LCD液晶显示屏,其如下图所示:

其显示屏的参数对于项目的区别在于320x240的视频显示分辨率,因此其主界面的图片显示应调整分辨率为320x240的图像分辨率,这里使用的是画图软件,进行图片大小的调整。

部署模型Python代码如下所示:

import sensor, image, lcd, time
import KPU as kpu
import gc, sys
input_size = (224, 224)
labels = ['cloth', 'Scissors', 'Stone']
cloth_pic = "/sd/bu.jpg"
Scissors_pic = "/sd/jian.jpg"
Stone_pic = "/sd/shi.jpg"
def lcd_show_except(e):import uioerr_str = uio.StringIO()sys.print_exception(e, err_str)err_str = err_str.getvalue()img = image.Image(size=input_size)img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))lcd.display(img)
def main(labels = None, model_addr="", sensor_window=input_size, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):sensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.set_windowing(sensor_window)sensor.set_hmirror(sensor_hmirror)sensor.set_vflip(sensor_vflip)sensor.run(1)lcd.init(type=1)lcd.rotation(lcd_rotation)lcd.clear(lcd.WHITE)try:img = image.Image("/sd/start.jpg")lcd.display(img)time.sleep(2)lcd.clear()img = image.Image(size=(320, 240))img.draw_string(80, 110, "Mora Guess Game", color=(255, 255, 255), scale=2)lcd.display(img)time.sleep(2)except Exception:img = image.Image(size=(320, 240))img.draw_string(50, 50, "model exception...", color=(255, 255, 255), scale=2)lcd.display(img)try:task = Nonetask = kpu.load(model_addr)lcd.clear()while(True):img = sensor.snapshot()t = time.ticks_ms()if img is None or img == "":continuefmap = kpu.forward(task, img)t = time.ticks_ms() - tfps = 1000/tplist=fmap[:]pmax=max(plist)max_index=plist.index(pmax);img.draw_string(0,0, "%.2f: %s" %(pmax,labels[max_index].strip()), scale=2, color=(000, 0,255))img.draw_string(0, 200, "fps :%.1f" %(fps), scale=2, color=(0, 0, 255))lcd.display(img,roi=(0, 0, 160, 240), oft=(0, 0))if max_index == 0:Scissors = image.Image(Scissors_pic)lcd.display(Scissors,roi=(0, 0, 160, 240), oft=(160, 0))elif max_index == 1:Stone = image.Image(Stone_pic)lcd.display(Stone,roi=(0, 0, 160, 240), oft=(160, 0))elif max_index == 2:cloth = image.Image(cloth_pic)lcd.display(cloth,roi=(0, 0, 160, 240), oft=(160, 0))except Exception as e:raise efinally:if not task is None:kpu.deinit(task)
if __name__ == "__main__":try:main(labels=labels, model_addr="/sd/model-26548.kmodel")except Exception as e:sys.print_exception(e)lcd_show_except(e)finally:gc.collect()

maix bit可以外接SD卡配置,将进行显示所用的文件为了节约芯片的内存,将LCD屏幕的320x240的屏幕进行一分为二,因此以上三个手势图片分辨率为160x240。

进行视频显示视频流显示与模型处理结果进行分割,针对视频流采集的图片进行预测,进行模型的前向传播,获取各个预测标签对应的概率。获取最大的概率所对应的索引,输出对应的预测标签结果。

博弈操作的逻辑代码如下:

if max_index == 0:Scissors = image.Image(Scissors_pic)lcd.display(Scissors,roi=(0, 0, 160, 240), oft=(160, 0))
elif max_index == 1:Stone = image.Image(Stone_pic)lcd.display(Stone,roi=(0, 0, 160, 240), oft=(160, 0))
elif max_index == 2:cloth = image.Image(cloth_pic)lcd.display(cloth,roi=(0, 0, 160, 240), oft=(160, 0))

将图像识别的标签进行分布为[石头,布,剪刀],通过识别的图片结果,读取sd卡中的图像数据,在半个LCD显示屏进行操作结果的显示,以此类推。

如图为本智能设备的最终识别效果:

以上为MaixBit(K210芯片)的图像识别猜拳手势博弈装置的最终效果,完整源代码通过关注我的公众号“千与编程”,有详细教程。其实这个项目是我一早就很想做的项目,现在也算完整完成了,做一个完整的项目,用编程改变世界加油!

我是千与千寻,我们下期见!

相关文章:

基于MaixBit(K210芯片)的图像识别猜拳手势博弈装置

本文介绍了一种基于嵌入式平台开发的图像识别部署装置,其主要功能包括实现机器与人的“猜拳博弈”,其组成分为三个部分:手势检测数据集图像识别模型训练模型格式部署maixbit开发板部署手势检测数据集:本项目的数据集包括三种标签&…...

leetcode 41~50 学习经历

leetcode 41~50 学习经历41. 缺失的第一个正数42. 接雨水43. 字符串相乘44. 通配符匹配45. 跳跃游戏 II46. 全排列47. 全排列 II48. 旋转图像49. 字母异位词分组50. Pow(x, n)小结41. 缺失的第一个正数 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的…...

SQL注入原理及漏洞利用(入门级)

文章目录一、什么是SQL注入漏洞?二、 SQL查询语句三、SQL注入分类数字型(整型)注入字符型注入搜索型注入四、SQL注入漏洞形成原因一、什么是SQL注入漏洞? 攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中…...

2023/2/26 Vue学习笔记 配置代理解决跨域[CORS ]的问题

利用vue的脚手架巧妙的解决ajax跨域的问题 1 我们首先利用springboot服务搭建 注意这里引出了跨域[CORS ]的问题: Access to XMLHttpRequest at http://localhost:5000/getUserInfo from origin http://localhost:8080 has been blocked by CORS policy: No Access-Control-A…...

算法练习--深拷贝与浅拷贝

🎀个人主页:努力学习前端知识的小羊 感谢你们的支持:收藏🎄 点赞🍬 加关注🪐 文章目录算法地址算法题解分析深拷贝与浅拷贝在练习算法时,遇到了深拷贝与浅拷贝的问题,于是就了解了一…...

Wireshark “偷窥”浏览器与服务器三次握手

本文使用的是Wireshark 4.0.3, Java 11 编写简易服务器,客户端使用Chrome浏览器移动端开发或是前、后端开发又或是高大上的云计算都脱离不了网络,离开了网络的计算机就是一个孤岛,快速上手开发、背面试八股文固然有些急功近利,但确…...

基于stm32温湿度采集平台开发

基于stm32温湿度采集平台开发这里记录一下自己以前课设报告,但是论文中图片和文字、公式太多了,懒得粘贴了,需要完整的可q我963_160_156,也可在微信公众号 *高级嵌入式软件* 里回复 *温湿度* 查看完整版文章摘 要关键词第一章 绪论…...

单机模拟kafka分布式集群(演示生产、消费数据过程)

用单机搭建kafka伪分布式集群,其实集群的概念并不复杂 先说明一下,以下的每个服务启动后都需要新开一个终端来启动另外的服务(因为是集群,自然会用多个终端) 首先下载kafka 提取码:dvz4 或者直接去官网下载kafka_2.11-1.0.0.tgz t…...

办公室人员离岗识别检测系统 yolov7

办公室人员离岗识别检测系统根据yolov7网络模型深度学习技术,办公室人员离岗识别检测算法能够7*24小时全天候自动识别人员是否在岗位。YOLOv7 在 5 FPS 到 160 FPS 范围内,速度和精度都超过了所有已知的目标检测器,并在V100 上,30…...

Android从屏幕刷新到View的绘制(一)之 Window、WindowManager和WindowManagerService之间的关系

0. 相关分享 Android从屏幕刷新到View的绘制(一)之 Window、WindowManager和WindowManagerService之间的关系 Android从屏幕刷新到View的绘制(二)之Choreographer、Vsync与屏幕刷新 1. 相关类 WindowManagerService&#xff0c…...

#多源数据融合#:HSI与Lidar

Lidar数据与HSI数据融合应该注意的问题 融合激光雷达(lidar)数据和高光谱数据可以提高地物特征的识别和分类准确性。以下是一些融合这两种数据的注意事项: 数据预处理 由于激光雷达数据和高光谱数据的特点不同,需要对两种数据进…...

android 权限控制与进程隔离

每次介绍说是做系统安全的,面试和领导首先就是说配selinux,实在很无语。虽然权限控制是安全很重要一环。 linux的进程就是系统运行中的程序(process),是正在执行的一个程序或者命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。Linux环境下…...

链表(一):移除链表元素、设计链表等力扣经典链表题目

203.移除链表元素相关题目链接:力扣 - 移除链表元素题目重现给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。思路链表的删除操作如上图所示,我们需要先找到要删除的…...

计算机网络 第4章 作业1

一、选择题 1. 由网络层负责差错控制与流量控制,使分组按序被递交的传输方式是_________(C) A.电路交换 B.报文交换 C.基于虚电路的分组交换 D.基于数据报的分组交换 2. TCP/IP 参考…...

Redis-Java代码使用示例

在我之前的项目中,使用Redis是我们团队自己封装了一个Redis操作类,但是这只是在Spring提供的RedisTemplate上做了一层封装而已,当时使用不是很熟练,都是一边在网上查资料,一边使用;这篇文章会介绍两种使用方…...

acwing3485最大异或和(trie树,贪心)

给定一个非负整数数列 a,初始长度为 N。 请在所有长度不超过 M 的连续子数组中,找出子数组异或和的最大值。 子数组的异或和即为子数组中所有元素按位异或得到的结果。 注意:子数组可以为空。 输入格式 第一行包含两个整数 N,M。 第二行…...

EasyRecovery16免费的电脑的数据恢复工具

常见的数据恢复有两种方式,第一种方式是找别人恢复,按照市场价来说,数据恢复的价格每次在100-500之间,但这种方式容易使自己设备上的隐私资料泄露出去,不安全。 另一种方式则是自己学会数据恢复的方法,有问…...

银行数字化转型导师坚鹏:平安银行数字化转型—橙E网战略研究

平安银行对公业务数字化转型案例—橙E网战略研究课程背景: 很多银行存在以下问题:不清楚银行对公业务数字化转型能否成功?不知道其它银行对公业务数字化转型的实际做法? 课程特色:用实战案例解读平安银行对公业务…...

tun驱动之open

tun驱动对应的设备文件是:/dev/net/tun,其详细信息如下: crw-rw-rw- 1 root root 10, 200 2月 26 08:05 tun 主次设备号的定义如下: #define MISC_MAJOR 10 #define TUN_MINOR 200 由于tun驱动属于misc设备驱动,因此用…...

计算机网络体系结构

计算机网络体系结构是指计算机网络中各个层次和功能组成的结构体系,它定义了计算机网络中各层次之间的协议和接口,以实现不同类型、不同规模、不同性能的计算机之间的互联和通信,同时提供各种网络服务和应用。计算机网络体系结构通常被分为多…...

基础夯实,字节内部总结240道算法LeetCode刷题笔记,直呼太全

1、什么是算法算法(algorithm,[ˈlɡərɪəm],计算程序):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结…...

Three.js使用WebWorker进行八叉树碰撞检测

经过一番探索后还是采用了整个碰撞检测都交给worker来做 原因 如果是小的模型还是不需要这么做的 js线程足够处理构建时的开销 步骤 将需要被检测的物体集合转换成可以背worker接收的结构化数据发送给worker worker将结构化的数据转换成有效的Three元素集合并对其构建八叉树fr…...

【教程】Notion笔记多平台设置中文显示

这个笔记软件界面挺好看,惊艳到了。 目录 网页版 桌面端 Windows版 Mac端 安卓端 网页版 直接安装这个插件即可,Chrome/Edge适用:Notion中文版 桌面端 都要去这个github下载语言包,用于替换文件:https://github.c…...

[牛客Hot101]链表篇

文章目录1.翻转链表2.链表内指定区间翻转3. 链表中的节点每k个一组翻转4. 合并两个排序的链表5. 合并k个排序的链表6. 判断链表是否有环7. 链表中倒数第k个节点8. 删除链表中的倒数第k和节点9. 两个链表的第一个公共节点10.链表的入环节点11. 链表相加(二&#xff0…...

Vue3 核心模块源码解析(上)

Vue3相比大家也都有所了解,即使暂时没有使用上,但肯定也学习过!Vue3是使用TS进行重写,采用了MonoRepo的管理方式进行管理,本篇文章我们一起来看看 Vue3的使用,与Vue2有什么区别,以及我们该如何优…...

【C进阶】指针的高级话题

文章目录:star:1. 字符指针:star:2. 指针数组2.1 指针数组的定义2.2 指针数组的使用:star:3. 数组指针3.1 数组的地址3.2 数组指针的使用:star:4. 数组参数和指针参数:star:5. 函数指针5.1 函数名和函数的地址5.2 练习:star:6. 函数指针数组6.1 转移表:star:7. 指向函数指针数组…...

无源晶振匹配电容—计算方法

以前有写过一篇文章“晶振”简单介绍了晶振的一些简单参数,今天我们来说下无源晶振的匹配电容计算方法: 如上图,是常见的的无源晶振常见接法,而今天来说到就是这种常见电路的电容计算方法,有两种: A&#…...

【测试】自动化测试03(JUnit)

努力经营当下,直至未来明朗! 文章目录JUnit一) 注解1. Test2. BeforeEach3. BeforeAll4. AfterEach5. AfterAll二) 断言(Assertions类)三)用例的执行顺序四)参数化五)测试…...

《计算机视觉和图像处理简介 - 中英双语版》:神经网络中的激活函数 ReLU vs Sigmoid

文章大纲 Neural Network Module and Training Function创建数据集Define Neural Network, Criterion function, Optimizer and Train the ModelTest Sigmoid and ReluAnalyze Results参考文献与学习路径在本文中,我们使用含有两个隐藏层的神经网络基于MNIST数据集测试Sigmoid…...

(三十七)大白话SQL标准中对事务的4个隔离级别,都是如何规定的呢?

之前我们给大家讲了数据库中多个事务并发时可能产生的几种问题,包括了脏写、脏读、不可重复读、幻读,几种问题 那么针对这些多事务并发的问题,实际上SQL标准中就规定了事务的几种隔离级别,用来解决这些问题。 注意一下&#xff…...

网站制作模板百度网盘/香蕉和忘忧草对焦虑的影响

PHP - 应用实例 - 语法着色 借助PHP支持的语法着色功能,可以创建批处理。php.exe -s "%1" > "%1.html"[PHP - 关键词] php[PHP - 相关论坛] http://php.board.newsmth.net/http://bbs.pku.edu.cn/, homepage看版http://forum.csdn.net/S…...

淘宝上做网站靠谱吗/seo优化设计

Xing, HF, Li, JL, Hou, B, Zhang, YJ, Guo, MFJOURNAL OF SENSORS[1687-725X], Published 2017,收录情况: WOS-----------------------------------------------------------------张新喜,张嵘,郭美凤,程高峰,牛树来清华大学学报(自然科学版)[1000-0054], Publishe…...

南京网站优化网站建设公司/如何引流客源最快的方法

第一种&#xff1a;使用正则 复制代码 代码如下:<?php echo preg_replace(# #, , ab ab); //输出 "abab" ?>第二种&#xff1a;使用str_replace()函数 复制代码 代码如下:<?php echo str_replace( , , ab ab); //输出 "abab ?>第三种&…...

房屋租赁网站开发模版/百度资源站长平台

windows下boost库的基本使用方法 因为boost都是使用模板的技术&#xff0c;所以所有代码都是写在一个.hpp头文件中。这样boost中的大部分内容是不需要编译生成相应的链接库&#xff0c;只需要设置下面的包含目录&#xff08;或者设置一下环境变量&#xff09;&#xff0c;在源文…...

黑龙江骏域建设网站专家/google官网登录入口

#前面了解了很多异常&#xff0c;是否所有异常都可以捕捉的呢&#xff1f;其实并非如此。如下示例&#xff1a;1 #!/usr/bin/python32 #-*-coding:UTF-8-*-3 #异常9.74 5 def model_exception(x,y):6 try:7 ax/y8 bname9 except(ZeroDivisionError,Nam…...

宜春网站制作/网络推广赚钱平台有哪些

工控机安装 openvino2021.4 需要安装python 就安装了python3.8.8 但是直接报错 安装不上去 在网上找了各种方法&#xff0c;最后安装了KB2533623 之后可以安装python了 下载地址 链接: https://pan.baidu.com/s/15KpcRN2w5v7xQtaFm7JlMw?pwdaxs6 提取码: axs6 或者 KB25…...