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

背景说明

        在视觉项目中,经常要判断目标的状态,例如:符号的不同频率闪烁、常亮等。然而常规的视觉算法例如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               #符号ID
        self.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 + 1
            self.posCount = 0
            self.flag_time = 0
        #检测到该符号
        if(flag == 1):
            #0之后的第一个1
            if(self.flag_time == 0):
                self.flag_time = 1
                temp_time = time.time()
                self.frequency = float(temp_time - self.start_time)*1000 #单位ms
                self.start_time = temp_time
            
            self.posCount = self.posCount + 1
            self.negCount = 0
    #刷新状态          
    def refresh(self):
        #详情请见confluence常亮和闪烁状态切换页面
        if(self.status == 0):
            #连续positive5次---->状态1,常亮
            if(self.posCount >= 5):
                self.isLight = True
                self.isFlashing = False
                self.status = 1
                self.posCount = 0
                self.negCount = 0
        elif(self.status == 1):
            #当处于状态1时,negative3次---->状态2,常亮
            if(self.negCount >= 3):
                self.status = 2
                self.posCount = 0
                self.negCount = 0
        elif(self.status == 2):
            #当处于状态2时,negative10次---->状态0,暗
            if(self.negCount >= 10):
                self.status = 0
                self.isFlashing = False
                self.isLight = False
                self.posCount = 0
                self.negCount = 0
            #当处于状态2时,positive4次---->状态3,闪烁
            if(self.posCount >= 4):
                self.status = 3
                self.isFlashing = True
                self.isLight = False
                self.posCount = 0
                self.negCount = 0
        elif(self.status == 3):
            #当处于状态3时,negative4次---->状态2,闪烁
            if(self.negCount >= 4):
                self.status = 2
                self.posCount = 0
                self.negCount = 0
            #当处于状态3时,posCount10次---->状态1,常亮
            if(self.posCount >= 10):
                self.status = 1
                self.isLight = True
                self.isFlashing = False
                self.posCount = 0
                self.negCount = 0

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟着AI学AI_09 PyTorch 简介

PyTorch 简介 PyTorch 是一个开源的深度学习框架,由 Facebook 的人工智能研究团队(FAIR)开发。它提供了灵活且高效的张量计算功能,并支持动态计算图。PyTorch 的易用性和灵活性使其成为深度学习研究和生产应用中广泛使用的工具。…

一维、二维数组练习题

1、输入一个6个元素的一维数组,实现冒泡排序 2、输入一个6个元素的一维数组,实现简单排序 3、输入一个5个元素的一维数组,求最大值,最小值 4、输入一个三行四列的二维数组,计算最大值和最小值

期权和股票有什么区别?

今天带你了解期权和股票有什么区别?股票和期权都是投资产品,但它们却是两种截然不同的交易模式,在开户要求上也有很多差别。 期权和股票有什么区别? 权利与义务: 股票:代表公司的所有权的一部分&#xff…

【扫码点餐系统】制作搭建部署

前言: 餐饮类做一个扫码点餐的工具可以提升用户体验、扩大市场份额、提高运营效率以及适应数字化趋势等方面。 一、企业开发小程序原因 企业开发小程序具有多方面的优势,可以帮助企业提升用户体验、扩大市场份额、提高运营效率以及适应数字化趋势等。…

线程安全问题【snychornized 、死锁、线程通信】

目录 一、线程安全1.1 线程安全问题?1.2 如何解决线程安全问题方法具体如何实现? 1.3 同步方法1.4 同步代码块1.5 总结1.6 售票例子1.8 补充 二、线程安全的集合三、死锁【了解】四、线程通信4.1 同步方法4.2 同步代码块4.3 wait和sleep本篇的思维导图 最后 一、线程安全 1.…

批量替换删除图片文件名称中相同数字:轻松管理文件结构新技巧大揭秘

特别是当图片文件名称中包含相同的数字时,想要快速找到或整理这些文件更是难上加难。今天,我要向大家揭秘一种轻松管理图片文件结构的新软件——文件批量改名高手。 进入“文件批量改命名高手”主页面,你会看到一个简洁明了的操作界面。在板…

【Linux】模拟实现一个简单的日志系统

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…

C++ 11 之 参数传递

c11参数传递.cpp #include <iostream> using namespace std;void swap1(int a, int b) {int temp a;a b;b temp;cout << "函数的a: " << a << endl;cout << "函数的b: " << b << endl; }void swap2(int *a,…

Boost-PFC电路讲解

电路拓扑图 PFC_Boost与普通Boost的区别 普通Boost&#xff1a;通常是用一次电源的输出的直流来作为它的输入&#xff0c;输入电压比较稳定&#xff0c;无需考虑 PF值THD方面的东西 PFC_Boost&#xff1a;直接是市电输入&#xff0c;输入电压是电压大小和方向时刻在变化的正弦…

