AI项目五:结印动作识别

若该文为原创文章,转载请注明原文出处。

感谢恩培大佬对项目进行了完整的实现,并将代码进行开源,供大家交流学习。

恩培大佬开源地址,有兴趣的可以去复现一下。GitHub - enpeizhao/CVprojects: computer vision projects | 计算机视觉相关好玩的AI项目(Python、C++)

一、介绍

从恩培大佬的git上看到的小项目《火影结印识别》,发现大佬开源的代码是需要GPU的,本人电脑没有GPU,环境安装好了,没复现成功,所以取巧使用yolov5的方式实现一样的功能。

yolov5安装及训练前面有提及,不熟悉yolov5训练可以看前面文章。

二、训练集

准备素材,训练的手势共有七种,每种采集30张图片,并使用lableImg标注所有图片。

label标签

三、训练

训练使用的是AutoDL云端训练,样本不多,训练大概20-30分钟,用的是3090显卡。

这有有个注意的,直接使用AutoDL提供的镜像训练出来的pt文件一直识别检测不到,所以又换回yolov5-5版本,训练出来正常。

效果还行,想要复现就得自己训练。

四、代码

1、生成字幕需要的中文PNG图片

PNG图片是为了把识别到的字显示出来,使用OPENCV不好显示中心,所以提前准备好png直接在视频内叠加PNG图片。

'''
生成字幕需要的中文PNG图片
'''from PIL import Image,ImageDraw,ImageFontdef generate(name='你好',color_label='green'):filename = './png_label/'+name+'.png'# 背景bg = Image.new("RGBA",(400,100),(0,0,0,0))# 添加文字d = ImageDraw.Draw(bg)font  = ImageFont.truetype('./fonts/MSYH.ttc',80,encoding="utf-8")if color_label == 'green':color = (0,255,0,255)else:color = (255,0,0,255)d.text((0,0),name,font=font,fill=color)# 保存bg.save(filename)print('ok: '+ name)generate('火遁豪火球之术','red')

运行后,会生成PNG图片。

2、完整代码

import ctypes
import cv2
import numpy as np
import time# 多进程
from multiprocessing import Process, Value
import threadingimport torch
import sys
from playsound import playsoundclass Ai_tello:def __init__(self):# ************************************ 绘制 相关 *********************************self.png_dict = {}# 获取self.getPngList()# 加载 yolov5模型self.model = torch.hub.load('./yolov5', 'custom', './weights/pose.pt',source='local') # 置信度阈值self.model.conf = 0.5print('self.model.conf = 0.5')self.take_off_time = None# 结印动作顺序self.yolo_action_seq = ['ani_1', 'ani_2','ani_3', 'ani_4', 'ani_5', 'ani_6', 'ani_7']# 状态机,1表示当前动作已做完(击中)self.yolo_action_status = [0, 0, 0, 0, 0, 0, 0]def getPngList(self):'''读取PNG图片,追加进png_dict'''palm_action = {'ani_1': '巳', 'ani_2': '未', 'ani_3': '申','ani_4': '亥', 'ani_5': '午', 'ani_6': '寅', 'ani_7':'火遁豪火球之术'}for name in palm_action.values():filename = './png_label/'+name+'.png'png_img = self.readPngFile(filename, 0.9)self.png_dict[name] = png_imgprint('PNG文字标签加载完毕')def playVoice(self, fileName,mode):"""播放音乐"""playsound(fileName)def backPlay(self,fileName):"""后台播放"""t = threading.Thread(target=self.playVoice, args=(fileName,'voice'))t.start()def readPngFile(self, fileName, scale=0.5):'''读取PNG图片'''# 解决中文路径问题png_img = cv2.imdecode(np.fromfile(fileName, dtype=np.uint8), -1)# 转为BGR,变成3通道png_img = cv2.cvtColor(png_img, cv2.COLOR_RGB2BGR)png_img = cv2.resize(png_img, (0, 0), fx=scale, fy=scale)return png_imgdef addOverylay(self, frame, overlay, l, t):'''添加标签png覆盖'''# 解决l、t超界l = max(l, 0)t = max(t, 0)# 覆盖显示overlay_h, overlay_w = overlay.shape[:2]# 覆盖范围overlay_l, overlay_t = l, toverlay_r, overlay_b = (l + overlay_w), (overlay_t+overlay_h)# 遮罩overlay_copy = cv2.addWeighted(frame[overlay_t:overlay_b, overlay_l:overlay_r], 1, overlay, 20, 0)frame[overlay_t:overlay_b, overlay_l:overlay_r] = overlay_copydef cameraProcess(self):'''视频流处理:动作识别、绘制等'''print('cameraProcess');cap = cv2.VideoCapture(0)# 动作palm_action = {'ani_1':'巳','ani_2':'未','ani_3':'申','ani_4':'亥','ani_5':'午','ani_6':'寅','ani_7':'火遁豪火球之术'}triger_time = time.time()while True:# 读取视频帧ret,frame = cap.read()if frame is None:continue;frame = cv2.flip(frame, 1)# 转为RGBimg_cvt = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)if self.take_off_time != None:  if time.time() - triger_time >= 2:label_zh = palm_action['ani_7']overlay = self.png_dict[label_zh]self.addOverylay(frame,overlay,l,200)else:# 目标检测推理results = self.model(img_cvt)results_arr = results.pandas().xyxy[0].to_numpy()# 解析目标检测结果for item in results_arr:# 标签IDret_label_id = item[-2]# 标签名称ret_label_text = item[-1]# 置信度ret_conf = item[-3]# ani_1,ani_2....ani_6# 结印动作,且置信度要求高一些if 'ani_' in  ret_label_text and ret_conf >= 0.7:l,t,r,b = item[:4].astype('int')# 绘制cv2.rectangle(frame,(l,t),(r,b),(0,255,20),2)# 绘制动作中文png                        label_zh = palm_action[ret_label_text]print(ret_label_text)# 拿到对应中文文字的数组图片overlay = self.png_dict[label_zh]# 覆盖绘制self.addOverylay(frame,overlay,l,t-100)cv2.putText(frame,'{}%'.format(round(ret_conf*100,2)),(l+80,t-20),cv2.FONT_ITALIC,1.5,(255,0,255),2)# 状态机列表中第一个0的索引first_0_index = next(i for i,x in enumerate(self.yolo_action_status) if x == 0 )# 对应动作名 ['ani_1', 'ani_2','ani_3', 'ani_4', 'ani_5', 'ani_6']check_action_name = self.yolo_action_seq[first_0_index]# 动作匹配if ret_label_text == check_action_name:# 赋值1self.yolo_action_status[first_0_index] = 1# 检查是否完毕if self.yolo_action_status == [1,1,1,1,1,1,1]:self.take_off_time = time.time()print('动作全部匹配完')self.backPlay('火遁豪火球.mp3')# 计时triger_time = time.time()else:print('击中一个动作,当前列表为'+str(self.yolo_action_status))else:print('未击中动作,当前列表为'+str(self.yolo_action_status))cv2.imshow('demo', frame)if cv2.waitKey(10) & 0xFF == ord('q'):breakcv2.destroyAllWindows()if __name__ == '__main__':# 实例化ai_tello = Ai_tello()ai_tello.cameraProcess()

