windows上运行yolov3代码详解(小白)

batch_normalize=1 # 是否做BN
代码链接

环境配置

没有Anaconda的话可以安装下

首先创建虚拟环境,名称随意,版本3.9.我觉得挺好的windows上运行yolov3代码详解(小白)_第1张图片
激活虚拟环境
conda activate 刚刚创建的环境名称
切换到requirements.txt目录下,直接vscode打开yolov3文件夹后,右键requirements.txt,复制路径
cd 路径即可(ps,先切换磁盘,for example,d:)再cd
按照requirements.txt安装环境后,直接运行train.py,你应该只会遇到two problem(我当初是doge),因为没记录下来,这里就不赘述了

yolov3.yaml

# YOLOv3  by Ultralytics, AGPL-3.0 license

# Parameters
nc: 80  # 要检测的类的数量
depth_multiple: 1.0  # 控制或缩放模型层的深度
width_multiple: 1.0  # 用于控制或缩放图层的通道数
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

# 这些数字成对排列,每对代表锚框的宽度和高度,如第一个锚框宽为10,高为13
# 原始模型,只有三个检测层,因此对应三组初始化Anchor值。当输入图像尺寸为640X640时
# P3/8 对应的检测层大小为80X80大小,可以用来检测大小在8X8以上的目标。
# P4/16对应的检测层大小为40X40大小,可以用来检测大小在16X16以上的目标。
# P5/32对应的检测层大小为20X20大小,可以用来检测32X32以上的目标

# darknet53 backbone
backbone:
  # [from, number, module, args]
  # from是从哪里接,-1就是代表上一层,-2就是上上层,具体数字就是具体哪一层
  # number就是重复来几次,8, Bottleneck就是重复8次Bottleneck,和resnet里面的残差类似
  # 实际中的重复次数=number*depth_multiple

  # args就是module的参数,filters、size、stride
  # 瓶颈层(Bottleneck):我们知道它是由:
  # 1x1 卷积层:应用 1x1 卷积来降低输入的维度。这降低了计算成本并有助于压缩信息
  # 3x3 卷积层:该层捕获降维内的空间特征
  # 1x1 卷积层(扩展):应用另一个 1x1 卷积将维度扩展回原始大小。这是瓶颈部分,因为它在再次扩展之前通过狭窄的层“挤压”信息
  # 64表示的是滤波器的个数
  [[-1, 1, Conv, [32, 3, 1]],  # 0层            1
   [-1, 1, Conv, [64, 3, 2]],  # 1-P1/2         2
   [-1, 1, Bottleneck, [64]],                   #4
   [-1, 1, Conv, [128, 3, 2]],  # 3-P2/4        5
   [-1, 2, Bottleneck, [128]],                  #5+2*2
   [-1, 1, Conv, [256, 3, 2]],  # 5-P3/8        10
   [-1, 8, Bottleneck, [256]],                  #10+2*8
   [-1, 1, Conv, [512, 3, 2]],  # 7-P4/16       27
   [-1, 8, Bottleneck, [512]],                  #27+2*8
   [-1, 1, Conv, [1024, 3, 2]],  # 9-P5/32      44
   [-1, 4, Bottleneck, [1024]],  # 10           44+2*4=52+FC=53
  ]

# YOLOv3 head
# 其实是Neck+head
# [-1, 1, Bottleneck, [1024, False]
# False其实这就是关闭了shortcut的选项
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]],
   # nn.Upsample表示上采样,
   # None表示没有特定的输出大小,即输出大小将由输入大小和上采样因子确定
   # nearest表示使用最近邻插值来进行上采样 
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],  
  #  -1 表示从当前层往前数的第一个元素。
  # 8 表示这个元素的索引为 8,可能是指前面网络中的第 8 层。
  # 1 表示该元素的输出通道数为 1。
  # Concat 表示使用拼接(concatenate)操作。
  # [1] 表示拼接的方向,这里是沿着通道轴进行拼接
   [[-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)
  ]

train.py

windows上运行yolov3代码详解(小白)_第2张图片

# 权重文件,选择你想使用的pt权重文件
parser.add_argument('--weights', type=str, default=ROOT / 'yolov3-tiny.pt', help='initial weights path')
# yaml文件,主要保存的是包含有关模型架构、超参数和训练配置的信息(这里默认使用的是yolov3-tiny.yaml,你可以根据自己需要更换)
parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
# 选择你的训练数据集
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')

run

windows上运行yolov3代码详解(小白)_第3张图片
运行后,会生成run文件夹,run\exp\weights\best.pt,这是我们根据我们训练生成的pt文件,保存的是训练过程中在验证集上表现最好的模型权重,当然还有个last.pt,顾名思义,保存的是最后一次训练迭代结束后的模型权重
里面还有一堆其他的,如resluts.csv文件,我们可以根据该文件来绘制图表,此处亦不再赘述

detect.py

在detect部分呢,还是上述三行代码,我们可以把pt权重文件换成best.ptwindows上运行yolov3代码详解(小白)_第4张图片

数据集

coco128数据集
同样的,运行后会再run下生成detect文件
windows上运行yolov3代码详解(小白)_第5张图片

ok,应该足以

你可能感兴趣的:(小白入门,YOLO,目标检测)