Skip to content

目标检测

🕒 Published at:

什么是目标检测

  • 感兴趣的目标
  • 定位
  • 识别

目标检测数据集

  • 输入
  • 输出:带有目标的标注
衡量数据集的好坏:
  • 数据集内容的数量
  • 数据集能充分反应实际场景
  • 标注数据集的质量

VOC数据集目录结构

tree
-VOCdevkit
   |-VOC2007
       |-Annotations(所有对应的图片的标注,xml文件⭐)
       |-ImageSets
       |-JPENGImages(存放图片⭐)
       |-SementationClass(图像分割,同一种类别用相同颜色进行标注)
       |-SementationObject(图像分割,每个物体用不同颜色标注)
xml
<segmented>0</segmented>

表示该图片没有进行分割

xml
<object>
    <name>cat</name>
    <pose>Right</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
        <xmin>231</xmin>
        <ymin>88</ymin>
        <xmax>483</xmax>
        <ymax>256</ymax>
    </bndbox>
</object>
  • pose标签是拍摄角度,truncated是判断这张图片有没有被完整标注,0表示被完整标注,difficult是0表示是确定这个目标类别不困难
  • bndbox标签⭐
  • 标注:x从左往右越来越大,y从上到下越来越大,标注的是左上角和右下角

CoCo数据集

  • 训练数据集,验证数据集,测试数据集
  • 主要是2014 2017
|-annotations_trainval2017
    |-annotayions
        |-captions_train2017.json(看图说话)
        |-captions_val2017.json
        |-instance_train2017.json(目标检测的标注)⭐
        |-instance_val2017.json
        |-person_keypoint_train2017.json(对人体关键节点的标注)
        |-person_keypoint_val2017.json
|-train2017(训练的图片)
|-val2017(验证的图片)
instance_train2017.json
|-info
|-licenses
|-image(文件名⭐、地址、宽高、时间、id⭐)
|-annotation
   |-segmentation(图像分割)
   |-area
   |-iscrowd
   |-image_id⭐
   |-bbox(框选的坐标)⭐
   |-category_id
   |-id(唯一标识)
|-categories
  • 如果我们想找到00003895.jpg的所有标注,那么我们需要找出标注信息中image_id=3895的所有标注
  • bbox中的数字分别代表 xmin,ymin,width,height

YOLO

  • yolo做了归一化,关注的是中心点

标注自己的数据集

  • 采集自己的数据集
  • 明确任务 检测不带头盔的摩托车驾驶员,并检测摸通常车牌号
  • 感兴趣的目标:不带头盔(class_id = 0)、摩托车(class_id = 1)、车牌号(class_id =2)

class.txt

no helmet
motor
number(摩托车车牌)
...

Labelme演示

目录:

|-自定义数据集
    |-train
        |—imges
        |-labels
    |-val
    |-classes
  • 输出是json格式,Labelme2YOLO可以转换

加载数据集

https://docs.pytorch.org/tutorials/beginner/basics/data_tutorial.html 加载VOC格式的数据:

import os
from PIL import Image
import xmltodict
import torch
from torch.utils.data import Dataset


class VOCDataset(Dataset):
    def __init__(self,image_folder,label_folder,transform,label_transform):
        self.image_folder = image_folder
        self.label_folder = label_folder
        self.transform = transform
        self.label_transform = label_transform
        self.img_names = os.listdir(self.image_folder)
        self.class_list = ["no helmet","motor","number","with helmet"]

    def __len__(self):
        return len(self.img_names)

    def __getitem__(self, index):
        img_name = self.img_names[index]
        img_path = os.path.join(self.image_folder,img_name)
        image = Image.open(img_path).convert("RGB")
        label_name = img_name.split(".")[0] + ".xml"
        label_path = os.path.join(self.label_folder,label_name)
        with open(label_path,"r",encoding="utf-8") as f:
            label_content = f.read()
        label_dict = xmltodict.parse(label_content)
        objects = label_dict["annotation"]["object"]
        target = []
        for object in objects:
            object_name = object["name"]
            object_class_id = self.class_list.index(object_name)
            object_xmax = float(["bndbox"]["xmax"])
            object_ymax = float(["bndbox"]["ymax"])
            object_xmin = float(["bndbox"]["xmin"])
            object_ymin = float(["bndbox"]["ymin"])
            target.extend([object_class_id,object_xmax,object_ymax,object_xmin,object_ymin])
        target = torch.tensor(target)
        if self.transform is not None:
            image = self.transform(image)
        return image,target

用yolov8训练自己的安全帽模型

  • 首先下载数据集,自己做的话太麻烦了,直接下载了yolo格式的,直接就能用
  • 然后写yaml文件,例如:
train: C:\Users\Li\Downloads\archive\css-data\train\images\

val: C:\Users\Li\Downloads\archive\css-data\valid\images\
 
test: C:\Users\Li\Downloads\archive\css-data\test\images\

nc: 10

names: [Hardhat,Mask,NO-Hardhat,No-Mask,No-Safety Vest,Person,Safety Cone,SafetyVest,machinery,vehicle]
  • 然后创建一个虚拟的干净python环境,下载Ultralytics,编写train.py文件,例如
from ultralytics import YOLO

model = YOLO('yolov8n.pt')

model.train(data='safehat.yaml',epochs=100)

model.val()
  • 最后进入虚拟环境,运行python train.py文件,开始训练