用PointNet++訓練自己的數據集(語義分割模型semseg)

(1)訓練部件分割(partseg)模型和檢測自己點云并將結果保存txt,請看博主上兩篇文章
(2)本文背景是將pipe點云上的缺陷和本體檢測出來,即1種語義場景(pipe),2種類別(body和quexian)。請記住這兩個數字。

一、標注數據集:

step1:數據集預處理

參考:Windows11和Ubuntu用PointNet++訓練自己的數據集(部件分割模型)的第一部分即“一、標注數據集”部分即可。得到分類好的n行4列的txt文件。如果是部件分割(partseg)就結束了,但這里是語義分割(semseg)標注很麻煩,還沒完成!我這里操作完后得到了m個txt文件,即原本有m個pipe的點云txt文本。

step1結果:
在這里插入圖片描述
在這里插入圖片描述

step2:學習語義分割數據集的格式

參考:S3DIS場景點云數據集,仔細閱讀
這里用Stanford3dDataset_v1.2_Aligned_Version模式。格式是x y z r g b格式 即n行6列

step3:制作語義分割txt格式數據集(可以問deepseek,見step3末尾)

思路:用matlab依次遍歷step1中每個txt點云文件,在進行操作:將標簽為0的點,去掉0并將后三位替換為某個rgb值,再將標簽為1的點后三位替換為另外某個rgb值。(因為我只有兩個類別,所以我就只有0和1。)。

注意:最后要符合語義分割數據集的格式,即每個場景(即step1得到的每個txt文件)單獨一個文件夾名字叫做pipe_i(i從1到m),文件夾下存著step1結果中第m個點云(n行6列)pipe_i.txt還有一個Annotations文件夾。Annotations文件夾下有2個txt文件(本文的2種類別),分別是body_i.txt和quexian_i.txt,即兩種類別的n行6列的文本文件。邏輯是:body_i.txt + quexian_i.txt=pipe_i.txt

step3結果:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

deepseek實現step3

我的某個文件夾里有42個txt文件,名字分別是1.txt~42.txt.每個txt文件有n行4列,中間用空格隔開,即每個文件有n個空間點 前三列是xyz后一列是標簽,這42個文件里的每個點只有兩個標簽即0和1可能是浮點型。你也知道上面這種格式是做pointnet++部件分割的,現在我要改成語義分割,需要把標簽變成rgb。所以現在要你遍歷每個txt文件(可以用for數字遍歷,因為名字有規律),把每個文件里的0標簽的點換為rgb為[0 0 1],1標簽是換為[1 0 0]即n行6列xyzrgb 每列用空格隔開。但是要求每個txt要單獨建立一個文件夾叫做pipe_i,i是和i.txt的i相對應。pipe_i文件夾下有個pipe_i.txt放著i.txt的變換好的文件,pipe_i文件夾下的Annotations文件夾下有單獨的按照標簽的txt,之前為0標簽的點標簽變換rgb后就放到命名為body_i.txt,之前為1標簽的點標簽變換rgb后就放到命名為quexian_i.txt。即完全符合語義分割的數據格式。matlab實現
在這里插入圖片描述
Matlab代碼如下:運行時間會很長!!其中的rgb的值都是0~1可以自己改。

