0

0

点云处理:基于Paddle2.0实现VoxNet对点云进行分类处理

P粉084495128

P粉084495128

发布时间:2025-07-29 11:29:22

|

1047人浏览过

|

来源于php中文网

原创

该项目利用VoxNet实现点云分类任务,使用ModelNet40数据集,抽取1024个点训练。先将点云转成32×32×32体素数据,生成训练和测试样本列表,构建数据加载器。VoxNet含3D卷积等层,通过Adam优化器训练100轮,保存模型,评估后可预测点云类别,如示例中成功识别出飞机。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

点云处理:基于paddle2.0实现voxnet对点云进行分类处理 - php中文网

GentleAI
GentleAI

GentleAI是一个高效的AI工作平台,为普通人提供智能计算、简单易用的界面和专业技术支持。让人工智能服务每一个人。

下载

点云处理:VoxNet分类任务

项目效果

    如图所示,能预测出该点云所对应的类别。

点云处理:基于Paddle2.0实现VoxNet对点云进行分类处理 - php中文网        

项目说明

①数据集

    ModelNet总共有662中目标分类,127915个CAD,以及十类标记过方向朝向的数据。其中包含了三个子集:

    1、ModelNet10:十个标记朝向的子集数据;

    2、ModelNet40:40个类别的三维模型;

    3、Aligned40:40类标记的三维模型。

    这里使用了ModelNet40,并且归一化了,文件中的数据的意义:

    1、横轴有六个数字,分别代表:x, y, z, r, g, b;

    2、纵轴为点,每份数据一共有10000个点,项目中每份数据抽取其中1024个点进行训练。

       

In [ ]
!unzip data/data50045/modelnet40_normal_resampled.zip!mkdir dataset
   

②VoxNet简介

    VoxNet:Volumetric Convolutional Neural Networks,将3D卷积应用到处理点云上,是一个比较早且比较好玩的网络。其发表在15年的文章,在IEEE/RSJ,机器人方面顶会IROS。

    一、提出背景:

    当时的很多方法要么不在机器人领域使用3D数据,要么就是处理不了这么大量的点云数据。于是提出的VoxNet利用3D CNN来对被占用的网格的体素进行处理。

    二、网络结构:

点云处理:基于Paddle2.0实现VoxNet对点云进行分类处理 - php中文网

    三、搭建过程的几个要点:

    ①、将点云数据转成体素数据,这里选择分辨率使得数据占据32×32×32体素的子体积(后面还有论文提出了更好玩的点云转成体素的方法,后面有时间俺可以再写下这方面的)。

点云处理:基于Paddle2.0实现VoxNet对点云进行分类处理 - php中文网

    ②、3D卷积处理体素数据(VoxNet)。

       

项目主体

①导入需要的库

In [1]
import osimport numpy as npimport randomimport paddleimport paddle.nn.functional as Ffrom paddle.nn import Conv3D, MaxPool3D, Linear, BatchNorm, Dropout, LeakyReLU, Softmax, Sequential
   

*②数据处理

1、类别

In [32]
category = {    'bathtub': 0,    'bed': 1,    'chair': 2,    'door': 3,    'dresser': 4,    'airplane': 5,    'piano': 6,    'sofa': 7,    'person': 8,    'cup': 9}
_category = {    0: 'bathtub',    1: 'bed',    2: 'chair',    3: 'door',    4: 'dresser',    5: 'airplane',    6: 'piano',    7: 'sofa',    8: 'person',    9: 'cup'}
categoryList = [    'bathtub',    'bed',    'chair',    'door',    'dresser',    'airplane',    'piano',    'sofa',    'person',    'cup']
   

*2、将点云数据转成体素数据

点云处理:基于Paddle2.0实现VoxNet对点云进行分类处理 - php中文网        

