【人工智能项目】小车障碍物识别与模型训练(完整工程资料源码)

发布于:2024-05-23 ⋅ 阅读:(39) ⋅ 点赞:(0)

实物演示效果:

一、项目目的:

1. 小车需在既定赛道上执行一系列标准化的行驶程序,确保其完整地完成整个赛程。

2. 在赛道行驶过程中,小车必须成功执行预设的障碍规避动作,以确保无障碍地继续其行驶路线。

二、项目内容:

1. 开发并优化赛道驾驶模拟器,以精确模拟小车在赛道上的行驶动态。

2. 实现小车在赛道上的全程自主导航,确保其顺利完成从起点至终点的整个行驶任务。

三、项目设备:

1.PC机

2.智能小车

3.喷绘地图

四、项目原理:

4.1 Alexnet网络介绍

        在深入探讨AlexNet之前,我们先回顾一下它的前身——LeNet模型。LeNet模型由两个核心部分组成:卷积层模块和全连接层模块。卷积层模块的核心组件是卷积层与最大池化层的组合,这种组合在模型中重复出现两次。卷积层通过使用5x5的窗口来捕捉图像中的局部特征,如线条和物体的特定部分,而紧随其后的最大池化层则通过降低特征图的空间分辨率来减少对位置变化的敏感性。在卷积层模块中,第一个卷积层配置了6个输出通道,而第二个卷积层则扩展到16个输出通道。这种增加是为了平衡第二个卷积层输入尺寸的减小,确保两个卷积层的处理能力相当。每个卷积层的最大池化层采用2x2的核,步幅同样为2,这意味着池化操作在特征图上滑动时,每次覆盖的区域不会重叠,有效地减少了特征图的尺寸。通过这种方式,LeNet模型能够有效地提取图像的特征,并为后续的全连接层提供丰富的信息。      

        在卷积神经网络(CNN)中,卷积层的输出通常以四维张量的形式表示,其维度包括:批量大小(batch size)、通道数(channels)、高度(height)和宽度(width)。当这些特征图传递到全连接层时,它们首先会被“扁平化”处理,即将每个样本的特征图转换成一个一维向量。这个扁平化的过程将原本多维的特征图压缩成一个长向量,其长度等于原始特征图中所有元素的总数,即通道数乘以高度再乘以宽度。

        在经典的LeNet模型中,全连接层部分包含三个层,分别输出120、84和10个神经元。最后一个全连接层的输出神经元数量10对应于模型的分类任务类别数。在实际应用中,这个数字可以根据具体的分类需求进行调整。

        2012年,AlexNet模型的出现标志着深度学习在图像识别领域的重大突破。这个模型的命名源自其论文的第一作者Alex Krizhevsky。AlexNet不仅在当年的ImageNet大规模视觉识别挑战赛(ILSVRC)中取得了显著的成绩,而且极大地推动了深度卷积神经网络的研究和应用。      

        AlexNet在2012年的ImageNet图像识别挑战赛中大放异彩,其8层的深度卷积神经网络架构显著超越了其他参赛模型。这一成就不仅展示了深度学习特征提取的强大能力,而且标志着自动学习特征超越传统手工设计特征的重要转折点。尽管AlexNet的设计理念与LeNet有诸多相似之处,但它在多个方面进行了显著的扩展和优化。

        首先,AlexNet的网络结构更为复杂,包含5个卷积层和3个全连接层。在处理高分辨率的ImageNet图像时,AlexNet在第一层采用了较大的11x11卷积窗口,以便更有效地捕捉图像中的大尺度特征。随着网络的深入,卷积窗口的尺寸逐渐减小,第二层使用5x5的窗口,而后续层则统一采用3x3的窗口,这种设计有助于提取更为精细的局部特征。

        此外,AlexNet在第一、第二和第五卷积层后均配置了3x3的窗口和步幅为2的最大池化层,这种设计有助于进一步减少特征图的尺寸,同时保留重要的空间信息。在通道数方面,AlexNet的卷积层输出通道数远超LeNet,这增强了模型对图像特征的表达能力。     

        AlexNet在其架构中引入了两个庞大的全连接层,每个层包含4096个神经元,这导致了大量的模型参数,接近1GB。在AlexNet首次提出时,由于当时GPU显存的限制,为了能够训练这个大型模型,采用了双数据流的设计,即模型被分割成两部分,分别在两个GPU上并行处理,以减少单个GPU的负担。随着技术的发展,现代GPU的显存已经大幅增加,因此通常不再需要这种双数据流的设计。

        在激活函数的选择上,AlexNet从传统的sigmoid函数转向了更为简单的ReLU(Rectified Linear Unit)函数。ReLU函数的计算更为高效,因为它避免了sigmoid函数中的指数运算,这使得前向传播和反向传播过程更快。此外,ReLU函数在正半轴的梯度始终为1,这有助于缓解梯度消失问题,特别是在深度网络中。相比之下,sigmoid函数在输出接近0或1时,其梯度接近于0,这可能导致反向传播过程中部分权重无法得到有效更新,尤其是在参数初始化不当时。

        为了进一步控制模型的复杂度和防止过拟合,AlexNet还引入了丢弃法(Dropout)技术,这在全连接层中尤为重要。丢弃法通过在训练过程中随机地关闭一部分神经元,增加了模型的泛化能力。这是LeNet所没有采用的策略,LeNet在其设计中并未使用丢弃法。

        我们将采用两个不同的深度学习模型来完成特定的任务:残差神经网络(Residual Neural Network, ResNet)和AlexNet。这两个模型的应用场景和功能有所不同,但它们将协同工作以实现更复杂的任务。

        首先,残差神经网络将被用作主要的运行模型,负责执行自主巡线操作。这意味着ResNet将处理连续的数据流,不断地分析和响应环境中的变化,以确保模型能够沿着预定的路径或轨迹移动。ResNet因其能够训练非常深的网络而不受梯度消失问题的影响而闻名,这使得它在处理复杂任务时非常有效。

        另一方面,AlexNet将被用作辅助模型,专门用于障碍物识别。在特定的情况下,当系统检测到可能存在障碍物时,将启动AlexNet来进行更详细的分析。AlexNet将分析图像数据,识别并分类可能的障碍物,如人、车辆等。

        程序的设计将允许在达到一定的置信度阈值时,自动停止运行以避免与障碍物发生碰撞。这意味着,如果AlexNet识别出障碍物并且置信度足够高,系统将采取措施停止或改变路径,以确保安全。

