从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。

文件地址

https://github.com/yanx27/Pointnet_Pointnet2_pytorch?spm=5176.28103460.0.0.21a95d27ollfze

Pointnet_Pointnet2_pytorch\log\classification\pointnet2_ssg_wo_normals文件夹改名为Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg

"E:\Pointnet_Pointnet2_pytorch\provider.py" 在provider.py文件头添加

def pc_normalize(pc):l = pc.shape[0]centroid = np.mean(pc, axis=0)pc = pc - centroidm = np.max(np.sqrt(np.sum(pc**2, axis=1)))pc = pc / mreturn pc

详细介绍了如何从视频帧中生成点云数据并使用PointNet++模型提取特征,最后将特征保存下来。
从视频帧中生成点云数据并提取特征
1. 引言

在计算机视觉领域,点云数据是一种重要的三维数据形式,广泛应用于自动驾驶、机器人导航、物体识别等场景。本文将详细介绍如何从视频帧中生成点云数据,并使用PointNet++模型提取特征,最后将特征保存下来以供后续分析或使用。
2. 环境准备

在开始之前,确保你的环境中安装了以下依赖项:

    Python 3.6+
    PyTorch 1.7+
    Open3D
    OpenCV
    NumPy

你可以使用以下命令安装这些依赖项:

pip install torch torchvision
pip install open3d opencv-python numpy

3. 代码实现

import os
import sys
# 获取当前脚本所在的目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 将 models 目录添加到 sys.path
sys.path.insert(0, os.path.join(current_dir, 'models'))
import numpy as np
import torch
import cv2
import open3d as o3d
from models.pointnet2_cls_ssg import get_model
from provider import pc_normalize
import time
import hashlib# 打印 sys.path 以确认路径是否正确
print(sys.path)# 设置设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(f"设备设置为: {device}")# 加载预训练模型
#"E:\Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg\checkpoints\best_model.pth"
model_path = os.path.join('log', 'classification', 'pointnet2_cls_ssg', 'checkpoints', 'best_model.pth')  # 替换为实际路径
print(f"加载预训练模型: {model_path}")
model = get_model(num_class=40, normal_channel=False).to(device)# 只加载模型参数
checkpoint = torch.load(model_path, map_location=device)
model.load_state_dict(checkpoint['model_state_dict'])
model.eval()
print("模型加载完成")# 从视频帧生成点云数据
def frame_to_point_cloud(frame, depth_frame=None):if depth_frame is None:# 如果没有深度图,使用随机生成的点云数据作为示例points = np.random.rand(1024, 3)  # 生成 1024 个点,每个点有 3 个坐标else:# 使用深度图生成点云h, w = depth_frame.shapey, x = np.indices((h, w))z = depth_framepoints = np.stack([x, y, z], axis=-1).reshape(-1, 3)points = points[~np.isnan(points).any(axis=1)]  # 去除无效点if points.shape[0] > 1024:points = points[np.random.choice(points.shape[0], 1024, replace=False)]elif points.shape[0] < 1024:points = np.pad(points, ((0, 1024 - points.shape[0]), (0, 0)), mode='constant')print(f"生成点云数据: {points.shape}")return points# 提取特征
def extract_features(model, point_cloud):point_cloud = pc_normalize(point_cloud)  # 归一化点云point_cloud = torch.from_numpy(point_cloud).float().unsqueeze(0).transpose(2, 1).to(device)with torch.no_grad():pred, trans_feat = model(point_cloud)  # 只接收两个返回值print(f"提取特征完成: {pred.shape}")return pred.cpu().numpy()# 处理单个视频文件
def process_video(video_path, output_folder):cap = cv2.VideoCapture(video_path)frame_count = 0video_name = os.path.basename(video_path).split('.')[0]print(f"开始处理视频: {video_path}")all_features = []while cap.isOpened():ret, frame = cap.read()if not ret:break# 生成点云数据point_cloud = frame_to_point_cloud(frame)if point_cloud.shape[0] < 1024:  # 确保至少有 1024 个点print(f"帧 {frame_count} 点云数据不足,跳过")continue  # 如果点不够,跳过此帧# 提取特征features = extract_features(model, point_cloud)print(f"处理帧 {frame_count} 特征: {features}")# 保存特征到 all_features 列表中all_features.append(features)frame_count += 1cap.release()print(f"视频处理完成: {video_path}")# 生成唯一的文件名output_file = os.path.join(output_folder, f'{video_name}_features.npy')# 将所有特征保存到一个文件中np.save(output_file, np.vstack(all_features))print(f"特征已保存到: {output_file}")# 检查视频文件是否已处理
def is_video_processed(video_path, processed_videos):video_hash = hashlib.md5(video_path.encode()).hexdigest()return video_hash in processed_videos# 获取已处理的视频文件列表
def get_processed_videos(output_file):if not os.path.exists(output_file):return set()processed_videos = set()with open(output_file, 'r') as f:for line in f:processed_videos.add(line.strip())return processed_videos# 记录已处理的视频文件
def record_processed_video(video_path, output_file):video_hash = hashlib.md5(video_path.encode()).hexdigest()with open(output_file, 'a') as f:f.write(video_hash + '\n')# 处理视频文件夹
def process_video_folder(folder_path, output_folder):processed_videos_file = os.path.join(output_folder, 'processed_videos.txt')processed_videos = get_processed_videos(processed_videos_file)print(f"开始处理视频文件夹: {folder_path}")for root, dirs, files in os.walk(folder_path):for file in files:if file.endswith('.mp4') or file.endswith('.avi'):video_path = os.path.join(root, file)if is_video_processed(video_path, processed_videos):print(f"视频已处理,跳过: {video_path}")continueprocess_video(video_path, output_folder)record_processed_video(video_path, processed_videos_file)print("所有视频处理完成")# 主程序
if __name__ == "__main__":# 视频文件夹路径input_folder = r'E:\Pointnet_Pointnet2_pytorch\data\voide'output_folder = r'E:\Pointnet_Pointnet2_pytorch\data\voide_features'  # 特征保存路径# 确保输出文件夹存在os.makedirs(output_folder, exist_ok=True)# 处理视频文件夹process_video_folder(input_folder, output_folder)


