深度学习和目标检测系列教程11-300:小麦数据集训练faster-rcnn模型(代码片段)

刘润森! 刘润森!     2022-12-04     274

关键词:

@Author:Runsen

上次训练的Faster-RCNN的数据格式是xml和jpg图片提供,在很多Object-Detection中,数据有的是csv格式,

  • 数据集来源:https://www.kaggle.com/c/global-wheat-detection

width和heigth是图片的长和宽,bbox是框的位置。

我们需要在小麦植物的室外图像中检测小麦头,分类的类别只有一个。

我们来看一个牛逼人的做法:https://www.kaggle.com/pestipeti/pytorch-starter-fasterrcnn-train

这次使用torch训练Faster-RCNN和之前的没有什么不一样。

import pandas as pd
import numpy as np
import cv2
import os
import re

from PIL import Image

import albumentations as A
from albumentations.pytorch.transforms import ToTensorV2

import torch
import torchvision

from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
from torchvision.models.detection import FasterRCNN
from torchvision.models.detection.rpn import AnchorGenerator

from torch.utils.data import DataLoader, Dataset
from torch.utils.data.sampler import SequentialSampler

from matplotlib import pyplot as plt

DIR_INPUT = '/kaggle/input/global-wheat-detection'
DIR_TRAIN = f'DIR_INPUT/train'
DIR_TEST = f'DIR_INPUT/test'

train_df = pd.read_csv(f'DIR_INPUT/train.csv')

train_df['x'] = -1
train_df['y'] = -1
train_df['w'] = -1
train_df['h'] = -1

def expand_bbox(x):
    r = np.array(re.findall("([0-9]+[.]?[0-9]*)", x))
    if len(r) == 0:
        r = [-1, -1, -1, -1]
    return r
# 读取'x', 'y', 'w', 'h'
train_df[['x', 'y', 'w', 'h']] = np.stack(train_df['bbox'].apply(lambda x: expand_bbox(x)))
train_df.drop(columns=['bbox'], inplace=True)
train_df['x'] = train_df['x'].astype(np.float)
train_df['y'] = train_df['y'].astype(np.float)
train_df['w'] = train_df['w'].astype(np.float)
train_df['h'] = train_df['h'].astype(np.float)

image_ids = train_df['image_id'].unique()
valid_ids = image_ids[-665:]
train_ids = image_ids[:-665]

# Albumentations
def get_train_transform():
    return A.Compose([
        A.Flip(0.5),
        ToTensorV2(p=1.0)
    ], bbox_params='format': 'pascal_voc', 'label_fields': ['labels'])

def get_valid_transform():
    return A.Compose([
        ToTensorV2(p=1.0)
    ], bbox_params='format': 'pascal_voc', 'label_fields': ['labels'])

# load a model; pre-trained on COCO
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)

num_classes = 2  # 1 class (wheat) + background

# get number of input features for the classifier
in_features = model.roi_heads.box_predictor.cls_score.in_features

# replace the pre-trained head with a new one
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)

不同的是定义了Averager类,这一个类来保存对应的loss。

device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
images, targets, image_ids = next(iter(train_data_loader))
images = list(image.to(device) for image in images)
targets = [k: v.to(device) for k, v in t.items() for t in targets]
boxes = targets[2]['boxes'].cpu().numpy().astype(np.int32)
sample = images[2].permute(1,2,0).cpu().numpy()

fig, ax = plt.subplots(1, 1, figsize=(16, 8))

for box in boxes:
    cv2.rectangle(sample,
                  (box[0], box[1]),
                  (box[2], box[3]),
                  (220, 0, 0), 3)
    
ax.set_axis_off()
ax.imshow(sample)

在这里插入图片描述

model.to(device)
params = [p for p in model.parameters() if p.requires_grad]
optimizer = torch.optim.SGD(params, lr=0.005, momentum=0.9, weight_decay=0.0005)
# lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=3, gamma=0.1)
lr_scheduler = None

num_epochs = 2

loss_hist = Averager()
itr = 1