五、步骤:

5.1 进行小车初始化

摄像头初始化,串口初始化

输入密码:jetson 

创建障碍物和正常通信的数据集,如果存在就跳过不创建 

5.2 障碍物数据集

        在障碍物检测的任务中,选择合适的障碍物样本对于训练一个鲁棒的模型至关重要。为了减少环境因素对检测结果的干扰,建议优先选择深色障碍物作为训练样本。深色障碍物在多种光照条件下通常具有较高的对比度,这有助于模型更好地学习和识别。

        此外,由于障碍物检测不是通过预先标记的方式进行,而是依赖模型自主学习识别,因此在采集障碍物数据集时,应特别注意在较近的距离下进行。近距离采集可以提供更清晰的图像细节,有助于模型捕捉到障碍物的特征,从而提高检测的准确性。

        在实际操作中,这意味着需要在模型运行路径的近距离范围内,对可能遇到的障碍物进行详细的数据采集。这样可以确保模型在遇到类似障碍物时,能够基于已有的数据集做出准确的判断和响应。

        创建一个存放数据集的文件夹位置,其中包括两个目录,一个为blocked_dir文件夹,另一个为free_dir文件夹,分别存放障碍物存在和无障碍物两个目录文件。如果数据集已经存在,那么将显示Directories not created becasue they already exist。不在重复创建新文件夹存放数据集。其中,可以反复修改blocked_dir和free_dir的参数。反复创建不同的避障数据集,本次创建的数据集名称为dataset2,也可以将其修改为其他名称,反复创建不同数据集。

    文件目录创建完成后,开始收集障碍物场景图片,在收集的过程中,主要是以ipywidgets的控件来收集数据集。使用layout设置布局,Button按键收集,intText来设置文本框数据。HBox设置水平控件信息。

 

     图片文件保存过程中,需要对文件名进行唯一命名操作,避免重复,本次程序中,使用的是uuid开发包对文件进行命名操作。并最终根据button控件来确定保存位置。将图片文件保存下来。

    将整个障碍物收集的程序全部显示出来,集中操作。主要包括场景信息,无障碍物和存在障碍物的保存控件信息等。

    第一个box显示的是此时摄像头采集的外部场景。
    第二个box显示为无障碍物和存在障碍物收集过程,以文本框显示,以控件保存。

