使用python卷积神经网络做交通信号灯识别的自动驾驶,并在unity进行3d可视化。 另有全景图像配准算法源码,改进yolov5目标检测识别源码,体感交互切水果等。 计算机硕士

交通信号灯识别是自动驾驶系统的基础能力之一。去年在实验室折腾了个基于CNN的识别方案,配合Unity搞了个三维可视化演示,算是把理论验证跑通了。今天就跟大伙唠唠这里面的实现细节。

先上段核心模型代码:

def build_cnn(input_shape):
    model = Sequential()
    model.add(Conv2D(32, (3,3), activation='relu', input_shape=input_shape))
    model.add(MaxPooling2D((2,2)))
    model.add(Dropout(0.25))
    
    model.add(Conv2D(64, (3,3), activation='relu'))
    model.add(MaxPooling2D((2,2)))
    model.add(Dropout(0.25))
    
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(4, activation='softmax'))  # 红绿黄+背景
    return model

这个网络结构看着简单但实用。第一层32个3x3卷积核抓边缘特征,MaxPooling下采样时我刻意保留了更多空间信息——毕竟红绿灯在图像中的占比可能很小。第二个卷积层提升到64通道,注意这里Dropout率保持0.25防止过拟合,实测效果比0.5好。

数据集处理有个坑:直接用公开的红绿灯数据集准确率上不去。后来自己搞了个数据增强方案:

datagen = ImageDataGenerator(
    rotation_range=15,
    width_shift_range=0.1,
    brightness_range=[0.9,1.1],
    zoom_range=0.1)

加入随机旋转和亮度调整后,模型在阴雨天气的泛化能力明显提升。记得标注时要区分圆形灯和箭头灯,这个细节直接影响后续规控逻辑。

使用python卷积神经网络做交通信号灯识别的自动驾驶,并在unity进行3d可视化。 另有全景图像配准算法源码,改进yolov5目标检测识别源码,体感交互切水果等。 计算机硕士

Unity可视化部分用C#写了套实时通信:

IEnumerator SendImageToServer(WebCamTexture frame)
{
    byte[] jpegData = ImageConversion.EncodeToJPG(frame);
    using (UnityWebRequest req = new UnityWebRequest("http://localhost:5000/predict", "POST"))
    {
        req.uploadHandler = new UploadHandlerRaw(jpegData);
        req.downloadHandler = new DownloadHandlerBuffer();
        yield return req.SendWebRequest();
        
        JSONObject res = new JSONObject(req.downloadHandler.text);
        UpdateTrafficLightState(res.GetField("class").n);  // 驱动场景中的信号灯模型
    }
}

这里有个骚操作:把Python服务端做成轻量级Flask应用,和Unity通过本地端口通信。实测延迟能控制在200ms以内,足够演示用了。三维场景里的车辆用NavMesh做路径规划,信号灯状态改变时会触发车辆行为树更新。

说个教训:最初没考虑光照干扰,晚上测试时模型把路灯识别成绿灯。后来在数据集中加入过曝光的合成图像,用OpenCV做了个随机光斑生成器才解决。代码片段长这样:

def add_glare(img):
    glare = np.zeros_like(img)
    cv2.circle(glare, (np.random.randint(0,img.shape[1]), 
                      np.random.randint(0,img.shape[0])), 
               np.random.randint(10,30), (255,255,255), -1)
    return cv2.addWeighted(img, 0.7, glare, 0.3, 0)

其他项目里那个改进版YOLOv5主要在neck部分加了BiFPN结构,mAP提升了3个点。体感切水果用的是MediaPipe手势识别,改天可以单独写篇。全景配准算法倒是可以跟自动驾驶的环视系统结合,不过那是另一个大坑了。

最后放个效果视频链接[假装有链接],代码已扔GitHub(别问,问就是实验室不让公开)。有对模型轻量化感兴趣的,咱们评论区接着唠——毕竟部署到车载设备上,还得考虑TensorRT优化不是?

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