Ubuntu18.04下YOLOv3详解——搭建、训练、测试、评估

本文详细介绍了在Ubuntu18.04上配置YOLOv3的环境,包括CUDA和CuDNN的安装,以及模型的训练、测试和评估过程。通过修改Makefile启用GPU加速,解决显存不足问题。使用自定义数据集进行训练,涉及数据集处理、cfg文件修改和训练参数调整。模型测试部分展示了如何进行单张和批量预测,并计算mAP和recall值。最后,文中还提供了常见问题的总结和解决方案。

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

Ubuntu18.04下YOLOv3详解——搭建、训练、测试、评估


YOLOv3是目标检测任务中最常用的算法之一,本文具体讲述了YOLOv3搭建——训练——测试——评估的几个步骤,顺便记录了遇到的几个坑。我用的是Ubuntu版本Darknet框架的YOLOv3,参考作者的步骤( https://pjreddie.com/darknet/yolo/)来一步步完成的,后面为了项目部署会继续学Tensorflow框架的。

Alt

基本配置

Ubuntu18.04
cuda9.0
cudnn7.3.1
opencv3.2.0

环境搭建

cuda和cudnn的配置相关具体的博文有很多,不需要过多赘述,推荐这篇博客写的比较详细(https://blog.youkuaiyun.com/weixin_41851439/article/details/88712465),一定注意Ubuntu系统与cuda、cudnn三者之间的对应关系,装cuda和cudnn是因为下面调用GPU进行训练和测试,用CPU和GPU的速度天差地别,如果显存太差建议用CPU慢慢跑。
主目录下

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

下载预训练权重,若下载太慢则复制链接(https://pjreddie.com/media/files/yolov3.weights)到浏览器下载。

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

下面测试一下!

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

将会见到以下输出

layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  32  0.299 BFLOPs
    1 conv     64  3 x 3 / 2   416 x 416 x  32   ->   208 x 208 x  64  1.595 BFLOPs
    .......
  105 conv    255  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 255  0.353 BFLOPs
  106 detection
truth_thresh: Using default '1.000000'
Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 0.029329 seconds.
dog: 99%
truck: 93%
bicycle: 99%

因为还没有调用GPU,用CPU进行测试的时候会几秒到十几秒的时间,下面调用一下GPU,减少训练测试时间,修改Makefile文件
终端输入命令

gedit Makefile

修改如下

GPU=1
CUDNN=1
OPENCV=# 如果安装了opencv则改为1
OPENMP=0
DEBUG=0
...
NVCC=/usr/local/cuda-9.0/bin/nvcc # 原为 NVCC = nvcc,cuda后面的紧跟自己的cuda版本,如cuda-9.0,cuda-10.0等

修改完后终端重新make后重新测试
如果见到下面的情况,不要慌,有两种可能:
1.显存不够,深度学习对显卡的显存要求较高,一般至少需要4G的显存,检查一下自己显卡对应的显存,如果显存不够建议换个好一点的显卡或者租服务器,深度学习最不能省钱的就是显卡了!!!
2.cfg文件没有修改,cfg文件夹下的yolov3.cfg文件做以下修改,如果是训练状态,取消Training下面batch和subdivisions的注释,把Testing的batch和subdivisions注释掉

# Testing
batch=1
subdivisions=1
# Training
# batch=64
# subdivisions=16
...

模型训练

接下来将会以自己的数据集作为例子进行训练,文件目录如下所示,图片存储于JPEGImages文件夹下,标注的xml文件存储与

VOCdevkit 
——VOC2008
————Annotations
————ImageSets 
——————Main
————JPEGImages


在voc2008文件夹下建立voc_2008.py文件并运行,voc_2008.py的作用是在ImageSets 下的main文件夹产生随机分割后的训练集测试集路径文件,代码如下:

import os
import random

trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets/Main'
total_xml = os.listdir(xmlfilepath)

num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)

ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')

for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftest.write(name)
        else:
            fval.write(name)
    else:
        ftrain.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

随后在darknet主目录下建立voc_label.py文件并运行,voc_label.py的作用是将所有标注的xml文件转化成txt文件,因为YOLO支持读取的数据只是txt格式,代码如下:

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets=[('2008', 'train'), ('2008', 'val'), ('2008', 'test')]

classes = ["knife"]


def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0 - 1
    y = (box[2] + box[
<think>好的,我现在需要帮助用户解决在Ubuntu 18.04上使用YOLOv3训练自定义数据集的问题。首先,我要回顾用户提供的引用内容,确保回答准确。用户提到了引用[1]和引用[2],其中引用[1]详细介绍了在Ubuntu 18.04上用CPU训练YOLOv3的步骤,包括下载编译darknet、修改配置文件、训练测试过程。引用[2]提到了YOLOv4的训练命令,但用户问的是YOLOv3,可能需要调整相关参数。 首先,我需要整理出训练YOLOv3的基本步骤。根据引用[1],步骤包括下载编译darknet、准备数据集、修改配置文件、训练模型。用户可能需要从数据准备开始,包括标注数据,生成对应的.txt文件和路径配置。然后,修改配置文件如obj.data、yolov3.cfg,确保类别数正确,调整参数如batch、subdivisions。接下来是下载预训练权重,执行训练命令,可能还需要训练过程的可视化,比如使用-map选项,这在引用[2]中提到过,但需要确认是否适用于YOLOv3。 需要注意的是,用户提到的是Ubuntu 18.04,所以环境配置方面可能需要安装CUDA、OpenCV等依赖,但引用[1]中用户使用CPU训练,但通常训练YOLOv3需要GPU加速。不过用户的问题可能只是针对方法,不涉及硬件细节。但需要指出如果使用GPU,可能需要安装CUDA和cuDNN,而如果使用CPU,训练速度会很慢,可能建议使用yolov3-tiny,如引用[1]提到的。 另外,数据集准备的步骤可能包括将图片和标注文件组织成train和val目录,创建train.txt和val.txt文件,指定路径。然后修改obj.data文件中的类别数目和路径。修改网络配置yolov3.cfg,将每个[yolo]层前的卷积层的filters数目调整为(classes + 5)*3,classes是类别数,并调整每个[yolo]层的classes参数。 训练命令方面,引用[1]提到使用darknet detector train命令,而引用[2]中的YOLOv4命令可能类似,但预训练权重不同。YOLOv3通常使用darknet53.conv.74作为预训练权重,需要下载。训练时可能需要指定这个权重文件。 可能还需要监控训练过程,比如生成图表,使用-map选项来显示mAP曲线,但需要确认YOLOv3是否支持这个选项,或者是否需要额外配置。 此外,用户可能需要测试训练好的模型,用detector test命令,并调整阈值等参数。最后,部署到其他平台如树莓派时,可能需要转换模型格式或使用更轻量的模型如yolov3-tiny,但用户的问题主要集中在训练步骤,这部分可能不需要深入。 总结步骤:1. 环境准备(安装darknet,依赖项);2. 数据集准备与配置;3. 修改配置文件;4. 下载预训练权重;5. 执行训练命令;6. 测试模型。需要确保每个步骤的命令正确,路径正确,特别是用户可能遇到的常见问题,比如路径错误、类别数未修改导致的问题,或者显存不足时调整batch大小等。 可能还需要提到如果训练过程中出现内存不足的情况,可以减小batch size或增加subdivisions,这在cfg文件中调整。此外,训练过程中生成的权重文件备份,以及如何恢复训练,如果中断的话。 最后,根据用户提供的引用,确保在回答中正确标注引用来源,例如编译darknet的部分引用[^1],训练命令参考了引用[^2]中的结构,但根据YOLOv3进行调整。</think>### 在 Ubuntu 18.04 上使用 YOLOv3 训练自定义数据集的步骤 #### 1. 环境准备 - **下载并编译 Darknet** 从官方仓库克隆代码并编译(需提前安装 `git` 和 `make`): ```bash git clone https://github.com/pjreddie/darknet cd darknet make ``` 若需 GPU 支持,需修改 `Makefile` 中的 `GPU=1` 并安装 CUDA 和 cuDNN。 #### 2. 数据集准备 - **标注数据** 使用工具(如 LabelImg)生成标注文件(每张图片对应一个 `.txt` 文件,格式为 `class_id x_center y_center width height`)。 - **组织文件结构** 创建以下目录: ``` custom_data/ ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ └── obj.names # 类别名称列表 ``` - **生成路径文件** 创建 `train.txt` 和 `valid.txt`,分别包含训练集和验证集图片的绝对路径。 #### 3. 配置文件修改 - **创建 `obj.data`** 内容示例: ```text classes = 2 # 类别数 train = /path/to/train.txt valid = /path/to/valid.txt names = obj.names backup = backup/ # 权重保存路径 ``` - **修改 YOLOv3 网络配置** 复制 `cfg/yolov3.cfg` 并调整以下参数: - `batch=64`(根据显存调整) - `subdivisions=16`(显存不足时增大此值) - 每个 `[yolo]` 层前的 `[convolutional]` 层中 `filters=(classes + 5) * 3`(例如类别数为 2,则 `filters=21`) - 每个 `[yolo]` 层中的 `classes=2`。 #### 4. 下载预训练权重 使用以下命令下载预训练权重: ```bash wget https://pjreddie.com/media/files/darknet53.conv.74 ``` #### 5. 开始训练 执行训练命令: ```bash ./darknet detector train obj.data yolov3-custom.cfg darknet53.conv.74 -map ``` - `-map` 选项会实时计算 mAP(需编译时启用 OpenCV)[^2]。 - 训练日志保存在 `backup/` 目录,权重每 1000 迭代保存一次。 #### 6. 测试模型 使用训练好的权重进行推理: ```bash ./darknet detector test obj.data yolov3-custom.cfg backup/yolov3-custom_final.weights test_image.jpg ``` #### 关键优化建议 - **轻量化模型**:若部署到资源受限设备(如树莓派),改用 `yolov3-tiny` 并调整对应配置文件[^1]。 - **训练监控**:使用 `-dont_show` 配合 `mjpeg` 流可在远程服务器实时查看训练状态。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值