5.2避障训练

   本次训练过程中,将以AlexNet神经网络来训练障碍物数据集。打开home>jetracer>notebooks>collision_avoidance目录中的train_model.ipynb文件,如下图所示。

首先第一步进行导包动作,将训练的所有开发包全部导入程序中。

         加载数据集信息,将采集的文件夹daraset2样本集导入模型中,并设置图片参数信息。需要说明,这里收集训练的数据集名称是什么,则使用什么数据集导入。通过colorjitter函数改变图片的亮度、对比度、饱和度和色调。并使用resize定义尺寸信息,使用Normalize进行数据归一化操作。换一种说法

     分割样本集,后50张为测试集,前面的均为训练集,为了保证测试集在百分之六十到百分之八十,需要匹配数据集收集情况,以及代码中关于样本集的分割情况。
    设置训练集和测试集在训练过程中的迭代参数信息。使用DataLoader函数加载数据信息。该函数主要用来将自定义的数据读取接口的输出或者PyTorch已有的数据读取接口的输入按照batch size封装成Tensor。函数中主要包括四个部分,dataset读取数据集部分,bitch_size批量迭代数据信息。在训练时需要将shuffle设置为Truenum_workers设置多进程导入数据。

加载AlexNet神经网络模型。

使用pytorch中的nn.Linear()函数设置全连接层,全连接层的输入输出一般形式为[batch_size,size]。最终全连接层将输出两个神经元。即存在障碍物和不存在障碍物。

开启GPU加速。

     配置训练信息。主要包括NUM_EPOCHS训练次数,次数最少保证有3050次,加大训练量,在数据集本身较小时,可训练去更加好的模型。BEST_MODEL_PATH文件保存名,最优模型保存阈值。配置优化器随机梯度下降等参数信息。训练并进行测试,保存训练模型。

5.3 运行模型 

      本次程序将在自主巡线的基础上完成障碍物躲避程序,进入home>jetracer>notebooks目录中,打开road_following_live.ipynb程序。注意,同时需要将训练的模型文件,如:best_model.pth文件,复制到这个文件夹下面。如下图所示。

导入开发包并加载原始残差神经网络模型,配置全连接层,并开始GPU加速。

加载AlexNet神经网络模型,并配置全连接层数据。

加载残差神经网络优化模型。生成优化模型可以参考实验一中巡线的生成方式,生成优化后的网络模型,做为自主训练的运行模型。

 加载避障模型参数。根据自己训练时的命名来加载。

设置图片信息,从CSI摄像头获取的图片信息不能直接导入模型训练,需要修改RGB值,维度信息已经像素值参数等,才能输入到AlexNet模型中进行障碍物判别。

 初始化小车参数。

开启摄像头信息,需要指出的是,自动巡线中camera.running是设置为False,而在进行避障程序设置时,camera.running的参数设置为True,因此程序在交替使用模型时,需要配置清楚。

 设置智能小车的运动参数信息。对于不同跑道的运行参数,可修改模型预测传递值,对通过急弯是,参数信息对舵机转向判断不足时,可根据实测模型做一步中间转化信息,可应对不同复杂的赛道信息。且智能小车在遇到急弯赛道时,会明显存在舵机转向不足的问题。在实际应用中会有所体现。

 

六、运行效果:

6.1 小车运行与赛道搭建

 6.2 完成赛道的避障运行

项目详细资料:毕设&课设&项&实训-小车障碍物识别与模型训练源码.zip_web3deditor资源-CSDN文库