全流程点云机器学习(一)使用CloudCompare自制sharpNet数据集
前言
这不是高支模项目需要嘛,他们用传统算法切那个横杆竖杆流程复杂耗时很长,所以想能不能用机器学习完成这些工作,所以我就来整这个工作了。
工欲善其事,必先利其器,在正式开始之前,我们先要搞懂如何切分数据集。
本系列文章所用的核心骨干网络代码主要来自点云处理:实现PointNet点云分割
使用的数据集类型主要为SharpNet,这篇文章里主要是讲如何使用CC切出指定的对象,并将其转换成我们想要的SharpNet数据集。
之后可能写一个番外,简单说说如何使用semantic-segmentation-editor工具进行简单的点云分割和解析吧,最近也摸了一下,但是发现这个工具貌似没有CC好用。
如果有人问起再写吧,有点折腾,不过也还好。
什么是SharpNet数据集?
我们可以在 LARGE-SCALE 3D SHAPE RECONSTRUCTION AND SEGMENTATION
FROM SHAPENET CORE55网站上下载到SharpNet的数据集和标签,我们下载下来解压看看里面的结构

以下是训练集点云文件组


以下是训练集点云的标签组
也就是说实际上是一个pts文件对应一个.seg文件。
其中pts文件好理解,就是一个个的明文点云,内容如下:

打开seg文件,里面行数和同名的pts文件行数相同,

这个.seg文件中代表的意思就是对应行数的点所对应的label标签,通常以一个数字来表示,比如1是背景,2,3,4代表各种各样的对象,具体每个数字对应的对象是什么。
如何标注点云文件
上文中简单说了下SharpNet的规则,那么本章就简单说说如何标注点云文件
主要可以参考这篇文章,我这里仅展示简单的流程:
比如我现在有一个这样的高支模点云,如果我想要做一个横杆的检测,那么我们就需要把横杆全部截出来
1.切割

先点击需要切片的点云文件,然后点这个剪刀进入剪切模式

先用左键划线工具框选住一个横杆,选完了之后单击右键确定选框,这个时候点击这个红色的多边形(选中框选内容)完成切割,再点击右边的这个绿色勾


这个时候切片就切出来了,可以看看效果


2. 分类
完成了切割工作之后,要给这个切出来的片加上一个名字,就点上面这个加号,然后给定一个对象的名称,再给定一个值

我们切分的是水平支撑,那么就给它起个名字叫Support

至于值的话随便声明就行,无所谓,这里声明的是1.00,这个和后面的处理有关,当然了你不懂也无所谓,如果你看懂了的话可以自己改这块的逻辑。
然后选中所有的点云,然后合并就行了

合并后可以看到被截取的这一块点云已经和原来的点云不一样了

在属性中找到Active可以找到被切分的点云分类


保存一下这个点云,保存成ASCII码的格式,以便我们对这个点云文件重新进行操作,以文本格式打开:

