NGSIM数据集之用sEMA算法进行平滑与滤波(MATLAB代码实现)

0. NGSIM intro

       NGISM是美国联邦公路局的车辆轨迹数据集中的 i-80 和 US-101 。 2 个数据集包含 6 个 15 min 采集轨迹子集, 其中的车辆状态数据是用10Hz (1 frame=0.1s)频率进行拍摄的多台高空相机对交通路况进行采集,然后再利用图像处理技术得到的, 数据包括车辆 ID、位置、速度、加速度、当前车道 ID,etc.。官方的NGSIM数据下载可评论留下邮箱看到后分享

1. sEMA Data filter

       NGSIM的数据类存在较大的噪声以及异常值,如果非必要精准的重构车辆的轨迹我们可以采用一些常见的滤波算法进行数据集平滑和异常值处理,eg. sEMA(symmetric exponential moving average) & S-G (Savitzky-Golay) & 小波变化 etc., 这里作者采用sEMA算法进行滤波。

2. code and simulation 

sEMA Part-codes

for f=1:1:r1  
 
    % --------------------------------
    % 提取 Vid=f 
    % using Local_x ,column=5
    S_V_Lx_calc=TrajData0415(  TrajData0415(:,1)==Vid_arr0415(f,1),5 );
    
    %  Vid=f 
    [Nr,Nc]=size(S_V_Lx_calc); 
   
    % 数据点个数
    %-----------------------------------------------------------------------     
    % 求解 数据集中的横向速度:Vx_0415
 
    for e=1:1:Nr   % Vx_0415 Acc_x0415 calc.
        
        if e==1
            
            Vx_0415_calc(f,e)= (S_V_Lx_calc(e+1,1)-S_V_Lx_calc(e,1))/dto;  % for Vx_0415
           
        elseif 2<=e && e<=Nr-1
            
            Vx_0415_calc(f,e)= (S_V_Lx_calc(e+1)-S_V_Lx_calc(e-1))/(2*dto);
            
            Acc_x0415_calc(f,e)=(S_V_Lx_calc(e+1)-2*S_V_Lx_calc(e,1)+S_V_Lx_calc(e-1))/dt2;
            
        elseif e==Nr
            
            Vx_0415_calc(f,e)= Vx_0415_calc(f,e-1); 
        end
    end
    % 单独计算 
     Acc_x0415_calc(f,1)=(Vx_0415_calc(f,2)-Vx_0415_calc(f,1))/dt;
     Acc_x0415_calc(f,Nr)=Acc_x0415_calc(f,Nr-1);
end
 
% for vy_0415_calc
Vx_0415_calcinv=Vx_0415_calc';        % 转置
Vx_0415_calc_=Vx_0415_calcinv(:);   
Vx_0415_calc_(Vx_0415_calc_==inf)=[]; % 去除预设的inf量 preallcation
 
% for Acc_x0415_calc
Acc_x0415inv_calc=Acc_x0415_calc';        
Acc_x0415_calc_=Acc_x0415inv_calc(:);    
Acc_x0415_calc_(Acc_x0415_calc_==inf)=[]; 
 
for w=1:1:r
    
    TrajData0415_calc(w,19)=Vx_0415_calc_(w,1)*0.3048;   % ft-->meter
    TrajData0415_calc(w,20)=Acc_x0415_calc_(w,1)*0.3048;
    
    for ww=[5,6,12,13]
        TrajData0415_calc(w,ww)=TrajData0415(w,ww)*0.3048;
    end
    
    for ww=[1,2,3,4,7,8,9,10,11,14,15,16,17,18]  % column index
        TrajData0415_calc(w,ww)=TrajData0415(w,ww);
    end
    
end

sEMA 滤波效果:

        分析可知滤波后的数据在保留数据集原有信息的同时可以很好处理NGSIM中的尖点与噪声。MMiL欢迎大家交流与讨论,一起进步 !

### 实现或改进 SEAM 模块 #### 设计思路 为了增强YOLOv8的多尺度特征融合能力,在网络结构中引入SEMA(Squeeze-and-Excitation Multi-scale Aggregation)模块可以有效提高模型的表现。通过调整不同层次特征图的重要性权重,使得模型能够更好地捕捉目标物体的不同尺寸细节[^1]。 #### 构建方法 具体来说,可以在YOLOv8的基础架构上加入SEMA机制: 1. **挤压操作**:对于每个尺度下的特征映射执行全局平均池化,得到一维向量作为通道描述符; 2. **激励函数应用前的全连接层处理**:利用两个连续的全连接神经元来构建瓶颈效应,从而减少参数数量并增加非线性变换的能力; 3. **比例缩放后的加权求和**:将经过上述两步计算得出的结果重新作用回原始特征映射之上,以此达到动态调节各通道贡献度的目的。 以下是Python代码片段展示如何定义这样一个自定义层: ```python import torch.nn as nn class SEModule(nn.Module): def __init__(self, channels, reduction=16): super(SEModule, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channels, channels // reduction), nn.ReLU(inplace=True), nn.Linear(channels // reduction, channels), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y.expand_as(x) def add_sema_to_yolov8(model): """Add SEMA module to the backbone of YOLOv8.""" for name, layer in model.backbone.named_children(): if isinstance(layer, nn.Conv2d): # Assuming conv layers need attention setattr(model.backbone, name, nn.Sequential(layer, SEModule(layer.out_channels))) ``` 此段代码展示了如何创建一个简单的SE模块类,并提供了一个辅助函数用于修改现有YOLOv8实例中的骨干网部分,使其具备SEMA特性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Liooo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值