In [ ]
def transform():
    for i in range(len(categoryList)):
        dirpath = os.path.join('./modelnet40_normal_resampled', categoryList[i])
        dirlist = os.listdir(dirpath)        if not os.path.exists(os.path.join('./dataset', categoryList[i])):
            os.mkdir(os.path.join('./dataset', categoryList[i]))        for datalist in dirlist:
            datapath = os.path.join(dirpath, datalist)
            zdata = []
            xdata = []
            ydata = []
            f = open(datapath, 'r')            for point in f:
                xdata.append(float(point.split(',')[0]))
                ydata.append(float(point.split(',')[1]))
                zdata.append(float(point.split(',')[2]))
            f.close()
            arr = np.zeros((32,) * 3).astype('float32')            for j in range(len(xdata)):
                arr[int(xdata[j] * 15.5 + 15.5)][int(ydata[j] * 15.5 + 15.5)][int(zdata[j] * 15.5 + 15.5)] = 1
            savepath = os.path.join('./dataset', categoryList[i], datalist.split('.')[0]+'.npy')
            np.save(savepath, arr)if __name__ == '__main__':
    transform()
   

3、生成训练和测试样本的list

In [ ]
def getDatalist():
    f_train = open('./dataset/train.txt', 'w')
    f_test = open('./dataset/test.txt', 'w')    for i in range(len(categoryList)):
        dict_path = os.path.join('./dataset/', categoryList[i])
        data_dict = os.listdir(dict_path)
        count = 0
        for data_path in data_dict:            if count % 60 != 0:
                f_train.write(os.path.join(dict_path, data_path) + ' ' + categoryList[i]+ '\n')            else:
                f_test.write(os.path.join(dict_path, data_path) + ' ' + categoryList[i]+ '\n')
            count += 1
    f_train.close()
    f_test.close()if __name__ == '__main__':
    getDatalist()
   

4、数据读取

In [3]
def pointDataLoader(file_path='./dataset/train.txt', mode='train'):
    BATCHSIZE = 64
    MAX_POINT = 1024
    datas = []
    labels = []
    f = open(file_path)    for data_list in f:
        point_data = np.load(data_list.split(' ')[0])
        datas.append(point_data)
        labels.append(category[data_list.split(' ')[1].split('\n')[0]])
    f.close()
    datas = np.array(datas)
    labels = np.array(labels)

    index_list = list(range(len(datas)))    def pointDataGenerator():
        if mode == 'train':
            random.shuffle(index_list)
        datas_list = []
        labels_list = []        for i in index_list:
            data = np.reshape(datas[i], [1, 32, 32, 32]).astype('float32')
            label = np.reshape(labels[i], [1]).astype('int64')
            datas_list.append(data) 
            labels_list.append(label)            if len(datas_list) == BATCHSIZE:                yield np.array(datas_list), np.array(labels_list)
                datas_list = []
                labels_list = []        if len(datas_list) > 0:            yield np.array(datas_list), np.array(labels_list)    return pointDataGenerator
   

*③定义网络

In [4]
class VoxNet(paddle.nn.Layer):
    def __init__(self, name_scope='VoxNet_', num_classes=10):
        super(VoxNet, self).__init__()
        self.backbone = Sequential(
            Conv3D(1, 32, 5, 2),
            BatchNorm(32),
            LeakyReLU(),
            Conv3D(32, 32, 3, 1),
            MaxPool3D(2, 2, 0)
        )
        self.head = Sequential(
            Linear(32*6*6*6, 128),
            LeakyReLU(),
            Dropout(0.2),
            Linear(128, num_classes),
            Softmax()
        )    def forward(self, inputs):
        x = self.backbone(inputs)
        x = paddle.reshape(x, (-1, 32*6*6*6))
        x = self.head(x)        return x

voxnet = VoxNet()
paddle.summary(voxnet, (64, 1, 32, 32, 32))
       
-----------------------------------------------------------------------------
 Layer (type)        Input Shape           Output Shape         Param #    
=============================================================================
   Conv3D-1     [[64, 1, 32, 32, 32]]  [64, 32, 14, 14, 14]      4,032     
  BatchNorm-1   [[64, 32, 14, 14, 14]] [64, 32, 14, 14, 14]       128      
  LeakyReLU-1   [[64, 32, 14, 14, 14]] [64, 32, 14, 14, 14]        0       
   Conv3D-2     [[64, 32, 14, 14, 14]] [64, 32, 12, 12, 12]     27,680     
  MaxPool3D-1   [[64, 32, 12, 12, 12]]  [64, 32, 6, 6, 6]          0       
   Linear-1          [[64, 6912]]           [64, 128]           884,864    
  LeakyReLU-2        [[64, 128]]            [64, 128]              0       
   Dropout-1         [[64, 128]]            [64, 128]              0       
   Linear-2          [[64, 128]]             [64, 10]            1,290     
   Softmax-1          [[64, 10]]             [64, 10]              0       