每个属性从上到下对应end_header后从左到右的一条条内容,比如第一行
7.099000 7.473000 4.869000 0 59 255 7.000000 1.000000 1.000000 0.000000
代表了一个点的
x坐标 y坐标 z坐标 r色 g色 b色 scalar_Intensity scalar_HSupport scalar_Support scalar_Original_cloud_index
我们在这里只需要判断Support的值就可以了,后面的几个scalar值就是标签的值,我们在这里只需要判断是不是Support对象,然后一行行地制作出.pts文件和.seg文件即可。
这里给出一段示例代码,需要注意的是,这个代码并不是自适应的识别所有标签,所以需要自己根据业务和自己的需要调整
CCSeperator.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_CCSeperator.h"
#include "qpoint.h"
#include "qvector.h"
#include "qfile.h"
#include "qfileinfo.h"
#include "qtextstream.h"
#include "qdir.h"
#include "qdebug.h"
//CC数据清洗工具
enum class PointType {
None = 0,
Support = 1,
VSupport = 2
};
struct CCPoint {
float x = 0.00;
float y = 0.00;
float z = 0.00;
PointType type = PointType::None;
};
class CCSeperator
{
Q_OBJECT
public:
CCSeperator();
~CCSeperator();
/// <summary>
/// 读取指定点云文件并尝试解析到指定目录下
/// </summary>
void ReadFile(const QString& filePath, const QString& outputPath);
QVector<CCPoint> vec_points;
};
CCSeperator.cpp
#include "CCSeperator.h"
CCSeperator::CCSeperator()
{
this->ReadFile("J:\\output\\GF3_7.ply", "J:\\output");
}
CCSeperator::~CCSeperator()
{
}
void CCSeperator::ReadFile(const QString& filePath, const QString& outputPath)
{
//尝试读取指定目录下的文件
QFile file(filePath);
QString fileName = QFileInfo(file).baseName();
if (!file.exists()) {
qDebug() << " file not exist";
return;
}
this->vec_points.clear();
qDebug() << file.open(QIODevice::ReadWrite | QIODevice::Text);
QTextStream in(&file);
bool blnEndHead = false;
while (!in.atEnd()) {
QString line = in.readLine();
if (line.contains("end_header")) {
blnEndHead = true;
continue;
}
if (!blnEndHead) continue;
QStringList list = line.split(" ");
CCPoint point;
point.x = list[0].toFloat();
point.y = list[1].toFloat();
point.z = list[2].toFloat();
//这个对应的是识别的列,这里是第七行
if (list[6].toFloat() == 1.0000) {
point.type = PointType::Support;
}
else {
point.type = PointType::None;
}
this->vec_points.append(point);
}
//注入点完成后,需要将其导出到指定目录下
QDir dir(outputPath);
if (!dir.exists()) {
dir.mkpath(dir.absolutePath());
}
QFile file_out_data(outputPath + QString("/Data/%1.pts").arg(fileName));
QTextStream out(&file_out_data);
QFile file_out_label(outputPath + QString("/Label/%1.seg").arg(fileName));
QTextStream out_label(&file_out_label);
file_out_data.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate);
file_out_label.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate);
for (auto item : this->vec_points) {
//将所有的点写入到指定目录下
//无论如何,正常的点都需要写入
QString fileContent = QString("%1 %2 %3").arg(item.x).arg(item.y).arg(item.z);
out << fileContent << endl;
QString label = QString("%1").arg(static_cast<qint32>(item.type));
out_label << label << endl;
}
file_out_data.close();
file_out_label.close();
}
这样洗出来的数据就是这样的:



这样我们就完成了自制SharpNet数据集的过程
全流程点云机器学习(一)使用CloudCompare自制sharpNet数据集的更多相关文章
- Java对接拼多多开放平台API(加密上云等全流程)
前言 本文为[小小赫下士 blog]原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者. 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本文章为企业ERP(I ...
- HMS Core电商与游戏行业解决方案,全流程赋能开发者创新
2021年12月29日,"华为云&华为终端云服务创新峰会2022"在北京柏悦酒店成功举办.华为HMS Core电商与游戏行业解决方案亮相本次峰会的线下展区,为行业开发者们解 ...
- AI全流程开发难题破解之钥
摘要:通过对ModelArts.盘古大模型.ModelBox产品技术的解读,帮助开发者更好的了解AI开发生产线. 本文分享自华为云社区<[大厂内参]第16期:华为云AI开发生产线,破解AI全流程 ...
- Unity3D 发布APK安卓环境配置步骤、安装、教程(含Java/Android)(超全流程)
Unity3D安卓环境配置运行 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- CentOS6.6服务器系统配置(LAMP+phpMyAdmin)全流程
CentOS6.6服务器系统配置(LAMP+phpMyAdmin)全流程 昨天在腾讯云上买了个服务器,是CentOS6.6操作系统的裸机,里面什么都没,然后开始了一天一夜的LAMP(Apache+My ...
- 阿里云机器学习tensorflow实践
1,前言 伴随人工智能和深度学习的应用越来越普及,越来越多的开发人员开始投入到智能算法的编程中.由于算法成熟且公开,软件编码这一块不存在难度:但模型训练和预测所需的时间与硬件设备的配置有极大关系,很多 ...
- 基于Jenkins的开发测试全流程持续集成实践
今年一直在公司实践CI,本文将近半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续还会深入实践和引入Kubernetes进行容 ...
- 一张图轻松掌握 Flink on YARN 应用启动全流程(上)
Flink 支持 Standalone 独立部署和 YARN.Kubernetes.Mesos 等集群部署模式,其中 YARN 集群部署模式在国内的应用越来越广泛.Flink 社区将推出 Flink ...
- QQ全量上云,你想了解的技术细节都在这
腾讯的业务体量非常庞大,在2019年,腾讯已拥有超过了100万台服务器,其中,社交业务包括QQ和空间的体量有近20万台服务器,且分布在全国三地. 把QQ这头大象搬到云上并非易事.作为腾讯最庞大.最悠久 ...
- 全流程指导Visual Studio Code+Markdown Nice+gitee+PicGo管理自己的技术博客文章
全流程指导Visual Studio Code+Markdown Nice+gitee+PicGo管理自己的技术博客 1.背景 我挺喜欢写博客,但每一次将博客转移到公众号或者知乎,总是需要调整格式,不 ...
随机推荐
- pgcacher 的简单学习
pgcacher 的简单学习 学习地址 https://github.com/rfyiamcool/pgcacher https://zhuanlan.zhihu.com/p/551833981 ht ...
- [转帖]058、集群优化之PD
PD调度基本概念 调度流程 调度中还有这还缺来了merge,例如合并空region. store: 基本信息,容量,剩余空间,读写流量等 region: 范围,副本分布,副本状态,数据量,读写流量等 ...
- [转帖]linux块I/O总体概括
直接先上重点,linux中IO栈的完全图如下: 系统中能够随机访问固定大小数据片的硬件设备称作块设备.固定大小的数据片称为块.常见的块设备就是硬盘了.不能随机访问的就是字符设备了,管理块设备比字符设备 ...
- [转帖]超线程SMT究竟可以快多少?(AMD Ryzen版 )
https://www.modb.pro/db/139224 昨天我们用Intel I9的10核,每个核2个threads的机器跑了内核的编译: 超线程SMT究竟可以快多少? 今天,我换一台机器,采用 ...
- [转帖]ls命令
ls(list) 命令可以说是Linux下最常用的命令之一 #ls -l;列出文件的详细信息 #ll 以上两个命令一样,ll是ls -l的简写 #ls -al;列出目录下的所有文件,包括以 . 开头的 ...
- [转帖]kubelet 原理解析五: exec的背后
https://segmentfault.com/a/1190000022163850 概述 线上排查pod 问题一般有两种方式,kubectl log或者kubectl exec调试.如果你的 lo ...
- [官方]Beyond Compare里面 二进制比较的含义.
Content Comparisons Actions > Compare Contents In the Actions menu, the Compare Contents command ...
- Raid卡在Write back 与Write through 时的性能差异
还是读姜老师的 mysql技术内核innodb存储引擎这本书里面的内容. 之前知道raid卡的设置会影响性能, 预计也是十几倍的性能差距, 但是从来没有用数据库进行过验证 书中有针对不通raid卡的设 ...
- Spring Cloud 系列:基于Seata 实现 XA模式
https://seata.io/zh-cn/docs/user/mode/xa https://seata.io/zh-cn/docs/dev/mode/xa-mode XA 规范 是 X/Open ...
- NOI Linux 下 Geany 配置教程
没有括号补全? 现在有自动括号补全了! 红色的 a.cpp 的意思是 a.cpp 没有保存. 现在来设置编译运行的快捷键. 不难推测 "%e" 是可执行文件的意思,"%f ...