驾驶行为得分算法代码片段

驾驶行为得分算法

package com.yunshao.score;

import net.sf.json.JSONObject;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**

  • @Author: yunshao

  • @Date: 2018/8/15 15:58
    /
    @RestController
    @RequestMapping
    public class ViewController {
    /
    *

    • @param x1xishu 严重报警系数变量
    • @param x2xishu 中级报警系数变量
    • @param x3xishu 一般报警系数变量
    • @param genghuancishu 更换驾驶员次数
    • @param yanzhongcishu 严重报警次数
    • @param zhongjicishu 中级报警次数
    • @param yibancishu 一般报警次数
    • @param xingcheng 总行程(KM)
    • @return
      /
      @RequestMapping(value = “/getScore”)
      public String getScore(int x1xishu, int x2xishu, int x3xishu, int x1fenmu, int x2fenmu, int x3fenmu, int genghuancishu, int yanzhongcishu, int zhongjicishu, int yibancishu, double xingcheng) {
      Map map = new HashMap();
      //日行程小于10km为无效行程,视同为当日无行程,不予打分;
      if (xingcheng < 10) {
      map.put(“genghuanscore”, 0);
      map.put(“yanzhongscore”, 0);
      map.put(“zhongjiscore”, 0);
      map.put(“yibanscore”, 0);
      map.put(“zongscore”, 100);
      JSONObject jsonObject = JSONObject.fromObject(map);
      return jsonObject.toString();
      }
      /
      *
      • 这里先处理 x 的系数 也可以 封装成一个方法
        */
        int myX1 = x1xishu * yanzhongcishu;
        int myX2 = x2xishu * zhongjicishu;
        int myX3 = x3xishu * yibancishu;
        //得分计算
        String s = myScore(myX1, myX2, myX3, genghuancishu, xingcheng, yanzhongcishu, zhongjicishu, yibancishu, x1fenmu, x2fenmu, x3fenmu);
        return s;
        }

    /**

    • 得分计算
    • myScore(myX1, myX2, myX3, genghuancishu, xingcheng, yanzhongcishu, zhongjicishu, yibancishu,x1fenmu,x2fenmu,x3fenmu);
      /
      public static String myScore(int myX1, int myX2, int myX3, int genghuancishu, double L, int yanzhongcishu, int zhongjicishu, int yibancishu, int x1fenmu, int x2fenmu, int x3fenmu) {
      //重度事件(当日x1次)的得分:
      double yanzhongscore = softmax(myX1, myX1, myX2, myX3) * fen1(yanzhongcishu, L, x1fenmu);
      //中度事件(当日x2次)的得分:
      double zhongjiscore = softmax(myX2, myX1, myX2, myX3) * fen2(zhongjicishu, L, x2fenmu);
      //轻度事件(当日x3次)的得分:
      double yibanscore = softmax(myX3, myX1, myX2, myX3) * fen3(yibancishu, L, x3fenmu);
      //更换驾驶员事件得分
      double genghuanscore = illegal(genghuancishu);
      //总分数 Score(x)=100- Softmax(6x1)
      F1(x1)- Softmax(3x2)* F2(x2)- Softmax(x3) *F3(x3)- I(x).
      double zongscore = 100
      - softmax(myX1, myX1, myX2, myX3) * fen1(yanzhongcishu, L, x1fenmu)
      - softmax(myX2, myX1, myX2, myX3) * fen2(zhongjicishu, L, x2fenmu)
      - softmax(myX3, myX1, myX2, myX3) * fen3(yibancishu, L, x3fenmu)
      - illegal(genghuancishu);
      //封装数据返回
      Map map = new HashMap();
      map.put(“genghuanscore”, genghuanscore);
      map.put(“yanzhongscore”, yanzhongscore);
      map.put(“zhongjiscore”, zhongjiscore);
      map.put(“yibanscore”, yibanscore);
      map.put(“zongscore”, zongscore);
      JSONObject jsonObject = JSONObject.fromObject(map);
      return jsonObject.toString();
      }

    /**Softmax

    • 设当日总行程为L(km),当日严重报警事件
    • X1次,当日中度事件X2次,轻度事件X3次,则当日三种不同类型事件的权重系数按softmax函数设定为:
    • Softmax(6x1)=e^6x1/ (e^6x1 +e^3x2+ e^x3)
    • Softmax(3x2)= e^3x2/ (e^6x1 +e^3x2+ e^x3)
    • Softmax(x3)= e^x3/ (e^6x1 +e^3x2+ e^x3)
    • @param x x1xishu * yanzhongcishu
    • @param x1 x1xishu * yanzhongcishu
    • @param x2 x2xishu * zhongjicishu
    • @param x3 x3xishu * yibancishu
    • @return
      */
      public static double softmax(int x, int x1, int x2, int x3) {
      //Math.E=e; Math.Pow(a,b)=a^b
      double e = Math.E;
      double result = Math.pow(e, x) / (
      Math.pow(e, x1)
      + Math.pow(e, x2)
      + Math.pow(e, x3)
      );
      return result;
      }

    /**fen1

    • 得分(100分值扣分):F1
    • F1(x1)=200(S1(x1)-0.5);
    • @param x1 yanzhongcishu
    • @return
      */
      public static double fen1(double x1, double L, int x1fenmu) {
      //F1(x1)=200(S1(x1)-0.5);
      double mysigMoid1 = mysigMoid1(x1, L, x1fenmu);
      double result = 200 * (mysigMoid1 - 0.5);
      return result;
      }

    /**

    • 重度事件(当日x1次)的得分:
    • 对应的sigmoid函数为:S1(x1)=1/(1+e1;
    • 得分(100分值扣分):F1(x1)=200(S1(x1)-0.5);
    • 其中L是当日总里程,100x1/L表示当日的100km的重度事件次数;10的选取,是默认当日100km重度事件达10次,大约F1(x1)=40分;F1(x1)=200(S1(x1)-0.5)的设计是将函数值投射到100分值上。
    • @param x1 yanzhongcishu
    • @param L
    • @return
      */
      public static double mysigMoid1(double x1, double L, int x1fenmu) {
      //S1(x1)=1/(1+e2;
      double y = -((100 * x1) / L + 1) / x1fenmu;
      double ey = Math.pow(Math.E, y);
      double result = 1 / (1 + ey);
      return result;
      }

    /**fen2

    • 得分(100分值扣分):F2
    • F2(x2)=200(S2(x2)-0.5);
    • @param x2 zhongjicishu
    • @return
      */
      public static double fen2(double x2, double L, int x2fenmu) {
      double result = 200 * (mysigMoid2(x2, L, x2fenmu) - 0.5);
      return result;
      }

    /**

    • 中度事件(当日x2次)的得分:
    • 对应的sigmoid函数为:S2(x2)=1/(1+e3;
    • 得分(100分值扣分):F2(x2)=200(S2(x2)-0.5);
    • @param x2 zhongjicishu
    • @return
      */
      public static double mysigMoid2(double x2, double L, int x2fenmu) {
      //S2(x2)=1/(1+e4;
      double y = -((100 * x2) / L + 1) / x2fenmu;
      double ey = Math.pow(Math.E, y);
      double result = 1 / (1 + ey);
      return result;
      }

    /**

    • 得分(100分值扣分):F3
    • F3(x3)=200(S3(x3)-0.5);
    • @param x3 yibancishu
    • @return
      */
      public static double fen3(double x3, double L, int x3fenmu) {
      double result = 200 * (mysigMoid3(x3, L, x3fenmu) - 0.5);
      return result;
      }

    /**

    • 轻度事件(当日x3次)的得分:
    • 对应的sigmoid函数为:S3(x3)=1/(1+e5;
    • 得分(100分值扣分):F3(x3)=200(S3(x3)-0.5);
    • @param x3 yibancishu
    • @return
      */
      public static double mysigMoid3(double x3, double L, int x3fenmu) {
      double y = -((100 * x3) / L + 1) / x3fenmu;
      double ey = Math.pow(Math.E, y);
      double result = 1 / (1 + ey);
      return result;
      }

    /**

    • 违法得分
    • @param time
    • @return
      */
      public static double illegal(int time) {
      return 10 * time;
      }

}



  1. -(100x1/L+1)/10 ↩︎

  2. -(100x1/L+1)/10 ↩︎

  3. -(100x2/L+1)/20 ↩︎

  4. -(100x2/L+1)/20 ↩︎

  5. -(100x3/L+1)/40 ↩︎

