目录
2.4.1.修改train_classification.py程序
2.4.2.修改train_segmentation.py文件
最终效果:
------------------------全文6090字51图一步一步完成大约耗时15h------------------------
(训练模型比较耗时)
所需软件以及环境:
Vmware Workstation 17pro
内存 8GB
处理器 6
硬盘 40GB
Python 3.8
Yolo V5
Pytorch 2.1
系统 Ubuntu20.04.6
一、【pointnet++网络原理】
【此节是对原理进行讲解,实战可跳过此部分】
参考链接:
【PointNet网络详解+分类解读】https://blog.csdn.net/CSDNcylinux/article/details/106723260
点云( point clouds): 直接将三维点云抛入网络进行训练,数据量小。主要任务有分类、分割以及大场景下语义分割
Mesh图 (manifold,graph):在流形或图的结构上进行卷积,三维点云可以表现为mesh结构,可以通过点对之间连接关系表现为图的结构
体素(volumetric):通过将物体表现为空间中的体素进行类似于二维的三维卷积(例如,卷积核大小为5x5x5),但同时因为多了一个维度,时间和空间复杂度都非常高,目前三维卷积已经不是主流的方法了
多视角( multi-view):通过多视角二维图片组合为三维物体,此方法将传统CNN应用于多张二维视角的图片,特征聚合起来形成三维物体;
能否直接设计一种能够直接在原始点云上学习的统一框架?
【PointNet】
PointNet网络结构的灵感来自于欧式空间里的点云的特点。对于一个欧式空间里的点云,有三个主要特征:
• 无序性:虽然输入的点云是有顺序的,但是显然这个顺序不应当影响结果。
• 点之间的交互:每个点不是独立的,而是与其周围的一些点共同蕴含了一些信息,因而模型应当能够抓住局部的结构和局部之间的交互。
• 变换不变性:比如点云整体的旋转和平移不应该影响它的分类或者分割
① 输入变换>对齐输入点云( 规范化3x3 )
② 点云处理->MLP处理点云( 升维到64 )
③ 特征变换->对齐输入特征( 规范化54x64 )
④ 特征处理>MLP处理特征(升维到1024 )
⑤ 对称函数处理>全局特征( Max pooling )
PointNet比较难对精细的特征做学习,在分割上有局限性,并且在平移不变性上也有局限性,对于单个的物体,可以将其平移到坐标系的中心,在一个场景中有多个物体不好办,对哪个物体做归一化呢?
【PointNet++】
• pointnet++在局部区域重复性、迭代的使用pointnet,在小区域使用ointnet生成新的点,新的点定义新的小区域,多级的特征学习。
• 因为是在区域中,可以用局部坐标系,可以实现平移的不变性
• 同时在小区域中对点的顺序是无关的,保证置换不变性。
PointNet++的网络大体是encoder-decoder结构,encoder-decoder根据分类、分割应用,又有所不同分类:重复set abstraction的过程,实现一个多级的网络,使得点的数量越来越少,但是每个点代表的区域以及感受野,越来越大,这个cnn的概念很类似,最后把点做一个pooling得到globle feature,送入几层全连接网络,最后通过一个softmax分类。
二、【基于激光点云的目标检测步骤】
2.1 基本配置
前提,得有一个Ubuntu20.04的虚拟机【若没有则需创建一个】
还需要完成基本环境的配置,包括Anaconda环境、Pytorch环境、安装Vscode等,具体步骤参考之前我写的博客:
需要完成的步骤:
------------------------这里需要大概1小时------------------------
2.2 pointnet++环境配置以及安装
首先安装pointnet++的依赖环境,这里直接克隆github大佬的仓库:
打开终端,输入指令:
git clone https://github.com/fxia22/pointnet.pytorch
如果失败的话需要安装git插件,输入命令即可:
sudo apt install git
接下来继续克隆仓库,即下载一系列的包和环境【需要20G硬盘空间】硬盘空间不足可以简单的扩容~
如果克隆失败可能是没有科学上网的原因(搜索解决)
然后,进入文件夹pointnet.pytorch
继续安装依赖环境(大概需要5min)
完成后即会显示如下
随后进入scripts文件,执行脚本构建可视化C++命令
cd scripts
bash build.sh #build C++ code for visualization
如果出现未找到指令可能是没有安装g++编译器
输入如下指令安装g++编译器
安装完成后,再次执行脚本
随后下载数据集执行脚本程序(这里通过指令下载很慢很慢,故终止此程序,转而使用2.3的方法):
(100KB/s的龟速)
2.3 数据集下载及移植准备
数据集名称:shapenetcore_partanno_segmentation_benchmark_v0
由于在Ubuntu系统下载此数据集速度过慢,于是采用在Windows系统下载镜像包,随后通过Vmware虚拟机共享文件夹,共享在Ubuntu系统下,即可完成。
2.3.1下载数据集
参考此博主的方法:https://blog.csdn.net/jizhidexiaoming/article/details/128164037
【数据集百度网盘】https://pan.baidu.com/s/1MavAO_GHa0a6BZh4Oaogug
【提取码】3hoe
将百度网盘里面的数据集下载至windows系统目录下
2.3.2新建共享文件夹
共享文件夹的作用是将Windows系统的文件与虚拟机的Ubuntu系统的文件相互联系起来,实现我在Windows下的数据集文件与Ubuntu文件共享,在Ubuntu系统下运行程序PointNet++来处理点云数据集,实现目标检测。
【共享文件夹参考博客】https://blog.csdn.net/weixin_44126785/article/details/120585921
①Windows下新建共享文件夹
在我的Windows11系统D盘下新建文件夹,叫做Akaxi_share
记住创建的文件路径:
②Vmware共享文件夹设置
打开Vmware虚拟机软件,进入如图所示的设置
根据共享文件夹指引一步一步操作:
点击浏览找到刚刚设置的【共享文件夹】,点击确定后继续。
下一步。
启用此共享,完成啦~~~~
点击确定,完成此共享文件夹的设置。
打开虚拟机,在Ubuntu系统终端输入指令(注意空格):
vmware-hgfsclient
sudo vmhgfs-fuse .host:/ /mnt -o nonempty -o allow_other
然后就可以在Ubuntu系统找到我们的在Windows系统下的共享文件夹了,根据如图找到你的共享文件夹
2.3.3数据集移动
【Windows】-> 【共享文件夹】->【工作文件夹】
在Windows系统将你下载的数据集文件,拖入共享文件夹
解压数据集压缩包,即可打开虚拟机在Ubuntu看到数据集文件
(解压大概需要2分钟,解压后1.42G,可删除压缩包)
打开Ubuntu即可看到数据集,接下来我们需要将数据集移动到工作目录下:
(注意解压后的文件夹会嵌套,注意文件关系)
(这里共享文件夹复制到Ubuntu工作文件夹下大概需要2分钟)
复制完成后,我们的工作就完成啦。
2.4 修改文件
我们需要对pointnet文件夹下的一些程序进行修改:
首先打开Vscode,方便文件操作以及代码改写。
2.4.1.修改train_classification.py程序
【参考链接】https://blog.csdn.net/weixin_61985044/article/details/130942480
文件在目录:pointnet.pytorch/utils/下
添加main函数
在代码开头添加下面代码,并将所有的cuda()改为to(device): device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
将scheduler.step()和optimizer.step()调换位置
修改好后的train_classification.py程序:(直接覆盖即可)
参考岑老师的Gitee:
https://gitee.com/cenruping/multi-sensor-fusion-perception/tree/master/pointnet.pytorch
2.4.2.修改train_segmentation.py文件
同理修改文件:
修改好后的train_classification.py程序:(直接覆盖即可)
参考岑老师的Gitee:
https://gitee.com/cenruping/multi-sensor-fusion-perception/tree/master/pointnet.pytorch
2.5 训练Pointnet++(分类功能)- 耗时操作
打开终端运行:
这里注意需要修改自己数据集的路径,如下图所示查看数据集路径:
这就是你的数据集路径,把你的路径替换在训练数据集的代码里面。
更改后:
输入指令进行训练
(注意需要Pytorch环境,如果没有配置需要配置一下,具体参考我的博客)
大概需要9-10小时(因为采用的是CPU)
(——漫长的等待——)
训练50层后,即可看到最后的训练结果:
2.6 测试Pointnet(分类功能)
首先也需要对代码进行修改,打开Vscode修改show_cls.py程序
修改好后的show_cls.py程序:(直接覆盖但需要改一下)
参考岑老师的Gitee:
https://gitee.com/cenruping/multi-sensor-fusion-perception/tree/master/pointnet.pytorch
修改代码中的第25行,这里是需要改成你的数据集路径(同理上面的路径修改过程)
输入下面代码用于测试分类功能:
python3 show_cls.py --model cls/cls_model_0.pth
接下来即可进行测试啦,可以看到测试效果
可以看到测试成功!!!!但是准确性accuracy比较低,但是过程总是成功的~
2.7 训练Pointnet(分割功能) - 耗时操作
与训练Pointnet的分类功能一样,这里也是需要注意
1.激活Pytorch环境
2.修改成自己的数据集环境
训练,启动!
(因为采用的是CPU同理也很费时间)
(大概5小时)
等待训练完成后,看到训练结果成功。
2.8 测试Pointnet(分割功能)
测试前需要移动一下文件:
输入指令测试分割功能
python3 show_seg.py --model cls/cls_model_0.pth
这里会报错一行代码出现索引超出范围(期末考试月呜呜呜,先放一放,待解决)
正常来说应该出现这样的分割激光点云的目标检测:
更多细节:
关于我的Pointnet为什么测试出来的准确率这么低?
数据集问题:如果数据集不够丰富或样本分布不均衡,那么模型就无法学会区分不同的类别。如果你使用的是 ShapeNet 数据集,建议检查每个类别中训练和测试样本的数量是否相等,并尝试增加训练集的大小。
超参数问题:模型的性能很大程度上取决于超参数的选择,如学习率、批量大小、训练时的迭代次数等。你可以尝试调整这些超参数,看看能否提高模型的精度。
过拟合问题:如果在训练期间模型表现良好,但测试精度很低,那么可能是由于过度拟合造成的。在这种情况下,你可以尝试通过增加正则化项(如 L2 正则化)或者使用 dropout 等方法来降低模型的复杂度。
模型选型问题:如果以上措施都没有改善测试精度,那么可能是由于模型的结构不适合数据集。你可以尝试使用其他的深度学习模型或者进行一些模型结构的修改,例如增加卷积层或全连接层。
怎么提高我的Pointnet准确率?
数据集加载:检查测试数据集是否被正确加载,例如检查测试数据集中的样本数量和类别数量是否正确。
模型加载:检查训练好的模型是否被正确加载,并且与训练时使用的参数相同。
模型评估:检查模型在测试集上的表现,例如打印输出每个类别的精度、计算混淆矩阵等。
超参数调整:尝试调整超参数,重新训练模型,看看是否能够提高测试精度。
码一下解决方案参考链接:
https://blog.csdn.net/qq_36638362/article/details/110483678
https://blog.csdn.net/u010663118/article/details/106237966
【如果您解决了以上问题,请联系我~~~~让我膜拜一下哇】
----------------------------------------------------------------------------------------------------
相信读到这里的朋友,一定是坚持且优秀的
给博主一个免费的赞👍吧
扫描二维码进博主交流群,问题交流 | 吹吹水 | 一起变得更加优秀
2023.12.23
渝北仙桃数据谷