%%
%設置pointnet++語義分割數據集
% 設置輸入路徑和輸出路徑
input_path = 'D:\YinParker\Desktop\管道數據集4\biaozhu';  % 輸入文件路徑
output_root = 'D:\YinParker\Desktop\管道數據集4\semseg';  % 輸出根目錄% 創建輸出根目錄(如果不存在)
if ~exist(output_root, 'dir')mkdir(output_root);
end% 遍歷1.txt到42.txt
for i = 1:42% 輸入文件名input_filename = fullfile(input_path, sprintf('%d.txt', i));% 檢查文件是否存在if ~exist(input_filename, 'file')fprintf('文件不存在: %s\n', input_filename);continue;end% 讀取數據data = load(input_filename);xyz = data(:, 1:3);labels = data(:, 4);% 創建對應的輸出目錄結構pipe_dir = fullfile(output_root, sprintf('pipe_%d', i));annotations_dir = fullfile(pipe_dir, 'Annotations');if ~exist(pipe_dir, 'dir')mkdir(pipe_dir);endif ~exist(annotations_dir, 'dir')mkdir(annotations_dir);end% 準備轉換后的數據(xyzrgb)rgb_data = zeros(size(data, 1), 6);rgb_data(:, 1:3) = xyz;% 分離不同標簽的點(帶RGB)body_points = [];quexian_points = [];for j = 1:size(data, 1)if abs(labels(j)) < 0.5  % 處理浮點型標簽% 標簽0 -> 藍色 [0 0 1]rgb_data(j, 4:6) = [0 0 1];body_points = [body_points; xyz(j, :), 0, 0, 1];  % 添加RGBelse% 標簽1 -> 紅色 [1 0 0]rgb_data(j, 4:6) = [1 0 0];quexian_points = [quexian_points; xyz(j, :), 1, 0, 0];  % 添加RGBendend% 保存轉換后的主文件(pipe_i.txt)output_main_file = fullfile(pipe_dir, sprintf('pipe_%d.txt', i));dlmwrite(output_main_file, rgb_data, 'delimiter', ' ');% 保存帶RGB的標簽文件(Annotations/body_i.txt和quexian_i.txt)if ~isempty(body_points)body_file = fullfile(annotations_dir, sprintf('body_%d.txt', i));dlmwrite(body_file, body_points, 'delimiter', ' ');endif ~isempty(quexian_points)quexian_file = fullfile(annotations_dir, sprintf('quexian_%d.txt', i));dlmwrite(quexian_file, quexian_points, 'delimiter', ' ');endfprintf('已處理文件: %s\n', input_filename);
endfprintf('所有文件處理完成!結果保存在: %s\n', output_root);

step4:txt格式數據集變為npy

語義分割需要.npy格式的數據集,這也是麻煩的地方。
在PointNet++工程文件夾下的data文件夾建立s3dis文件夾,再在s3dis里面建立Stanford3dDataset_v1.2_Aligned_Version文件夾,里面有Area_1和Area_2兩個文件夾。后面會在程序參數設置中讓Area_2里的數據為測試集。再從step3中的pipe_i文件夾里找點文件復制進去,當做訓練集(Area1)和測試集(Area2)。結構圖如下:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

再在data文件夾下建立stanford_indoor3d用于存儲npy格式的文件。
在這里插入圖片描述

再修改anno_paths.txt和class_names.txt ,anno_paths.txt寫所有Area的Annotations的路徑,class_names.txt寫類別,和之前的step3中得到的Annotions里的相對應。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

用collect_indoor3d_data.py和indoor3d_util.py將txt樣本變為npy樣本 。參考:【PointNet++】基于自建數據訓練PointNet++場景語義分割網絡
在這里插入圖片描述
(1)collect_indoor3d_data.py修改:

1/1 加一行代碼:out_filename=os.path.basename(os.path.join(output_folder, out_filename)),不然生成的npy文件路徑不對,還得自己復制到data/stanford_indoor3d文件夾下
在這里插入圖片描述

(2)indoor3d_util.py修改: 改方框的兩處地方:
在這里插入圖片描述

運行collect_indoor3d_data.py在 data/stanford_indoor3d文件夾下生成npy文件,且前面有Area_1和2的前綴。
在這里插入圖片描述

二、修改訓練和測試代碼以及S3DISDataLoader.py

參考:
【PointNet++】基于自建數據訓練PointNet++場景語義分割網絡
【PointNet++】PointNet++復現(PyTorch版本)

1、訓練代碼修改:train_semseg.py

(1)類別:
在這里插入圖片描述
(2)改參數:其中最后一個參數指定哪個Area是測試集,剩下參數都根據實際調整
在這里插入圖片描述
(3)類別數:
在這里插入圖片描述
(4)(5)numpy版本問題
在這里插入圖片描述

2、測試代碼修改:test_semseg.py

測試的參數batch_size、num_point等參數根據自己實際調整

(1)類別:
在這里插入圖片描述
(2)類別數量:
在這里插入圖片描述

3、S3DISDataLoader.py修改

參考文獻中老哥少改了一個
(1)數字:
在這里插入圖片描述
(2)數字:得+1
在這里插入圖片描述
(3)數字:
在這里插入圖片描述
(4)補充: 其實后面兩個也不用改,因為后兩個在class ScannetDatasetWholeScene而前兩個在class S3DISDataset(Dataset):里,這里只用到了class S3DISDataset(Dataset):
在這里插入圖片描述

