使用python卷积神经网络做交通信号灯识别的自动驾驶,并在unity进行3d可视化。 另有全...
去年在实验室折腾了个基于CNN的识别方案,配合Unity搞了个三维可视化演示,算是把理论验证跑通了。后来在数据集中加入过曝光的合成图像,用OpenCV做了个随机光斑生成器才解决。使用python卷积神经网络做交通信号灯识别的自动驾驶,并在unity进行3d可视化。使用python卷积神经网络做交通信号灯识别的自动驾驶,并在unity进行3d可视化。另有全景图像配准算法源码,改进yolov5目标检测
使用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优化不是?

更多推荐
所有评论(0)