yolov3实现Kitti baseline(含评估代码:easy、moderate和hard的AP计算,fps计算)
1. 项目下载
在Linux系统下运行以下代码,下载yolov3训练代码和后面的评估代码
yolov3模型训练项目库
git clone https://github.com/bubbliiiing/yolo3-pytorch.git
评估代码项目库
git clone https://github.com/ChenhongyiYang/KITTI_evaluation_for_2d_detection.git
2. 数据集处理
2-1数据集准备
按照yolo3-pytorch项目所描述的将上一篇博客处理好的VOC的kitti数据的xml标签文件放到Annotations文件夹内,将kitti数据的png格式文件放到JPEGImages中。
本文使用VOC格式进行训练,训练前需要自己制作好数据集,
训练前将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中。
训练前将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中。
2-2数据集处理
①运行以下命令,将JPEGImages文件夹内的png格式文件转换为jpg格式文件,本项目的代码只能处理jpg格式的文件。
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.png}.jpg"'
②在运行以下命令,删除png格式的图片,本项目不需要png格式的图片
rm -r *.png
③在完成数据集的摆放之后,我们需要利用voc_annotation.py获得训练用的2007_train.txt和2007_val.txt。修改voc_annotation.py里面的参数。第一次训练可以仅修改classes_path,classes_path用于指向检测类别所对应的txt。训练自己的数据集时,可以自己建立一个cls_classes.txt,里面写自己所需要区分的类别。
model_data/cls_classes.txt文件内容为:
Car
Pedestrian
Cyclist
④修改voc_annotation.py中的classes_path,使其对应cls_classes.txt,确定mode=0,用于获取训练集、验证集和测试集并运行voc_annotation.py。
#--------------------------------------------------------------------------------------------------------------------------------#
# annotation_mode用于指定该文件运行时计算的内容
# annotation_mode为0代表整个标签处理过程,包括获得VOCdevkit/VOC2007/ImageSets里面的txt以及训练用的2007_train.txt、2007_val.txt
# annotation_mode为1代表获得VOCdevkit/VOC2007/ImageSets里面的txt
# annotation_mode为2代表获得训练用的2007_train.txt、2007_val.txt
#--------------------------------------------------------------------------------------------------------------------------------#
annotation_mode = 0
#-------------------------------------------------------------------#
# 必须要修改,用于生成2007_train.txt、2007_val.txt的目标信息
# 与训练和预测所用的classes_path一致即可
# 如果生成的2007_train.txt里面没有目标信息
# 那么就是因为classes没有设定正确
# 仅在annotation_mode为0和2的时候有效
#-------------------------------------------------------------------#
classes_path = 'model_data/cls_classes.txt'
3. yolov3网络训练
3-1预训练模型权重下载
下载预训练权重并查看train.py代码
链接: https://pan.baidu.com/s/1ncREw6Na9ycZptdxiVMApw
提取码: appk
# 网络一般不从0开始训练,至少会使用主干部分的权值,有些论文提到可以不用预训练,主要原因是他们 数据集较大 且 调参能力优秀。
# 如果一定要训练网络的主干部分,可以了解imagenet数据集,首先训练分类模型,分类模型的 主干部分 和该模型通用,基于此进行训练。
#----------------------------------------------------------------------------------------------------------------------------#
model_path = 'model_data/yolo_weights.pth'
3-2路径修改(开始训练)
训练的参数较多,均在train.py中,大家可以在下载库后仔细看注释,其中最重要的部分依然是train.py里的classes_path。
classes_path用于指向检测类别所对应的txt,这个txt和voc_annotation.py里面的txt一样!训练自己的数据集必须要修改!
修改完classes_path后就可以运行train.py开始训练了,在训练多个epoch后,权值会生成在logs文件夹中
#--------------------------------------------------------#
# 训练前一定要修改classes_path,使其对应自己的数据集
#--------------------------------------------------------#
classes_path = 'model_data/cls_classes.txt'