### MATLAB 疲劳驾驶检测方法 #### 行为特征分析行为特征疲劳驾驶检测方法能够通过采集驾驶员的行为数据,提取特征并设计相应的检测算法判断驾驶员的疲劳状态。这种方法可以通过实时监测车辆行驶参数以及司机操作习惯的变化来进行评估[^1]。 ```matlab % 假设已获取到一系列时间序列形式的方向盘转角数据steering_angle_data function fatigue_level = detectFatigueFromSteering(steering_angle_data) % 计算标准差作为衡量指标之一 std_deviation = std(steering_angle_data); % 设定阈值用于区分正常与异常情况 threshold_value = 0.5; if std_deviation > threshold_value fatigue_level = 'High'; else fatigue_level = 'Low'; end end ``` 此函数`detectFatigueFromSteering`接收方向盘角度的时间序列输入,并返回一个表示疲劳程度的结果字符串。当方向盘转动的标准偏差超过预定义的阈值时,则认为存在较高的疲劳风险;反之则视为低度疲劳。 #### 面部表情识别技术 采用Adaboost等人脸检测算法可实现快速而准确的脸部位置锁定,在此基础上进一步应用图像处理手段捕捉眼睛闭合频率等细微变化以辅助判定是否存在困倦现象[^2]。 ```matlab function eye_closure_rate = calculateEyeClosureRate(face_image_sequence) adaboost_classifier = trainCascadeObjectDetector('face_cascade.xml'); % 加载训练好的级联分类器模型文件 detected_faces = cellfun(@(img)detect(adaboost_classifier,img), face_image_sequence,'UniformOutput',false); total_frames = length(face_image_sequence); blink_count = sum(cellfun(@isempty,detected_faces)); % 统计未检出脸部帧数即眨眼次数 eye_closure_rate = blink_count / total_frames; end ``` 上述代码片段展示了如何利用预先训练完成的Haar特征分类器对象(`adaboost_classifier`)对给定的一组连续抓拍图片(`face_image_sequence`)执行面部区域探测任务,并据此统计每秒内发生的眼睑活动比例——这通常被认为是反映个体精神集中力水平的重要生理信号之一。 #### 深度学习框架下的解决方案探索 近年来兴起的各种深层架构如ELMAN递归神经网络及其变体(LSTM/BiLSTM),乃至卷积层组合而成的空间-时间混合型结构(CNN-LSTM/CNN-BiLSTM),均被证明适用于解决复杂的模式匹配难题,包括但不限于视频流中的动作姿态解析工作[^4]。 ```matlab layers = [ sequenceInputLayer(inputSize,'Name','input') bilstmLayer(numHiddenUnits,'OutputMode','sequence','Name','bilstm') fullyConnectedLayer(outputSize,'Name','fc') regressionLayer('Name','output')]; options = trainingOptions('adam',... 'MaxEpochs',max_epochs,... 'MiniBatchSize',mini_batch_size,... 'InitialLearnRate',initial_learn_rate); net = trainNetwork(XTrain,YTrain,layers,options); YPred = predict(net,XTest); fatigue_score = mean(abs(YTest - YPred)); ``` 这里给出了一种基于双向长短期记忆单元构建循环神经网路的例子,它接受多维向量组成的时空序列作为输入源,经过充分迭代优化之后最终输出对于测试样本集预测误差的一个量化评价分数(fatigue_score)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值