pointnet2_sem_seg.py改動

用這個模型就改,不用這個就改別的模型
在這里插入圖片描述

三、訓練以及訓練中報錯:

運行train_semseg.py即可開啟訓練。

報錯1:

Traceback (most recent call last):File "D:\YinParker\Desktop\AllFileFolder\A_Other_projects_in_laboratory\pointNet2\Pointnet_Pointnet2_pytorch-master\train_semseg.py", line 302, in <module>main(args)File "D:\YinParker\Desktop\AllFileFolder\A_Other_projects_in_laboratory\pointNet2\Pointnet_Pointnet2_pytorch-master\train_semseg.py", line 186, in mainfor i, (points, target) in tqdm(enumerate(trainDataLoader), total=len(trainDataLoader), smoothing=0.9):File "E:\ProfessionSoftware2\anaconda\anaconda3202303\envs\yolov8Python310\lib\site-packages\torch\utils\data\dataloader.py", line 438, in __iter__return self._get_iterator()File "E:\ProfessionSoftware2\anaconda\anaconda3202303\envs\yolov8Python310\lib\site-packages\torch\utils\data\dataloader.py", line 386, in _get_iteratorreturn _MultiProcessingDataLoaderIter(self)File "E:\ProfessionSoftware2\anaconda\anaconda3202303\envs\yolov8Python310\lib\site-packages\torch\utils\data\dataloader.py", line 1039, in __init__w.start()File "E:\ProfessionSoftware2\anaconda\anaconda3202303\envs\yolov8Python310\lib\multiprocessing\process.py", line 121, in startself._popen = self._Popen(self)File "E:\ProfessionSoftware2\anaconda\anaconda3202303\envs\yolov8Python310\lib\multiprocessing\context.py", line 224, in _Popenreturn _default_context.get_context().Process._Popen(process_obj)File "E:\ProfessionSoftware2\anaconda\anaconda3202303\envs\yolov8Python310\lib\multiprocessing\context.py", line 336, in _Popenreturn Popen(process_obj)File "E:\ProfessionSoftware2\anaconda\anaconda3202303\envs\yolov8Python310\lib\multiprocessing\popen_spawn_win32.py", line 93, in __init__reduction.dump(process_obj, to_child)File "E:\ProfessionSoftware2\anaconda\anaconda3202303\envs\yolov8Python310\lib\multiprocessing\reduction.py", line 60, in dumpForkingPickler(file, protocol).dump(obj)
AttributeError: Can't pickle local object 'main.<locals>.<lambda>'
Traceback (most recent call last):File "<string>", line 1, in <module>File "E:\ProfessionSoftware2\anaconda\anaconda3202303\envs\yolov8Python310\lib\multiprocessing\spawn.py", line 116, in spawn_mainexitcode = _main(fd, parent_sentinel)File "E:\ProfessionSoftware2\anaconda\anaconda3202303\envs\yolov8Python310\lib\multiprocessing\spawn.py", line 126, in _mainself = reduction.pickle.load(from_parent)
EOFError: Ran out of input

在這里插入圖片描述
在這里插入圖片描述
原因:gpt說是train_semseg.py有兩處lambda表達式在window不行

法一:改lanbda表達式(推薦法二)

(1)改:參考行號
在這里插入圖片描述

在這里插入圖片描述
(2)得import functools
在這里插入圖片描述
法二:
如何使用PointNet++復現自己的點云語義分割數據集?
如果你是windows系統,那你應該還要注意num_workers設置為0,否則會報錯的。 僅需改兩處
在這里插入圖片描述

報錯2:

也不是報錯,就是訓練代碼運行后一直卡住,
在這里插入圖片描述
原因:S3DISDataLoader.py里有個一直循環,點數沒有達到1024個
在這里插入圖片描述
因為1*1平方米內自己點太少了,達不到訓練時設置的參數--npoint(超參數)在這里插入圖片描述
解決方法:train_semseg.py里把參數1調大也行 或者 將上圖S3DISDataLoader.py里把1024調小
在這里插入圖片描述

如果對你有幫助,可以點贊、收藏支持一波

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900698.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900698.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kotlin中主構造函數是什么