for epoch in range(num_epochs):
    loss_hist.reset()
    
    for images, targets, image_ids in train_data_loader:
        
        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())
        loss_value = losses.item()

        loss_hist.send(loss_value)

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

        if itr % 50 == 0:
            print(f"Iteration #itr loss: loss_value")

        itr += 1
    
    # update the learning rate
    if lr_scheduler is not None:
        lr_scheduler.step()

    print(f"Epoch #epoch loss: loss_hist.value")   

images, targets, image_ids = next(iter(valid_data_loader))
images = list(img.to(device) for img in images)
targets = [k: v.to(device) for k, v in t.items() for t in targets]
boxes = targets[1]['boxes'].cpu().numpy().astype(np.int32)
sample = images[1].permute(1,2,0).cpu().numpy()
model.eval()
cpu_device = torch.device("cpu")

outputs = model(images)
outputs = [k: v.to(cpu_device) for k, v in t.items() for t in outputs]
fig, ax = plt.subplots(1, 1, figsize=(16, 8))

for box in boxes:
    cv2.rectangle(sample,
                  (box[0], box[1]),
                  (box[2], box[3]),
                  (220, 0, 0), 3)
    
ax.set_axis_off()
ax.imshow(sample)
torch.save(model.state_dict(), 'fasterrcnn_resnet50_fpn.pth')

这个代码真的值得学习和模仿:
https://www.kaggle.com/pestipeti/pytorch-starter-fasterrcnn-train

深度学习和目标检测系列教程17-300:3个类别面罩检测类别数据集训练yolov5s模型(代码片段)

@Author:RunsenYOLO是目前最火爆的的计算机视觉算法之一,今天使用的数据集来源:https://www.kaggle.com/andrewmvd/face-mask-detection这是数据集可以创建一个模型来检测戴口罩、不戴口罩或不正确戴口罩的人。该数据集包含... 查看详情

深度学习和目标检测系列教程17-300:3个类别面罩检测类别数据集训练yolov5s模型(代码片段)

@Author:RunsenYOLO是目前最火爆的的计算机视觉算法之一,今天使用的数据集来源:https://www.kaggle.com/andrewmvd/face-mask-detection这是数据集可以创建一个模型来检测戴口罩、不戴口罩或不正确戴口罩的人。该数据集包含... 查看详情

深度学习和目标检测系列教程10-300:通过torch训练第一个faster-rcnn模型(代码片段)

@Author:Runsen上次介绍了Faster-RCNN模型,那么今天就开始训练第一个Faster-RCNN模型。本文将展示如何在水果图像数据集上使用Faster-RCNN模型。代码的灵感来自此处的Pytorch文档教程和Kagglehttps://pytorch.org/tutorials/intermediate/torc... 查看详情

深度学习和目标检测系列教程19-300:关于目标检测apiou和map简介(代码片段)

@Author:RunsenR-CNN和YOLO等对象检测模型,使用了平均精度(mAP)。mAP将真实边界框与检测到的框进行比较并返回分数。分数越高,模型的检测就越准确。PrecisionandRecall现在有两个类,Positive和Negative,这里是10个... 查看详情

深度学习和目标检测系列教程19-300:关于目标检测apiou和map简介(代码片段)

@Author:RunsenR-CNN和YOLO等对象检测模型,使用了平均精度(mAP)。mAP将真实边界框与检测到的框进行比较并返回分数。分数越高,模型的检测就越准确。PrecisionandRecall现在有两个类,Positive和Negative,这里是10个... 查看详情

深度学习和目标检测系列教程13-300:yolo物体检测算法(代码片段)

@Author:RunsenYOLO,是目前速度更快的物体检测算法之一。虽然它不再是最准确的物体检测算法,但当您需要实时检测时,它是一个非常好的选择,而不会损失太多的准确性。YOLO框架在本篇博客中,我将... 查看详情

深度学习和目标检测系列教程21-300:deepsorts测试小车经过的时间和速度(代码片段)

@Author:RunsendeepDeepSortDeepSort是一种用于跟踪目标的模型,为每个目标分配ID,为每一个不同的类别分配label。在DeepSort中,过程如下。使用YOLO计算边界框(检测)使用Sort(卡尔曼滤波器)和ReID... 查看详情

