YOLOv1 模型构建与训练

相关文章

项目地址:YOLOv1 VOC 2007

笔者训练的权重地址:阿里云盘分享

10 秒文章速览

本文主要讲解了 YOLOv1 的模型构建、损失函数、模型训练

模型构建

对于模型的构建,我们不采用论文中的方案,而是使用 ResNet 模型。至于为什么,在笔者的观测下,ResNet练的训练速度明显更快

YOLOv1 模型

但在这里笔者还是贴出论文中的模型,向前辈致敬🫡

python 复制代码
# 根据原论文构建的模型
def get_YOLOv1():
    model = keras.Sequential([
        keras.layers.Conv2D(64, (7, 7), 2, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.MaxPool2D((2, 2), 2),

        keras.layers.Conv2D(192, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.MaxPool2D((2, 2), 2),

        keras.layers.Conv2D(128, (1, 1), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(256, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(256, (1, 1), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(512, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.MaxPool2D((2, 2), 2),

        keras.layers.Conv2D(256, (1, 1), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(512, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(256, (1, 1), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(512, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(256, (1, 1), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(512, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(256, (1, 1), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(512, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(512, (1, 1), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(1024, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.MaxPool2D((2, 2), 2),

        keras.layers.Conv2D(512, (1, 1), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(1024, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(512, (1, 1), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(1024, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(1024, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(1024, (3, 3), 2, 'same'),
        keras.layers.LeakyReLU(0.1),

        keras.layers.Conv2D(1024, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Conv2D(1024, (3, 3), 1, 'same'),
        keras.layers.LeakyReLU(0.1),

        keras.layers.Flatten(),
        keras.layers.Dense(4096),
        keras.layers.LeakyReLU(0.1),
        keras.layers.Dropout(rate=0.5),
        keras.layers.Dense(1470),
        keras.layers.Reshape((7, 7, 30)),
        keras.layers.Activation('sigmoid')
    ])
    model.build(input_shape=(None, 224,224, 3))

    return model

ResNet50V2 模型

使用 ResNet 作为模型,还有一个原因是 TensorFlow 提供的模型可以加载 ImageNet 数据集的训练权重

在全连接部分,我们参考论文中的构建方式,只不过将 Flatten 层改为了 GlobalAvgPool2D 层

python 复制代码
# 以 ResNet50V2 作为模型主干
ResNet = keras.applications.ResNet50V2(input_shape=(448, 448, 3), include_top=False)

# 构建全连接层部分
x = ResNet.output
x = keras.layers.GlobalAvgPool2D()(x)
x = keras.layers.Dense(4096)(x)
x = keras.layers.LeakyReLU(0.1)(x)
x = keras.layers.Dropout(rate=0.5)(x)
x = keras.layers.Dense(1470)(x)
x = keras.layers.Reshape((7, 7, 30))(x)
x = keras.layers.Activation('sigmoid')(x)

model = keras.Model(ResNet.input, x)

模型训练

对于模型的训练,同样参考了论文中的方案(有意思的是笔者在训练中也使用了 TensorFlow 提供的分段衰退的方法,但效果似乎不如下面这种简单粗暴的方法)

python 复制代码
optimizer = keras.optimizers.SGD(learning_rate=0.0055, momentum=0.9, weight_decay=0.0005)
model.compile(optimizer=optimizer, loss=get_loss)

model.fit(train_set, epochs=1)
model.optimizer.learning_rate.assign(0.01)
model.fit(train_set, epochs=75)
model.optimizer.learning_rate.assign(0.001)
model.fit(train_set, epochs=30)
model.optimizer.learning_rate.assign(0.0001)
model.fit(train_set, epochs=30)

如果在不加载预训练权重的情况下,这里也给出笔者的训练方案

使用 Adam 优化器,weight_decay 设置为0.0005,训练步骤如下

  • 以0.0003为学习率,训练75个周期
  • 以0.0001为学习率,训练50个周期
  • 以0.00005为学习率,训练25个周期
  • 以0.00003为学习率,训练25个周期
相关推荐
天上路人4 分钟前
A-59F所有应用模式说明
人工智能·硬件架构·音视频·语音识别·实时音视频
带娃的IT创业者4 分钟前
LLM半年巨变:从模型混战到AI代理“爪“时代的崛起
人工智能·llm·ai编程·基准测试·技术趋势·ai代理
数智工坊4 分钟前
视觉-语言-动作模型解剖学:从模块、里程碑到核心挑战
论文阅读·人工智能·深度学习·算法·transformer
萤萤七悬28 分钟前
基于本地模型yolov11识别广告关闭按钮
人工智能·airtest·poco
醒李30 分钟前
盲人出行辅助系统原型
人工智能·python·目标检测
惊鸿一博30 分钟前
Transformer模型图解(简单易懂版)
人工智能·深度学习·transformer
黎阳之光44 分钟前
视听融合新范式!黎阳之光打破视觉边界,声影协同赋能全域智慧管控
大数据·人工智能·物联网·算法·数字孪生
Ian在掘金1 小时前
SSE 还是 WebSocket?从 AI 流式输出聊到实时通信选型
前端·人工智能
雨雨雨雨雨别下啦1 小时前
心理健康AI助手 - 项目总结
前端·javascript·vue.js·人工智能·信息可视化
PILIPALAPENG1 小时前
第4周 Day 3:多 Agent 协作——让 Agent 们"组队干活"
前端·人工智能·python