开关门动作识别模型开发

该项目旨在开发电梯开关门识别系统,经历了从基于模板匹配到图像分类再到视频动作识别的三个开发阶段。使用了C3D算法进行3D卷积操作,通过数据增强提升模型性能。针对识别中的问题,如类别混淆和特殊场景误识别,进行了模型优化,包括状态机设计和后处理计数方法,提高了识别的稳定性和准确性。然而,单开门数据的缺乏仍然是一个挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 编写目的

2. 项目背景

3. 开发结果

3.1 主要功能

3.2 精度&&性能

4. 开发过程总结

4.1 场景分析

4.2 算法调研

4.3 算法开发

4.3.1 阶段一:基于零样本的开发

4.3.2 阶段二:基于图像的开发--图像分类

4.3.3 阶段三:基于视频的开发--动作识别

5. 遗留问题

  1. 编写目的
  1. 总结本项目开发经验和所学到的知识;
  2. 将开发过程中遇到的问题加以阐述和说明。
  1. 项目背景

名称:开关门识别

提出者:佳博

开发时间:2022年3月11日-

  1. 开发结果

3.1 主要功能

功能点

说明

开门、关门识别

门完全关才算关

开关门异常识别

门卡住

3.2 精度&&性能

指标

输入尺寸

量化精度

推理耗时(200MHz)

准确率

112x112

Int16

13ms

99.97%

  1. 开发过程总结

4.1 场景分析

场景

说明

电梯类型

双开门、单开门

图像尺寸

正常模式(16:9)

中间尺寸

走廊模式(9:16)

电梯门

带电梯门屏幕电梯

不带电梯门屏幕

4.2 算法调研

相关算法:

    • 模板匹配
    • 相似性比对
    • 图像识别
    • 行为识别
    • 标志物检测(海康)

4.3 算法开发

4.3.1 阶段一:基于零样本的开发

方法1:模板匹配

测试集:

抖音视频:电梯监控视频

测试结果:

受人影闪动等光线条件不稳定影响,匹配结果的稳定性很差。

    

方法2:相似性比对

测试集:

同模板匹配

测试结果:

  1. 对开关门具有一定的区分度;

例:关门相似度为0.98,开门相似度为0.92

  1. 不同电梯的开关门阈值差异大;

例:一部电梯关门相似度为0.98,开门相似度为0.92,另一部电梯关门相似度为0.85,开门相似度为0.7。

  1. 对于环境的变化,基本没有优化措施可用

例:遮挡、光线变化、物体搬移

4.3.2 阶段二:基于图像的开发--图像分类

图像来源:维小保

训练集:

数量:6000张

开门类别:

关门类别:

数据预处理

  1. 图像识别要尽可能去处多余的背景,电梯开关门截取上半部分图片。
  2. 数据增强:

类型

取值范围

执行概率(%)

随机resize

16:9--9:16

1

随机裁剪

0.02

灰度图

0.5

随机变色

0.02

随机噪声

椒盐噪声、高斯噪声

0.02

随机模糊

高斯模糊

0.02

随机畸变

中心点畸变、水平/垂直畸变,适应不同尺寸的电梯门

0.1

随机遮挡

0.02

水平翻转

0.5

随机旋转

-30°-- 30°

0.1

测试结果:

  1. 精度可以达到99%以上;
  2. 存在无法解决的场景:

无法应对电梯门贴巨幅广告的场景;

无法应对特定电梯外背景;

例:电梯外正对管道井门或消防栓门。

4.3.3 阶段三:基于视频的开发--动作识别

视频来源:维小保、云梯

4.3.3.1 面向sca200的动作识别算法设计过程

1. 基于C3D算法的开关门识别精度验证

训练集:

输入帧数:4帧

类别:

开门:

关门:

门不动:

输入:

4x3x112x112

数据预处理:

  1. 尽可能去处多余的背景,电梯开关门截取上半部分图片。
  2. 数据增强:

类型

取值范围

执行概率(%)

随机resize

16:9--9:16

1

随机裁剪

0.02

灰度图

0.5

随机变色

0.02

随机噪声

椒盐噪声、高斯噪声

0.02

随机模糊

高斯模糊

0.02

随机畸变

中心点畸变、水平/垂直畸变,适应不同尺寸的电梯门

0.1

随机遮挡

0.02

水平翻转

0.5

随机旋转

-30°-- 30°

0.1

测试结果:

  1. 精度可以达到99%以上;
  2. 可以解决图像分类难分样本。

但是sca200不支持3D卷积运算,需要采用2D卷积来近似实现3D卷积的功能。

  1. N通道输入的2DCNN分类网络

输入:

将4帧3x112x112的图像合并为12x112x112的Tensor,图像分类网络输入卷积层改为3x3x12,

数据预处理:

同上

测试结果:

训练精度在90%左右。分析:2DCNN神经网络对通道顺序不敏感,比如,同一个模型,RGB输入和BGR输入预测的结果相近。

  1. 仿C3D

说明:C、H、W维度降采样次数与C3D保持一致。

输入:

4个3x112x112输入

数据预处理:

同上

测试结果:

类比C3D

4.3.3.2 模型优化

参数规模:

精度不下降的前提下,参数量可降为原模型的1/5。

