【笔记】YOLOv3训练自己的数据集(2)——训练和测试训练效果

环境:Ubuntu18.04 GTX1080

3 训练

3.1 修改配置文件

3.1.1 修改类别名称显示文件darknet/data/voc.names

这里存放的是要检测的类别的名称,比如gun,就把原来的内容删除掉,键入gun,即可,如果是多个类别,以回车分割各个类别。

cd darknet
cp data/voc.names data/voc.names.bak  #备份原文件
gedit data/voc.names

在这里插入图片描述

3.1.2 修改数据文件darknet/cfg/voc.data

cd darknet
cp cfg/voc.data cfg/voc.data.bak  #备份原文件
gedit cfg/voc.data
classes= 1 /*类别数*/
train  = /home/xxx/train.txt                  /*voc2yolo.py生成的train.txt所在路径,建议使用绝对路径*/
valid  =/home/xxx/2007_test.txt               /*voc2yolo.py生成的2007_test.txt所在路径,建议使用绝对路径*/
names = cfg/voc.names                         /*3.1中修改的voc.names所在路径*/
backup = backup                              /*Darknet训练结果的输出路径,一定要有,不然没有输出。*/

3.1.3 修改配置文件 darknet/cfg/yolov3-voc.cfg

下面是yolov3-voc.cfg内容简介。

[net]
# Testing /*测试配置标签*/
# batch=1   /*测试时批次大小*/
# subdivisions=1  
# Training /*训练配置标签*/
batch=64  /*训练时批次大小*/
subdivisions=16   /*训练时,每次参与训练的图片数,是batch/subdivisions*/
width=416  /*图片宽度*/
height=416 /*图片高度*/
channels=3/*图片通道数*/
momentum=0.9/*动量,反向传播用*/
decay=0.0005/*衰减率,反向传播用*/
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

learning_rate=0.001
burn_in=1000
max_batches = 50200
policy=steps
steps=40000,45000
scales=.1,.1


/**下面是每层的网络配置*/
[convolutional]/*这一层是卷积层*/
batch_normalize=1/*使用批量归一化*/
filters=32/*滤波器个数*/
size=3/*滤波器尺寸*/
stride=1/*滤波器步长*/
pad=1/*填充*/
activation=leaky/*激活函数是 leaky relu*/

...

[shortcut]/*这个是仿ResNet的shortcut层*/
from=-3
activation=linear

...

[convolutional]/*yolo层之前的一个卷积层,比较重要*/
size=1
stride=1
pad=1
filters=75 /*3x(类别数+4+1)*/
activation=linear

