IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> YoloV5 工程文档 学习自记 -> 正文阅读

[Python知识库]YoloV5 工程文档 学习自记

个人记录

正在扒代码,随手记录,上传方便以后找

YOLOv5 工程文件中的需要注意的文件

runs: 存储结果/中间过程文件

weights :存储神经网络模型以及权重参数,一边可以在学习(train)结束后生成,一边在测试(detect)时可以通过调用直接检测

models:存储模型的相关函数,比如yolo.py和common.py(记录)

.yaml文件:神经网路主干内容的描述文件

nc 代表训练的类别数,depth_multiple(模型),width_multiple(层)代表倍率

anchors,暂时不清楚,后面的是检测网络和输出网路的构造。

# Parameters
nc: 80  # number of classes
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # 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

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, C3, [1024, False]],  # 9
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

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  # self就是用于存储对象属性的集合,就算没有属性self也是必备的
  
    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)  # 本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。
print(b.__dict__)  # 这里返回的就是self本身,self存储属性,没有动作。

关于类的继承

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)# 3
a =3 if False else 5
print(a)# 5

语句大意是,判定为真则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)# 5
print(5 and 3)# 3
print(False and 3)# False
print(True and 3)# 3
inp = 2
oup = 2
a = True and inp == oup
print(a)# True
oup = 1
a = True and inp == oup
print(a)# False
oup = 2
a = False and inp == oup
print(a)# False
print(0 and False)# 0

总而言之,and这个语句,优先级相对较判等语句低,第一个参数作为判定语句,为真时,不论第二个值为何,直接输出,为假时候则直接输出第一个参数,也就是,他的输出只可能是两个值,False/0 或者是第二个参数

数组切片操作[::2]/[1::2]

x=[1,2,3,4,5,6]
x[::1]  # [1, 2, 3, 4, 5, 6]
x[::2]  # [1, 3, 5]
x[::3]  # [1, 4]
x[1::2] # [2, 4, 6]
x[2::2] # [3, 5]

由代码可知::2代表的是间隔两个取一个数,1::2代表偏置为1,缺省为0

维数超过 3 的多维数组,可通过 ‘…’ 来简化操作

arr[1, …] 等价于 arr[1, :, :]

arr[…, 1] 等价于 arr[:, :, 1]

numpy中对切片元素的操作会影响原数组本身

math.gcd() 求最大公约数

import math 
math.gcd(15,3)# 3
math.gcd(5,3) # 1

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):    # Standard convolution    
def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups        
	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))
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-14 13:59:04  更:2021-08-14 14:00:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:49:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码