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

news2024/10/7 12:17:52

背景说明

        在视觉项目中,经常要判断目标的状态,例如:符号的不同频率闪烁、常亮等。然而常规的视觉算法例如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

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

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

相关文章

9 - 上升的温度(高频 SQL 50 题基础版)

9 - 上升的温度 -- 找出与之前(昨天的)日期相比温度更高的所有日期的 id -- DATEDIFF(2007-12-31,2007-12-30); # 1 -- DATEDIFF(2010-12-30,2010-12-31); # -1select w1.id from Weather w1, Weather w2 wheredatediff(w1.recordDate,w2.recordDat…

Android Studio项目升级报错:Namespace not specified

原项目升级AGP到8.0时报错: Namespace not specified. Specify a namespace in the modules build file: C:\Users\Administrator\Desktop\MyJetpack\app\build.gradle. See https://d.android.com/r/tools/upgrade-assistant/set-namespace for information about…

准研究生了解内容:如何挑选论文并下载

本文主要纪录自己从0开始摸索如何找论文,下载论文等的过程。 前言 (一点想法)## 作为准研究生,上岸后一直非常颓废,除了给人补课挣了点money,剩下时间都是打游戏,被老姐训诫后决定继续学习。毕…

1+x(Java)中级题库易混淆理论题(四)

Java 代码 15.2%5 的结果为0.2 super 关键字是在子类对象内部指代其父类对象的引用 IllegalAccessException 是访问权限不足构成的异常;ClassCastException 是类型转换异常;InputMismatchException 通常是使用 Scanner 输入数据时发生的异常。 List 集合…

分治法思想-归并排序案例图片详解

分治法简介 分治法思想 ​ 分治法,就是将一个难以解决的大问题给分成多个规模较小的子问题,分别解决各个子问题,最后合并子问题的解得到原问题的解。 分治法求解过程: 1、划分(分): ​ 把规…

GEO ISP图像调试-PFC(蓝紫边校正)

目录 1、简单介绍 2、调试策略 3、输出结果 1、简单介绍 GEO中中调整图像蓝紫边可分为两步,第一步:调整蓝紫边检测区域,第二步:设置去蓝紫边强度。 2、调试策略 图1 该图像蓝紫边较严重 主要原因是由于蓝紫边检测不准导致的&…

怎么买充电宝不踩雷?六大充电宝选购攻略,1分钟选对充电宝!

充电宝是选快充好还是慢充好呢?充电宝的充电速度取决于多个因素,包括充电宝的容量、输入电流、充电线的质量等。一般来说,充电宝的充电速度可以通过输入电流来衡量,输入电流越大,充电速度越快。当我们面临选择充电宝的…

常说的上游服务和下游服务如何区分?

目录 上游和下游 (upstream and downstream)从信息的流向方向来看从依赖规则和价值规则来看 总结参考 上游和下游 (upstream and downstream) 一般在谈论服务和调用关系的时候,我们会使用上游和下游来表示服务间的相关…

【后端开发】服务开发场景之高可用(冗余设计,服务限流,降级熔断,超时重试,性能测试)

【后端开发】服务开发场景之高可用(冗余设计,服务限流,降级熔断,超时重试,性能测试) 文章目录 序:如何设计一个高可用的系统?可用性的判断指标是什么?哪些情况会导致系统…

小学姐教你HarmonyOS开发-02-ArkTS语言基础

简单介绍基于TypeScript扩展的ArkTS语言。 ArkTS是鸿蒙生态的应用开发语言,由ArkUI框架提供,以声明式开发范式来开发界面,让开发者可以更简洁、更自然的方式开发高性能应用。 源课程:d2school(第2学堂) 什么是ArkTS? …

免费的维吾尔语翻译工具,汉维翻译软件只推荐这一个《维汉翻译通App》,维吾尔文OCR字母识别!

免费维吾尔语翻译,真好用 《维汉翻译通》App提供免费的短文本翻译服务,支持翻译维吾尔语和汉语,无论是日常对话还是学术研究的内容,都能轻松应对。 维吾尔文OCR,文字识别新体验 高精度维文文字识别技术,让…

跟着AI学AI_11 PyTorch, TensorFlow 和JAX 功能对比简介

PyTorch, TensorFlow 和 JAX 功能对比简介 PyTorch、TensorFlow 和 JAX 是当前最流行的深度学习框架。它们各自具有独特的特性和优势,适合不同的应用场景和开发者需求。下面是对这三个框架的功能对比。 1. 基本概念和特性 PyTorch: 动态计算图&#xf…

王炸ChatGPT学术应用!从文献综述至定稿,轻松完成优质学术论文

智写论文 智写论文(chatyy.cn)是一款专注AI科研和学术写作的专业平台,AI论文写作、AI学术润色修改、科研分析、文献搜索和综述撰写,科研数据分析、英文学术润色,中英学术互译,文献查询和综述撰写&#xff…

知识图谱的应用---智慧外交

文章目录 智慧外交典型应用 智慧外交 智慧外交是指通过事件分析的手段,从历史、政治、经济、军事、文化等多个层面对各个国家的关系进行定量分析,提供智能化的外交关系研判和外交决策支撑。依托公开媒体、互联网及内部信息等海量资源数据,综合…

vivado HW_SIO_RX

HW_SIO_RX 描述 在硬件设备上,每个GT包括一个独立的接收器hw_sio_rx 由一个PCS和一个PMA组成。高速串行数据从板上的迹线流入 GTX/GTH收发器RX的PMA,进入PCS,最后进入FPGA逻辑。 相关对象 HW_SIO_RX对象与HW_server、HW_target、HW_device、H…

STM32F103 ADC

STM32 ADC 12位ADC是一种逐次逼近型模拟数字转换器,和比较型ADC相比,逐次逼近型ADC的优点是低功耗,缺点是速度慢。下图为逐次逼近型ADC。 ​ STM32F103的ADC有单次和连续转换两种模式,有通道扫描和单独工作两种模式,并且有校准和…

Gi标签管理

文章目录 前言理解标签创建标签操作标签总结 前言 理解标签 标签,可以理解为对某次commit的一次标识,相当于起起了一个别名。 例如,在项目发布某个版本时候,针对最后一次commit起一个v1.0这样的标签来标识里程碑的意义。 这有什…

inferCNV:scRNA-seq数据推断染色体拷贝数变化

inferCNV分析简介 inferCNV用于探索肿瘤单细胞RNA-Seq 数据,以确定体细胞大规模染色体拷贝数改变的证据,例如整个染色体或大片段染色体的增益或缺失。这是通过与一组参考“正常”细胞(这里的正常细胞可自行定义)进行比较&#xf…

【STM32】输入捕获应用-测量脉宽或者频率(方法2)

链接:https://blog.csdn.net/gy3509/article/details/139629893?spm1001.2014.3001.5502,讲述了只使用一个捕获寄存器测量脉宽和频率的方法,其实测量脉宽和频率还有一个更简单的方法就是使用PWM输入模式,PWM输入模式需要占用两个…

Imagic: Text-Based Real Image Editing with Diffusion Models

Imagic: Text-Based Real Image Editing with Diffusion Models Bahjat Kawar, Google Research, CVPR23, Paper, Code 1. 前言 在本文中,我们首次展示了将复杂(例如,非刚性)基于文本的语义编辑应用于单个真实图像的能力。例如…