1.方案架构:
图1 本方案核心框架示意
如图1所示,整个装卸车事件识别基于车辆内体积检测传感器上传的时序数据,分别经过数据处理模块,作业状态提取模块,短事件合并和异常事件剔除模块,最终输出车辆装卸车事件时间点及具体装载体积。
其中数据处理模块主要任务是数据清洗,数据标准化,拓展衍生指标,提取作业状态区间信号;作业状态提取模块主要任务是定义装卸车装换矩阵,结合装卸车事件特点进行噪音滤波,实现不同车辆,不同路线,不同时间,不同任务,不同装卸车效率的动态自适应计算;短事件合并模块主要是针对间隔时间极短的事件,将其与邻近的同类型事件进行合并,因为实际上是同一次作业事件;异常作业事件剔除模块主要任务是将合并之后依然存在事件从开始到结束持续时间极短的事件剔除掉,因为通常正常的装卸车事件会持续一段时间,当出现持续时间不合理时认为实际不是一次事件,需要剔除处理。
2、数据处理
图2 数据处理流程
数据处理模块如图2所示,主要包括三部分,数据预处理,【1】一阶特征处理,【2】二阶特征处理。
数据预处理:
由于每辆车的体积检测数据的频率不一致,也可能一辆车每天的数据监测频率不一样,比如有的车每10s监测一次,有的车每20s监测一次,还有40s监测一次,(此处不作完全罗列),又比如一辆车前一天每15s监测一次,后一天每25s监测一次,因此首先需要对不同频率的监测数据进行频率统一化处理,具体做法是将监测数据所在的分钟作为区分,计算当前分钟内的均值,最终统一成按分钟维度的监测数据【00】。另外,由于车辆作业出勤差异,或网络信号问题,导致云端接收到的监测数据有缺失,比如一辆车在9点到10点有执行任务,9点前和10点后每一分钟经过频率统一可以的到装载体积监测数据,而9点到10点之间缺失数据会导致时序数据不连续,对后续事件识别造成很大干扰,因此这里加入拉格朗日差值法【02】,目的是结合9点前和10点后的数据预测出9点与10点之间每一分钟应该补入哪些合理的值代替缺失值,从而使数据完整。
一阶特征处理:
如图2所示,在一阶特征处理模块中,可以看到体积监测数据记为volume,对其进行窗口为3的非中心点中值滑动平均,这里解释一下窗口3就是包含当前volume的3分钟窗口;非中心点指的是将当前volume作为窗口中最后一个元素,之所以使用非中心是因为监测数据更多是事前逻辑,即实际识别过程中不会等到事件结束很久之后再去识别,所以可用来计算的数据是当前监测数据之前的数据;这里的中值平滑即在窗口里的三个元素的中值作为当前元素的衍生指标,之所以使用中值滑动平均是考虑原始监测数据噪音较大,当窗口较小时中值有更好的稳定性,记为特征“3”,即为“进行窗口为3的非中心点中值滑动平均”的衍生特征【11】。
接下来同样逻辑只是调整窗口大小,依次进行“窗口为5的非中心点中值滑动平均”,“窗口为7的非中心点中值滑动平均”处理分别生成特征“5”和“7”,此处不作额外说明【12】【13】。
同时此处对volume进行了一次“窗口为10的非中心点均值滑动平均”,因为窗口为10已经可以不受噪音太大影响,所以此处倾向使用均值处理,生成的特征记为“10”【14】。
不同窗口尺寸的特征衍生表达了当前监测数据附近不同尺寸范围内的数据波动特性,因此借助卷积思想,将上述四个窗口尺寸处理的衍生指标进行均值化,生成特征“xx”,其权重以隐含在不同的窗口尺寸中【15】。
二阶特征处理:
一阶特征目的是表征原始volume特征,那么装卸车事件判定要依赖于监测数据的变化趋势和变化力度,因此相关处理放在二阶特征处理模块进行。
首先对特征“xx”进行一阶差分生成特征“diffxx”,具体做法是将当前监测数据减去前一分钟监测数据得到,一阶差分后数据波动较大,因此进行窗口为7的中心点中值平滑,将输出特征更新原始特征“diffxx”【21】【22】。
接下来对特征“diffxx”分别进行窗口的3,5,7,10的中心点中值滑动平均,分别生成特征“diffxx3”、“diffxx5”、“diffxx7”、“diffxx10”,最后将上述四个窗口特征进均值化处理,生成的特征更新于特征“diffxx”。至此,数据处理阶段完成了二阶特征部分。
3、作业状态提取
图3 作业状态识别流程
如图3所示,基于数据处理模块的计算结果,作业状态提取模块主要任务是探查哪些时序片段疑似装卸车片段,对此打上标签。
因此,在本模块先行定义状态转换矩阵,如表1所示,其作用是为了根据前一时刻与后一时刻状态切换来确定后一时刻的作业状态。分别将卸货状态标记为“0”,运输状态标记为“10”,装货状态标记为“20”,状态转移的列表头代表当前时刻的状态(前一时刻),行表头代表下一时刻的状态(后一时刻)。可以看到具有“卸货中”、“运输中”、“装货中”、“开始卸货”、“结束卸货”,“开始装货”、“结束卸货”、“错误状态1”、“错误状态2”共9种状态,其中“错误状态1”是前一时刻卸货,下一时刻装货,这与业务场景不符合,定义为异常状态,同理“错误状态2”是前一时刻装货,下一时刻卸货,同样这个也定义为异常状态。
装卸车状态转换矩阵 |
0(下一时刻卸货) |
10(下一时刻运输) |
20(下一时刻装货) |
0(当前时刻卸货) |
卸货中 |
结束卸货 |
错误状态1 |
10(当前时刻运输) |
开始卸货 |
运输中 |
开始装货 |
20(当前时刻装货) |
错误状态2 |
结束装货 |
装货中 |
表1 作业状态转换矩阵
此时,我们再来回看图3,假定已经确定装卸车阈值为threshold_xieche=0,threshold_zhuangche=0(实际阈值不可能为0,且阈值对每辆车需要单独求最优,阈值最优化放在后面描述,此处仅举例目的为说明作业状态识别逻辑)【01】,由数据处理模块输出的“diffxx”作为本模块输入,当特征“diffxx”<0时新增“tag”特征并将其标记为“0”,【04】,代表此刻卸车相关,当特征“diffxx”>0时“tag”标记为“20”【06】,代表此刻与装车相关,否则“tag”标记为“10”代表该时刻与装卸车无关【07】。这里的相关意思是不确定具体作业状态,比如与卸车相关,可能是“开始卸车”、“卸车中”、“结束卸车”,具体作业状态需要依赖状态转换矩阵进行后续处理。
为了识别具体的事件状态,在【08】处对特征“tag”进行一阶差分处理,目的是比较前一时刻和后一时刻状态变化,此处将处理结果作为特征“tag_pre”,具体含义代表当前时刻的前一时刻的状态。之后接入【09】作业状态识别模块进行具体状态的确定。
图4 作业状态识别模块
如图4所示,作业状态识别模块主要任务是跟据前一时刻与后一时刻状态的转换来确定后一时刻的具体状态。其实现逻辑就是状态转换矩阵的代码实现,因此此处输出的具体状态就是状态转移矩阵对应的9种作业状态。举例说明,当特征“tag_pre”等于0是,来看特征“tag”是否等于0,如果等于0,则状态为“卸货中”,如果特征“tag”等于10.,则此刻状态是卸车结束,同理其它7种状态都可以通过判断特征“tag_pre”和特征“tag”来确定。
图5 装卸车阈值梯度下降面
前面提到装卸车事件阈值,是假定为0,其实显然不符合实际情况,因此此处将描述如何确定装卸车最合理的阈值问题。对于装车事件来说,阈值的本质关系到二阶特征变化是否被过滤掉,比如传感器数据小幅度波动是否会被认为是装卸货导致的装载体积变化,又例如个别车辆在某个场地的装车效率低,单位时间内装载体积变化较小,是否会被认为是数据波动而不是装车。因此,由于车辆,场地,线路,装卸货效率,监测数据波动等因素,需要寻找对于装车事件识别和卸车事件识别较为稳定合理的阈值。这里的装车事件指的是一次“装车开始”与一次“装车结束”作为一个装车事件,同理卸车事件是一次“卸车开始”与“卸车结束”作为一次卸车事件。
通常,如果只考虑装车事件的阈值时,采用的方式是选取不同装车阈值,计算不同阈值对应的装车事件数量变化趋势,当阈值过大或过小是,由于偏离客观世界的真实阈值会导致装车数量急剧减小或急剧增大,而在真实阈值附近,装车事件数量变化比较平缓,基于这个原理来确定装车阈值。但本方案中面对的问题是装车事件和卸车事件是相互影响,当装车事件阈值不确定时卸车阈值不能单独计算,当卸车阈值不确定时其实装车阈值也没办法计算,因此本方案提出一种新思路,将装车和卸车阈值联合起来,分别设为X,Y坐标,在不同的装卸车阈值下计算装车事件数量与卸车事件数量总和,其值作为Z轴,如图5所示。因此装卸车最优阈值的问题转换为求空间曲面梯度变化最大的点。
图6 装卸车阈值二阶偏微分最值可视化
如图6所示,曲面梯度下降最大的点即为梯度变化最大的点,对应于高维曲率,当我们对曲面求二阶偏微分最值时,可以认为近似于曲率最大的点,最优阈值可以看到在(0.22,0.18),即装车阈值为0.22,卸车阈值为0.18。此处针对某一特定车辆,实际情况会针对不同车辆的运输特性计算属于本车辆作业情况的最优阈值,装卸车最优阈值不都是(0.22,0.18)。
图7 装卸车通过最优阈值滤波
如图7所示,蓝色是二阶特征“diffxx”,黄色是经过最优阈值过滤噪声之后对蓝色数据的变化力度的体现,其中变化力度指的是当前时刻较前一时刻变化的百分比,如式1。
式1 变化力度描述公式
事件类型 |
开始时间 |
结束时间 |
开始时装载体积 |
结束时装载体积 |
装货 |
2021/6/28 2:46 |
2021/6/28 3:05 |
3.195 |
6.635 |
装货 |
2021/6/28 7:20 |
2021/6/28 7:50 |
4.425 |
23.18 |
装货 |
2021/6/28 12:41 |
2021/6/28 13:21 |
3.945 |
26.64 |
装货 |
2021/6/28 13:27 |
2021/6/28 13:37 |
28.48 |
30.92 |
装货 |
2021/6/28 21:13 |
2021/6/28 21:16 |
4.635 |
6.4 |
装货 |
2021/6/28 21:46 |
2021/6/28 21:52 |
10.175 |
8.97 |
装货 |
2021/6/28 22:31 |
2021/6/28 22:38 |
9.93 |
13.11 |
装货 |
2021/6/28 22:43 |
2021/6/28 22:53 |
14.845 |
15.57 |
卸货 |
2021/6/28 0:01 |
2021/6/28 0:11 |
11.5 |
9.015 |
卸货 |
2021/6/28 0:15 |
2021/6/28 0:30 |
5.1 |
0.3 |
卸货 |
2021/6/28 3:36 |
2021/6/28 4:06 |
8.605 |
20.695 |
卸货 |
2021/6/28 4:12 |
2021/6/28 4:20 |
17.885 |
17.64 |
卸货 |
2021/6/28 5:25 |
2021/6/28 5:39 |
12.565 |
0.275 |
卸货 |
2021/6/28 8:01 |
2021/6/28 8:24 |
23.66 |
32.23 |
卸货 |
2021/6/28 10:37 |
2021/6/28 11:14 |
27.355 |
1.48 |
卸货 |
2021/6/28 11:48 |
2021/6/28 11:54 |
1.48 |
2.685 |
卸货 |
2021/6/28 13:47 |
2021/6/28 13:54 |
34.465 |
34.8 |
卸货 |
2021/6/28 15:20 |
2021/6/28 15:45 |
27.735 |
0.3 |
表2 作业状态提取模块输出展示
如表2所示某辆车的作业状态提取输出,其中不乏一些作业持续时间较短,事件间隔较短的事件,例如2021年6月28日 0点01开始的卸货时间持续10分钟,而本次事件在0点11分结束后,紧接着在0点15分时开始另一次卸货时间,两次事件间隔4分钟,与实际情况不符。因此,需要对接短事件合并模块和异常作业事件剔除模块进行最终处理。
4、装卸车事件拆分与合并
如上节所述,在作业状态提取模块中处理得到的事件存在两个同类型事件间隔事件较短,这种情况说明实际上这两个事件应该对齐合并,这里的同类型指的是“装车”或“卸车”事件。同时存在另一种情况是一个作业事件从开始到结束的持续时间较短,这种情况我们从业务场景实际出发,认为装车或卸车作业一般会持续一个时间段,不会在极短时间内完成,对于这类事件我们需要对其剔除掉。为了不丢失事件片段,因此我们先对事件合并,再对事件剔除,这所以这样做是因为先合并可以把一些持续时间短但间隔时间也短的事件保留下来,将其合并至邻近的同类事件中,在合并之后如果依然存在持续时间较短的事件,我们有理由相信这些事件更应该被剔除,而不是丢失掉一些正确事件。
图8 装车事件合并与剔除事件数量随阈值变化趋势
当然,此处装卸车合并阈值剔除阈值的确定可以根据平稳性计算,具体来说有四个阈值,分别是“装车间隔时间A”、“卸车间隔时间B”、“装车持续时间C”、“卸车持续时间D”。对于“装车间隔时间A”来看,我们可以选取不同阈值对表2进行计算,可得到不同阈值对应的装车事件数量,计算曲率最大的点对应的坐标即为“装车间隔时间A”,由于拐点计算比较通用,此处不作特殊说明。对于“装车持续时间C”、“卸车持续时间D”可以通过类似方式,分别计算“装车事件数量”、“卸车事件数量”、“卸车事件数量”来找到曲率最大点对应的坐标即为各个阈值。
事件类型 |
开始时间 |
结束时间 |
开始时装载体积 |
结束时装载体积 |
装车 |
2021/6/28 2:46 |
2021/6/28 3:05 |
3.195 |
6.635 |
装车 |
2021/6/28 3:36 |
2021/6/28 4:06 |
8.605 |
20.695 |
装车 |
2021/6/28 7:20 |
2021/6/28 8:24 |
4.425 |
32.23 |
装车 |
2021/6/28 12:41 |
2021/6/28 13:54 |
3.945 |
34.8 |
装车 |
2021/6/28 22:31 |
2021/6/28 22:53 |
9.93 |
15.57 |
卸车 |
2021/6/27 5:19 |
2021/6/27 5:29 |
10.53 |
2.6845 |
卸车 |
2021/6/27 10:34 |
2021/6/27 11:22 |
30.0505 |
2.705 |
卸车 |
2021/6/27 13:57 |
2021/6/27 14:22 |
18.91 |
17.565 |
卸车 |
2021/6/27 15:20 |
2021/6/27 15:37 |
14.05 |
0.295 |
卸车 |
2021/6/28 0:01 |
2021/6/28 0:30 |
11.5 |
0.3 |
卸车 |
2021/6/28 5:25 |
2021/6/28 5:39 |
12.565 |
0.275 |
卸车 |
2021/6/28 10:37 |
2021/6/28 11:14 |
27.355 |
1.48 |
卸车 |
2021/6/28 15:20 |
2021/6/28 15:45 |
27.735 |
0.3 |
表3 短事件合并和异常作业事件剔除之后事件识别效果
通过四个最优阈值的确定,我们可以对表2的输出进行装车事件合并,装车事件剔除,卸车事件合并,卸车事件剔除。最终可得到事件识别的结果,如表3所示。可以对比表3较表2而言,对一些事件进行了合并,同时剔除了一些事件。案例是针对特定一辆车,实际应用场景方案会针对每辆车的特点单独计算该车的参数阈值来实现最终装卸车事件识别最优化效果。
图9 本方案装卸车事件在装在数据上的输出示例
如图8所示,在装载体积数据上可视化展示了装卸车识别效果,其中volume是装载体积,随时间变化有波动,呈现局部锯齿状,橘色为本方案是别的卸车事件,对应的坐标位置即为装车事件起止时间点,灰色是本方案识别出的装车事件,同理可以确定到装车事件的起止时间点。