代码有几个需要注意的:

一、加载 yolov5模型

加载 yolov5模型时,有可能出错,遇到的问题是版本不同,使用的是yolov5-5版本训练的,加载的文件不是,出错。

二、识别流程

识别采用的状态机方式,即事先定义一下数组【0,0,0,0,0,0,0】共7个元素,

当检测到对应动作时就置1,当数组全部为1时,就播放声音。

五、效果演示

《结印识别之火球之术》_哔哩哔哩_bilibili

如有侵权,或需要完整代码,请及时联系博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/132063.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Glide in RecyclerView,only load visible item when page return,Kotlin

Android Glide in RecyclerView,only load visible item when page return,Kotlin base on this article: Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin_zhangphil的博客…

使用大型语言模型的指南: 提高效率及安全性的技巧和策略 | 开源日报 0913

brexhq/prompt-engineering Stars: 5.8k License: MIT Prompt Engineering Guide,提供了与大型语言模型(LLM)相关的技巧和窍门。该指南基于Brex公司在生产用例中研究和创建LLM提示时所学到的经验教训,并涵盖了有关使用和构建程序…

【Java从入门到精通】这也许就是Java火热的原因吧!

前言:Java是一种高级的、面向对象的、可跨平台的程序设计语言。Java根据技术类别可划分为以下几类:JavaSE(Standard Edition,标准版):支持面向桌面、嵌入式和移动设备的应用程序开发;JavaEE&…

机器学习实战-系列教程7:SVM分类实战2线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读

🌈🌈🌈机器学习 实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 SVM分类实战1之简单SVM分类 SVM分类实战2线性SVM SVM分类实战3非线性SVM 3、不同软间隔C值 3.1 数据标准化的影响 如图左边是没…

目录操作函数

1.mkdir #include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode); 作用&#xff1a;创建一个目录 参数&#xff1a; -pathname:创建的目录的路径 -mode:权限&#xff0c;八进制的数 返回值&#xff1a; 成功返回0&#xff…

activemq学习笔记

传统的request/response 在客户端提交请求后必须等待服务端处理完毕给于反馈&#xff0c;这期间客户端完全处于空闲等待状态&#xff0c;甚至有可能超时&#xff1b; 基于消息中间件的request/response 客户端提交请求&#xff0c;不必等待服务器处理&#xff0c;客户端可以继…

Re-Learn Linux Part1

