闪烁与常亮的符号状态判断机制(状态机算法)

背景说明

        在视觉项目中,经常要判断目标的状态,例如:符号的不同频率闪烁、常亮等。然而常规的视觉算法例如YOLO,仅仅只能获取当前帧是否存在该符号,而无法对于符号状态进行判断,然而重新写一个基于时序的卷积神经网络又未免太过了,而且效果也往往低于预期。

        所以笔者通过借鉴操作系统的状态转换策略,想了一个符号状态的状态机转换算法。

算法难点说明

对于该算法的主要难点如下

 对于以YOLO为例的视觉检测算法传递的只有当前帧的符号类别列表,而且是非常快速的传递,状态判断算法很难直接融入到主程序当中,只能进行模块解耦。

对于视觉检测算法,必然会存在检测错误的情况(误检、漏检,错检),此时就会产生“噪声”,我们的状态判断算法必须要有足够的抗噪能力,然而对于如何进行抗噪又是一大难题。

状态机算法说明

 误识别情况说明:

  • 目标符号被短暂地识别为其他符号
  • 其他符号被短暂地识别为目标符号

图的说明
对于所有的符号,定义模型识别到该符号记为positive,没有识别到该符号记为negative。(这里单纯指的是识别的结果)

符号共有4种状态:状态0、状态1、状态2、状态3。

3种表现形式:暗、常亮、闪烁。

所有的符号初始化为状态0、暗。

对于状态0的符号:

  • 连续识别到该符号3次以上(即positive三次以上),切换为状态1,并记为常亮。
  • 没有识别到该符号,保持状态不变

对于状态1的符号:

  • 连续没有识别到该符号3次以上(即negative三次以上),切换为状态2。
  • 连续识别到该符号,保持状态不变

对于状态2的符号:

  • 连续识别到该符号3次以上(即positive三次以上),切换为状态3,并记为闪烁。
  • 连续没有识别到该符号3次以上(即negative四次以上),切换为状态0,并记为暗。
  • 停留在状态2时长超过2s将会进行状态的坍缩,会坍缩到上一个状态,有可能是状态2,也有可能是状态3

对于状态3的符号:

  • 连续没有识别到该符号3次以上(即negative三次以上),切换为状态2。

  • 连续识别到该符号5次以上(即positive五次以上),切换为状态1,并记为常亮

闪烁频率判断算法

对于闪烁频率的判断,由于检测的频率和性能的问题,实际上比较复杂,算法中采用的是100ms收集一次识别结果的方式。

例如:

对于400ms闪烁的情况:

  • 理想情况:0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ……
  • 实际情况:0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 ……

对于200ms闪烁的情况:

  • 理想情况:0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ……
  • 实际情况:0 0 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 ……

下图是对于闪烁频率判断的具体操作方式

代码示例

下列为状态机与频率计算算法

class Label:#初始化def __init__(self):self.frequency = 0        #记录闪烁频率self.isLight = False      #常亮标志self.isFlashing = False   #闪烁标志self.id = 0               #符号IDself.status = 0           #临时状态self.posCount = 0         #检测到1计数self.negCount = 0         #检测到0计数self.start_time = 0       #用以判断频率self.flag_time = 0        #用以判断是否是0之后的第一个1#计数次数def count(self,flag):if(flag == 0):self.negCount = self.negCount + 1self.posCount = 0self.flag_time = 0#检测到该符号if(flag == 1):#0之后的第一个1if(self.flag_time == 0):self.flag_time = 1temp_time = time.time()self.frequency = float(temp_time - self.start_time)*1000 #单位msself.start_time = temp_timeself.posCount = self.posCount + 1self.negCount = 0#刷新状态          def refresh(self):#详情请见confluence常亮和闪烁状态切换页面if(self.status == 0):#连续positive5次---->状态1,常亮if(self.posCount >= 5):self.isLight = Trueself.isFlashing = Falseself.status = 1self.posCount = 0self.negCount = 0elif(self.status == 1):#当处于状态1时,negative3次---->状态2,常亮if(self.negCount >= 3):self.status = 2self.posCount = 0self.negCount = 0elif(self.status == 2):#当处于状态2时,negative10次---->状态0,暗if(self.negCount >= 10):self.status = 0self.isFlashing = Falseself.isLight = Falseself.posCount = 0self.negCount = 0#当处于状态2时,positive4次---->状态3,闪烁if(self.posCount >= 4):self.status = 3self.isFlashing = Trueself.isLight = Falseself.posCount = 0self.negCount = 0elif(self.status == 3):#当处于状态3时,negative4次---->状态2,闪烁if(self.negCount >= 4):self.status = 2self.posCount = 0self.negCount = 0#当处于状态3时,posCount10次---->状态1,常亮if(self.posCount >= 10):self.status = 1self.isLight = Trueself.isFlashing = Falseself.posCount = 0self.negCount = 0

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

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

