首页 > 其他分享 >如何利用深度学习框架训练使用 可以使用YOLOv5模型来进行目标检测 智慧化生产工地 钢筋计数数据集共23400组 voc标注,从数据准备到模型训练的所有步骤

如何利用深度学习框架训练使用 可以使用YOLOv5模型来进行目标检测 智慧化生产工地 钢筋计数数据集共23400组 voc标注,从数据准备到模型训练的所有步骤

时间:2025-01-03 22:34:25浏览次数:3  
标签:__ 训练 voc 模型 torch train time self def

如何训练自己的数据集——智慧化生产工地资产盘点,超大规模钢筋计数数据集,共23400组图像,多视角,多角度,多场景,采用voc方式标注。在这里插入图片描述
智慧化生产工地资产盘点,超大规模钢筋计数数据集,共23400组图像,多视角,多角度,多场景,采用voc方式标注。在这里插入图片描述
在这里插入图片描述
为了实现智慧工地资产盘点中的超大规模钢筋计数任务,我们可以使用YOLOv5模型来进行目标检测。以下是详细的步骤和代码示例,包括数据集定义、配置文件、训练脚本等。

目录结构

首先,确保你的项目目录结构如下:

/rebar_counting_project
    /datasets
        /train
            /images
                *.jpg
            /annotations
                *.xml
        /valid
            /images
                *.jpg
            /annotations
                *.xml
    /scripts
        train.py
        datasets.py
        config.yaml
        requirements.txt

config.yaml

配置文件 config.yaml 包含训练参数、数据路径等信息。

# config.yaml
train: ../datasets/train/images/
val: ../datasets/valid/images/

nc: 1
names: ['rebar']

requirements.txt

列出所有需要安装的Python包。

torch>=1.8
torchvision>=0.9
pycocotools
opencv-python
matplotlib
albumentations
labelme2coco

datasets.py

定义数据集类以便于加载钢筋计数的数据集,并进行数据增强。

import os
from pathlib import Path
from PIL import Image
import torch
from torch.utils.data import Dataset, DataLoader
import albumentations as A
from albumentations.pytorch.transforms import ToTensorV2
import xml.etree.ElementTree as ET

class RebarDataset(Dataset):
    def __init__(self, root_dir, transform=None):
        self.root_dir = Path(root_dir)
        self.transform = transform
        self.img_files = list((self.root_dir / 'images').glob('*.jpg'))
        self.label_files = [Path(str(img_file).replace('images', 'annotations').replace('.jpg', '.xml')) for img_file in self.img_files]

    def __len__(self):
        return len(self.img_files)

    def __getitem__(self, idx):
        img_path = self.img_files[idx]
        label_path = self.label_files[idx]

        image = Image.open(img_path).convert("RGB")
        boxes = []
        labels = []

        tree = ET.parse(label_path)
        root = tree.getroot()
        size = root.find('size')
        width = int(size.find('width').text)
        height = int(size.find('height').text)

        for obj in root.findall('object'):
            bbox = obj.find('bndbox')
            xmin = float(bbox.find('xmin').text) / width
            ymin = float(bbox.find('ymin').text) / height
            xmax = float(bbox.find('xmax').text) / width
            ymax = float(bbox.find('ymax').text) / height
            boxes.append([xmin, ymin, xmax, ymax])
            labels.append(1)  # Assuming only one class 'rebar'

        if self.transform:
            transformed = self.transform(image=np.array(image), bboxes=boxes, class_labels=labels)
            image = transformed['image']
            boxes = transformed['bboxes']
            labels = transformed['class_labels']

        target = {}
        target['boxes'] = torch.tensor(boxes, dtype=torch.float32)
        target['labels'] = torch.tensor(labels, dtype=torch.int64)

        return image, target

# 定义数据增强
data_transforms = {
    'train': A.Compose([
        A.Resize(width=640, height=640),
        A.HorizontalFlip(p=0.5),
        A.VerticalFlip(p=0.5),
        A.Rotate(limit=180, p=0.7),
        A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.3),
        A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
        ToTensorV2(),
    ], bbox_params=A.BboxParams(format='pascal_voc')),
    'test': A.Compose([
        A.Resize(width=640, height=640),
        A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
        ToTensorV2(),
    ], bbox_params=A.BboxParams(format='pascal_voc')),
}

train.py

编写训练脚本来训练YOLOv5模型。

import torch
import torch.optim as optim
from torchvision.models.detection import fasterrcnn_resnet50_fpn_v2
from datasets import RebarDataset, data_transforms
from torch.utils.data import DataLoader
import yaml
import time

with open('config.yaml', 'r') as f:
    config = yaml.safe_load(f)

def collate_fn(batch):
    images = [item[0] for item in batch]
    targets = [item[1] for item in batch]
    images = torch.stack(images)
    return images, targets