数据增强:

类型

取值范围

执行概率(%)

帧倒序

0.5

帧乱序

0.5

特殊场景优化

  1. 临界状态切换不稳定

修改类别标签:

关门:

关门中:

开门:

门不动:

开门中:

添加状态机:

状态转移表:(0:关门  1:关门中  2:开门 3:门不动)

现态

次态

输出

0

3

3

0

2

2

1

0

0

1

2

2

1

3

0

2

3

3

2

1

1

3

2

2

3

1

1

任意

=现态

现态

任意

连续四次结果一样但不在以上转移范围

转移到和四次结果一样的状态

其他

不变

问题:

关门中与关门、开门中与开门存在10%的类别混淆。

  1. 竖线条状物体的移动会导致识别错误

细分任务上的模型容易受到噪声干扰,借鉴大模型思想,采用开源数据集ucf作为上游任务,训练具有200个类别(含开关门类别)的大模型。

  1. (针对类别混淆)提高稳定性:输入模糊+输出计数

采用线性滤波器对输入进行特定方向的滤波,只保留门缝清晰:

分别合并开门与开门中、关门与关门中,输出后处理从状态机改为计数。开关门动作是个连续缓变的过程,而不是突变过程,因此可以采用计数累加形式。后处理:

  1. 设定计数器,值域为0~7
  2. 当输出状态为0时,计数器减1;当输出状态为1时,计数器加1
  3. 设定开门阈值o和关门阈值c,当计数器值<c,判断为关,当计数器值>o,判断为开。

5. 遗留问题

缺乏单开门数据

### Unity2D 中通过触发器实现开关门功能 在 Unity2D 的开发过程中,可以通过 `Collider2D` 和触发器机制来实现游戏中的动态交互行为,比如开关门功能。以下是详细的说明以及代码示例。 #### 触发器的工作原理 触发器是一种特殊的碰撞体,在其 `Is Trigger` 属性被启用的情况下不会阻止其他刚体穿过它,而是仅用于检测事件的发生。当一个带有触发器的对象与其他具有 `Rigidbody2D` 或同样启用了触发器的碰撞体发生重叠时,会调用特定的方法,例如 `OnTriggerEnter2D`、`OnTriggerStay2D` 和 `OnTriggerExit2D`[^5]。 #### 实现步骤概述 为了实现开关门的功能,通常需要以下几个部分: 1. **创建门对象**:定义一扇可打开和关闭的门。 2. **添加碰撞体和触发器**:为玩家角色或其他触发源配置 `Collider2D` 并启用 `Is Trigger` 属性。 3. **编写逻辑脚本**:处理触发事件并改变门的状态(开/关)。 --- #### 示例代码 假设我们有一个场景,其中包含以下元素: - 一个名为 `Door` 的对象表示门。 - 一个名为 `Player` 的对象代表玩家角色。 ##### 脚本:DoorController.cs 此脚本负责管理门的开启与关闭状态: ```csharp using UnityEngine; public class DoorController : MonoBehaviour { public bool isClosed = true; // 初始状态下门是关闭的 private Animator animator; // 假设门有动画控制器 void Start() { animator = GetComponent<Animator>(); if (animator == null) Debug.LogWarning("Animator component not found on door!"); UpdateDoorState(); // 初始化门的状态 } public void ToggleDoor() // 切换门的状态 { isClosed = !isClosed; UpdateDoorState(); } private void UpdateDoorState() { if (animator != null) { animator.SetBool("IsClosed", isClosed); // 控制动画参数 } else { // 如果没有动画,则简单调整位置或透明度等方式模拟开门效果 this.gameObject.SetActive(!isClosed); } } } ``` ##### 脚本:TriggerHandler.cs 该脚本附加在玩家身上或者任何能激活触发器的角色上,用来响应触发事件并与门互动: ```csharp using UnityEngine; public class TriggerHandler : MonoBehaviour { private void OnTriggerEnter2D(Collider2D other) // 当进入触发区域时执行 { if (other.CompareTag("Door")) // 检查是否触碰到标记为“Door”的对象 { var doorScript = other.GetComponent<DoorController>(); if (doorScript != null) doorScript.ToggleDoor(); // 调用门的切换方法 } } } ``` --- #### 场景设置指南 1. 创建一个新项目并将两个脚本分别命名为 `DoorController.cs` 和 `TriggerHandler.cs`。 2. 将 `DoorController.cs` 添加到门对象,并为其分配合适的动画资源(如果适用)。如果没有动画支持,可以直接隐藏或显示门模型。 3. 给门对象打上标签 `"Door"` 方便识别。 4. 对于玩家或者其他可能触发动作的对象,挂载 `TriggerHandler.cs` 脚本,并确保它们拥有有效的 `Collider2D` 及 `Rigidbody2D` 配置。 5. 测试运行程序验证结果。 --- ### 注意事项 - 确保所有涉及的 GameObjects 上都已正确定义了各自的 Collider 类型及其属性值,尤其是 Is Trigger 设置要一致才能正常工作[^3]。 - 动画系统的引入并非强制性的;对于简单的视觉反馈来说也可以采用修改 alpha 值或是变换 scale 来代替复杂的骨骼动画表现形式[^4]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值