自己训练yolov3需要用yolov3格式的数据和标签,KITTI 自带的标签是KITTI格式,与yolo使用的格式不同。用kitti数据集训练yolo,需要转化格式。
本文使用fiftyone库将kitt 格式的7481个label转化为yolo格式,只需要几行代码,非常简洁易懂而且不会犯错。
github上有一些逐个文件名读取txt,计算,并写回的代码。或者转化为xml的VOC 格式再用yolo自带的转换代码转为yolo格式txt文件。作为个人理解不同格式的label如何标注是可以的,实际操作上格外繁琐,而且边框的计算过程是否正确,小数点精度取舍等问题很难验证正确与否。
用于构建高质量数据集和计算机视觉模型的开源工具: fiftyone官网 https://voxel51.com/docs/fiftyone/index.html
FiftyOne is an open-source tool facilitating visualization and access to COCO data resources and serves as an evaluation tool for model analysis on COCO. (Source:https://cocodataset.org/#home)
import fiftyone as fo
import fiftyone.utils.kitti
#%%
dataset_dir="/home/yz/PycharmProjects/2022/TRUST-E/ErrorResilienceAnalysisYOLOV3/0723/"
fiftyone.utils.kitti.download_kitti_detection_dataset( dataset_dir , overwrite=True , cleanup=True )
关键代码只有一行即可下载,非常简洁。overwrite代表有zip是否仍然下载,cleanup代表是否删除zip文件。下载过程中可能会要100多gb磁盘空间。
下载完成后,占用12.6gb磁盘。文件路径下有 train和test文件夹,train下有data和label文件夹, 各自有7481个png和label文件。这些是kitti object detection数据集。
fiftyone.utils.kitti.download_kitti_detection_dataset( dataset_dir , overwrite=True , cleanup=True )
文件路径格式应当如下
/
data/
.
.
...
labels/
.txt
.txt
...
加载数据集官方示例: https://voxel51.com/docs/fiftyone/user_guide/dataset_creation/datasets.html#kittidetectiondataset
加载数据集官方示例python代码
import fiftyone as fo
name = "my-dataset"
dataset_dir = "/path/to/kitti-detection-dataset"
# Create the dataset
dataset = fo.Dataset.from_dir(
dataset_dir=dataset_dir,
dataset_type=fo.types.KITTIDetectionDataset,
name=name,
)
# View summary info about the dataset
print(dataset)
# Print the first few samples in the dataset
print(dataset.head())
先打印当前的数据集list,应该是什么都没有,或者有你之前加载好的。
#%%
print(fo.list_datasets())
导入3.1.1下载好的kitti数据集
#%%
name = "my-dataset-kitti0723_1222"
dataset_dir="/home/yz/PycharmProjects/2022/TRUST-E/ErrorResilienceAnalysisYOLOV3/0723/train/"
# Create the dataset
dataset = fo.Dataset.from_dir(
dataset_dir=dataset_dir,
dataset_type=fo.types.KITTIDetectionDataset,
name=name,
)
查看加载好的数据集 View summary info about the dataset
print(dataset)
打印一些例子 Print the first few samples in the dataset
print(dataset.head())
print("done")
先设置好输出路径,然后选择ground_truth输出全部7481张,格式的话选择fo.types.YOLOv4Dataset。 v3和v4格式是一样的。
output_yolo_dir="/home/yz/PycharmProjects/2022/TRUST-E/ErrorResilienceAnalysisYOLOV3/0723ConvertToYOLO/"
label_field = "ground_truth"
dataset.export(
export_dir=output_yolo_dir,
dataset_type=fo.types.YOLOv4Dataset,
label_field=label_field,
)
完成后,输出文件夹内有一个data文件夹,里面有7481张图和7481个label标注文件,有一个images.txt内有对应的图像路径,还有obj.names分别是9个类的名字。
image.txt内的路径最好更改为绝对路径,用文本编辑器替换即可。用相对路径的话,yolo训练时候读取可能会报错。
obj.names 内是9个类的名字。
import fiftyone as fo
import fiftyone.utils.kitti
#%%
dataset_dir="/home/yz/PycharmProjects/2022/TRUST-E/ErrorResilienceAnalysisYOLOV3/0723/"
#fiftyone.utils.kitti.download_kitti_detection_dataset( dataset_dir , overwrite=True , cleanup=True )
#%%
print(fo.list_datasets())
#%%
#DELETE DATA
#dataset = fo.load_dataset("my-dataset-kitti0723")#my-dataset-kitti0709
#dataset.delete()
#%%
#import kitti dataset
name = "my-dataset-kitti0723_1222"
dataset_dir="/home/yz/PycharmProjects/2022/TRUST-E/ErrorResilienceAnalysisYOLOV3/0723/train/"
# Create the dataset
dataset = fo.Dataset.from_dir(
dataset_dir=dataset_dir,
dataset_type=fo.types.KITTIDetectionDataset,
name=name,
)
# View summary info about the dataset
print(dataset)
# Print the first few samples in the dataset
print(dataset.head())
print("done")
#%%
print(fo.list_datasets())
#%%
# convert
output_yolo_dir="/home/yz/PycharmProjects/2022/TRUST-E/ErrorResilienceAnalysisYOLOV3/0723ConvertToYOLO/"
#dataset_type=fo.types.YOLOv4Dataset
label_field = "ground_truth"
dataset.export(
export_dir=output_yolo_dir,
dataset_type=fo.types.YOLOv4Dataset,
label_field=label_field,
)
#fiftyone.utils.data.converters.convert_dataset( input_dir=dataset_dir, input_type=fo.types.KITTIDetectionDataset, input_kwargs=None , dataset_importer=None , output_dir=output_yolo_dir, output_type=fo.types.YOLOv4Dataset , output_kwargs=None , dataset_exporter=None , overwrite=False )