本课设使用yolov3,详情参考视频
公司方面也是源码套用即可。
step1:yolo-v3的简介
1.改进方面最大改进就是网格结构,使其更适合小目标检测;
2.特征做的更细致,融入多持续特征图信息来预测不同规格物体
3.先验框由三种变成九种
4.softmax:多分类分类器,对其进行改进,预测多标签任务,一个物体可以有多个标签,如:狗-哺乳动物-犬科……
多scale
为了检测不同大小的物体,设计了3个scale(13×13,26×26,52×52),13×13预测大的,26×26预测中的,52×52预测小的,每种有三种候选框。
如何得到?scale变换,需要特征融合,先取出13×13,后面的需要借鉴前面的,
方法:上采样。
残差连接
resnet(深度残差网络),v3中也使用了resnet的思想,堆叠更多的层来进行特征提取。vgg网络会越学越差劲(19层后),而resnet解决了这个问题。
resnet思想:为了将好的卷积留下,差劲的卷积放弃,至少不比原来差。
darknet53
池化:将特征做压缩。
softmax
损失,对数函数,
step2:流程
1.准备一个编译器
eclipse,pycharm,idea都可,相关教程自己找。
2.环境配置
创建虚拟环境yolov3
(一)首先我们要创建适合yolov3运行的虚拟环境,本机器使用的是python3.8,故降低python版本。
在anaconda控制台中进行虚拟环境创建。
# 创建yolov3环境
conda create -n yolov3 python=3.7 anaconda
# 激活环境
conda activate yolov3
(二)安装pytorch
因为要在低版本中将本身的gpu调用起来,所以选用以下命令。
# 安装pytorch
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=10.2 -c pytorch
请耐心等待,因为是从原镜像安装,所以可能会有点慢。如果失败请多试几次一定可以安装成功。
(三)测试
# 测试torch
import torch
torch.cuda.is_available()
# 查看torch版本
torch.__version__
出现上面结果证明你已安装成功。
3.进入代码实现环境匹配
下载yolov3的源码,地址
下载官方权重文件,地址
下载完成后找到源码压缩包进行解压,在文件夹中新建weights文件夹,将下载好的权重文件放入其中。
安装yolov3需要的包和库
# 安装代码
pip install -r requirements.txt
错误解决
# 解决pip问题
python -m ensurepip
python -m pip install --upgrade pip
# 解决pyqt5问题
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple " pyqt5<5.13"
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple " pyqtwebengine<5.13"
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pathlib
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ruamel-yaml
安装完成后就不会报错了。
4.测试代码
# 测试是否完成环境与源码配套
python detect.py --weights D:\A-bishe\code\yolov3-master\weigths\yolov3.pt --source data/images/bus.jpg
step3:训练与测试
1.数据标注
使用labelimg进行标注。
2.配置环境
(一)在data文件夹下新建voc_rbc.yaml文件
path: ../yolov3-9.6.0/VOCdevkit/
train:
- C:\Users\Lenovo\Desktop\dataset\images\train
val:
- C:\Users\Lenovo\Desktop\dataset\images\val
nc: 4 # number of classes
names: ['xfc','xc','yzc','jc'] # class names
(二)在models文件下新建yolov3_rbc.yaml文件
# YOLOv3 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 4 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# darknet53 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [32, 3, 1]], # 0
[-1, 1, Conv, [64, 3, 2]], # 1-P1/2
[-1, 1, Bottleneck, [64]],
[-1, 1, Conv, [128, 3, 2]], # 3-P2/4
[-1, 2, Bottleneck, [128]],
[-1, 1, Conv, [256, 3, 2]], # 5-P3/8
[-1, 8, Bottleneck, [256]],
[-1, 1, Conv, [512, 3, 2]], # 7-P4/16
[-1, 8, Bottleneck, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 9-P5/32
[-1, 4, Bottleneck, [1024]], # 10
]
# YOLOv3 head
head:
[[-1, 1, Bottleneck, [1024, False]],
[-1, 1, Conv, [512, [1, 1]]],
[-1, 1, Conv, [1024, 3, 1]],
[-1, 1, Conv, [512, 1, 1]],
[-1, 1, Conv, [1024, 3, 1]], # 15 (P5/32-large)
[-2, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 8], 1, Concat, [1]], # cat backbone P4
[-1, 1, Bottleneck, [512, False]],
[-1, 1, Bottleneck, [512, False]],
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, Conv, [512, 3, 1]], # 22 (P4/16-medium)
[-2, 1, Conv, [128, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P3
[-1, 1, Bottleneck, [256, False]],
[-1, 2, Bottleneck, [256, False]], # 27 (P3/8-small)
[[27, 22, 15], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
2.训练
# 训练代码 权重 预设模型 数据
python train.py --weights D:\A-bishe\code\yolov3-master\weigths\yolov3.pt --cfg models/yolov3_rbc.yaml --data data/voc_rbc.yaml --epochs 100 --workers 0
3.测试
# 测试代码
python detect.py --weights runs/train/exp3/weights/best.pt --source C:\Users\Lenovo\Desktop\1\xfc1.mp4