目录
依赖环境
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_TRAIN 和 DIR_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_