[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=20 # 类别数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 /*如果显存很小,将random设置为0,关闭多尺度训练*/
cd darknet
cp cfg/yolov3-voc.cfg cfg/yolov3-voc.cfg.bak  #备份原配置文件
gedit cfg/yolov3-voc.cfg

要修改的地方有那么几处
①如果Training配置被注释,那么要取消Training的注释,并且把Testing注释。
在这里插入图片描述
②如果你想修改图片的大小也可以,但是要注意图像的宽高都要是32的倍数,因为Darknet53最后的特征层的宽高是原图的1/32。不过一般情况下,不需要更改。
在这里插入图片描述
③类别数修改为自己想要的检测的类别数,比如这里仅仅检测枪支,类别数classes=1
使用gedit打开yolov3-voc.cfg,按下Ctrl+F,右上角输入框里输入classes,定位到classes出现的三个位置,统统改为1

在这里插入图片描述
④修改filters,只需要修改[yolo]层前一个[convolutional]里的filters,结果计算公式是filters=3x(类别数+4+1),这里就是3x(1+4+1)=18
使用gedit打开yolov3-voc.cfg,按下Ctrl+F,右上角输入框里输入yolo,定位到yolo出现的三个位置,找到上面第一个出现的[convolutional]filters,统统改为18
在这里插入图片描述
⑤如果显存太小,可以把[yolo]层的random1改为0,关闭多尺度训练,使得训练能继续下去。
方法同③,使用gedit打开yolov3-voc.cfg,按下Ctrl+F,右上角输入框里输入random,定位到random出现的三个位置,统统改为0
在这里插入图片描述

3.2 开始训练

训练时可以在预训练模型上继续训练,也可以从头开始训练。

3.2.1 从预训练模型开始训练

cd darknet
wget https://pjreddie.com/media/files/darknet53.conv.74
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpu 0 | tee train_yolov3.log 

3.2.2 从头开始训练

cd darknet
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg  -gpu 0 | tee train_yolov3.log 

这里把训练日志保存到darknet/train_yolov3.log,以便后面分析训练过程,如可视化loss曲线等。

3.2.3 控制台输出解释

在这里插入图片描述
①每组包含三条信息,分别是:Region 82,Region 94,Region 106,三个尺度上预测不同大小的框,82卷积层为最大的预测尺度,使用较大的mask,但是可以预测出较小的物体,94卷积层为中间的预测尺度,使用中等的mask,106卷积层为最小的预测尺度,使用较小的mask,可以预测出较大的物体。
Region Avg IOU表征在当前subdivision内的图片的平均IOU,代表预测的矩形框和真实目标的交集与并集之比;Class表征标注物体分类的正确率,期望该值趋近于1;Obj越接近1越好;No Obj期望该值越来越小,但不为零;count是所有的当前subdivision图片中包含正样本的图片的数量。
③最后一行是每个batch(本文中是64)处理完成后都会输出的训练信息。
24996:第24996组batch。
0.146299:该批次内的总损失
0.214918 avg:平均损失
0.001000 rate:当前的学习率
4.207787 seconds: 当前batch训练所花的时间
1599744 images : 目前为止参与训练的图片总数 = 24996 * 64
等到avg降到1e-1~1e-2Classes,Obj等也都接近于1时,就可以停止训练了。

4 训练结果测试

训练结束之后
①进入3.1.2中配置的voc.data下指定的backup目录,把yolov3-voc_xxx.weights中选择一个xxx最大的拷贝到darknet目录下,比如是yolov3-voc_20000.weights
②准备一张测试图像放在darknet/data目录下,比如是gun.jpg

 cd darknet 
 ./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg yolov3-voc_20000.weights data/gun.jpg

在这里插入图片描述

至此,便从零开始使用YOLOv3训练好了一个自己的目标检测器。

【未完待续…】

下一篇【笔记】YOLOv3训练自己的数据集(3)——小技巧和训练日志可视化

### 配置 PyCharm 连接到 AutoDL 服务器进行 YOLOv8 模型训练 #### 设置 SSH 远程解释器 为了能够在 PyCharm 中远程运行代码,在本地开发环境中配置 SSH 解释器是必要的。这允许通过安全的方式访问远程服务器上的 Python 环境。 1. 打开 PyCharm 并进入 `File` -> `Settings` (Windows/Linux) 或者 `PyCharm` -> `Preferences` (macOS). 2. 寻找并点击左侧菜单中的 `Project: <your_project_name>` 下的 `Python Interpreter`. 3. 在右上角找到齿轮图标,选择 `Add...`. 4. 接下来会看到多个选项;这里应该选择 `SSH Interpreter`. 输入 AutoDL 服务器的相关信息,比如主机名、端口、用户名以及私钥文件路径来完成身份验证[^1]. #### 安装依赖库 一旦成功设置了远程解释器,下一步就是安装所需的软件包以便支持 YOLOv8 的训练过程: ```bash pip install ultralytics ``` 这条命令会在指定的虚拟环境下安装 Ultralytics 提供的支持 YOLOv8 版本的官方库[^2]. #### 数据集准备 对于自定义数据集而言,通常需要按照特定格式整理好图像及其对应的标注文件。确保这些资源位于易于访问的位置,并且可以通过脚本轻松加载它们作为输入给定模型框架。 假设已经有一个 COCO 格式的 JSON 文件描述了所有的类别标签边界框位置,则可以利用如下方式读取该文件并将之转换成适合 YOLO 使用的形式: ```python from pathlib import Path import json def convert_coco_to_yolo(coco_json_path, output_dir): with open(coco_json_path) as f: coco_data = json.load(f) image_id_to_filename = {image[&#39;id&#39;]: image[&#39;file_name&#39;] for image in coco_data[&#39;images&#39;]} categories = {category[&#39;id&#39;]: category[&#39;name&#39;] for category in coco_data[&#39;categories&#39;]} yolo_labels = {} for annotation in coco_data[&#39;annotations&#39;]: image_id = annotation[&#39;image_id&#39;] bbox = annotation[&#39;bbox&#39;] class_id = str(annotation["category_id"]) filename = image_id_to_filename[image_id] if not filename in yolo_labels: yolo_labels[filename] = [] normalized_bbox = [ (bbox[0] + bbox[2]/2)/coco_data[&#39;width&#39;], (bbox[1] + bbox[3]/2)/coco_data[&#39;height&#39;], bbox[2]/coco_data[&#39;width&#39;], bbox[3]/coco_data[&#39;height&#39;] ] line = " ".join([class_id]+list(map(str,normalized_bbox))) yolo_labels[filename].append(line) outpath = Path(output_dir) outpath.mkdir(parents=True, exist_ok=True) for key,value in yolo_labels.items(): txt_file = outpath / Path(key).with_suffix(&#39;.txt&#39;) content = "\n".join(value)+"\n" txt_file.write_text(content) convert_coco_to_yolo(&#39;instances_train.json&#39;, &#39;./labels/train/&#39;) ``` 这段代码片段展示了如何将标准 COCO JSON 转换成适用于 YOLO 训练的数据结构[^3]. #### 开始训练 最后一步是在 PyCharm 内部启动实际的训练流程。创建一个新的 Python 文件或笔记本单元格,编写下面所示的内容以调用预训练权重初始化网络架构,并传入之前处理好的数据集路径参数执行 fit 方法即可开始迭代优化直至收敛为止. ```python from ultralytics import YOLO model = YOLO(&#39;yolov8n.yaml&#39;) # Load model specification from YAML file or use pretrained weights like &#39;yolov8n.pt&#39; results = model.train(data=&#39;./datasets/&#39;, epochs=100, imgsz=640) ``` 上述操作完成后就可以顺利地在 PyCharm IDE 上面管理整个项目周期内的各项任务了——从环境搭建直到最终部署上线前的各项准备工作都能得到妥善安排[^4].
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值