1. Linux的目录结构 在Linux文件系统中有两个特殊的目录&#xff1a; 一个用户所在的工作目录&#xff0c;也叫当前目录&#xff0c;可以使用一个点 . 来表示&#xff1b;另一个是当前目录的上一级目录&#xff0c;也叫父目录&#xff0c;可以使用两个点 .. 来表示。 . &#…

Kubernetes网络插件Canal的工作原理和关键功能

文章目录 什么是 Canal&#xff1f;安装 Canal配置网络策略使用 Canal 进行跨节点通信总结 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;云计算 ✨文章内容&#xff1a;网…

Direct3D光照

光照的组成 环境光&#xff1a;这种类型的光经其他表面反射到达物体表面&#xff0c;并照亮整个场景&#xff0c;要想以较低代价粗略模拟这类反射光&#xff0c;环境光是一个很好的选择 漫射光&#xff1a;这种类型光沿着特定的方向传播。当它到达某一表面时&#xff0c;将沿…

Python 内置函数详解 (2) 逻辑运算

近期在外旅游,本篇是出发编辑的,准备定时发布用,不完整,旅游回来后再补充。 Python 内置函数 Python3.11共有75个内置函数,其来历和分类请参考:Python 新版本有75个内置函数,你不会不知道吧_Hann Yang的博客-CSDN博客https://blog.csdn.net/boysoft2002/article/detai…

群晖Cloud Sync数据同步到百度云、另一台群晖、nextcloud教程

群晖Cloud Sync数据同步到百度云、另一台群晖、nextcloud教程 一、群晖套件中下载Cloud Sync 二、同步到百度云盘 打开Cloud Sync&#xff0c;点击左上角的号&#xff0c;云供应商选择百度云。 这里可以选择双向备份&#xff0c;也可以只上穿到百度云的仅上传本地更改。因为百…

服务器中了勒索病毒怎么办?勒索病毒解密,数据恢复

勒索病毒是一种比较常见的电脑病毒&#xff0c;它们给企业的生产经营和发展带来了很大的影响。可是绝大多数企业在这方面并没有做合理的预案&#xff0c;这也导致当安全运维人员或者企业主发现中了勒索病毒以后手足无措。那云天数据恢复中心就用这篇文章来告诉大家当服务器中了…

联通数科赋能中国联通DCMM5级评估!

近日&#xff0c;中国电子信息行业联合会发布了“关于公布获得数据管理能力成熟度等级证书单位的通知”&#xff0c;中国联通获得最高等级优化级&#xff08;5级&#xff09;&#xff0c;成为通信行业率先获得最高等级的单位&#xff0c;标志着中国联通数据管理能力进入国家第一…

MyBatis基础之概念简介

文章目录 基本概念1. 关于 MyBatis2. MyBatis 的体系结构3. 使用 XML 构建 SqlSessionFactory4. SqlSession5. 默认的别名6. 补充 [注意] 放前面前 很多人可能在使用 MyBatis-plus 进行代码开发&#xff0c;MyBatis的这部分内容是用来更好的讲述之后的内容。 基本概念 1. 关于…

Apollo介绍和入门

文章目录 Apollo介绍配置中心介绍apollo介绍主流配置中心功能特性对比 Apollo简介 入门简单的执行流程Apollo具体的执行流程Apollo对象执行流程分步执行流程 核心概念应用&#xff0c;环境&#xff0c;集群&#xff0c;命名空间企业部署方案灰度发布全量发布 配置发布的原理发送…

小程序引入高德/百度地图坐标系详解

小程序引入高德/百度地图坐标系详解 官网最近更新时间&#xff1a;最后更新时间: 2021年08月17日 高德官网之在原生小程序中使用的常见问题 链接 目前在小程序中使用 高德地图只支持以下功能 &#xff1a;地址描述、POI和实时天气数据 小结&#xff1a;从高德api中获取数…

PaddleOCR以及CUDA、cuDNN安装踩坑记录

PaddleOCR安装参考官网或者Gitee说明文档&#xff1a;https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.6/doc/doc_ch/quickstart.md 可以先安装CPU版本跑起来&#xff1a; python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple pip instal…

【操作系统】进程的概念、组成、特征

概念组成 程序&#xff1a;静态的放在磁盘&#xff08;外存&#xff09;里的可执行文件&#xff08;代码&#xff09; 作业&#xff1a;代码&#xff0b;数据&#xff0b;申请&#xff08;JCB&#xff09;&#xff08;外存&#xff09; 进程&#xff1a;程序的一次执行过程。 …

python自学

自学第一步 第一个简单的基础&#xff0c;向世界说你好 启动python 开始 print是打印输出的意思&#xff0c;就是输出引号内的内容。 标点符号必须要是英文的&#xff0c;因为他只认识英文的标点符号。 exit&#xff08;&#xff09;推出python。 我们创建一个文本文档&…

计算机竞赛 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#x…