相关文章

使用 MySQL 子查询和 CASE 语句判断关联状态

使用 MySQL 子查询和 CASE 语句判断关联状态 一、前言1.表结构及样例数据1.1card_management1.2card_auth_register 二、SQL 查询实现1.逐步讲解2.1 基本选择2.2 添加 CASE 语句2.3解释 CASE 语句2.4完整查询2.5查询结果 2.结论 一、前言 在这篇文章中,我们将详细讲…

DDD领域应用理论实践分析回顾

目录 一、DDD的重要性 (一)拥抱互联网黑话(抓痛点、谈愿景、搞方法论) (二)DDD真的重要吗? 二、领域驱动设计DDD在B端营销系统的实践 (一)设计落地步骤 &#xff0…

详解 Flink 的常见部署方式

一、常见部署模式分类 1. 按是否依赖外部资源调度 1.1 Standalone 模式 独立模式 (Standalone) 是独立运行的,不依赖任何外部的资源管理平台,只需要运行所有 Flink 组件服务 1.2 Yarn 模式 Yarn 模式是指客户端把 Flink 应用提交给 Yarn 的 ResourceMa…

Ansys Mechanical|使用Trace Mapping建立PCB板的有限元模型

Trace Mapping需要使用ECAD的方法 传统方法 vs ECAD方法 传统方法既繁琐又费时。以下是一些数据: 导出电路板布局的step文件大约需要30分钟。 导入Ansys SpaceClaim中大约需要10分钟。 进行布尔运算和共享拓扑操作大约需要24小时甚至更久。 而ECAD方法更加快速且…

剧本新纪元:探索短剧系统的魔力

在现代社会,随着科技的迅猛进步和生活节奏的不断加快,传统的长篇电视剧和电影已不能完全满足所有人的需求。短剧,由于其简短、快速、直接的特性,正在逐步成为一种文化新趋势。短剧系统正是这一趋势的典型代表,它以独特…

自己用pip下载好模块啦,但是在pycharm里面不显示?

问题: 今天在cmd里面用pip命令安装第三方模块,最后用pip list 命令发现已经成功安装,但是在pycharm里面用该模块的时候,还是爆红,显示没有该库 。 解决方法: 第一种(项目刚创建)&am…

项目问题24/5/29需求:用一路IO口捕获外界方波PWM频率,将捕获值实时传入,使得正弦波频率和外界方波频率一致