12大类150个图像处理和深度学习开源数据集

12大类150个图像处理和深度学习开源数据集本文整理了150个深度学习和图像处理领域的开源数据集,包括:目标检测、人脸识别、文本识别、图像分类、缺陷检测、医学影像、图像分割、图像去雾、关键点检测、动作识别... 查看详情

12大类150个图像处理和深度学习开源数据集

12大类150个图像处理和深度学习开源数据集本文整理了150个深度学习和图像处理领域的开源数据集,包括:目标检测、人脸识别、文本识别、图像分类、缺陷检测、医学影像、图像分割、图像去雾、关键点检测、动作识别... 查看详情

12大类150个图像处理和深度学习开源数据集

12大类150个图像处理和深度学习开源数据集本文整理了150个深度学习和图像处理领域的开源数据集,包括:目标检测、人脸识别、文本识别、图像分类、缺陷检测、医学影像、图像分割、图像去雾、关键点检测、动作识别... 查看详情

深度学习和目标检测系列教程23-300:fasterrcnn和yolov5训练飞机目标识别的小项目(代码片段)

@Author:RunsenFasterRCNN和yolov5训练飞机目标识别的项目目标检测算法主要包括:两类two-stage和one-stage一类是two-stage,two-stage检测算法将检测问题划分为两个阶段,首先产生候选区域(regionproposals),然... 查看详情

深度学习和目标检测系列教程18-300:关于yolovoc格式标签转化问题(代码片段)

@Author:RunsenPASCALVOC(ThePASCALVisualObjectClasses)是一个世界级的计算机视觉挑战赛,第一届比赛在2005年举办,随后一年举办一次,直到2012年最后一次。PASCAL的全称是PatternAnalysis,StatisticalmodellingandComputAtionalLe 查看详情

深度学习和目标检测系列教程14-300:训练第一个yolov3检测器(代码片段)

@Author:Runsen本次博客参考GIthub项目:https://github.com/qqwweee/keras-yolo3.git在开始之前,请在以下位置克隆!gitclonehttps://github.com/qqwweee/keras-yolo3.git到您的本地机器。确保设置虚拟环境并安装要求Keras2.1.5Tensorfl 查看详情

深度学习和目标检测系列教程22-300:关于人体姿态常见的估计方法(代码片段)

@Author:Runsen姿态估计是计算机视觉中的一项流行任务,比如真实的场景如何进行人体跌倒检测,如何对手语进行交流。作为人工智能(AI)的一个领域,计算机视觉使机器能够以模仿人类视觉为目的来... 查看详情

深度学习100例|第51天-目标检测算法(yolov5)

大家好,我是『K同学啊』!拖了好久,终于要开始目标检测系列了。自己想过好几次,想尽快出几期目标检测算法的博客教程,但是一直苦于不知道如何写,才能让大家轻松、快速、高效的入门目标检测算法。这段时间终于有... 查看详情

如何快速入门深度学习目标检测?

学习目标了解目标检测的任务知道目标检测的常用数据集知道目标检测算法的评价指标掌握非极大值NMS算法的应用了解常用的目标检测算法分类1.目标检测目标检测(ObjectDetection)的任务是找出图像中所有感兴趣的目标,并确定... 查看详情

深度学习和目标检测系列教程12-300:常见的opencv的api和用法总结(上)(代码片段)

@Author:Runsen由于CV需要熟练使用opencv,因此总结了opencv常见的APi和用法。OpenCV(opensourcecomputervision)于1999年正式推出,它来自英特尔的一项倡议。OpenCV的核心是用C++编写的。在Python中,我们只使... 查看详情

深度学习目标检测---使用yolov5训练自己的数据集模型(windows系统)(代码片段)

...v5代码1.1yolov5网络project克隆1.2项目代码结构的整体介绍1.3深度学习环境的配置和安装yolov5所需要的库2、数据集和预训练权重的准备2.1利用labelimg对数据进行标注和划分2.2下载预训练权重 3、训练自己的模型3.1修改一些文件配置3.2... 查看详情