一 Kotlin 中的主構造函數 主構造函數&#xff08;Primary Constructor&#xff09;是 Kotlin 類聲明的一部分&#xff0c;用于在 創建對象時初始化類的屬性。它不像 Java 那樣是一個函數體&#xff0c;而是緊跟在類名后面。 主構造函數的基本定義 class Person(val name: S…

PHP 過濾器

PHP 過濾器 引言 PHP作為一種廣泛使用的服務器端腳本語言&#xff0c;提供了強大的數據處理能力。在處理數據時&#xff0c;確保數據的安全性和準確性至關重要。PHP過濾器&#xff08;Filters&#xff09;就是用來對數據進行預處理和后處理的工具。本文將詳細介紹PHP過濾器的…

【WebRTC】開源項目Webrtc-streamer介紹

WebRTC-Streamer 這是一個用于通過簡單的信令機制&#xff08;參見 api&#xff09;流式傳輸 WebRTC 媒體源的實驗項目&#xff0c;支持以下媒體源&#xff1a; 捕獲設備 屏幕捕獲 mkv 文件 RMTP/RTSP 源 同時該項目也兼容 WHEP 接口。 注意 * 在線演示已停止&#xff0c…

【Java設計模式】第9章 原型模式講解

9. 原型模式 9.1 原型模式講解 定義:通過拷貝原型實例創建新對象,無需調用構造函數。特點: 創建型模式無需了解創建細節適用場景: 類初始化消耗資源多對象創建過程繁瑣(如屬性賦值復雜)循環體中需創建大量對象優點: 性能優于直接new簡化創建流程缺點: 必須實現clone()…

【Java集合】LinkedList源碼深度分析

參考筆記&#xff1a;java LinkedList 源碼分析&#xff08;通俗易懂)_linkedlist源碼分析-CSDN博客 目錄 1.前言 2.LinkedList簡介 3.LinkedList的底層實現 4.LinkedList 與 ArrayList 的對比 4.1 如何選擇 4.2 對比圖 5.LinkedList 源碼Debug 5.1 add(E e) &#xff…

openssl源碼分析之加密模式(modes)

openssl實現分組加密模式&#xff08;例如AES128-CBC的CBC部分&#xff09;的模塊名字叫做modes&#xff0c;源代碼位于 https://gitee.com/gh_mirrors/openssl/tree/master/crypto/modes 博主又打不開github了TT&#xff0c;只能找個gitee鏡像 頭文件是modes.h。 該模塊目前…

Java 搭建 MC 1.18.2 Forge 開發環境

推薦使用 IDEA 插件 Minecraft Development 進行創建項目 創建完成后即可進行 MOD 開發。 但是關于 1.18.2 的開發教程太少&#xff0c;因此自己研究了一套寫法&#xff0c;寫法并非是最優的但是是探索開發MOD中的一次筆記和記錄 GITHUB: https://github.com/zimoyin/zhenfa…

nginx如何實現負載均衡?

Nginx 是一款高性能的 Web 服務器和反向代理服務器&#xff0c;它可以通過配置實現負載均衡功能。以下是實現負載均衡的詳細步驟和方法&#xff1a; 1. 基本概念 負載均衡是將客戶端請求分發到多個后端服務器上&#xff0c;以提高系統的可用性和性能。Nginx 支持多種負載均衡策…

深度學習天崩開局

李沐大神的d2l包導入&#xff0c; 這玩意需要python311版本&#xff0c;我現在版本已經313了&#xff0c;作為一個天生要強的男人&#xff0c;我是堅決不向低版本低頭的。 然后我就研究啊&#xff0c;各種翻資料啊&#xff0c;然后deepseek加豆包都翻爛了&#xff0c; 最終所…

docker部署jenkins并成功自動化部署微服務

一、環境版本清單&#xff1a; docker 26.1.4JDK 17.0.28Mysql 8.0.27Redis 6.0.5nacos 2.5.1maven 3.8.8jenkins 2.492.2 二、服務架構&#xff1a;有gateway&#xff0c;archives&#xff0c;system這三個服務 三、部署步驟 四、安裝linux 五、在linux上安裝redis&#…

MPDrive:利用基于標記的提示學習提高自動駕駛的空間理解能力