=============================================================================
Total params: 917,994
Trainable params: 917,866
Non-trainable params: 128
-----------------------------------------------------------------------------
Input size (MB): 8.00
Forward/backward pass size (MB): 159.20
Params size (MB): 3.50
Estimated Total Size (MB): 170.70
-----------------------------------------------------------------------------
       
{'total_params': 917994, 'trainable_params': 917866}
               

⑤训练

In [5]
def train():
    train_loader = pointDataLoader(file_path='./dataset/train.txt', mode='train')
    model = VoxNet()
    optim = paddle.optimizer.Adam(parameters=model.parameters(), weight_decay=0.001)

    loss_fn = paddle.nn.CrossEntropyLoss()
    epoch_num = 100
    for epoch in range(epoch_num):        for batch_id, data in enumerate(train_loader()):
            inputs = paddle.to_tensor(data[0])
            labels = paddle.to_tensor(data[1])
            predicts = model(inputs)

            loss = F.cross_entropy(predicts, labels)
            acc = paddle.metric.accuracy(predicts, labels)
            loss.backward()
            optim.step()
            optim.clear_grad()            if batch_id % 8 == 0: 
                print("epoch: {}, batch_id: {}, loss is: {}, acc is: {}".format(epoch, batch_id, loss.numpy(), acc.numpy()))        if epoch % 20 == 0:
            paddle.save(model.state_dict(), './model/VoxNet.pdparams')
            paddle.save(optim.state_dict(), './model/VoxNet.pdopt')if __name__ == '__main__':
    train()
   

⑥评估

In [7]
def evaluation():
    test_loader = pointDataLoader(file_path='./dataset/test.txt', mode='test')
    model = VoxNet()
    model_state_dict = paddle.load('./model/VoxNet.pdparams')
    model.load_dict(model_state_dict)    for batch_id, data in enumerate(test_loader()):
        inputs = paddle.to_tensor(data[0])
        labels = paddle.to_tensor(data[1])
        predicts = model(inputs)

        loss = F.cross_entropy(predicts, labels)
        acc = paddle.metric.accuracy(predicts, labels)        # 打印信息
        if batch_id % 100 == 0:            print("batch_id: {}, loss is: {}, acc is: {}".format(batch_id, loss.numpy(), acc.numpy()))if __name__ == '__main__':
    evaluation()
       
batch_id: 0, loss is: [1.4866376], acc is: [0.96875]
       

⑦预测

In [28]
def visual(file_path='./dataset/predict.txt'):
    f = open(file_path)
    arr = np.load(f.readline().split(' ')[0])
    f.close()
    zdata = []
    xdata = []
    ydata = []    for i in range(arr.shape[0]):        for j in range(arr.shape[1]):            for k in range(arr.shape[2]):                if arr[i][j][k] == 1:
                    xdata.append(float(i))
                    ydata.append(float(j))
                    zdata.append(float(k))
    xdata = np.array(xdata)
    ydata = np.array(ydata)
    zdata = np.array(zdata)    from mpl_toolkits import mplot3d
    %matplotlib inline    import matplotlib.pyplot as plt

    ax = plt.axes(projection='3d')
    ax.scatter3D(xdata, ydata, zdata, c='r')
    plt.show()
   
In [38]
def test():
    test_loader = pointDataLoader(file_path='./dataset/predict.txt', mode='test')
    model = VoxNet()
    model_state_dict = paddle.load('./model/VoxNet.pdparams')
    model.load_dict(model_state_dict)    for batch_id, data in enumerate(test_loader()):
        predictdata = paddle.to_tensor(data[0])
        label = paddle.to_tensor(data[1])
        predict = model(predictdata)        print("predict: {}, label: {}".format(np.argmax(predict.numpy(), 1), np.squeeze(label.numpy())))        print("predict: {}".format(_category[int(np.argmax(predict.numpy(), 1))]))if __name__ == '__main__':
    visual()
    test()
       
<Figure size 432x288 with 1 Axes>
               
predict: [5], label: 5
predict: airplane
       

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

46

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

178

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

51

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

532

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

171

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号