团队名称
Intel启动队
问题陈述
使用计算机视觉技术和英特尔® AI 分析工具套件为自动驾驶车辆开发实时对象检测模型。参赛团队需要创建一个深度学习模型,用于准确检测行人、车辆、交通标志和交通信号等对 象。该模型需要具有高准确度和低延迟,能够满足自动驾驶车辆安全导航的需求。
项目简介
本项目采用了deeplabv3模型,通过以下步骤实现了语义分割。
- 数据预处理
- ResNet部分提取输入图像特征
- ASPP模块利用上下文信息丰富特征
- DeeplabV3将两部分结合,完成语义分割预测任务
至此,已实现从视频或图象中分割道路、交通标志、车辆等,识别环境,为自动驾驶提供技术支持。
相关技术
在编写程序的过程中,我们使用了英特尔® AI 分析工具套件及其中的适当组件:
- 使用英特尔® DNN for PyTorch 提高训练速度:DNN for PyTorch可以利用硬件加速来提升卷积计算速度,从而缩短Deeplabv3的训练时间。
- 使用英特尔® Video Profiler分析模型:Video Profiler可以对Deeplabv3的计算图各环节进行性能分析,识别瓶颈层次以优化模型。
与传统的CUDA编程模型相比,OneAPI具有以下优势:
- 跨平台支持:OneAPI支持多种硬件架构,包括英特尔CPU、GPU和FPGA等。这使得开发人员可以使用统一的编程模型在不同的硬件上进行开发,并实现高性能计算。
- 硬件无关性:OneAPI提供了抽象层,使开发人员能够以硬件无关的方式编写代码。这意味着你可以使用相同的代码在不同的硬件上运行,而无需为每个硬件架构编写特定的实现。
- 统一编程模型:OneAPI采用了基于数据并行性的编程模型,通过使用语言扩展和库来支持并行计算。这使得开发人员可以在不同的硬件上实现并行计算,而无需学习和使用不同的编程模型。
- 生态系统支持:OneAPI具有丰富的生态系统支持,包括编译器、调试器、性能分析工具和优化库等。这些工具和库可以帮助开发人员提高代码的性能,并简化调试和优化的过程。
- 开放标准:OneAPI是一个开放的标准,由多个硬件和软件供应商支持。这意味着你可以在不同的供应商之间进行选择,并且不会受限于特定供应商的硬件或软件。
通过调用oneAPI,我们将模型和优化器搬移到IPU上训练,不再需要手动管理设备,IPU能力足够强大,利用IPU神经网络加速功能提升训练速度。具体实现步骤如下:
#导入Intel Extension for PyTorch:
import intel_extension_for_pytorch as ipex
#对网络和优化器进行IPU优化:
network.train()
network = ipex.optimize(model=network, optimizer=optimizer)
#屏蔽掉了原PyTorch版本的优化器,使用IPU优化后的版本:
optimizer = torch.optim.Adam(params = network.parameters(), lr=0.003)
实现了基于OneAPI的高效深度学习训练流程。
团队收获
我们学会了使用oneAPI进行性能优化:
oneAPI 提供了一系列的工具和库,用于分析和优化代码的性能。例如,使用 Intel® VTune™ Profiler 可以分析代码的性能瓶颈,并提供优化建议。通过使用这些性能优化工具,你可以学习如何识别和解决性能瓶颈,优化算法和数据结构,提高代码的执行效率和响应速度。
我们学会了使用oneAPI进行深度学习模型训练:
oneAPI 提供了一些,如 Intel® oneAPI Deep Neural Network Library 等的深度学习和神经网络的库和工具。在使用Intel® oneAPI Deep Neural Network Library的过程中,我们学习了如何构建、训练和部署深度学习模型,以及如何优化模型的推理性能。
实现方案
数据预处理
Cityscapes数据集提供了34种分类,但在某些情况下,我们可能只对其中的一部分分类感兴趣。在默认情况下,Cityscapes数据集使用19个训练ID(trainId)进行图像语义分割训练。
训练ID(trainId)是为了方便训练而设计的一种标识符,它将原始标签中的34个分类映射到19个分类的集合。这样做的目的是减少训练中的计算复杂性,并提高模型的性能。
因此,这里的trainId代表了19个分类中的每个类别的标识符,用于Cityscapes数据集的图像语义分割任务。
映射关系(id->trainId):
labels = [
# name id trainId category catId hasInstances ignoreInEval color
Label( 'unlabeled' , 0 , 19 , 'void' , 0 , False , True , ( 0, 0, 0) ),
Label( 'ego vehicle' , 1 , 19 , 'void' , 0 , False , True , ( 0, 0, 0) ),
Label( 'rectification border' , 2 , 19 , 'void' , 0 , False , True , ( 0, 0, 0) ),
Label( 'out of roi' , 3 , 19 , 'void' , 0 , False , True , ( 0, 0, 0) ),
Label( 'static' , 4 , 19 , 'void' , 0 , False , True , ( 0, 0, 0) ),
Label( 'dynamic' , 5 , 19 , 'void' , 0 , False , True , (111, 74, 0) ),
Label( 'ground' , 6 , 19 , 'void' , 0 , False , True , ( 81, 0, 81) ),
Label( 'road' , 7 , 0 , 'flat' , 1 , False , False , (128, 64,128) ),
Label( 'sidewalk' , 8 , 1 , 'flat' , 1 , False , False , (244, 35,232) ),
Label( 'parking' , 9 , 19 , 'flat' , 1 , False , True , (250,170,160) ),
Label( 'rail track' , 10 , 19 , 'flat' , 1 , False , True , (230,150,140) ),
Label( 'building' , 11 , 2 , 'construction' , 2 , False , False , ( 70, 70, 70) ),
Label( 'wall' , 12 , 3 , 'construction' , 2 , False , False , (102,102,156) ),
Label( 'fence' , 13 , 4 , 'construction' , 2 , False , False , (190,153,153) ),
Label( 'guard rail' , 14 ,