25年4月來自南方科技大學、百度、英國 KCL和琶洲實驗室&#xff08;廣東 AI 和數字經濟實驗室&#xff09;的論文“MPDrive: Improving Spatial Understanding with Marker-Based Prompt Learning for Autonomous Driving”。 自動駕駛視覺問答&#xff08;AD-VQA&#xff09;…

Halcon圖像采集

Halcon是一款強大的機器視覺軟件&#xff0c;結合C#可以開發出功能完善的視覺應用程序。 基本設置 確保已經安裝了Halcon和Halcon的.NET庫&#xff08;HalconDotNet&#xff09;。 1. 添加引用 在C#項目中&#xff0c;需要添加對HalconDotNet.dll的引用&#xff1a; 右鍵點…

Win10定時任務計劃無法顯示要執行的EXE任務程序界面,問題解決辦法

用C#開發的一款WINFORM程序&#xff0c;在電腦測試一切順利&#xff0c;運行結果正確。但用電腦的定時任務執行時&#xff0c;程序界面不顯示&#xff0c;重啟電腦、各種試都不行&#xff0c;最終問題解決。 解決辦法&#xff1a; 要選“只在用戶登陸時運行”&#xff0c;才能執…

Navicat和PLSQL在oracle 使用語句報ORA-00911: 無效字符

后面我發現可能是在復制SQL語句中有中文&#xff0c;但是環境變量未配置中文環境。 因為Oracle的語法解析器特別嚴格&#xff0c;就會報出以上的錯誤出來。 SQL語句錯誤&#xff0c;存在中文字符或者sql語句空格導致&#xff0c;去掉即可解決。 我重新寫語句&#xff0c;發現…

[ctfshow web入門] web30

信息收集 題目將flag system php不區分大小寫地過濾了 解題 前置知識 print_r&#xff1a;php中用于打印數組 scandir&#xff1a;php中用于獲取指點目錄下的所以文件目錄名 getcwd&#xff1a;獲取當前目錄 目錄獲取 這里提供兩種方法 print_r(scandir(getcwd())); pri…

linux下MMC_TEST的使用

一:打開如下配置,將相關文件編譯到內核里: CONFIG_MMC_TEST CONFIG_MMC_DEBUG CONFIG_DEBUG_FS二:將mmc設備和mmc_test驅動進行綁定 2.1查看mmc設備編號 ls /sys/bus/mmc/drivers/mmcblk/mmc0:aaaa2.2將mmc設備與原先驅動進行解綁 echo mmc0:aaaa >

《深度解析LightGBM與MySQL數據集成:高效機器學習的新范式》

在機器學習工程實踐中&#xff0c;數據與模型的高效交互一直是制約算法性能發揮的關鍵瓶頸。LightGBM作為梯度提升決策樹框架的杰出代表&#xff0c;其與關系型數據庫MySQL的深度集成能力&#xff0c;為數據科學家提供了從原始數據到預測結果的完整解決方案。這種集成不是簡單的…

處理Excel的python庫openpyxl、xlrd、xlwt、pandas有什么區別,搞懂它

openpyxl、xlrd、xlwt、pandas 都能處理 Excel 表格&#xff0c;但用途和適合的場景不同。今天做個總結&#xff1a; 庫名功能支持格式讀寫支持樣式備注openpyxl全面的.xlsx處理庫.xlsx&#xff08;Excel2007&#xff09;???首選xlrd讀取.xls文件的老牌工具.xls&#xff08…

EasyExcel-一款好用的excel生成工具

EasyExcel是一款處理excel的工具類&#xff0c;主要特點如下&#xff08;官方&#xff09;&#xff1a; 特點 高性能讀寫&#xff1a;FastExcel 專注于性能優化&#xff0c;能夠高效處理大規模的 Excel 數據。相比一些傳統的 Excel 處理庫&#xff0c;它能顯著降低內存占用。…

視頻分析設備平臺EasyCVR攜手高空拋物AI智能分析技術,打造住宅小區頭頂安全智能防線

一、背景介紹 隨著城市化進程的高速推進&#xff0c;城市天際線不斷被刷新&#xff0c;高樓大廈密密麻麻。然而&#xff0c;高空拋物問題也逐漸顯現&#xff0c;這一行為不僅嚴重影響城市文明的形象&#xff0c;更帶來很多安全隱患&#xff0c;威脅居民的生命財產安全&#xf…