YOLOv3训练自己的VOC数据集

本文详细介绍YOLOv3在TX1平台上的部署流程及性能表现。从搭建环境到训练自定义数据集,再到最终的实时检测应用,全方位解析YOLOv3的优势。通过与SSD等模型对比,展示其在速度与精度之间的平衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://pjreddie.com/darknet/yolo/

刚开始做深度学习检测任务,在尝试了https://github.com/rbgirshick/py-faster-rcnnhttps://github.com/weiliu89/caffe/tree/ssd之后,正好看到YOLOv3出来,据说比RetinaNet快3.8倍,比SSD快3倍,速度很惊人,因为任务是要在TX1上做实时检测,所以赶紧试起来

1. darknet配置起来不要太方便

下载工程

git clone https://github.com/pjreddie/darknet
cd darknet

修改配置文件

gedit Makefile

修改

GPU=1

CUDNN=1

OPENCV=1

NVCC=/usr/local/cuda-8.0/bin/nvcc

编译

make -j16

下载预训练权值文件

wget https://pjreddie.com/media/files/yolov3.weights

测试一下图片,测试图在data文件夹,结果图在darknet根目录

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

测一下视频文件,video file自己放段视频

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

2. 训练自己的VOC数据

标记部分不讲了,一个标记工程https://github.com/tzutalin/labelImg

根目录scripts下新建一个VOCdevkit,其中再建一个VOC2007,放Annotations,ImageSets,JPEGImages三个文件夹。

修改scripts/voc_label.py

