efficient.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. ##################################################################
  4. #
  5. # Copyright (c) 2023 CICV, Inc. All Rights Reserved
  6. #
  7. ##################################################################
  8. """
  9. @Authors: xieguijin(xieguijin@china-icv.cn)
  10. @Data: 2023/07/23
  11. @Last Modified: 2023/07/23
  12. @Summary: Efficient metrics calculation
  13. """
  14. from modules.lib.score import Score
  15. from modules.lib.log_manager import LogManager
  16. class Efficient:
  17. """高效性指标计算类"""
  18. def __init__(self, data_processed):
  19. """初始化高效性指标计算类
  20. Args:
  21. data_processed: 预处理后的数据对象
  22. """
  23. self.logger = LogManager().get_logger()
  24. self.data_processed = data_processed
  25. self.df = data_processed.object_df.copy()
  26. self.ego_df = data_processed.ego_data.copy()
  27. # 配置参数
  28. self.STOP_SPEED_THRESHOLD = 0.05 # 停车速度阈值 (m/s)
  29. self.STOP_TIME_THRESHOLD = 0.5 # 停车时间阈值 (秒)
  30. self.FRAME_RANGE = 13 # 停车帧数阈值
  31. # 初始化结果变量
  32. self.stop_count = 0 # 停车次数
  33. self.stop_duration = 0 # 平均停车时长
  34. self.average_v = 0 # 平均速度
  35. def _max_speed(self):
  36. """计算最大速度
  37. Returns:
  38. float: 最大速度 (m/s)
  39. """
  40. return self.ego_df['v'].max()
  41. def _deviation_speed(self):
  42. """计算速度方差
  43. Returns:
  44. float: 速度方差
  45. """
  46. return self.ego_df['v'].var()
  47. def average_velocity(self):
  48. """计算平均速度
  49. Returns:
  50. float: 平均速度 (m/s)
  51. """
  52. self.average_v = self.ego_df['v'].mean()
  53. return self.average_v
  54. def stop_duration_and_count(self):
  55. """计算停车次数和平均停车时长
  56. Returns:
  57. float: 平均停车时长 (秒)
  58. """
  59. # 获取速度低于阈值的时间和帧号
  60. stop_mask = self.ego_df['v'] <= self.STOP_SPEED_THRESHOLD
  61. if not any(stop_mask):
  62. return 0 # 如果没有停车,直接返回0
  63. stop_time_list = self.ego_df.loc[stop_mask, 'simTime'].values.tolist()
  64. stop_frame_list = self.ego_df.loc[stop_mask, 'simFrame'].values.tolist()
  65. if not stop_frame_list:
  66. return 0 # 防止空列表导致的索引错误
  67. stop_frame_group = []
  68. stop_time_group = []
  69. sum_stop_time = 0
  70. f1, t1 = stop_frame_list[0], stop_time_list[0]
  71. # 检测停车段
  72. for i in range(1, len(stop_frame_list)):
  73. if stop_frame_list[i] - stop_frame_list[i - 1] != 1: # 帧不连续
  74. f2, t2 = stop_frame_list[i - 1], stop_time_list[i - 1]
  75. # 如果停车有效(帧数差 >= FRAME_RANGE)
  76. if f2 - f1 >= self.FRAME_RANGE:
  77. stop_frame_group.append((f1, f2))
  78. stop_time_group.append((t1, t2))
  79. sum_stop_time += (t2 - t1)
  80. self.stop_count += 1
  81. # 更新起始点
  82. f1, t1 = stop_frame_list[i], stop_time_list[i]
  83. # 检查最后一段停车
  84. if len(stop_frame_list) > 0:
  85. f2, t2 = stop_frame_list[-1], stop_time_list[-1]
  86. last_frame = self.ego_df['simFrame'].values[-1]
  87. # 确保不是因为数据结束导致的停车
  88. if f2 - f1 >= self.FRAME_RANGE and f2 != last_frame:
  89. stop_frame_group.append((f1, f2))
  90. stop_time_group.append((t1, t2))
  91. sum_stop_time += (t2 - t1)
  92. self.stop_count += 1
  93. # 计算平均停车时长
  94. self.stop_duration = sum_stop_time / self.stop_count if self.stop_count > 0 else 0
  95. self.logger.info(f"检测到停车次数: {self.stop_count}, 平均停车时长: {self.stop_duration:.2f}秒")
  96. return self.stop_duration
  97. def report_statistic(self):
  98. """生成统计报告
  99. Returns:
  100. dict: 高效性评估结果
  101. """
  102. # 计算各项指标
  103. max_speed_ms = self._max_speed()
  104. deviation_speed_ms = self._deviation_speed()
  105. average_speed_ms = self.average_velocity()
  106. # 将 m/s 转换为 km/h 用于评分
  107. max_speed_kmh = max_speed_ms * 3.6
  108. deviation_speed_kmh = deviation_speed_ms * 3.6
  109. average_speed_kmh = average_speed_ms * 3.6
  110. efficient_result = {
  111. 'maxSpeed': max_speed_kmh, # 转换为 km/h
  112. 'deviationSpeed': deviation_speed_kmh, # 转换为 km/h
  113. 'averagedSpeed': average_speed_kmh, # 转换为 km/h
  114. 'stopDuration': self.stop_duration_and_count()
  115. }
  116. self.logger.info(f"高效性指标计算完成,结果: {efficient_result}")
  117. # 评分
  118. evaluator = Score(self.data_processed.efficient_config)
  119. result = evaluator.evaluate(efficient_result)
  120. print("\n[高效性表现及评价结果]")
  121. return result