个人记录
正在扒代码,随手记录,上传方便以后找
YOLOv5 工程文件中的需要注意的文件
runs: 存储结果/中间过程文件
weights :存储神经网络模型以及权重参数,一边可以在学习(train)结束后生成,一边在测试(detect)时可以通过调用直接检测
models:存储模型的相关函数,比如yolo.py和common.py(记录)
.yaml文件:神经网路主干内容的描述文件
nc 代表训练的类别数,depth_multiple(模型),width_multiple(层)代表倍率
anchors,暂时不清楚,后面的是检测网络和输出网路的构造。
nc: 80
depth_multiple: 0.67
width_multiple: 0.75
anchors:
- [10,13, 16,30, 33,23]
- [30,61, 62,45, 59,119]
- [116,90, 156,198, 373,326]
backbone:
[[-1, 1, Focus, [64, 3]],
[-1, 1, Conv, [128, 3, 2]],
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]],
[-1, 9, C3, [256]],
[-1, 1, Conv, [512, 3, 2]],
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]],
[-1, 1, SPP, [1024, [5, 9, 13]]],
[-1, 3, C3, [1024, False]],
]
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]],
[-1, 3, C3, [512, False]],
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]],
[-1, 3, C3, [256, False]],
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]],
[-1, 3, C3, [512, False]],
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]],
[-1, 3, C3, [1024, False]],
[[17, 20, 23], 1, Detect, [nc, anchors]],
]
detect.py :检测的py 文件
train.py:训练的py文件
export.py:从现有的.pt文件生成更可视化/通用的onnx文件
python 类相关
定义
Python 的类是 C++ 和 Modula-3 中类机制的结合体,而且支持所有面向对象编程(OOP)的标准特性:类继承机制支持多个基类,派生类可以覆盖基类的任何方法,类的方法可以调用基类中相同名称的方法。对象可以包含任意数量和类型的数据。和模块一样,类也拥有 Python 天然的动态特性:在运行时创建,创建后也可以修改。
python 的作用域和命名空间
namespace (命名空间)是一个从名字到对象的映射。不同命名空间中的名称之间绝对没有关系,例如,两个不同的模块都可以定义一个 maximize 函数而不会产生混淆 — 模块的用户必须在其前面加上模块名称。
关于self 的代码
class Box:
def __init__(self, boxname, size, color):
self.boxname = boxname
self.size = size
self.color = color
def open(self,myself):
print('-->用自己的myself,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))
print('-->用类自己的self,打开那个%s,%s的%s' % (self.color, self.size, self.boxname))
def close(self):
print('-->关闭%s,谢谢' % self.boxname)
b = Box('魔盒', '14m', '红色')
c = Box('魔盒', '8m', '绿色')
b.close()
b.open(c)
print(b.__dict__)
关于类的继承
class parent(object):
def implicit(self):
print("Parent implicit()")
def override(self):
print("Parent override()")
def altered(self):
print("Parent altered()")
class child(parent):
def override(self):
print("Child override()")
def altered(self):
print("Child,Before Parent altered()")
super(child,self).altered()
print("Child,After Parent altered()")
dad=parent()
son=child()
dad.implicit()
son.implicit()
dad.override()
son.override()
dad.altered()
son.altered()
可以看出 class child(parent),定义的child类继承了parent类
关于super 函数
描述
super() 函数是用于调用父类(超类)的一个方法。
super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
python 基础知识
assert
当判断的文件存在时,使用断言说明文件存在程序运行没有任何错误。而删除断言中判断的存在文件之后,程序运行时候报错。实际上,断言的条件不成立时程序是直接报错并且终止执行。这不仅仅是保证程序运行可靠的一种方式,同时也算是一种程序问题定位的一种手段。因为程序运行停止时,错误信息会给出出现错误所在的代码行,而相应的条件都是程序员自己设定的,比较容易排查。
stride = 5
assert stride in [3, 5]
stride = 4
assert stride in [3, 5]
stride = 3
assert stride in [3, 5]
综上,判定 stride是否为3/5,如果都不是,报错抛出异常,否则程序继续
a =3 if True else 5
a =3 if True else 5
print(a)
a =3 if False else 5
print(a)
语句大意是,判定为真则a =3 ,为假则等于5
and 、or
在不加括号时候, and优先级大于or
x or y 的值只可能是x或y. x为真就是x, x为假就是y
x and y 的值只可能是x或y. x为真就是y, x为假就是x
print(3 and 5)
print(5 and 3)
print(False and 3)
print(True and 3)
inp = 2
oup = 2
a = True and inp == oup
print(a)
oup = 1
a = True and inp == oup
print(a)
oup = 2
a = False and inp == oup
print(a)
print(0 and False)
总而言之,and这个语句,优先级相对较判等语句低,第一个参数作为判定语句,为真时,不论第二个值为何,直接输出,为假时候则直接输出第一个参数,也就是,他的输出只可能是两个值,False/0 或者是第二个参数
数组切片操作[::2]/[1::2]
x=[1,2,3,4,5,6]
x[::1]
x[::2]
x[::3]
x[1::2]
x[2::2]
由代码可知::2代表的是间隔两个取一个数,1::2代表偏置为1,缺省为0
维数超过 3 的多维数组,可通过 ‘…’ 来简化操作
arr[1, …] 等价于 arr[1, :, :]
arr[…, 1] 等价于 arr[:, :, 1]
numpy中对切片元素的操作会影响原数组本身
math.gcd() 求最大公约数
import math
math.gcd(15,3)
math.gcd(5,3)
nn 相关的几个函数
nn.Conv2d
nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')
? in_channel: 输入数据的通道数,例RGB图片通道数为3; ? out_channel: 输出数据的通道数,这个根据模型调整; ? kennel_size: 卷积核大小,可以是int,或tuple;kennel_size=2,意味着卷积大小2, kennel_size=(2,3),意味着卷积在第一维度大小为2,在第二维度大小为3; ? stride:步长,默认为1,与kennel_size类似,stride=2,意味在所有维度步长为2, stride=(2,3),意味着在第一维度步长为2,意味着在第二维度步长为3; ? padding: 零填充 ? dilation:控制卷积核点之间的距离,如图,蓝色输入,青色输出
? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QbORIV1O-1628866911649)(C:\Users\Administrator\Desktop\日志\dilation.gif)]
? groups:分组卷积,将对应的输入通道与输出通道数进行分组, 默认值为1, 也就是说默认输出输入的所有通道各为一组。 比如输入数据大小为90x100x100x32,通道数32,要经过一个3x3x48的卷积,group默认是1,就是全连接的卷积层。 ? 如果group是2,那么对应要将输入的32个通道分成2个16的通道,将输出的48个通道分成2个24的通道。对输出的2个24的通道,第一个24通道与输入的第一个16通道进行全卷积,第二个24通道与输入的第二个16通道进行全卷积。 ? bias:卷积后是否加偏移量
语句翻译
Conv
定义了一个卷积类Conv,继承nn.Module
构造函数的初始化变量有两个必输入项c1,c2,后面跟可选输入项k=1(卷积核),s=1(步长),p=none,g=1,act=true
主动调用父类的无参数初始化构造函数
并在自己的构造函数中赋予函数方法Conv.conv,Conv.bn,Conv.act
class Conv(nn.Module):
def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):
super().__init__()
self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)
self.bn = nn.BatchNorm2d(c2)
self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
def forward(self, x):
return self.act(self.bn(self.conv(x)))
def fuseforward(self, x):
return self.act(self.conv(x))
|