3.1 导入必要的库

首先,我们需要导入一些必要的库,包括文件操作、数值计算、深度学习框架、图像处理和点云处理相关的库。
3.2 设置设备

检查是否有可用的GPU,并设置设备。如果存在GPU,将使用GPU进行计算;否则,使用CPU。
3.3 加载预训练模型

我们使用PointNet++模型来提取点云特征。首先,加载预训练模型。这通常涉及以下几个步骤:

    指定模型路径:提供预训练模型的路径。
    加载模型:使用 get_model 函数创建模型实例,并将其移动到指定的设备(CPU或GPU)。
    加载模型参数:从预训练模型文件中加载模型参数,并设置模型为评估模式。

3.4 从视频帧生成点云数据

定义一个函数 frame_to_point_cloud,该函数从视频帧中生成点云数据。如果没有深度图,可以生成随机点云数据作为示例。具体步骤如下:

    生成随机点云:如果没有深度图,生成1024个随机点,每个点有3个坐标。
    使用深度图生成点云:如果有深度图,从深度图中提取点云数据。具体做法是将深度图的每个像素位置(x, y)和对应的深度值z组合成一个三维点(x, y, z)。然后,去除无效点,并确保点云数据的形状为 (1024, 3)。

3.5 提取特征

定义一个函数 extract_features,该函数使用预训练模型提取点云数据的特征。具体步骤如下:

    归一化点云:对点云数据进行归一化处理,使其适合输入到模型中。
    转换为张量:将点云数据转换为PyTorch张量,并移动到指定的设备。
    提取特征:使用预训练模型提取特征,并返回特征向量。

3.6 处理单个视频文件

定义一个函数 process_video,该函数处理单个视频文件,逐帧生成点云数据并提取特征。具体步骤如下:

    打开视频文件:使用OpenCV的 cv2.VideoCapture 打开视频文件。
    读取帧:逐帧读取视频。
    生成点云数据:调用 frame_to_point_cloud 函数生成点云数据。
    提取特征:调用 extract_features 函数提取特征。
    保存特征:将提取的特征保存为 .npy 文件。

