如何使用yolov3训练自己的数据集
博客主要结构
1. 如何在ubuntu18.04上安装yolo
2 .如何配置yolov3
3 .如何制作自己的训练集测试集
4 .如何在自己的数据集上运行yolov3
1. 在ubuntu18.04下安装yolov3
安装darknet
按ctrl+atl+t 打开终端, 并在终端下依次输入以下命令
1 2 3 | git clone https: //github .com /pjreddie/darknet .git cd darknet make |
如果成功的话你会看到以下信息
1 2 3 4 5 6 | mkdir -p obj gcc -I /usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast.... gcc -I /usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast.... gcc -I /usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast.... ..... gcc -I /usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast -lm.... |
编译完成后键入以下命令运行darknet
1 | . /darknet |
你将会看到以下输出结果
1 | usage: . /darknet < function > |
使用GPU编译(可选)
如果想让yolo运行的更快的话, 可以使用GPU 加速。你的电脑中应该有Nvidia GPU 并安装cuda。 在安装完cuda后,在本目录下修改 Makefile第一行
1 | GPU=1 |
然后在终端键入
1 | make |
这样就可以使用cuda啦, darknet在默认情况下会使用你系统里第零个块显卡 (如果你成功安装了cuda, 在终端输入nvidia-smi可以看到自己的显卡情况)。 如果你想修改darknet可以使用的显卡,你可以给他一个可选的命令 -i <index>, 例如
1 | . /darknet -i 1 imagenet test cfg /alexnet .cfg alexnet.weights |
这样darknet就会使用你的第一块显卡。
下载pre-trained model
可以在这里下载预训练模型, 或者在终端输入以下命令
1 | wget https: //pjreddie .com /media/files/yolov3 .weights |
然后训练你的detector
1 | . /darknet detect cfg /yolov3 .cfg yolov3.weights data /eagle .jpg |
正常情况下你会看到如下输出
darknet会把他的检测的结果, 以及confidence输出出来,因为我没有在darknet下编译opencv所以检测结果不会直接显示出来, 他会把这个结果保存在你的darknet目录下。
2 .配置yolov3
在darknet目录下创建一个dataset子目录, 并在dataset中创建yolo-tiny-obj.cfg 文件, 文件内容与yolov3_tiny.cfg(在darknet/cfg文件夹下)相同(可以直接把yolov3_tiny.cfg的文件内容复制过去), 然后
- 把batch所在行修改为batch=64
- 把subdivision设置为8
- 在每个[yolo]-层, 把classes=80修改成你要检测的类的数量
https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg#L135
https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg#L176
- 在每个[yolo]-层前的[convolution]-层中,修改filters=255, 改成filters=(classes+5)*3(只适用于yolov3, 对于yolov2如何计算filters,google/百度一下)
https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg#L127
https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg#L171
因此如果classes=1, 那么filters=18, 如果classes=2, 那么filters=21
(不要在cfg文件里这样写:filters=(classes+5)*3)
(一般情况下, filters取决于classes, coords, 以及mask的数量, 例如filters = (classes+coords+1)*<numbers of mask>, 这里的mask就是anchors的索引, 如果没有mask, 那么filters=(classes+coords+1)*num)
比如, 只有两个类, 那么你的yolo-tiny-obj.cfg 在每个yolo层中应该是如下设置
1 2 3 4 5 | [convolutional] filters=21 [region] classes=2 |
在/darknet/dataset创建obj.names文件, 每行是你的类的名字, 如果你要检测的是猫和狗, 那么你的obj.names文件内容如下
1 2 | cat dog |
在/darknet/dataset创建obj.data文件, 包含如下内容, (classes=你要检测的类的数量)
1 2 3 4 5 | classes= 2 train = dataset /train .txt valid = dataset /test .txt names = dataset /obj .names backup = backup/ |
3. 制作自己的训练集测试集
首先把你的训练集(测试集)图片放到/darknet/dataset/Train (/darknet/dataset/Test ) , 图片扩展名为.jpg
然后对你数据集图片上的每个物体作标记,你可以用这个工具在图片上画边框, 并生成标记文件。他会在同一个目录下,给每个.jpg文件生成一个名字相同的.txt文件,文件里应该包含物体的类的编号, 以及物体在图片中的坐标,每一行都表示一个物体 <物体类的编号><x_center> <y_center> <width> <height>
- <类的编号> :是正整数, 从0-<类的数目-1>
<x_center> <y_center> <width> <height>
:都是浮点数范围从0到1,通过图片的长宽计算得出,例如<y_center>=<边框中心的纵坐标>/图片的高,<height> = <边框的高>/图片的高- 注意<x_center> <y_center>:是你画得边框的中心
比如对于img1.jpg你会创建一个img1.txt文件,包含以下内容
1 2 3 | 1 0.716797 0.395833 0.216406 0.147222 0 0.687109 0.379167 0.255469 0.158333 1 0.420312 0.395833 0.140625 0.166667 |
在/darknet/dataset目录下创建train.txt文件,文件中每一行都是到你训练集的地址, 可以使绝对路径, 也可以是相对路径, (相对darknet这个文件夹的路径), 例如文件内容如下
1 2 3 | dataset /Train/img1 .jpg dataset /Train/img2 .jpg dataset /Train/img3 .jpg |
这里你需要重新根据你自己的数据集计算anchors值, 可以参开这个python script 来计算, 然后把yolo-tiny-obj.cfg文件中的anchors值替换成你计算的结果
4 .在自己的数据集上运行yolov3
下载yolov3-tiny的权重文件:https://pjreddie.com/media/files/yolov3-tiny.weights 到darknet目录下
在终端输入以下命令得到预训练模型yolov3-tiny.conv.15
1 | . /darknet partial dataset /yolo-tiny-obj .cfg yolov3-tiny.weights yolov3-tiny.conv.15 15 |
输入以下命令开始训练
1 | . /darknet detector train dataset /obj .data dataset /yolo-tiny-obj .cfg yolov3-tiny.conv.15 |
如果一切正常应该是这样的结果
如果你运行中出现了nan, 这是正常现象,但如果全部都是nan的话,这就是训练过程出了问题,请仔细检查每一步是否按照操作进行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!