1. 要件分析
最近モデルをテストしていたとき、出力された obj ファイルの一部は非常に直感的ではなく、画像ファイルに対応する点群を見つけるのが難しかったため、ファイル名を記録して使用し、画像ファイルに対応する他のセンサーの出力を見つけました。同じ瞬間。
私のニーズは次のとおりです。
テストからの出力は、単一の独立したフォルダーです。各フォルダーには、グラウンド トゥルース、環境ポイント、予測の 3 つの obj ファイルが含まれています。より適切に視覚化するには、画像と点群を同時に使用する必要があるため、LiDAR データを使用する必要がありますファイル名に基づいて他のセンサーのデータを同時に検索します。つまり、あるセンサーのデータ名に基づいて他のセンサーのデータを同時に検索し、それらをまとめて保存します。
2. コードの実装
1. 必要なパッケージをインポートする
import os
import shutil
import json
from nuscenes.nuscenes import NuScenes
# 导入数据集
nuscenes_mini_path = 'D:/数据集/目标检测系列/v1.0-mini/'
nusc = NuScenes(version='v1.0-mini', dataroot=nuscenes_mini_path, verbose=True)
インポートが成功すると、次の出力が表示されます。
2. アノテーションを読み、sample_token を見つけます。
# 读取nuScenes数据集数据标注文件(在nuScenes数据集路径下,找一下)
with open('sample_data.json', encoding='utf-8') as data_file:
datas = json.load(data_file)
length = len(datas)
# 文件名,留意下nuScenes的文件名组织,最重要的是时间戳得找对
find_file_name = 'n008-2018-08-01-15-16-36-0400__LIDAR_TOP__1533151604048025'
sample_token = None
find_sample = None
# 以下是根据部分文件名定位出具体的一条数据,然后提取其中的sample_token
for data in datas:
if data['filename'].find(find_file_name):
sample_token = data['sample_token']
break
if sample_token is None:
print('没有找到')
else:
find_sample = nusc.get('sample', sample_token) # 根据sample_token 获取到整个sample
print(find_sample)
このステップではサンプル全体を取得しますが、私のニーズとしては、各センサーのトークン値を記録するデータ データに注目します。
3. ファイルをコピーする
# 需要提取的传感器
sensors = ['CAM_FRONT', 'CAM_FRONT_RIGHT', 'CAM_BACK_RIGHT', 'CAM_BACK', 'CAM_BACK_LEFT', 'CAM_FRONT_LEFT']
# 保存路径
save_path = 'save_dir/'
tar_path = save_path + sample_token
# 在save_path下,创捡名为sample_token的文件夹
if not os.path.exists(tar_path):
os.makedirs(tar_path)
for sensor in sensors:
sensor = nusc.get('sample_data', find_sample['data'][sensor])
per_img = nuscenes_mini_path + sensor['filename']
# 也可以直接使用下面这句保存带标注的图片
# 其中out_path需要指定文件名,如outpath = 'save_dir/test.png'
# 如果想实现标注的个性化(边框颜色之类),需要重写render_sample_data方法
# nusc.render_sample_data(sensor['token'],with_anns=True,out_path='') # with_anns表示带标注
shutil.copy(per_img, tar_path)
上記のコード スニペットは、まず抽出するセンサーのリストを作成し、保存パスを指定して、データを保存するために保存パスの下にsample_tokenという名前のフォルダーを作成します。次に、各センサーに対応するデータが対応するパスにコピーされ、実行時の効果は次のとおりです。
4. ステップ 1 ~ 3 の完全なコード スニペット
import os
import shutil
from nuscenes.nuscenes import NuScenes
import json
# 导入数据集
nuscenes_mini_path = 'D:/数据集/目标检测系列/v1.0-mini/'
nusc = NuScenes(version='v1.0-mini', dataroot=nuscenes_mini_path, verbose=True)
# 读取nuScenes数据集数据标注文件
with open('sample_data.json', encoding='utf-8') as data_file:
datas = json.load(data_file)
length = len(datas)
# 文件名,留意下nuScenes的文件名组织,最重要的是时间戳得找对
find_file_name = 'n008-2018-08-01-15-16-36-0400__LIDAR_TOP__1533151604048025'
sample_token = None
find_sample = None
# 以下是根据部分文件名定位出具体的一条数据,然后提取其中的sample_token
for data in datas:
if data['filename'].find(find_file_name):
sample_token = data['sample_token']
break
if sample_token is None:
print('没有找到')
else:
find_sample = nusc.get('sample', sample_token) # 根据sample_token 获取到整个sample
print(find_sample)
# 需要提取的传感器
sensors = ['CAM_FRONT', 'CAM_FRONT_RIGHT', 'CAM_BACK_RIGHT', 'CAM_BACK', 'CAM_BACK_LEFT', 'CAM_FRONT_LEFT']
# 保存路径
save_path = 'save_dir/'
tar_path = save_path + sample_token
# 在save_path下,创捡名为sample_token的文件夹
if not os.path.exists(tar_path):
os.makedirs(tar_path)
for sensor in sensors:
sensor = nusc.get('sample_data', find_sample['data'][sensor])
per_img = nuscenes_mini_path + sensor['filename']
shutil.copy(per_img, tar_path) #复制操作