3.7 处理视频文件夹

定义一个函数 process_video_folder,该函数处理指定文件夹中的所有视频文件。具体步骤如下:

    遍历文件夹:使用 os.walk 遍历指定文件夹中的所有视频文件。
    处理每个视频:调用 process_video 函数处理每个视频文件。

3.8 主程序

在主程序中,指定输入视频文件夹和输出特征文件夹的路径,并调用 process_video_folder 函数处理所有视频文件。
4. 总结

本文详细介绍了如何从视频帧中生成点云数据,并使用PointNet++模型提取特征,最后将特征保存下来。通过这些步骤,你可以将视频数据转换为点云数据,并提取有用的特征,为后续的分析和应用提供支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高效工具推荐:基于WebGPU的Whisper Web结合内网穿透远程使用指南

文章目录 前言1.本地部署Whisper Web1.1 安装git1.2 安装Node.js1.3 运行项目 2. Whisper Web使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 公网访问测试6. 配置固定公网地址 前言 OpenAI开源的 Whisper 语音转文本模型效果都说还不错&#xff0c;今天就给大家推荐 GitHub…

大数据学习16之Spark-Core

1. 概述 1.1.简介 Apache Spark 是专门为大规模数据处理而设计的快速通用的计算引擎。 一种类似 Hadoop MapReduce 的通用并行计算框架&#xff0c;它拥有MapReduce的优点&#xff0c;不同于MR的是Job中间结果可以缓存在内存中&#xff0c;从而不需要读取HDFS&#xff0c;减少…

TDSQL 免密码登录

需求 os用户免密登录tdsql 解决方案 使用mysql自带的 mysql_config_editor 工具 提示&#xff1a;使用这个工具&#xff0c;登录密码不能包含#字符。 操作步骤 建os账号&#xff0c;切换到新账号 [roottdsql1 ~]# useradd jdbc_user [roottdsql1 ~]# su - jdbc_user [jd…

Go语言跨平台桌面应用开发新纪元:LCL、CEF与Webview全解析

开篇寄语 在Go语言的广阔生态中&#xff0c;桌面应用开发一直是一个备受关注的领域。今天&#xff0c;我将为大家介绍三款基于Go语言的跨平台桌面应用开发框架——LCL、CEF与Webview&#xff0c;它们分别拥有独特的魅力和广泛的应用场景。通过这三款框架&#xff0c;你将能够轻…

机器学习day5-随机森林和线性代数1最小二乘法

十 集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。大致可以分为&#xff1a;Bagging&#xff0c;Boosting 和 Stacking 三大类型。 &#xff08;1&#xff09;每次有放回地从训练集中取出 n 个训练样本&…

某某科技笔试题

&#xff08;15题&#xff0c;45分钟&#xff0c;闭卷&#xff09; 一、( 8 分 &#xff09;请问以下程序输出什么结果&#xff1f; char *getStr(void) 。 &#xff5b; char p[] "hellow world"; return p; &#xff5d; void test(void) &#xff5b; ch…

Excel使用-弹窗“此工作簿包含到一个或多个可能不安全的外部源的链接”的发生与处理

文章目录 前言一、探讨问题发生原因1.引入外部公式2.引入外部数据验证二、问题现象排查及解决1.排查公式2.排查数据验证3.特殊处理方式总结前言 作为一种常用的办公软件,Excel被大家所熟知。尽管使用了多年,有时候在使用Excel时候也会发生一些不太常见的现象,需要用心核查下…

跨越网络边界:IPv6与零信任架构的深度融合

2024年&#xff0c;工信部发布了《关于开展“网络去NAT”专项工作 进一步深化IPv6部署应用的通知》&#xff0c;加速了国内网络由IPv4向IPv6的转型步伐。未来&#xff0c;各行各业将逐步去NAT&#xff0c;逐步向IPv6迁移。在此过程中&#xff0c;网络安全解决方案和产品能力将面…

从大数据到大模型:现代应用的数据范式

