1.首先去官網下載對應的工具庫https://github.com/linClubs/nuscenes2kitti.git
2.官網有具體的教程,不過編譯的時候需要刪除nus2kitti_ws/src的Cmake文件,除此之外在命令窗口進行軟鏈接export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libffi.so.7
3.詳細過程如下:
# 記得切一個能運行BEVFusion,fastbev,bevdet,mmdetetion3d的python虛擬環境運行該工程
# 報錯需要什么庫就編譯什么庫# 1 激活自己的虛擬環境 本人使用bevdet
conda activate bevdet# 2 安裝依賴包?
pip install pyyaml nuscenes-devkit python-opencv pypcd?# 3 安裝ros發布box的依賴 ?需要ros可視化才需要安裝
pip install pyyaml rospkg empy catkin_pkg
sudo apt install ros-noetic-jsk-recognition ros-noetic-jsk-rviz-plugins# 4 創建工作空間
mkdir -p nus2kitti_ws/src && cd nus2kitti_ws/src# 5 拉取源碼
git clone https://github.com/linClubs/nuscenes2kitti.git# 6 編譯
cd nus2kitti_ws && catkin_make# 7 運行時報錯
ModuleNotFoundError: No module named 'cStringIO'
# 修改如下 python3中StringIO是從io導入
try:
? ? from cStringIO import StringIO? ? from io import StringIO
# 1. 只發布前視圖和點云
roslaunch nus_pkg nus_pub_cloud.launch# 2. 發布環視,點云, 3Dbox
roslaunch nus_pkg nus_pub_box3d.launch# 3 nus2kitti
rosrun nus_pkg nus2kitti.py
# 或者
cd nus_pkg/scripts
python nus2kitti.py
4.這個庫寫的超詳細還可以制作自己的數據集,可以自己研究研究
?5.之后運行后生成的標簽是這樣的,我們進行轉換
?6.之后我們寫個下面的腳本轉換一下?
nuscenes2kitti
7.轉換之后就是正常的數據集格式:
8.最后一步重要的是需要改變角度要不最后檢測結果會偏90°,相應的程序代碼為:
import os
import math# 文件夾路徑
folder_path = '/home/pc/2026BOSS/OpenPCDet/data/custom/training/label_2'# 遍歷文件夾中的所有文件
for filename in os.listdir(folder_path):# 只處理 .txt 文件if filename.endswith('.txt'):file_path = os.path.join(folder_path, filename)# 讀取文件內容with open(file_path, 'r') as file:lines = file.readlines()# 處理每一行的最后一個數字new_lines = []for line in lines:parts = line.strip().split()if parts:# 將最后一個數字加上 pi/2parts[-1] = str(float(parts[-1]) + math.pi / 2)new_line = ' '.join(parts)new_lines.append(new_line)# 將處理后的內容寫回文件with open(file_path, 'w') as file:file.write('\n'.join(new_lines) + '\n')print("處理完成")
9 ,轉換之后的標簽如下所示:
10.這里寫了一個點云可視化腳本,比較方便。
import sys
import os
import numpy as np
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QLabel,QFileDialog, QVBoxLayout, QHBoxLayout, QComboBox, QSlider
)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QScreen
from mayavi.core.ui.api import MayaviScene, SceneEditor
from mayavi.tools.mlab_scene_model import MlabSceneModel
from traits.api import HasTraits, Instance
from traitsui.api import View, Item, Group# 嵌入 Mayavi 的 Traits 視圖
class MayaviView(HasTraits):scene = Instance(MlabSceneModel, ())view = View(Group(Item('scene', editor=SceneEditor(scene_class=MayaviScene), show_label=False),),resizable=True,width=800,height=600)def __init__(self, **kwargs):super(MayaviView, self).__init__(**kwargs)# 設置背景顏色為黑色self.scene.mayavi_scene.scene.background = (0, 0, 0)def plot(self, x, y, z, point_size):# 清空當前圖self.scene.mlab.clf()# 繪制所有點為白色self.scene.mlab.points3d(x, y, z,mode='point',color=(1, 1, 1), # 白色scale_factor=point_size,figure=self.scene.mayavi_scene)class PointCloudViewer(QWidget):def __init__(self):super().__init__()self.setWindowTitle("BIN 點云可視化")# 設置窗口大小為屏幕大小的百分比以實現自適應screen = QScreen.availableGeometry(QApplication.primaryScreen())self.resize(screen.width() * 0.8, screen.height() * 0.8)self.mayavi_widget = Noneself.x = self.y = self.z = None# 主布局main_layout = QVBoxLayout()# 文件標簽和按鈕布局file_layout = QHBoxLayout()self.label = QLabel("請選擇一個 .bin 文件")file_layout.addWidget(self.label)self.select_button = QPushButton("打開文件")self.select_button.clicked.connect(self.open_file)file_layout.addWidget(self.select_button)main_layout.addLayout(file_layout)# 點尺寸滑塊布局config_layout = QHBoxLayout()config_layout.addWidget(QLabel("點尺寸:"))self.size_slider = QSlider(Qt.Horizontal)self.size_slider.setMinimum(1)self.size_slider.setMaximum(20)self.size_slider.setValue(5)self.size_slider.valueChanged.connect(self.update_plot)config_layout.addWidget(self.size_slider)main_layout.addLayout(config_layout)self.setLayout(main_layout)def open_file(self):filename, _ = QFileDialog.getOpenFileName(self, "選擇點云 .bin 文件", "", "BIN files (*.bin)")if filename:self.label.setText(f"已加載: {os.path.basename(filename)}")self.load_bin(filename)self.show_mayavi()def load_bin(self, filepath):raw = np.fromfile(filepath, dtype=np.float32)if raw.size % 4 == 0:pc = raw.reshape(-1, 4)elif raw.size % 3 == 0:pc = raw.reshape(-1, 3)pc = np.concatenate([pc, np.zeros((pc.shape[0], 1), dtype=np.float32)], axis=1)else:raise ValueError(f"無法識別的 BIN 格式,總元素數 {raw.size}")self.x, self.y, self.z = pc[:, 0], pc[:, 1], pc[:, 2]def show_mayavi(self):if self.mayavi_widget is None:self.mayavi_view = MayaviView()self.mayavi_widget = self.mayavi_view.edit_traits(parent=self, kind='subpanel').control# 將 Mayavi 控件添加到主布局下方self.layout().addWidget(self.mayavi_widget)self.update_plot()def update_plot(self):if self.x is None:returnpoint_size = self.size_slider.value() * 0.1 # 調整縮放因子self.mayavi_view.plot(self.x, self.y, self.z, point_size)if __name__ == '__main__':app = QApplication(sys.argv)viewer = PointCloudViewer()viewer.show()sys.exit(app.exec_())
11.訓練后的檢測效果: