SSD: Single Shot MultiBox Detector 训练KITTI数据集(1)

前言

之前介绍了SSD的基本用法和检测单张图片的方法,那么本篇博客将详细记录如何使用SSD检测框架训练KITTI数据集。SSD项目中自带了用于训练PASCAL VOC数据集的脚本,基本不用做修改就可以轻松完成训练;但是想要训练其他数据集比如KITTI,则需做很大的调整。本文所有工具源码都已公开,请根据实际情况自行修改。

下载数据集

博主打算将SSD算法用于检测车载视频,用到的是 KITTI数据集 。简单介绍一下,KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集。用于评测目标(机动车、非机动车、行人等)检测、目标跟踪、路面分割等计算机视觉技术在车载环境下的性能。KITTI包含市区、乡村和高速公路等场景采集的真实图像数据,每张图像中最多达15辆车和30个行人,还有各种程度的遮挡(ps:欧洲道路状况和中国还是很不相同,期待国内早日能有同类数据集)。

进入官网,找到object一栏,准备下载数据集:

这里写图片描述

根据下载情况(博主把前四个都下载了,点开看过),进行SSD训练只需要下载第1个图片集 Download left color images of object data set (12 GB)和标注文件 Download training labels of object data set (5 MB) 就够了。然后将其解压,发现其中7481张训练图片有标注信息,而测试图片没有,这就是本次训练所使用的图片数量。由于SSD中训练脚本是基于VOC数据集格式的,所以我们需要把KITTI数据集做成PASCAL VOC的格式,其基本架构可以参看这篇博客:PASCAL VOC数据集分析 。根据SSD训练要求,博主在/home/mx/data/中目录中建立一系列文件夹存放所需数据集和工具文件,具体如下:

PS.参看截图,数据要放在home目录下的data文件夹,不是caffe中的data文件夹,这个要注意,否则后续脚本出错。

# 在data/文件夹下新建KITTIdevkit/KITTI两层子目录,所需文件放在KITTI/中
Annotations/
└── 000000.xml 
ImageSets/
└── main/
      └── trainval.txt
      └── test.txt # 等等
JPEGImages/
└── 000000.png
Labels/
└── 000000.txt # 自建文件夹,存放原始标注信息,待转化为xml,不属于VOC格式
create_train_test_txt.py # 3个python工具,后面有详细介绍
modify_annotations_txt.py
txt_to_xml.py

这里写图片描述
(截图来源于小规模试验,图片只有400张)

转换数据集

为了方便SSD进行训练,我们需要将KITTI数据集转换成PASCAL VOC的格式,细心的朋友可能已经发现,KITTI官网提供了一个工具: code to convert from KITTI to PASCAL VOC file format ,为啥不用呢?因为我觉得很难用,缺乏灵活性,还不如自己的Python转换工具好使。

KITTI标注信息说明

KITTI数据集中标注信息是存放在txt文本中的,我们随便复制一些标注语句,看看都包含了那些信息:

Car 0.00 0 -1.67 642.24 178.50 680.14 208.68 1.38 1.49 3.32 2.41 1.66 34.98 -1.60
Car 0.00 0 -1.75 685.77 178.12 767.02 235.21 1.50 1.62 3.89 3.27 1.67 21.18 -1.60

具体的含义在官网没找到,但是博主偶然在DIGITS项目中看到了KITTI标注信息的明确含义:

这里写图片描述

上图链接:Object Detection Data Extension ,可以看到,KITTI的标注信息中,SSD训练需要使用的只有类别’Car‘和物体外框的坐标‘387.63 181.54 423.81 203.12’,其余的字段都可以忽略。

转换KITTI类别

PASCAL VOC数据集总共20个类别,如果用于特定场景,20个类别确实多了。此次博主为数据集设置3个类别, ‘Car’,’Cyclist’,’Pedestrian’,只不过标注信息中还有其他类型的车和人,直接略过有点浪费,博主希望将 ‘Van’, ‘Truck’, ‘Tram’ 合并到 ‘Car’ 类别中去,将 ‘Person_sitting’ 合并到 ‘Pedestrian’ 类别中去(‘Misc’ 和 ‘Dontcare’ 这两类直接忽略)。这里使用的是modify_annotations_txt.py工具,源码如下:

# modify_annotations_txt.py
import glob
import string

txt_list = glob.glob('./Labels/*.txt') # 存储Labels文件夹所有txt文件路径
def show_category(txt_list):
    category_list= []
    for item in txt_list:
        try:
            with open(item) as tdf:
                for each_line in tdf:
                    labeldata = each_line.strip().split(' ') # 去掉前后多余的字符并把其分开
                    category_list.append(labeldata[0]) # 只要第一个字段,即类别
        except IOError as ioerr:
            print('File error:'+str(ioerr))
    print(set(category_list)) # 输出集合

def merge(line):
    each_line=''
    for i in range(len(line)):
        if i!= (len(line)-1):
            each_line=each_line+line[i]+' '
        else:
            each_line=each_line+line[i] # 最后一条字段后面不加空格
    each_line=each_line+'\n'
    return (each_line)

print('before modify categories are:\n')
show_category(txt_list)

for item in txt_list:
    new_txt=[]
    try:
        with open(item, 'r') as r_tdf:
            for each_line in r_tdf:
                labeldata = each_line.strip().split(' ')
                if labeldata[0] in ['Truck','Van','Tram']: # 合并汽车类
                    labeldata[0] = labeldata[0].replace(labeldata[0],'Car')
                if labeldata[0] == 'Person_sitting': # 合并行人类
                    labeldata[0] = labeldata[0].replace(labeldata[0],'Pedestrian')
                if labeldata[0] == 'DontCare': # 忽略Dontcare类
                    continue
                if labeldata[0] == 'Misc': # 忽略Misc类
                    continue
                new_txt.append(merge(labeldata)) # 重新写入新的txt文件
        with open(item,'w+') as<
### Kitti 数据集目标识别方法 Kitti 数据集中包含了丰富的标注信息,这些信息对于开发和评估计算机视觉算法至关重要[^2]。具体来说,该数据集提供了多种类型的标注: - **物体检测框**:包括3D和2D边界框,用于检测和识别不同类型的物体(如车辆、行人、骑车人等)。 - **道路和车道标注**:有助于实现自动驾驶场景下的路径规划与环境理解。 #### 使用KITTI数据集进行目标检测的方法概述 为了利用KITTI数据集执行高效的目标检测任务,通常会采用深度学习框架配合预训练模型来加速收敛并提高精度。以下是几种常见的方式: 1. **基于卷积神经网络(CNN)** 的架构被广泛应用于此领域内,比如Faster R-CNN, SSD (Single Shot MultiBox Detector), 和YOLO (You Only Look Once)家族成员都取得了不错的效果。 2. 对于特定应用场景下(例如仅限于汽车),可以考虑微调已有的预训练权重文件以适应新的类别分布情况;而对于更复杂的情况,则可能需要重新训练整个网络直至获得满意的结果。 #### 实现示例代码展示 下面给出一段简单的Python脚本作为如何加载并可视化KITTI格式的数据样本的例子: ```python import os from PIL import Image import matplotlib.pyplot as plt def load_kitti_image(image_path): """Load an image from the specified path.""" img = Image.open(image_path) return img def plot_bounding_boxes(img, labels_file): """Plot bounding boxes on top of given image using label information.""" with open(labels_file, 'r') as f: lines = f.readlines() fig, ax = plt.subplots(1) ax.imshow(img) for line in lines: parts = line.strip().split(' ') class_name = parts[0] bbox = list(map(float, parts[4:8])) rect = plt.Rectangle((bbox[0], bbox[1]), bbox[2]-bbox[0], bbox[3]-bbox[1], fill=False, edgecolor='red', linewidth=2) ax.add_patch(rect) ax.text(bbox[0], bbox[1], class_name, style='italic', bbox={'facecolor': 'white', 'alpha': 0.7, 'pad': 1}) plt.show() if __name__ == "__main__": base_dir = '/path/to/kitti/dataset' image_id = '000001' # Example ID image_filename = os.path.join(base_dir, 'training/image_2/', '{}.png'.format(image_id)) label_filename = os.path.join(base_dir, 'training/label_2/', '{}.txt'.format(image_id)) loaded_img = load_kitti_image(image_filename) plot_bounding_boxes(loaded_img, label_filename) ``` 这段代码展示了怎样读取一张图片及其对应的标签文件,并绘制出所有的边界框位置。这只是一个基础版本,在实际项目中还需要加入更多的功能模块来进行完整的对象检测流程设计。
评论 73
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值