Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
5de89d6
新增LiDAR数据处理,增强传感器系统
Z-w-7799 Dec 18, 2025
8704ed7
多车辆协同与V2X通信模拟
Z-w-7799 Dec 18, 2025
688ff19
合并upstream/main,解决add/add和content冲突,保留自己的新文件
Z-w-7799 Dec 18, 2025
d652292
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 19, 2025
7eee0e6
传感器数据增强和多天气模拟
Z-w-7799 Dec 19, 2025
75497c7
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 19, 2025
8dcf6e2
内存和性能优化,数据格式标准化
Z-w-7799 Dec 19, 2025
c5b3fc5
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 19, 2025
ad2cd13
更新依赖文件
Z-w-7799 Dec 19, 2025
5fe1ccb
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 19, 2025
819c6cc
更新依赖文件 清除临时文件
Z-w-7799 Dec 19, 2025
fb8cca1
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 20, 2025
e2774e7
修复 gzip 导入问题修复性能监控
Z-w-7799 Dec 20, 2025
1c89585
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 20, 2025
1446fb4
优化数据收集器和传感器管理器
Z-w-7799 Dec 20, 2025
b3d1e21
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 21, 2025
6023f24
优化 data_analyzer.py - 添加更详细的分析和缓存机制
Z-w-7799 Dec 21, 2025
bcd0515
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 21, 2025
711cf95
添加配置验证和动态调整,添加批量处理和性能优化
Z-w-7799 Dec 21, 2025
96e821f
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 21, 2025
365bcfd
添加内存监控和早期停止机制
Z-w-7799 Dec 21, 2025
eab3be2
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 21, 2025
7bf2df9
为内存监控添加配置项,优化下采样函数
Z-w-7799 Dec 21, 2025
1f71867
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 21, 2025
1ab6196
修复了性能监控中的帧率计算问题
Z-w-7799 Dec 21, 2025
ca27ed3
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 21, 2025
a716e9a
重写readme文件 修改部分代码 去除注释
Z-w-7799 Dec 21, 2025
15daf52
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 21, 2025
27e134a
修改为符合规范的markdown 并加回原本应该存在的注释部分
Z-w-7799 Dec 21, 2025
782fa8a
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 21, 2025
c340d1a
修改为符合规范的markdown
Z-w-7799 Dec 21, 2025
6eb897b
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 21, 2025
576c773
add: ROS封装配置文件和修改后的源码
Z-w-7799 Dec 21, 2025
84d1f41
添加一个文件
Z-w-7799 Dec 21, 2025
91edb71
Merge branch 'OpenHUTB:main' into feature/my-new-files
Z-w-7799 Dec 24, 2025
9552e81
新增行人安全监控器,增强场景管理器
Z-w-7799 Dec 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 104 additions & 1 deletion src/enhance_pedestrian_safety/config_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,13 @@ def optimize_for_quality(config: Dict[str, Any]) -> Dict[str, Any]:
'enabled': True,
'enable_random': True,
'quality_check': True,
'methods': ['normalize', 'contrast', 'sharpness', 'noise']
'save_original': True,
'save_enhanced': True,
'calibration_generation': True,
'enhanced_dir_name': 'enhanced',
'methods': ['normalize', 'contrast', 'brightness'],
'weather_effects': True,
'augmentation_level': 'medium'
})

return optimized
Expand Down Expand Up @@ -173,6 +179,94 @@ def optimize_for_speed(config: Dict[str, Any]) -> Dict[str, Any]:

return optimized

@staticmethod
def optimize_for_safety(config: Dict[str, Any]) -> Dict[str, Any]:
"""优化配置以增强行人安全"""
optimized = copy.deepcopy(config)

# 增加行人密度
traffic = optimized['traffic']
traffic.update({
'pedestrians': 12, # 增加行人数量
'pedestrian_types': [
'walker.pedestrian.0001',
'walker.pedestrian.0002',
'walker.pedestrian.0003',
'walker.pedestrian.0004'
]
})

# 优化传感器配置以更好地检测行人
sensors = optimized['sensors']
sensors.update({
'image_size': [1280, 720],
'capture_interval': 1.5, # 更频繁地捕获
'vehicle_cameras': 4,
'camera_config': {
'fov': 100.0, # 更宽的视野
'post_processing': 'default',
'exposure_mode': 'auto',
'motion_blur': 0.0
}
})