def train_one_epoch(model, optimizer, data_loader, device, epoch, print_freq):
    model.train()
    metric_logger = MetricLogger(delimiter="  ")
    header = f"Epoch: [{epoch}]"

    for images, targets in metric_logger.log_every(data_loader, print_freq, header):
        images = list(image.to(device) for image in images)
        targets = [{k: v.to(device) for k, v in t.items()} for t in targets]

        loss_dict = model(images, targets)
        losses = sum(loss for loss in loss_dict.values())

        optimizer.zero_grad()
        losses.backward()
        optimizer.step()

        metric_logger.update(loss=losses.item(), **loss_dict)

class MetricLogger(object):
    def __init__(self, delimiter="\t"):
        self.meters = defaultdict(SmoothedValue)
        self.delimiter = delimiter

    def update(self, **kwargs):
        for k, v in kwargs.items():
            if isinstance(v, torch.Tensor):
                v = v.item()
            assert isinstance(v, (float, int))
            self.meters[k].update(v)

    def __getattr__(self, attr):
        if attr in self.meters:
            return self.meters[attr]
        if attr in self.__dict__:
            return self.__dict__[attr]
        raise AttributeError(f"'MetricLogger' object has no attribute '{attr}'")

    def log_every(self, iterable, print_freq, header=None):
        i = 0
        if not header:
            header = ""
        start_time = time.time()
        end = time.time()
        iter_time = SmoothedValue(fmt='{avg:.4f}')
        eta_string = SmoothedValue(fmt='{eta}')
        space_fmt = ':' + str(len(str(len(iterable)))) + 'd'
        log_msg = [
            header,
            '[{0' + space_fmt + '}/{1}]',
            'eta: {eta}',
            '{meters}',
            'time: {time}'
        ]
        if torch.cuda.is_available():
            log_msg.append('max mem: {memory:.0f}')
        log_msg = self.delimiter.join(log_msg)
        MB = 1024.0 * 1024.0
        for obj in iterable:
            data_time.update(time.time() - end)
            yield obj
            iter_time.update(time.time() - end)
            if i % print_freq == 0 or i == len(iterable) - 1:
                eta_seconds = iter_time.global_avg * (len(iterable) - i)
                eta_string.update(datetime.timedelta(seconds=int(eta_seconds)))
                if torch.cuda.is_available():
                    print(log_msg.format(
                        i, len(iterable), eta=eta_string, meters=str(self),
                        time=str(iter_time), memory=torch.cuda.max_memory_allocated() / MB))
                else:
                    print(log_msg.format(
                        i, len(iterable), eta=eta_string, meters=str(self),
                        time=str(iter_time)))
            i += 1
            end = time.time()
        total_time = time.time() - start_time
        total_time_str = str(datetime.timedelta(seconds=int(total_time)))
        print('{} Total time: {} ({:.4f} s / it)'.format(
            header, total_time_str, total_time / len(iterable)))

class SmoothedValue(object):
    """Track a series of values and provide access to smoothed values over a
    window or the global series average.
    """

    def __init__(self, window_size=20, fmt=None):
        if fmt is None:
            fmt = "{median:.4f} ({global_avg:.4f})"
        self.deque = deque(maxlen=window_size)
        self.total = 0.0
        self.count = 0
        self.fmt = fmt

    def update(self, value, n=1):
        self.deque.append(value)
        self.count += n
        self.total += value * n

    def synchronize_between_processes(self):
        """
        Warning: does not synchronize the deque!
        """
        if not is_dist_avail_and_initialized():
            return
        t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda')
        dist.barrier()
        dist.all_reduce(t)
        t = t.tolist()
        self.count = int(t[0])
        self.total = t[1]

    @property
    def median(self):
        d = torch.tensor(list(self.deque))
        return d.median().item()

    @property
    def avg(self):
        d = torch.tensor(list(self.deque), dtype=torch.float32)
        return d.mean().item()

    @property
    def global_avg(self):
        return self.total / self.count

    @property
    def max(self):
        return max(self.deque)

    @property
    def value(self):
        return self.deque[-1]

    def __str__(self):
        return self.fmt.format(
            median=self.median,
            avg=self.avg,
            global_avg=self.global_avg,
            max=self.max,
            value=self.value)

def main():
    device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')

    dataset_train = RebarDataset(root_dir=config['train'], transform=data_transforms['train'])
    dataset_val = RebarDataset(root_dir=config['val'], transform=data_transforms['test'])

    data_loader_train = DataLoader(dataset_train, batch_size=4, shuffle=True, num_workers=4, collate_fn=collate_fn)
    data_loader_val = DataLoader(dataset_val, batch_size=4, shuffle=False, num_workers=4, collate_fn=collate_fn)

    model = fasterrcnn_resnet50_fpn_v2(pretrained=True)
    num_classes = config['nc'] + 1  # background + number of classes
    in_features = model.roi_heads.box_predictor.cls_score.in_features
    model.roi_heads.box_predictor = torch.nn.Linear(in_features, num_classes)
    model.to(device)

    params = [p for p in model.parameters() if p.requires_grad]
    optimizer = optim.SGD(params, lr=0.005, momentum=0.9, weight_decay=0.0005)

    for epoch in range(10):  # number of epochs
        train_one_epoch(model, optimizer, data_loader_train, device=device, epoch=epoch, print_freq=10)

        # save every epoch
        torch.save({
            'epoch': epoch,
            'model_state_dict': model.state_dict(),
            'optimizer_state_dict': optimizer.state_dict(),
        }, f'model_epoch_{epoch}.pth')

