目录

小土堆目标检测笔记

小土堆目标检测笔记

1 什么是目标检测

希望计算机在视频或图像中定位并识别我们感兴趣的目标
定位:找到目标在图像中的位置。
https://i-blog.csdnimg.cn/direct/51cd1d9910594d9a9332695c55070d19.png

2 目标检测常见的数据集

2.1 目标检测数据集

数据集涉及到输入和输出
输入:图片
输出:带有目标的标注
https://i-blog.csdnimg.cn/direct/7fc34fe395674674bd1c6c576b4aa575.png

imagej工具下载链接

https://i-blog.csdnimg.cn/direct/c66f4d1c850f437c975e2e3d60847124.png

2.2 目标检测数据集的标注

YOLO格式的标注,会将x_yolo,y_yolo,width_yolo,hight_yolo进行一个归一化的处理,将范围控制在[0,1],(Xcenter/ImageWidth,Ycenter/ImageHight,Width/ImageWidth,Hight/ImageHight)
https://i-blog.csdnimg.cn/direct/a20bc9e2e2764038a0c2abc69622ddea.png
YOLO标注例子
https://i-blog.csdnimg.cn/direct/b4b1f42e60d8422684b9bdd306b7b8c5.png
YOLO格式<class_id,x_yolo,y_yolo,width_yolo,hight_yolo>
0 0.5 0.54 0.406 0.5135
https://i-blog.csdnimg.cn/direct/af28eee9fafa4aa991a578236b42467d.png

2.3 目标检测工具介绍

labellmg标注工具的使用
采集自己的数据集
明确任务–检测没有不带头盔的驾驶员,并检测出摩托车车牌
抽象出感兴趣的目标,摩托车

  1. 不带头盔的人 class id 0 no helmet
  2. 摩托车 class id 1 motor
  3. 摩托车车牌 class id 2 number
  4. 带头盔的人 class id 3 with helmet

标注工具,从up网盘下载
Labellmg
修改一下自己所需要的标签
https://i-blog.csdnimg.cn/direct/71b9eed931ed4b2ca9425565e2c09139.png
Open Dir打开目录,Change Save Dir切换保存后的标注路径,通过create框出感兴趣目标,切换YOLO(txt)/VOC(xml)标注格式
https://i-blog.csdnimg.cn/direct/0a524c5f6edf4a8b9ba1d4601e77298c.png
labelstudio工具的使用
在python的虚拟环境中安装labelstudio

pip install -U label-studio

https://i-blog.csdnimg.cn/direct/c536e09604f843a4a144f89ca71813b3.png

启动labelstudio

label-studio

https://i-blog.csdnimg.cn/direct/3e2f85f250d74a0eaac4762a64c166b5.png
https://i-blog.csdnimg.cn/direct/bfa65f7f42b24a55abbaff3a7d45abf3.png
通过导入的形式将未标定的数据集导入到labelstudio中,设置标签的类别进行标注
https://i-blog.csdnimg.cn/direct/28273b5ee05f4a0eb2706db20ebd6ed2.png
标注完成后的导出格式
https://i-blog.csdnimg.cn/direct/3b0a808a85b34c77b9ffd51e3ae84264.png
本地的挂载和网盘的挂载适合大批量的数据集
设置-Cloud Storage-Add Source Storage
Absolute local path路径要和虚拟环境放在一个盘里
https://i-blog.csdnimg.cn/direct/ba09eb05f0cc4ca586bc2ac76dfe86b1.png
设置环境变量
LOCAL_FILES_SERVING_ENABLED=True
https://i-blog.csdnimg.cn/direct/65b9f06d65564611841f7baa1fa87db1.png
重新启动继续导入,点击Sync Storage同步数据
https://i-blog.csdnimg.cn/direct/1fec2730084c4523919825520125908f.png
添加标签
https://i-blog.csdnimg.cn/direct/f771d80e6e0a4224a3236e07407e929c.png

3 数据集的标注

3.1 VOC数据集标注

使用labelimg工具标注,首先修改预定义的类别文件为所需要标注的类别
https://i-blog.csdnimg.cn/direct/aaf8dc57f47b4c6c9a3d4855eca5d230.png
目录结构train为训练集,val为验证集,images为图片,labels为标注信息
https://i-blog.csdnimg.cn/direct/8ecd19eaa6a240f2bfff82a385d0707b.png
标注的labels信息
https://i-blog.csdnimg.cn/direct/dc394530547d4873bc20227534099e85.png
训练集和验证集,全部标注完成

3.2 加载数据集

编写自己数据集

import os

import torch
import xmltodict  # 用于将XML数据转换为Python字典
from PIL import Image  # Python图像处理库
from torch.utils.data import Dataset  # PyTorch数据集基类
from torchvision import transforms  # 图像预处理工具


class VOCDataset(Dataset):
    # VOC数据集初始化
    def __init__(self, image_dir, label_dir, transform, label_transform):
        """
        初始化VOC格式数据集
        Args:
            image_dir: 图像文件目录路径
            label_dir: 标签文件目录路径
            transform: 图像预处理变换
            label_transform: 标签预处理变换(代码中未实际使用)
        """
        self.image_dir = image_dir
        self.label_dir = label_dir
        self.transform = transform
        self.label_transform = label_transform
        self.imgs = os.listdir(self.image_dir)  # 获取图像目录下所有文件名
        # 定义类别列表
        self.classes_list = ["no helmet", "motor", "number", "with helmet"]

    # 返回数据集大小
    def __len__(self):
        """返回数据集中的图像数量"""
        return len(self.imgs)

    # 获取单个数据项
    def __getitem__(self, index):
        """获取索引对应的数据项"""
        # 获取图像文件名并构建完整路径
        img_name = self.imgs[index]
        img_path = os.path.join(self.image_dir, img_name)
        image = Image.open(img_path).convert('RGB')  # 打开图像并转换为RGB格式
        # 构建对应的XML标签文件路径(将图像扩展名替换为.xml)
        label_name = img_name.split('.')[0] + '.xml'
        label_path = os.path.join(self.label_dir, label_name)
        # 解析XML标签文件
        with open(label_path, "r", encoding="utf-8") as f:
            label_content = f.read()
        label_dict = xmltodict.parse(label_content)  # 将XML转换为字典
        # 提取标注信息
        objects = label_dict["annotation"]["object"]
        target = []  # 存储所有目标的标注信息
        # 遍历每个标注对象
        for obj in objects:
            obj_name = obj["name"]  # 获取对象类别名称
            obj_class_id = self.classes_list.index(obj_name)  # 将类别名称转换为索引ID
            # 提取边界框坐标(注意转换为浮点数)
            xmin = float(obj["bndbox"]["xmin"])
            ymin = float(obj["bndbox"]["ymin"])
            xmax = float(obj["bndbox"]["xmax"])
            ymax = float(obj["bndbox"]["ymax"])
            # 将当前目标的标注信息添加到列表
            target.extend([obj_class_id, xmin, ymin, xmax, ymax])
        # 将标注列表转换为张量
        target = torch.tensor(target)
        # 应用图像预处理变换
        if self.transform is not None:
            image = self.transform(image)
        return image, target  # 返回处理后的图像和标注张量


if __name__ == '__main__':
    image_dir = r'E:\deeplearning\torch\data\HelmetDataset-VOC\train\images'
    label_dir = r'E:\deeplearning\torch\data\HelmetDataset-VOC\train\labels'
    # 创建数据集实例
    train_dataset = VOCDataset(image_dir, label_dir, transforms.Compose([transforms.ToTensor()]), None)
    print(len(train_dataset))  # 打印数据集大小
    print(train_dataset[1])