AI日报|苹果生态全面整合AI功能,字节跳动被曝秘密启动AI手机研发

文章推荐 粽叶飘香&#xff0c;端午安康&#xff01;AI视频送祝福啦~ 谁是最会写作文的AI“考生”&#xff1f;“阅卷老师”ChatGPT直呼惊艳&#xff01; ⭐️搜索“可信AI进展“关注公众号&#xff0c;获取当日最新AI资讯 苹果WWDC 2024&#xff1a;AI为苹果带来了什么&am…

Linux基础之进程替换

目录 一、进程替换的基本概念 二、exec系列函数 2.1 execl系列函数 2.2 execv系列函数 2.3 替换原理 一、进程替换的基本概念 根据我们之前所学&#xff0c;我们可以知道我们所创建的所有的子进程&#xff0c;执行的代码&#xff0c;都是父进程代码的一部分。如果我们想让…

IP隔离是什么,你了解多少?

一、IP地址隔离的概念和原理 当我们谈论 IP 地址隔离时&#xff0c;我们实际上是在讨论一种网络安全策略&#xff0c;旨在通过技术手段将网络划分为不同的区域或子网&#xff0c;每个区域或子网都有自己独特的 IP 地址范围。这种划分使网络管理员可以更精细地控制哪些设备或用…

基于java的英文翻译字典

基于java的英文翻译字典&#xff0c;附有源代码&#xff0c;源数据库初始化文件 源码地址 dict_demo: 提取一段英文对话中的英文词汇&#xff0c;输出为英文单词字典形式 解析json字条 private void readFile(String pathname) {long start System.currentTimeMillis(); //…

学习笔记——路由网络基础——路由优先级(preference)

1、路由优先级(preference) 路由优先级(preference)代表路由的优先程度。当路由器从多种不同的途径获知到达同一个目的网段的路由(这些路由的目的网络地址及网络掩码均相同)时&#xff0c;路由器会比较这些路由的优先级&#xff0c;优选优先级值最小的路由。 路由来源的优先…

Goby 漏洞发布|XAMPP Windows PHP-CGI 代码执行漏洞

漏洞名称&#xff1a;XAMPP Windows PHP-CGI 代码执行漏洞 English Name&#xff1a;XAMPP PHP-CGI Windows Code Execution Vulnerability CVSS core: 9.8 漏洞描述&#xff1a; PHP是一种在服务器端执行的脚本语言,在 PHP 的 8.3.8 版本之前存在命令执行漏洞,由于 Window…

SpringMVC框架学习笔记(七):处理 json 和 HttpMessageConverter 以及文件的下载和上传

1 处理 JSON-ResponseBody 说明: 项目开发中&#xff0c;我们往往需要服务器返回的数据格式是按照 json 来返回的 下面通过一个案例来演示SpringMVC 是如何处理的 &#xff08;1&#xff09; 在web/WEB-INF/lib 目录下引入处理 json 需要的 jar 包&#xff0c;注意 spring5.x…

MYSQL数据库下载和安装(详细)

1.点击MySQL官网(后续照着图走) 2.软件下载完点击进入安装 设置要安装的路径然后点击OK,后面点击下一步 再点击下一步 MySQL推荐使用最新的数据库和相关客户端&#xff0c;mysql8换了加密插件&#xff0c;所以如果选第一种方式&#xff0c;很可能导致你的navicat等客户端连不上…

基于C#开发web网页管理系统模板流程-主界面密码维护功能完善

点击返回目录-> 基于C#开发web网页管理系统模板流程-总集篇-CSDN博客 前言 紧接上篇->基于C#开发web网页管理系统模板流程-主界面统计功能完善-CSDN博客 一个合格的管理系统&#xff0c;至少一定存在一个功能——用户能够自己修改密码&#xff0c;理论上来说密码只能有用…

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱 在大数据处理和分析的场景中&#xff0c;Hadoop MapReduce是一种常见且高效的工具。本文将展示如何使用Hadoop MapReduce来分析邮件日志&#xff0c;提取邮件的发送状态&#xff08;成功、失败或退回&#xff09;和…

【云原生】使用kubekey部署k8s多节点及kubesphere

kubesphere官方部署文档 https://github.com/kubesphere/kubesphere/blob/master/README_zh.md kubuctl命令文档 https://kubernetes.io/zh-cn/docs/reference/kubectl/ k8s资源类型 https://kubernetes.io/zh-cn/docs/reference/kubectl/#%E8%B5%84%E6%BA%90%E7%B1%BB%E5%9E…