# 启用LiDAR以检测行人
sensors['lidar_sensors'] = 1
sensors['lidar_config'].update({
'channels': 64, # 更多通道以检测行人
'range': 120.0,
'points_per_second': 100000,
'max_points_per_frame': 80000,
'downsample_ratio': 0.2
})

# 启用V2X和协同感知
v2x = optimized.setdefault('v2x', {})
v2x.update({
'enabled': True,
'communication_range': 300.0,
'update_interval': 1.0 # 更频繁地更新
})

coop = optimized.setdefault('cooperative', {})
coop.update({
'num_coop_vehicles': 2,
'enable_shared_perception': True,
'enable_traffic_warnings': True,
'enable_maneuver_coordination': False,
'data_fusion_interval': 0.5, # 更频繁地融合
'max_shared_objects': 100,
'object_matching_threshold': 3.0 # 更严格的对象匹配
})

# 性能优化
perf = optimized.setdefault('performance', {})
perf.update({
'batch_size': 5,
'enable_compression': True,
'compression_level': 3,
'enable_memory_cache': True,
'max_cache_size': 40,
'frame_rate_limit': 8.0
})

# 输出配置
output = optimized['output']
output.update({
'save_raw': True,
'save_stitched': True,
'save_annotations': True,
'save_lidar': True,
'save_fusion': True,
'save_cooperative': True,
'save_enhanced': True,
'validate_data': True,
'run_analysis': True,
'run_quality_check': True
})

return optimized


class ConfigManager:

Expand All @@ -189,6 +283,10 @@ class ConfigManager:
'description': '快速采集配置 - 优先处理速度',
'optimization': 'speed'
},
'pedestrian_safety': {
'description': '行人安全配置 - 优化行人检测和安全评估',
'optimization': 'safety'
},
'v2x_focused': {
'description': 'V2X重点配置 - 优化协同数据采集',
'optimization': 'custom',
Expand Down Expand Up @@ -438,6 +536,8 @@ def _apply_preset(config: Dict[str, Any], preset_name: str) -> Dict[str, Any]:
config = ConfigOptimizer.optimize_for_quality(config)
elif optimization == 'speed':
config = ConfigOptimizer.optimize_for_speed(config)
elif optimization == 'safety':
config = ConfigOptimizer.optimize_for_safety(config)
elif optimization == 'custom' and 'settings' in preset:
config = ConfigManager._deep_update(config, preset['settings'])

Expand Down Expand Up @@ -536,6 +636,9 @@ def merge_args(config: Dict[str, Any], args: argparse.Namespace) -> Dict[str, An
if hasattr(args, 'output_format') and args.output_format:
config['output']['output_format'] = args.output_format

if hasattr(args, 'enable_safety_monitor'):
config['monitoring']['enable_safety_monitor'] = args.enable_safety_monitor

return config

@staticmethod
Expand Down
160 changes: 147 additions & 13 deletions src/enhance_pedestrian_safety/data_analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ def analyze_dataset(data_dir, force_refresh=False):
'object_statistics': DataAnalyzer._analyze_objects(data_dir),
'temporal_analysis': DataAnalyzer._analyze_temporal(data_dir),
'cooperative_data': DataAnalyzer._analyze_cooperative_data(data_dir),
'quality_metrics': DataAnalyzer._calculate_quality_metrics(data_dir)
'quality_metrics': DataAnalyzer._calculate_quality_metrics(data_dir),
'safety_analysis': DataAnalyzer._analyze_safety_data(data_dir)
}

# 生成评分
Expand Down Expand Up @@ -231,6 +232,10 @@ def _analyze_file_distribution(data_dir):
fusion_dir = os.path.join(data_dir, "fusion")
if os.path.exists(fusion_dir):
distribution['fusion'] = DataAnalyzer._analyze_fusion_data(fusion_dir)
elif dir_name == "safety_reports":
safety_dir = os.path.join(data_dir, "safety_reports")
if os.path.exists(safety_dir):
distribution['safety_reports'] = DataAnalyzer._analyze_safety_reports(safety_dir)

return distribution

Expand Down Expand Up @@ -335,6 +340,41 @@ def _analyze_fusion_data(fusion_dir):
fusion_stats['total_size_mb'] = round(total_size / (1024 * 1024), 2)
return fusion_stats

@staticmethod
def _analyze_safety_reports(safety_dir):
"""分析安全报告数据"""
safety_stats = {
'reports': 0,
'high_risk': 0,
'medium_risk': 0,
'low_risk': 0,
'total_interactions': 0
}

json_files = [f for f in os.listdir(safety_dir) if f.lower().endswith('.json')]
safety_stats['reports'] = len(json_files)

if json_files:
# 采样分析几个文件
sample_files = json_files[:min(5, len(json_files))]
for json_file in sample_files:
try:
with open(os.path.join(safety_dir, json_file), 'r', encoding='utf-8') as f:
data = json.load(f)

if 'high_risk_cases' in data:
safety_stats['high_risk'] += data['high_risk_cases']
if 'medium_risk_cases' in data:
safety_stats['medium_risk'] += data['medium_risk_cases']
if 'low_risk_cases' in data:
safety_stats['low_risk_cases'] += data['low_risk_cases']
if 'total_interactions' in data:
safety_stats['total_interactions'] += data['total_interactions']
except:
pass

return safety_stats

@staticmethod
def _analyze_objects(data_dir):
"""分析物体统计(优化版)"""
Expand Down Expand Up @@ -647,6 +687,70 @@ def _analyze_cooperative_data(data_dir):

return analysis

@staticmethod
def _analyze_safety_data(data_dir):
"""分析安全数据"""
safety_dir = os.path.join(data_dir, "safety_reports")

if not os.path.exists(safety_dir):
return {
'total_reports': 0,
'risk_levels': {'high': 0, 'medium': 0, 'low': 0},
'safety_score': 0,
'pedestrian_interactions': 0,
'average_distance': 0
}

json_files = [f for f in os.listdir(safety_dir) if f.lower().endswith('.json')]

safety_data = {
'total_reports': len(json_files),
'risk_levels': {'high': 0, 'medium': 0, 'low': 0},
'safety_score': 0,
'pedestrian_interactions': 0,
'average_distance': 0,
'near_misses': 0,
'safety_warnings': 0
}

if json_files:
distances = []
for json_file in json_files[:min(10, len(json_files))]:
try:
with open(os.path.join(safety_dir, json_file), 'r', encoding='utf-8') as f:
data = json.load(f)

if 'high_risk_cases' in data:
safety_data['risk_levels']['high'] += data['high_risk_cases']
if 'medium_risk_cases' in data:
safety_data['risk_levels']['medium'] += data['medium_risk_cases']
if 'low_risk_cases' in data:
safety_data['risk_levels']['low'] += data['low_risk_cases']
if 'total_interactions' in data:
safety_data['pedestrian_interactions'] += data['total_interactions']
if 'average_distance' in data:
distances.append(data['average_distance'])
if 'near_misses' in data:
safety_data['near_misses'] += data['near_misses']
if 'safety_warnings' in data:
safety_data['safety_warnings'] += data['safety_warnings']

except Exception as e:
print(f"分析安全报告 {json_file} 失败: {e}")

if distances:
safety_data['average_distance'] = round(np.mean(distances), 2)

# 计算安全评分
total_risks = sum(safety_data['risk_levels'].values())
if total_risks > 0:
high_risk_ratio = safety_data['risk_levels']['high'] / total_risks
safety_data['safety_score'] = max(0, 100 - high_risk_ratio * 100)
else:
safety_data['safety_score'] = 100

return safety_data

@staticmethod
def _calculate_quality_metrics(data_dir):
"""计算质量指标(增强版)"""
Expand All @@ -657,6 +761,7 @@ def _calculate_quality_metrics(data_dir):
'cooperative_score': 0,
'temporal_score': 0,
'structural_score': 0,
'safety_score': 0,
'issues_found': [],
'recommendations': []
}
Expand All @@ -674,7 +779,8 @@ def _calculate_quality_metrics(data_dir):
"lidar",
"fusion",
"annotations",
"calibration"
"calibration",
"safety_reports"
]

missing_required = []
Expand Down Expand Up @@ -781,9 +887,17 @@ def _calculate_quality_metrics(data_dir):
quality_metrics['temporal_score'] *= 0.8 # 时长不足,降低分数
quality_metrics['recommendations'].append("建议增加数据收集时长以获得更完整的时间序列")

# 7. 安全评分
safety_data = DataAnalyzer._analyze_safety_data(data_dir)
quality_metrics['safety_score'] = safety_data.get('safety_score', 0)

if quality_metrics['safety_score'] < 80:
quality_metrics['issues_found'].append(f"安全评分较低: {quality_metrics['safety_score']}")
quality_metrics['recommendations'].append("建议增加行人安全相关的场景和数据收集")