sets=[ ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
classes = ["person"]#修改自己的类别,我只有一类
os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt  > train.txt")#输出删掉下面一句

执行voc_label.py

python voc_label.py

在scripts下刚好得到4个txt,其中train.txt为所有的图用于训练

下载imagenet预训练模型

wget https://pjreddie.com/media/files/darknet53.conv.74

修改cfg/voc.data

classes= 1#类别数
train  = /xxx/yolov3/darknet/scripts/train.txt
valid  = /xxx/yolov3/darknet/scripts/2007_test.txt
names = data/voc.names
backup = /xxx/yolov3/darknet/results/  #输出权值路径

修改data/voc.names

person  #自己的类别名

修改cfg/yolov3-voc.cfg,三个yolo层中的classes为自己的类别数,三个yolo层前一层的convolutional中的filters为3*(classes+5),其余超参按需修改。

开始训练

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1

测试了一下视频效果,一块1080ti检测352*288的视频,fps在120~180,耗显存700M,对比SSD的fps55~65,耗显存1G,最大帧率上速度确实提高3倍左右。2块1080ti测试视频fps在190~240。

TX1上效果,SSD测试视频4~5fps,YOLOv3测试视频24~35fps。

 

这块TX1片内外设不同,非官方版。。最近测了下官方的TX1,YOLOv3测视频17~26fps。

 

 

参考

 

https://blog.youkuaiyun.com/davidlee8086/article/details/79693079

https://blog.youkuaiyun.com/sinat_30071459/article/details/53100791

 

资源为视频检测算法代码包括算法的模型,算法实现的原理是:首先在视频检测跟踪之前,对所有目标已经完成检测,那么当第一帧进来时,以检测到的目标初始化并创建新的跟踪器,标注ID,输出行人图片,输出一组向量,通过比对两个向量之间的距离,来判断两副输入图片是否是同一个行人。在后面帧进来时,先到卡尔曼滤波器中得到由前面帧box产生的状态预测和协方差预测,并且使用确信度较高的跟踪结果进行预测结果的修正。求跟踪器所有目标状态与本帧检测的box的IOU,通过匈牙利算法寻找二分图的最大匹配,在多目标检测跟踪问题中为寻找前后两帧的若干目标的匹配最优解,得到IOU最大的唯一匹配,在去掉匹配值小于iou_threshold的匹配对。 用本帧中匹配到的目标检测box去更新卡尔曼跟踪器,计算卡尔曼增益,状态更新和协方差更新。并将状态更新值输出,作为本帧的跟踪box,再对于本帧中没有匹配到的目标重新初始化跟踪器。 yolo v3首先通过特征提取网络对输入图像提取特征,得到一定size的feature map,通过尺寸聚类确定anchor box。对每个bounding box网络预测4个坐标偏移。如果feature map某一单元偏移图片左上角坐标,bounding box预选框尺寸为,即anchor尺寸,那么生成对预测坐标为,此为feature map层级.而为真值在feature map上的映射,通过预测偏移使得与一致。类别预测方面为多标签分类,采用多个scale融合的方式做预测。
### 使用YOLOv3训练自定义VOC格式的数据集 要使用YOLOv3训练自定义VOC格式的数据集,以下是详细的说明: #### 准备环境 首先需要安装Darknet框架,这是YOLO系列算法的基础实现工具之一。可以通过克隆AlexeyAB的GitHub仓库来获取源码并编译: ```bash git clone https://github.com/AlexeyAB/darknet.git cd darknet make ``` 完成上述操作后,确保darknet可执行文件能够正常运行。 #### 数据准备 对于VOC格式的数据集,通常包含图像及其对应的XML标注文件。为了适应YOLOv3的需求,这些标注文件需要转换成TXT格式,每行表示一个目标框的位置以及类别索引。具体来说,每个TXT文件的内容应遵循如下格式: ``` <class_id> <x_center> <y_center> <width> <height> ``` 其中 `<class_id>` 是类别的编号;`<x_center>, <y_center>, <width>, <height>` 都是以相对图片尺寸的比例给出的数值范围应在 `[0, 1]` 中[^4]。 可以编写Python脚本来批量处理这种转换工作。下面提供了一个简单的例子作为参考: ```python import xml.etree.ElementTree as ET import os def convert(size, box): dw = 1./size[0] dh = 1./size[1] x = (box[0] + box[1])/2.0 y = (box[2] + box[3])/2.0 w = box[1] - box[0] h = box[3] - box[2] x = x*dw w = w*dw y = y*dh h = h*dh return (x,y,w,h) def convert_annotation(image_set_path, classes): tree=ET.parse(open(image_set_path)) root = tree.getroot() size = root.find(&#39;size&#39;) w = int(size.find(&#39;width&#39;).text) h = int(size.find(&#39;height&#39;).text) bnd_list = [] for obj in root.iter(&#39;object&#39;): difficult = obj.find(&#39;difficult&#39;).text cls = obj.find(&#39;name&#39;).text if cls not in classes or int(difficult)==1: continue cls_id = classes.index(cls) xmlbox = obj.find(&#39;bndbox&#39;) b = (float(xmlbox.find(&#39;xmin&#39;).text), float(xmlbox.find(&#39;xmax&#39;).text), float(xmlbox.find(&#39;ymin&#39;).text), float(xmlbox.find(&#39;ymax&#39;).text)) bb = convert((w,h), b) bnd_list.append(str(cls_id) + " " + " ".join([str(a) for a in bb]) + &#39;\n&#39;) with open(os.path.splitext(image_set_path)[0]+&#39;.txt&#39;, &#39;w&#39;) as f: f.writelines(bnd_list) classes = ["dog", "cat"] # 替换为实际使用的类别名称列表 for image_set_file in [&#39;train.txt&#39;,&#39;val.txt&#39;]: # 假设已经存在划分好的训练和验证集合文件名清单 base_dir = &#39;/path/to/voc_dataset/&#39; # VOC数据集根目录路径 with open(base_dir+image_set_file,&#39;r&#39;) as img_names_f: for line in img_names_f.readlines(): filename_no_ext = line.strip().split()[0] annotation_filepath = os.path.join(base_dir,"Annotations",filename_no_ext+".xml") convert_annotation(annotation_filepath, classes) ``` #### 划分数据集 类似于提到的方法,通过编写 `split_train_val.py` 脚本或者手动创建三个`.txt` 文件——分别是测试集(`test.txt`)、训练集(`train.txt`) 和验证集(`valid.txt`) 来指定哪些样本属于哪个子集。每一个 `.txt` 文件中的每一行应该写入一张图片绝对路径或相对于配置文件所在位置的相对路径[^5]。 #### 修改配置文件 编辑 YOLO v3 的配置文件(cfg/yolov3.cfg),调整最后一层卷积核数量以匹配自己数据集中对象种类数目。如果原预训练权重有80个分类,则最后三层检测头部分可能形如这样: ``` [yolo] ... filters=255 ... ``` 这里 filters 应该等于 `(num_classes + 5)*3` ,即三倍于锚点数加上五个回归参数之和的结果。因此当 num_class 改变时也需要相应修改此值[^6]。 另外还需要准备好自己的 dataset configuration file 如下所示模板: ``` classes= 2 train=/path/to/train.txt valid=/path/to/valid.txt names=/path/to/classes.names backup=backup/ eval=voc ``` #### 开始训练 最终启动训练过程前确认所有设置无误之后就可以利用 Darknet 提供的一键命令来进行模型学习了: ```bash ./darknet detector train cfg/custom_data.data cfg/yolov3-custom.cfg yolov3.weights -dont_show ``` ---
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值