问题 STM32F103控制下,定时器3的捕获PWM模式下的中断里的全局变量psc 20,中断触发后,主函数while循环里TIM1_PWM_Init(1451,psc)函数初始化正弦波,用了中断传过来的全局变量psc后,为什么PWM频率不是PWM 72000000.0 / ((145 * (psc11))24.8…

常用的bit位操作

#ifndef BIT_IS_1 #define BIT_IS_1(value,bitpos) (((value)&(1<<(bitpos)))>>(bitpos)) //判断某1位是1还是0 #endif #ifndef GET_BIT #define GET_BIT(value,bitpos) ((value)&(1<<(bitpos))) //读取指定位置bit位的值 #endif #ifndef REV_BIT…

如何学习软件测试,并成功找到工作

在IT行业日益繁荣的今天&#xff0c;软件测试作为确保软件质量的关键环节&#xff0c;越来越受到企业的重视。对于初入职场的小白来说&#xff0c;掌握软件测试技能不仅能够帮助他们快速适应工作&#xff0c;还能为未来的职业发展奠定坚实的基础。本文将为职场小白推荐学习软件…

PHP数组排序方法及应用场景分析

在PHP编程中&#xff0c;数组是一种非常常见的数据结构&#xff0c;而对数组进行排序是经常需要处理的任务之一。PHP提供了多种方法来对数组进行排序&#xff0c;包括按值排序、按键排序、自定义排序等。本文将从多个角度对PHP数组排序方法进行详细介绍&#xff0c;并探讨不同排…

NVIDIA DeepStream SDK 说明及链接

NVIDIA DeepStream SDK DeepStream 的多平台支持为您提供了一种更快、更简单的方式来开发视觉AI应用程序和服务。您甚至可以在本地、边缘和云中部署它们&#xff0c;只需单击一个按钮。 开始 在Launchpad上试用 什么是 NVIDIA DeepStream&#xff1f; NVIDIA 的 DeepStream …

公交车载视频监控系统解决方案

公交车载视频监控系统基于iVMS-7200移动视频监控管理平台&#xff0c;通过3G/4G网络接入车载前端&#xff0c;实现实时监控、录像回放、GIS地图定位、轨迹回放、设备状态查询、紧急报警等功能。 车载前端包含车载硬盘录像机(简称车载DVR或MDVR)、车载专用摄像机、车载LCD显示屏…

50.Python-web框架-Django中引入静态的bootstrap样式

目录 Bootstrap 官网 特性 下载 在线样例 Bootstrap 入门 Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网 在django中使用bootstrap 新建static\bootstrap5目录&#xff0c;解压后的Bootstrap文件&#xff0c;拷贝项目里就好。 在template文件里引用css文…

SQL-窗口函数合集

目录 1.窗口函数简介2.窗口的定义3.相关题目示例3.1 PERCENT_RANK()2346 以百分比计算排名 3.2 FIRST_VALUE()/LAST_VALUE()/NTH_VALUE()2388 将表中的空值更改为前一个值 1.窗口函数简介 MySQL 开窗函数&#xff08;Window Functions&#xff09;是 MySQL 8.0 版本引入的一个…

k8s metrics-server服务监控pod 的 cpu、内存

项目场景&#xff1a; 需要开启指标服务&#xff0c;依据pod 的 cpu、内存使用率进行自动的扩容或缩容 pod 的数量 解决方案&#xff1a; 下载 metrics-server 组件配置文件&#xff1a; wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/…

植物大战僵尸杂交版 MacBook 苹果电脑下载安装详细教程

最近老是看到别人玩植物大战僵尸杂交版&#xff0c;可是找了一圈发现都是PC版本的&#xff0c;原来游戏作者只做了一个PC版本&#xff0c;还好最终没有放弃终于在 Mac 上安装上了植物大战僵尸杂交版 版本是 2.0.88 真的蛮好玩的就是关卡有亿点点难&#xff0c;我最爱玩无尽模式…

一站式解决ComfyUI安装、调试和界面操作,附安装包 C001

点击打开以上网页&#xff0c;页面往下拉&#xff0c;找到“Direct link to download”&#xff0c;点击即可下载官方安装包。 下载完成后&#xff0c;将安装包移动到你想要安装的地方&#xff0c;解压&#xff08;推荐使用7-Zip&#xff09;&#xff0c;然后点击“run_nvidia_…

C++中的观察者模式

目录 观察者模式&#xff08;Observer Pattern&#xff09; 实际应用 股票价格监控系统 发布-订阅系统 总结 观察者模式&#xff08;Observer Pattern&#xff09; 观察者模式是一种行为型设计模式&#xff0c;它定义了对象间的一对多依赖关系。当一个对象的状态发生改变…

无需插件脚本,IDEA配置多服务一键启动

分享本教程的初衷是本人在本地调试时业务场景中需要调用多个服务&#xff0c;并且每次为了找到需要启动的服务花了很多不必要的时间&#xff0c;我相信很多同为开发的小伙伴也有和我一样的困扰。但是学会这招后多个服务需要同时启动时仅需一键即可搞定。接下来让我们一步步设置…

C++方法封装成dll及C#调用示例

1,编译生成dll时可能出现错误&#xff0c;解决办法&#xff1a;pch.h文件头部&#xff0c;添加声明 #define _CRT_SECURE_NO_WARNINGS 2, c头文件声明 extern "C" __declspec(dllexport) char* getvalue(const char * param1, const char * param2); 3, c方法实现…