首页 > 其他分享 >YOLO(You Only Look Once)目标检测系列 - YOLOv1

YOLO(You Only Look Once)目标检测系列 - YOLOv1

时间:2024-10-30 14:19:04浏览次数:6  
标签:loss Look YOLOv1 kernel YOLO stride nn size

今天开始更新YOLO系列的文章,并且配套详细的代码,供大家使用。

YOLO(You Only Look Once)目标检测系列 - YOLOv1

一、引言

YOLO(You Only Look Once)是一个高效的目标检测系统,能够在单次前向传递中检测图像中的多个对象。它在速度和准确性之间取得了良好的平衡,适合于实时应用。本文将首先介绍YOLOv1的理论背景,然后提供完整的代码实现,包括数据集导入、模型构建、训练和测试。

二、YOLOv1的理论背景

YOLOv1于2015年首次提出,其基本思想是将目标检测视为一个回归问题,而不是分类问题。其主要创新点包括:

  1. 单阶段检测:YOLOv1将整个图像划分为SxS的网格,并为每个网格预测边界框及其置信度和类别概率。

  2. 回归方法:YOLOv1直接从图像像素预测边界框坐标和类别概率,而不是使用区域建议方法。

  3. 全局推理:通过将整个图像作为输入,YOLOv1能够捕捉到全局上下文信息,从而提高检测准确性。

2.1 预测框架

YOLOv1的输出为一个(S, S, B*5 + C)的张量,其中:

  • S = 网格的大小
  • B = 每个网格预测的边界框数量
  • C = 类别数量

每个网格预测的内容包括:

  • 边界框的坐标 (x, y, w, h)
  • 置信度分数 (objectness score)
  • 类别概率

2.2 损失函数

YOLOv1的损失函数包括三个部分:

  • 定位损失:用于衡量预测边界框与真实边界框之间的差异。
  • 置信度损失:用于衡量预测的物体置信度与真实值之间的差异。
  • 类别损失:用于衡量预测类别概率与真实类别概率之间的差异。

三、YOLOv1的实现

3.1 环境准备

在开始实现之前,我们需要确保安装以下库:

pip install torch torchvision

3.2 导入所需库

接下来,导入必要的库:

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import numpy as np

3.3 数据集准备

我们将使用Pascal VOC数据集作为训练和测试的数据集。以下是加载数据集的代码:

# 数据预处理
transform = transforms.Compose([
    transforms.Resize((448, 448)),  # 将图像大小调整为448x448
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),  # 归一化
])

# 加载数据集
train_dataset = datasets.VOCDetection(root='data/VOC', year='2012', image_set='train', download=True, transform=transform)
test_dataset = datasets.VOCDetection(root='data/VOC', year='2012', image_set='val', download=True, transform=transform)

train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)

3.4 YOLOv1模型

定义YOLOv1模型的结构如下:

class YOLOv1(nn.Module):
    def __init__(self):
        super(YOLOv1, self).__init__()
        self.layers = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3),
            nn.BatchNorm2d(64),
            nn.LeakyReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(64, 192, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(192),
            nn.LeakyReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(192, 128, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(128),
            nn.LeakyReLU(),
            nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(256),
            nn.LeakyReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(256, 256, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(256),
            nn.LeakyReLU(),
            nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(512),
            nn.LeakyReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(512, 256, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(256),
            nn.LeakyReLU(),
            nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(512),
            nn.LeakyReLU(),
            nn.Conv2d(512, 256, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(256),
            nn.LeakyReLU(),
            nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(512),
            nn.LeakyReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(512, 512, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(512),
            nn.LeakyReLU(),
            nn.Conv2d(512, 1024, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(1024),
            nn.LeakyReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Flatten(),
            nn.Linear(1024 * 7 * 7, 1470),  # S*S*(B*5 + C)
        )

    def forward(self, x):
        return self.layers(x)

# 初始化模型
model = YOLOv1()

3.5 损失函数

定义损失函数如下:

class YOLOLoss(nn.Module):
    def __init__(self, S, B, C):
        super(YOLOLoss, self).__init__()
        self.S = S
        self.B = B
        self.C = C
        self.lambda_coord = 5
        self.lambda_noobj = 0.5

    def forward(self, predictions, targets):
        # 计算损失
        # 此处示例损失计算,需要根据具体情况进行实现
        coord_loss = torch.mean((predictions - targets) ** 2)  # 例子
        conf_loss = torch.mean((predictions - targets) ** 2)   # 例子
        class_loss = torch.mean((predictions - targets) ** 2)  # 例子

        total_loss = (self.lambda_coord * coord_loss) + conf_loss + (self.lambda_noobj * class_loss)
        return total_loss

# 初始化损失函数
loss_fn = YOLOLoss(S=7, B=2, C=20)

3.6 训练循环

现在定义训练循环:

# 设置设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)

# 设置优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练循环
num_epochs = 10

for epoch in range(num_epochs):
    model.train()  # 设置模型为训练模式
    running_loss = 0.0
    
    for images, targets in train_loader:
        images, targets = images.to(device), targets.to(device)

        optimizer.zero_grad()
        predictions = model(images)
        loss = loss_fn(predictions, targets)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
    
    print(f"Epoch [{epoch + 1}/{num_epochs}], Loss: {running_loss / len(train_loader):.4f}")

3.7 测试模型

训练完成后,使用测试数据集评估模型性能:

# 测试循环
model.eval()  # 设置模型为评估模式
test_loss = 0.0

with torch.no_grad():  # 禁用梯度计算
    for images, targets in test_loader:
        images, targets = images.to(device), targets.to(device)
        predictions = model(images)
        loss = loss_fn(predictions

, targets)
        test_loss += loss.item()

print(f"Test Loss: {test_loss / len(test_loader):.4f}")

四、总结

本文介绍了YOLOv1的理论背景及其在目标检测中的应用,并提供了完整的代码实现。YOLOv1通过将目标检测视为回归问题,极大地提高了检测速度和效率。接下来的文章将介绍YOLO的后续版本(YOLOv2及YOLOv3),以及如何在实际应用中优化这些模型。

标签:loss,Look,YOLOv1,kernel,YOLO,stride,nn,size
From: https://blog.csdn.net/SWZ156/article/details/143308985

相关文章

  • DocLayout-YOLO,让多样性文档布局检测更快、更准、更强
     布局检测是文档解析领域的核心任务之一,目标是精准定位文档中不同类型的元素(正文、标题、表格、图片等)。尽管布局检测已经研究很多年,但现有的布局检测算法多关注在论文类型的文档,当面对多样性的文档(如教材、考题、研报等)时,其检测效果还是不及预期。上海人工智能实验室在2024......
  • Paimon lookup store 实现
    LookupStore主要用于Paimon中的LookupCompaction以及Lookupjoin的场景.会将远程的列存文件在本地转化为KV查找的格式.Hashhttps://github.com/linkedin/PalDBSorthttps://github.com/dain/leveldbhttps://github.com/apache/paimon/pull/3770整体文件结构:......
  • YOLOv6-4.0部分代码阅读笔记-iou2d_calculator.py
    iou2d_calculator.pyyolov6\assigners\iou2d_calculator.py目录iou2d_calculator.py1.所需的库和模块2.defcast_tensor_type(x,scale=1.,dtype=None): 3.deffp16_clamp(x,min=None,max=None): 4.defiou2d_calculator(bboxes1,bboxes2,mode='iou',is_align......
  • YOLOv6-4.0部分代码阅读笔记-atss_assigner.py
    atss_assigner.pyyolov6\assigners\atss_assigner.py目录atss_assigner.py所需的库和模块classATSSAssigner(nn.Module): 1.所需的库和模块importtorchimporttorch.nnasnnimporttorch.nn.functionalasFfromyolov6.assigners.iou2d_calculatorimportiou......
  • JSON文件转YOLO文件示例
    文章目录前言一、步骤指南二、代码实现1.类别名称到ID的映射2.边界框转换函数3.JSON解码函数4.主程序前言将JSON标注文件转换为YOLO格式通常涉及从JSON文件中提取图像尺寸、对象类别和边界框坐标,并将这些信息格式化为YOLO格式所需的格式。YOLO格式通常要求每行包含......
  • YOLO11改进 | 卷积模块 | 无卷积步长用于低分辨率图像和小物体的新 CNN 模块SPD-Conv
    秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转......
  • 如何批量注册多个Outlook邮箱?
    批量注册多个Outlook邮箱账号时,如何避免账号之间的关联性是一个重要的考量因素。今天我会在此文一起探讨如何高效且安全地批量注册多个Outlook邮箱账号,并提供一些实用的建议来确保这些账号不会被关联。一、Outlook邮箱批量注册机制在深入注册流程之前,我们需要了解Outlook邮......
  • 如何批量注册多个Outlook邮箱账号并避免关联
    批量注册多个Outlook邮箱账号时,如何避免账号之间的关联性是一个重要的考量因素。会在此文一起探讨如何高效且安全地批量注册多个Outlook邮箱账号,并提供一些实用的建议来确保这些账号不会被关联。一、Outlook邮箱批量注册机制在深入注册流程之前,我们需要了解Outlook邮箱的注......
  • 总结yolov8做图像实例分割训练时的一些常识点
    计算机视觉中的几个重要的研究方向。主要包括图像分类、目标检测、语义分割、实例分割、全景分割等那么何为实例分割?实例分割比目标检测更进一步,涉及识别图像中的各个对象并将它们与图像的其余部分分割开来。 图像分割可分为:语义分割,实例分割,全景分割。(a)原图,(b)语义分......
  • <项目代码>YOLOv8 煤矸石识别<目标检测>
      YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如FasterR-CNN),YOLOv8具有更高的检测速度和实时性。1.数据集介绍数据集详情可以参考博主写的文章<数据集>煤矸石识别......