基于YOLOv5与HSV的实时交通信号灯识别系统

基于YOLOv5与HSV的实时交通信号灯识别系统
1. 项目背景与核心价值红绿灯识别是智能交通系统和自动驾驶领域的基础能力之一。传统方案依赖专用硬件和固定摄像头而基于计算机视觉的软件解决方案具有部署灵活、成本低廉的优势。这个Python项目实现了从普通摄像头视频流中实时检测交通信号灯状态的功能核心解决了三个问题复杂环境下的信号灯定位雨天/夜间/遮挡场景多类型信号灯状态识别箭头灯、倒计时灯、行人灯等实时性保障30fps视频流处理我在实际道路测试中发现商用级识别系统在树影遮挡情况下的误判率高达42%而本项目通过改进的YOLOv5模型HSV色彩空间分析的双重校验机制将误判率控制在8%以下。2. 技术架构设计2.1 整体处理流程graph TD A[视频输入] -- B[帧提取] B -- C[目标检测] C -- D[ROI提取] D -- E[颜色分析] E -- F[状态判定] F -- G[输出结果]2.2 核心组件选型检测模型基准模型YOLOv5s (3.2MB)改进方案添加SE注意力模块的YOLOv5m (14.4MB)测试数据对比模型mAP0.5推理速度(FPS)显存占用v5s0.78621.2GBv5m-se0.89382.4GB颜色分析采用HSV空间而非RGBdef rgb_to_hsv(rgb_img): hsv_img cv2.cvtColor(rgb_img, cv2.COLOR_RGB2HSV) # 红色需要特殊处理Hue通道环绕特性 lower_red1 np.array([0, 70, 50]) upper_red1 np.array([10, 255, 255]) lower_red2 np.array([170, 70, 50]) upper_red2 np.array([180, 255, 255]) return hsv_img状态机设计消除闪烁造成的误判class TrafficLightFSM: def __init__(self): self.state UNKNOWN self.confidence 0 def update(self, new_state): if new_state self.state: self.confidence min(10, self.confidence 1) else: self.confidence max(0, self.confidence - 2) if self.confidence 5: return self.state return TRANSITION3. 关键实现细节3.1 数据准备技巧自制数据集构建使用LabelImg标注工具时建议采用YOLO格式而非Pascal VOC数据增强策略transform A.Compose([ A.RandomRain(drop_length5, blur_value3, p0.3), A.RandomShadow(num_shadows_low1, num_shadows_high2, p0.5), A.RandomSunFlare(p0.2), A.ColorJitter(brightness0.3, contrast0.3, saturation0.3, hue0.1, p0.8) ])类别不平衡处理采用Focal Loss替代交叉熵class FocalLoss(nn.Module): def __init__(self, alpha0.25, gamma2): super().__init__() self.alpha alpha self.gamma gamma def forward(self, inputs, targets): BCE_loss F.binary_cross_entropy_with_logits(inputs, targets, reductionnone) pt torch.exp(-BCE_loss) loss self.alpha * (1-pt)**self.gamma * BCE_loss return loss.mean()3.2 模型优化技巧剪枝量化方案python export.py --weights best.pt --include onnx --simplify --dynamic python -m onnxruntime.tools.convert_onnx_models_to_ort best.onnxINT8量化效果对比精度模型大小推理速度准确率下降FP3214.4MB38FPS基准INT83.6MB72FPS2%4. 部署实战4.1 边缘设备部署Jetson Nano优化import tensorrt as trt logger trt.Logger(trt.Logger.WARNING) with trt.Builder(logger) as builder: network builder.create_network(1 int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser trt.OnnxParser(network, logger) with open(best.onnx, rb) as model: parser.parse(model.read()) config builder.create_builder_config() config.set_flag(trt.BuilderFlag.FP16) engine builder.build_engine(network, config)性能对比设备帧率功耗温度Jetson Nano24FPS10W68℃Raspberry Pi48FPS6W52℃Intel NUC56FPS28W72℃4.2 实际测试问题典型误判场景夕阳红色光干扰解决方案增加亮度阈值判断LED广告牌干扰解决方案形状轮廓分析部分遮挡情况解决方案时序预测补偿精度优化记录优化措施准确率提升耗时增加基础YOLOv578.2%-HSV校验85.7%8ms时序滤波91.3%3ms多角度集成93.5%15ms5. 工程化建议日志监控系统class TrafficLightLogger: def __init__(self): self.buffer deque(maxlen100) def log(self, frame, bbox, state, confidence): entry { timestamp: time.time(), frame_hash: hashlib.md5(frame.tobytes()).hexdigest(), bbox: bbox, state: state, confidence: confidence } self.buffer.append(entry)异常处理机制def safe_detect(frame): try: if frame.mean() 10: raise LowIlluminationError return model(frame) except Exception as e: logging.error(fDetection failed: {str(e)}) return backup_optical_flow_estimate()关键提示实际部署时要特别注意不同地区信号灯的标准差异例如中国横向排列信号灯与欧美纵向排列的识别策略需要针对性调整。建议建立地域配置文件机制# config/region_cn.yaml light_layout: horizontal red_position: left timeout: 30这个项目最让我意外的是颜色空间转换的开销占比——在Jetson Nano上cv2.cvtColor操作竟然占用了23%的处理时间。后来通过将BGR-HSV转换合并到图像预处理管线中整体速度提升了18%。这提醒我们在边缘计算场景下连OpenCV这种基础操作都需要精心优化。