今天我们来解读yolo.py文件,这个文件是用来搭建Yolo的网络模型。它会根据你配置的yaml文件来搭建网络模型,如果你想对Yolov5的模型做出改进,那么你需要对这个文件里的模块有一定的了解。
一,parse_model模块
首先这个模块的功能是从字典里获取网络模型相关的信息,然后构建网络。接下来我会对这段代码做出详细的讲解。
def parse_model(d, ch):
LOGGER.info(f"\n{'':>3}{'from':>18}{'n':>3}{'params':>10} {'module':<40}{'arguments':<30}")
# 使用日志记录器对象记录一条带有特定格式的信息
anchors, nc, gd, gw, act, ch_mul = (
d["anchors"],
d["nc"],
d["depth_multiple"],
d["width_multiple"],
d.get("activation"),
d.get("channel_multiple"),
)
"""
从字典里获取anchors和parameters的信息
anchors:锚框,用于检测目标的预定义框。
nc:类别数量,表示模型需要检测的不同类别的数量。
depth_multiple:深度倍增因子,用于调整模型的深度。
width_multiple:宽度倍增因子,用于调整模型的宽度。
activation:激活函数,用于网络层的激活。
channel_multiple:通道倍增因子,用于调整模型的通道数。
"""
if act:
Conv.default_act = eval(act)
LOGGER.info(f"{colorstr('activation:')} {act}")
# 使用act作为默认的激活函数
if not ch_mul:
ch_mul = 8
na = (len(anchors[0]) // 2) if isinstance(anchors, list) else anchors
# 计算锚框的数量,如果anchors是一个列表,则锚框的数量等于列表中第一个锚框的一半的长度(因为锚框是由两个坐标组成的)
no = na * (nc + 5)
# 计算输出通道数。每个锚框对应的输出通道数等于类别数量加上5(其中4个是坐标,1个是置信度),然后乘以锚框数量。
layers, save, c2 = [], [], ch[-1]
# 三个空列表存储模型的层结构、保存列表以及输出通道数(由输入参数ch的最后一个元素确定)