# 限制分数在0-100之间
for key in ['completeness_score', 'consistency_score', 'diversity_score',
'cooperative_score', 'temporal_score', 'structural_score']:
'cooperative_score', 'temporal_score', 'structural_score', 'safety_score']:
quality_metrics[key] = max(0, min(100, quality_metrics[key]))

return quality_metrics
Expand All @@ -792,12 +906,13 @@ def _calculate_quality_metrics(data_dir):
def _calculate_overall_score(analysis):
"""计算总体评分(增强版)"""
weights = {
'completeness': 0.20, # 完整性
'consistency': 0.15, # 一致性
'demporal': 0.15, # 时间性
'structural': 0.10, # 结构性
'diversity': 0.15, # 多样性
'cooperative': 0.15, # 协同性
'completeness': 0.15, # 完整性
'consistency': 0.12, # 一致性
'temporal': 0.12, # 时间性
'structural': 0.08, # 结构性
'diversity': 0.12, # 多样性
'cooperative': 0.12, # 协同性
'safety': 0.19, # 安全性
'quality_bonus': 0.10 # 质量加成
}

Expand All @@ -810,7 +925,8 @@ def _calculate_overall_score(analysis):
quality['temporal_score'] * weights['temporal'] +
quality['structural_score'] * weights['structural'] +
quality['diversity_score'] * weights['diversity'] +
quality['cooperative_score'] * weights['cooperative']
quality['cooperative_score'] * weights['cooperative'] +
quality['safety_score'] * weights['safety']
)

# 质量加成(基于问题数量)
Expand All @@ -822,7 +938,8 @@ def _calculate_overall_score(analysis):
# 额外加成(如果数据集特别优秀)
if (quality['completeness_score'] >= 95 and
quality['consistency_score'] >= 90 and
quality['diversity_score'] >= 85):
quality['diversity_score'] >= 85 and
quality['safety_score'] >= 90):
total_score += 5

return round(min(total_score, 100), 1)
Expand Down Expand Up @@ -852,6 +969,7 @@ def _save_analysis_report(data_dir, analysis):
'total_objects': analysis['object_statistics']['total_objects'],
'num_classes': len(analysis['object_statistics']['by_class'])
},
'safety_data': analysis.get('safety_analysis', {}),
'analysis_metadata': analysis.get('metadata', {})
}

Expand Down Expand Up @@ -919,6 +1037,20 @@ def _print_analysis_summary(analysis):
print(f" 每帧物体数统计:")
print(f" 最小: {stats['min']}, 最大: {stats['max']}, 平均: {stats['mean']}, 中位数: {stats['median']}")

# 安全数据分析
if 'safety_analysis' in analysis:
safety = analysis['safety_analysis']
print(f"\n🚸 安全数据分析:")
print(f" 安全评分: {safety.get('safety_score', 0)}/100")
print(f" 风险等级分布:")
print(f" 高风险: {safety.get('risk_levels', {}).get('high', 0)}")
print(f" 中风险: {safety.get('risk_levels', {}).get('medium', 0)}")
print(f" 低风险: {safety.get('risk_levels', {}).get('low', 0)}")
print(f" 行人交互次数: {safety.get('pedestrian_interactions', 0)}")
print(f" 平均距离: {safety.get('average_distance', 0):.2f}米")
print(f" 近距离事件: {safety.get('near_misses', 0)}")
print(f" 安全警告: {safety.get('safety_warnings', 0)}")

# 协同数据分析
cooperative = analysis['cooperative_data']
print(f"\n🤝 协同数据分析:")
Expand Down Expand Up @@ -958,7 +1090,8 @@ def _print_analysis_summary(analysis):
('结构性', quality['structural_score']),
('时间性', quality['temporal_score']),
('多样性', quality['diversity_score']),
('协同性', quality['cooperative_score'])
('协同性', quality['cooperative_score']),
('安全性', quality['safety_score'])
]

for name, score in metrics:
Expand Down Expand Up @@ -1015,7 +1148,8 @@ def generate_comparison_report(data_dirs, output_file=None):
'object_statistics': {
'total_objects': analysis['object_statistics']['total_objects'],
'num_classes': len(analysis['object_statistics']['by_class'])
}
},
'safety_analysis': analysis.get('safety_analysis', {})
}

if output_file:
Expand Down
Loading
Loading