文件目录
1.cfg文件
存放网络模型
yolov3--->整个网络每一个层及其参数
最后一层为yolo层(候选框):
2.data文件
含有训练集和测试集,以及txt格式的坐标值(物体的框坐标),标签,以及每个训练和测试数据的路径(txt文件)
参数设置
1.data_config-->引入coco.data文件
2.pretrained_weights-->weights加载预训练模型
代码讲解
1.加载参数
读取数据为每轮迭代方式读取:
第一步:(从txt文件读出训练数据路径)
直接加绝对路径
转换为tensor格式,RGB三通道
将输入图像变为正方形做一个填充,然后加载原始坐标值,并进行变换变换为现在图像坐标值,
然后可以选择做图像增强
2.构造模型
1 init构造函数--指定网络模型(读取配置文件yolov3.cfg)包括了参数和网络层
2 forward函数--将输入数据带入网络
3 网络结构构建--调用create方法--创建卷积层
if module_def["type"] == "convolutional": bn = int(module_def["batch_normalize"]) filters = int(module_def["filters"]) kernel_size = int(module_def["size"]) pad = (kernel_size - 1) // 2 modules.add_module( f"conv_{module_i}", nn.Conv2d( in_channels=output_filters[-1], out_channels=filters, kernel_size=kernel_size, stride=int(module_def["stride"]), padding=pad, bias=not bn, ), )
route层--拼接图 con层--提取特征 max_pool--池化
class Darknet(nn.Module):
"""YOLOv3 object detection model"""
def __init__(self, config_path, img_size=416):
super(Darknet, self).__init__()
self.module_defs = parse_model_config(config_path)# 读取配置文件
self.hyperparams, self.module_list = create_modules(self.module_defs)# 创建模型
self.yolo_layers = [layer[0] for layer in self.module_list if hasattr(layer[0], "metrics")]
self.img_size = img_size
self.seen = 0
self.header_info = np.array([0, 0, 0, self.seen, 0], dtype=np.int32)
def forward(self, x, targets=None):
img_dim = x.shape[2]
loss = 0
layer_outputs, yolo_outputs = [], []
for i, (module_def, module) in enumerate(zip(self.module_defs, self.module_list)):
if module_def["type"] in ["convolutional", "upsample", "maxpool"]:
x = module(x)
elif module_def["type"] == "route":
x = torch.cat([layer_outputs[int(layer_i)] for layer_i in module_def["layers"].split(",")], 1)
elif module_def["type"] == "shortcut":
layer_i = int(module_def["from"])
x = layer_outputs[-1] + layer_outputs[layer_i]
elif module_def["type"] == "yolo":
x, layer_loss = module[0](x, targets, img_dim)
loss += layer_loss
yolo_outputs.append(x)
layer_outputs.append(x)
yolo_outputs = to_cpu(torch.cat(yolo_outputs, 1))
return yolo_outputs if targets is None else (loss, yolo_outputs)