作者介绍&#xff1a;沈炼&#xff0c;蚂蚁数据部数据库内核负责人。2014年入职蚂蚁&#xff0c;承担蚂蚁集团的数据库架构职责&#xff0c;先后负责了核心链路上OceanBase&#xff0c;OceanBase高可用体系建设、NoSQL数据库产品建设。沈炼对互联网金融、数据库内核、数据库高可…

vue3 + vite + ts 配置 @ 别名

第一步 npm install types/node -D第二步 这是原 vite.config.ts文件import { defineConfig } from vite import vue from vitejs/plugin-vue// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()], })改成下面这个import { defineConfig } from vite …

Android Framework AMS面试题及参考答案

目录 什么是 AMS? AMS 在 Android 系统中的作用? AMS 是如何启动的? Zygote、SystemServer 与 AMS 之间的关系? AMS 如何与其他系统服务(如 PackageManagerService、WindowManagerService、WMS)交互? AMS 如何使用 Binder 完成通信? AMS 如何管理系统服务的启动…

从零开始学习 sg200x 多核开发之 eth0 dhcpc 配置

前面已经介绍过 sophpi 的启动过程和 eth0 静态 IP 地址配置。不过静态 IP 在使用的时候比较不通用&#xff0c;本文介绍 eth0 自动使能并配置 dhcp 功能。 udhcpc udhcpc 是 BusyBox 工具集中的一个组件&#xff0c;用于从 DHCP 服务器获取网络配置信息&#xff0c;如 IP 地…

开源vs闭源:你更看好哪一方?

开源vs闭源:你更看好哪一方? 引言 你有没有想过,在当今人工智能(AI)蓬勃发展的时代,开源大模型与闭源大模型之间的竞争竟然如此激烈?这仿佛就像是两位骑士在同一片战场上,争夺你我心目中“最强武器”的荣耀。在这场有趣又复杂的较量中,数据隐私、商业应用与社区参与…

华为eNSP:MSTP

一、什么是MSTP&#xff1f; 1、MSTP是IEEE 802.1S中定义的生成树协议&#xff0c;MSTP兼容STP和RSTP&#xff0c;既可以快速收敛&#xff0c;也提供了数据转发的多个冗余路径&#xff0c;在数据转发过程中实现VLAN数据的负载均衡。 2、MSTP可以将一个或多个VLAN映射到一个Inst…

利用python 检测当前目录下的所有PDF 并转化为png 格式

以下是一个完整的 Python 脚本&#xff0c;用于检测当前目录下的所有 PDF 文件并将每一页转换为 PNG 格式&#xff1a; import os from pdf2image import convert_from_path# 设置输出图像的 DPI&#xff08;分辨率&#xff09; DPI 300# 获取当前目录 current_directory os…

24. 正则表达式

一、什么是正则表达式 正则表达式&#xff08;regular expression&#xff09;又称 规则表达式&#xff0c;是一种文本模式&#xff08;pattern&#xff09;。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串&#xff0c;通常被用来检索、替换那些符合某个模式&…

MATLAB绘制克莱因瓶

MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…

2、 家庭网络发展现状

上一篇我们讲了了解家庭网络历史(https://blog.csdn.net/xld_hung/article/details/143639618?spm1001.2014.3001.5502),感兴趣的同学可以看对应的文章&#xff0c;本章我们主要讲家庭网络发展现状。 关于家庭网络发展现状&#xff0c;我们会从国内大户型和小户型的网络说起&…

Java基础语法(一)

一、基础语法 数据类型 基本数据类型&#xff1a; 整数类型&#xff1a;包括 byte&#xff08;1 字节&#xff0c;范围是 - 128 到 127&#xff09;、short&#xff08;2 字节&#xff0c;范围是 - 32768 到 32767&#xff09;、int&#xff08;4 字节&#xff0c;范围是 - 214…

Vue3 -- 项目配置之eslint【企业级项目配置保姆级教程1】

下面是项目级完整配置1➡eslint&#xff1a;【吐血分享&#xff0c;博主踩过的坑你跳过去&#xff01;&#xff01;跳不过去&#xff1f;太过分了给博主打钱】 浏览器自动打开项目&#xff1a; 你想释放双手吗&#xff1f;你想每天早上打开电脑运行完项目自动在浏览器打开吗&a…