if __name__ == "__main__":
    main()

总结

以上代码涵盖了从数据准备到模型训练的所有步骤。你可以根据需要调整配置文件中的参数,并运行训练脚本来开始训练Fast R-CNN模型。确保你的数据集目录结构符合预期,并且所有的文件路径都是正确的。

标签:__,训练,voc,模型,torch,train,time,self,def
From: https://blog.csdn.net/2401_86822270/article/details/144838861

相关文章

  • YOLOv8模型改进 第二十七讲 添加Cascade Multi-Receptive Fields(CMRF)模块
        近年来,轻量级医疗图像分割模型受关注,但现有模型因减少参数和计算复杂度而特征表示不足,难以超越现有最佳模型。基于多感受野的现代特征提取模块虽能提升性能,但会增加成本,不利于资源有限环境下的临床应用。在此背景下,为解决轻量级与高性能的矛盾,作者提出了CascadeM......
  • 最新的序列数据预测模型SOFTS详解
    模型背景在时间序列预测领域的发展历程中,研究者们不断探索更高效、准确的方法。传统方法如递归神经网络(RNN)和卷积神经网络(CNN)虽然取得了一定成果,但存在无法有效捕捉长期依赖性的局限性。近年来,Transformer模型因其出色的长期依赖关系捕捉能力,在时间序列预测任务中展......
  • DCGAN模型详解
    模型背景在深度学习领域迅速发展的背景下,生成对抗网络(GAN)作为一种革命性的生成模型应运而生。IanGoodfellow等人于2014年首次提出GAN概念,开创了生成模型的新纪元。这一创新源于对深度学习在图像生成方面潜力的探索,旨在解决非监督学习中的关键问题:如何让机器创造出看似真......
  • 使用Cursor + Qwen2.5 大模型 零经验研发微信小程序:自由构建个性化节拍器应用实战
    最近,小朋友开始学习小提琴,需要一个节拍器来帮助他练习。老牛同学下载了好几个节拍器应用,里面的广告实在是太多了,简直无从下手操作,就算老牛同学是慎之又慎,但还是中招,被运营商扣费。因此,老牛同学决定自己动手,定制一个专属的微信小程序节拍器。虽然老牛同学没有微信小程序的研发经验......
  • 婴儿四维影像生成AI人脸照片-大模型 Agent(智能体)实践
    婴儿四维影像生成AI人脸照片-大模型Agent(智能体)实践在当今科技飞速发展的时代,大模型Agent(智能体)作为一种创新的技术范式,正逐渐崭露头角。它依托强大的大模型能力,通过可视化设计与流程编排,以无代码或低代码的方式,为开发者提供了构建各种功能性应用程序的便捷途径。本文将......
  • 如何得到深度学习模型的参数量和计算复杂度
    1.准备好网络模型代码importtorchimporttorch.nnasnnimporttorch.optimasoptim#BP_36:输入2个节点,中间层36个节点,输出25个节点classBP_36(nn.Module):def__init__(self):super(BP_36,self).__init__()self.fc1=nn.Linear(2,36)#输......
  • 机器学习之模型评估——混淆矩阵,交叉验证与数据标准化
    目录混淆矩阵交叉验证数据标准化        0-1标准化        z标准化混淆矩阵混淆矩阵(ConfusionMatrix)是一种用于评估分类模型性能的工具。它是一个二维表格,其中行表示实际的类别,列表示模型预测的类别。假设我们有一个二分类问题(类别为正例和反例),......
  • 日常训练2025-1-3
    日常训练2025-1-3C.Saragarating:1400https://codeforces.com/problemset/problem/2045/C思路(Trick)题目说至少要将缩写拆分成2个非空子串,我们就思考一下分成两个的情况假设一个缩写由三部分组成,为:a+b+c则必须满足,a+b是S的前缀,c是T的后缀,且a是S的前缀,b+......
  • 国内AI大模型前十排行榜,最后一个你可能没听过
    根据2024年的最新数据和搜索结果,国内AI大模型的前十排行榜阿里云通义千问(Qwen2-72B):在SuperCLUE基准测试中得分最高,超过众多国内外闭源模型,引领全球的开源生态。华为盘古大模型:凭借其强大的技术能力和行业应用得到广泛认可。百度文心一言(ERNIEBot):专注于自然语言理解......
  • 我的AI工具箱Tauri版-SEOManage大模型撰写上稿网站
    本教程基于自研的AI工具箱Tauri版进行SEOManage大模型撰写上稿网站自动SEO。SEOManage网站自动SEO是一款专为网站优化和内容生产设计的AI工具,支持高效撰写关键词文章并实现自动化上稿。基于LMStudio本地大模型,SEOManage通过智能模板匹配和关键词策略生成,为用户提供从文......