目标检测YOLOV3-训练集真实标注label预处理(三)

本文介绍了YOLOV3目标检测模型中,针对训练集标注文件的预处理方法,包括调整标注信息格式,以及如何创建数据生成器以优化训练过程。还提供了部分测试代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 预处理标注文件

2. 制作数据生成器

3. 测试 


文件下载:https://download.youkuaiyun.com/download/qq_37116150/12289213

1. 预处理标注文件

首先将全局变量定义完成:

IMGSZ = 512 # 输入图片尺寸大小,必须是512x512
GRIDSZ = 16 # 网络最后输出的尺寸, 16x16
num_classes = 3 # 标签类别,共有3类,其中一类是背景,实际就两类,可根据需要修改
# YOLO的anchors的5个尺寸
ANCHORS = [0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828]

为了损失函数,需要将标注信息的格式修改,应符合网络输出的格式: [b, 16, 16, 5, (4+1+num_classes)],具体代码如下:

def process_true_boxes(gt_boxes, anchors):
    """
    计算一张图片的真实标签信息
    :param gt_boxes:
    :param anchors:
    :return:
    """
    # gt_boxes: [40,5] 一张真实标签的位置坐标信息,40是虚数,根据实际情况来定
    # 512//16=32
    # 计算网络模型从输入到输出的缩小比例
    scale = IMGSZ // GRIDSZ
    # [5,2] 将anchors转化为矩阵形式,一行代表一个anchors
    anchors = np.array(anchors).reshape((5, 2))

    # mask for object
    # 用来判断该方格位置的anchors有没有目标,每个方格有5个anchors
    detector_mask = np.zeros([GRIDSZ, GRIDSZ, 5, 1])
    # x-y-w-h-l
    # 在输出方格的尺寸上[16, 16, 5]制作真实标签, 用于和预测输出值做比较,计算损失值
    matching_gt_box = np.zeros([GRIDSZ, GRIDSZ, 5, 5])
    # [40,5] x1-y1-x2-y2-l => x-y-w-h-l
    # 制作一个numpy变量,用于存储一张图片真实标签转换格式后的数据
    # 将左上角与右下角坐标转化为中心坐标与宽高的形式
    # [x_min, y_min, x_max, y_max] => [x_center, y_center,
### 使用 LabelMe 进行标注 LabelMe 是一款灵活的图像标注工具,支持多种形状的标注方式。为了准备用于目标检测的数据集,在启动 LabelMe 后可以加载待标注图片文件夹中的所有图像[^1]。 对于每张图像,通过点击左侧工具栏的不同几何图形按钮来创建边界框或者多边形区域以包围感兴趣的对象,并为其指定类别标签。完成单幅图标的全部对象标注之后保存JSON格式的结果文件到本地磁盘上相应位置以便后续处理[^2]。 ```bash labelme --version ``` 上述命令可用于验证安装成功的版本号;如果尚未部署该软件,则需先按照官方文档说明进行环境配置与程序下载操作。 ### 数据转换至 YOLOv8-OBB 格式 YOLOv8-OBB 对于输入数据有着特定的要求。由于原始由 LabelMe 产生的 JSON 文件并不直接适用于此模型训练过程,因此需要编写脚本将这些标注信息转化为兼容的形式——通常为 TXT 文档列表,其中每一行代表一个实例及其属性(中心坐标、宽度高度以及角度等参数)。Python 脚本能够高效地实现这种转换逻辑: ```python import json from pathlib import Path def convert_labelme_to_yolo(labelme_json, output_dir): with open(labelme_json) as f: data = json.load(f) image_path = Path(data['imagePath']) txt_name = image_path.stem + '.txt' shapes = [ { 'label': shape['label'], 'points': shape['points'] } for shape in data['shapes'] ] lines = [] for obj in shapes: label_id = class_names.index(obj["label"]) # Assuming the points are already sorted and represent a rectangle. (x0, y0), (x1, y1) = obj['points'][0], obj['points'][1] cx = ((x0+x1)/2) / img_width cy = ((y0+y1)/2) / img_height w = abs(x1-x0) / img_width h = abs(y1-y0) / img_height angle = 0 # For simplicity; may need to calculate based on actual orientation. line = f"{label_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f} {angle}" lines.append(line) out_file = str(Path(output_dir).joinpath(txt_name)) with open(out_file, 'w') as f: f.write('\n'.join(lines)) for file in Path('annotations').glob('*.json'): convert_labelme_to_yolo(str(file), './labels') ``` 这段代码遍历 `annotations` 文件夹内的每一个 `.json` 文件,读取其内容并将之解析成符合 YOLOv8-OBB 输入标准的文字记录形式存储起来。注意这里假设所有的矩形都是水平排列而未考虑旋转情况下的角度计算问题[^3]。 ### 开始训练自定义数据集 准备好经过预处理后的数据集后就可以着手构建自己的检测器了。确保已经正确设置了工作目录结构,包括但不限于划分好训练集/测试集子文件夹路径,同时调整超参配置文件使之匹配当前任务需求。最后利用如下指令调用 Ultralytics 提供的一键式 API 接口来进行迭代优化直至收敛获得满意的性能指标为止[^4]。 ```bash yolo task=detect mode=train model=yolov8obb.yaml data=custom_data.yaml epochs=100 batch=16 name=my_custom_obb_project ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

然雪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值