FasterRCNN入门案例水稻图像目标检测新手友好入门案例

目录

依赖环境

代码概述

引用库

读取数据指定目录

数据集划分

数据集加载Dataset类

特征增强处理

预训练模型定义

评估指标定义

实例化训练集和测试集

设置硬件调取一个batch

可视化

​编辑

激活选定硬件,初始化损失函数参数

模型训练

模型测试和验证

配套数据集和源码下载

pytorch实现FasterRCNN目标检测入门案例


依赖环境

opencv、numpy、pandas、pillow、albumentations、pytorch、torchvision、matplotlib

代码概述

引用库

import pandas as pd  # 用于数据处理和分析的库
import numpy as np  # 数值计算库,提供高效的多维数组操作
import cv2  # OpenCV库,用于进行图像处理和计算机视觉任务
import os  # 提供与操作系统交互的功能,如文件路径操作
import re  # 用于执行正则表达式,进行字符串匹配和处理

from PIL import Image  # 用于图像打开、处理和保存

import albumentations as A  # 图像增强库,用于提高模型的泛化能力
from albumentations.pytorch.transforms import ToTensorV2  # 将图像数据转换为PyTorch张量

import torch  # PyTorch基础库,提供多维数组(张量)和自动求导功能
import torchvision  # 提供图像视频处理工具,和模型训练或加载预训练模型

from torchvision.models.detection.faster_rcnn import FastRCNNPredictor  # Faster R-CNN的预测器部分
from torchvision.models.detection import FasterRCNN  # Faster R-CNN模型
from torchvision.models.detection.rpn import AnchorGenerator  # 生成锚点用于RPN(区域提议网络)

from torch.utils.data import DataLoader, Dataset  # 数据加载和批处理
from torch.utils.data.sampler import SequentialSampler  # 数据采样器,按顺序采样

from matplotlib import pyplot as plt  # 绘图库,用于数据可视化

读取数据指定目录

DIR_INPUT = '.'  # 设置基本目录为当前目录
DIR_TRAIN = f'{DIR_INPUT}/train'  # 设置训练数据集的目录
DIR_TEST = f'{DIR_INPUT}/test'  # 设置测试数据集的目录

train_df = pd.read_csv(f'{DIR_INPUT}/train.csv')  # 使用pandas加载训练数据集的CSV文件
train_df.shape  # 显示加载的DataFrame的形状(即,行数和列数)
  • DIR_INPUT - 指定了数据的基本输入目录,通常设置为项目的根目录或数据存储的目录。
  • DIR_TRAINDIR_TEST - 这两行代码分别设置了训练和测试数据集的文件路径。这有助于在代码中引用这些目录时更有条理和清晰。
  • train_df - 这行代码通过读取CSV文件加载训练数据到train_df这个DataFrame中。DataFrame是pandas库中用于存储和操作结构化数据的主要数据结构。
  • train_df.shape - 这行代码用于输出DataFrame的维度,即里面有多少行(样本)和列(特征)。这通常用来快速获取数据集的大小和结构。

这部分代码是数据预处理和初步检查的基础部分,确保数据正确加载并且可以进一步用于训练模型。如果你需要更进一步的帮助,例如数据的可视化或预处理,请继续提供相关的代码或需求。

数据集划分

# 在DataFrame中初始化四个新列,用于存储边界框的x, y坐标和宽度、高度
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

# 将'bbox'列的字符串转换为具体的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)  # 删除原始的'bbox'列
train_df['x'] = train_df['x'].astype(np.float32)  # 转换数据类型为浮点数
train_df['y'] = train_df['y'].astype(np.float32)
train_df['w'] = train_df['w'].astype(np.float32)
train_df['h'] = train_df['h'].astype(np.float32)

# 获取所有唯一的图像ID
image_ids = train_df['image_id'].unique()
valid_ids = image_ids[-665:]  # 划分最后665个ID为验证集
train_ids = image_ids[:-665]  # 剩余的为训练集

# 创建验证集和训练集的DataFrame
valid_df = train_df[train_df['image_id'].isin(valid_ids)]
train_df = train_df[train_df['image_id'].isin(train_ids)]

# 输出验证集和训练集的形状(即,行数和列数)
valid_df.shape, train_df.shape
  • 初始化列 - 首先为边界框的坐标和尺寸初始化列,设置默认值为-1。
  • expand_bbox函数 - 这个函数用于解析边界框数据,它从格式化的字符串中提取边界框的坐标和尺寸。
  • 数据类型转换 - 将提取的字符串转换为浮点数,以便于后续的数值计算。
  • 数据集划分 - 根据图像ID划分数据为训练集和验证集。这里的分割是基于图像ID的唯一性,确保同一图像的所有数据要么在训练集,要么在验证集中。

这部分代码主要负责数据预处理和训练验证集的分割,这是模型训练前的重要步骤,确保数据的正确格式和合适的分布。

数据集加载Dataset类

class WheatDataset(Dataset):
    # 初始化方法
    def __init__(self, dataframe, image_dir, transforms=None):
        super().__init__()
        self.image_ids = dataframe['image_id'].unique()  # 获取所有唯一的图像ID
        self.df = dataframe  # 数据帧
        self.image_dir = image_dir  # 图像文件的目录
        self.transforms = transforms  # 图像变换(如增强)

    # 获取单个样本
    def __getitem__(self, index: int):
        image_id = self.image_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

E寻数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值