waterman 发表于 2024-12-16 13:48

【读书】《计算机视觉之PyTorch数字图像处理》6.目标检测

# 目标检测相关概念简介

在图像处理中,目标检测与分类和分割构成了图像处理的三大任务。与图像分类和分割不同,目标检测不仅要进行分类,而且还需要估计目标在图像中的位置。

1. 感受野(Receptive Field)
感受野指卷积神经网络中,特征图中某个元素在原始图像上对应的区域。特征图中每个元素的值是由它的感受野内的像素计算得到的。感受野的大小决定了该网络能够检测的目标尺寸范围。通过增加网络层数或联合特征图中的多个相邻元素,可以扩大感受野,以适应更大目标的检测。
2. 锚框(Anchor Box)
锚框是目标检测中用于表示目标位置的矩形框。锚框有两种来源:
- 真实锚框:由人工标注,作为训练模型的目标。
- 预测锚框:模型生成的矩形框,用于目标定位。
锚框的表示方法通常包括:
    - 左上角和右下角坐标
    - 左上角坐标与宽高
    - 中心坐标与宽高
坐标表示可以采用绝对值(像素)或相对值(相对图像尺寸)。
3. 交并比(IoU,Intersection over Union)
交并比是两个矩形框重合程度的衡量指标,定义为相交面积与相并面积的比值:
- 当两个框完全重合时,IoU = 1。
- 当两个框完全分离时,IoU = 0。
- IoU 值介于 0 和 1 之间时,表示框有部分重叠,值越大表示重叠越多,值越小表示重叠越少。
IoU 常用于衡量目标检测中锚框的定位精度。

# YoLov5训练
由于YOLO系列具有检测速度快、精度也不低的优点,已经成为了最常用的目标检测模型。目前主流的YOLO模型是YOLOv5,整个模型以开源的形式发布在以下地址:https://github.com/ultralytics/yolov5。

## YOLOv5安装
1. 克隆YOLOv5项目到本地。
```bash
git clone https://github.com/ultralytics/yolov5
```
2. 下载权重文件。权重文件可以在readme页面中找到Pretrained Checkpoints,点击想要下载的模型即可进行下载。

3. 安装项目所需的第三方库。从终端进入到yolov5文件夹,输入下面的命令:
```bash
pip install -r .\requirements.txt
```


## 数据集构建

与torchvision中需要自定义数据集不同,YOLOv5将数据集的创建包含到项目本身,不需要使用者自定义数据集,只需要按照YOLOv5对数据集格式的要求整理好数据和标签,并使用配置文件记录数据集的位置和类别即可。

数据集的配置文件存放于yolov5文件夹下的data子文件夹中,并且以.yaml的格式进行存储。YAML文件是一种用于记录配置的标记语言,YOLOv5使用该格式存储数据集和模型的配置。我们以官方提供的coco和coco128数据集来学习。
coco:
```yaml
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list:
path: ../datasets/coco # dataset root dir
train: train2017.txt # train images (relative to 'path') 118287 images
val: val2017.txt # val images (relative to 'path') 5000 images
test: test-dev2017.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794

# Classes
names:
0: person
1: bicycle
```
coco128:
```yaml
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list:
path: datasets/coco128 # dataset root dir
train: images/train2017 # train images (relative to 'path') 128 images
val: images/train2017 # val images (relative to 'path') 128 images
test: # test images (optional)

# Classes
names:
0: person
1: bicycle
2: car
3: motorc
```
在上面的配置中,path参数指明了coco数据集的位置;train参数指向了包含所有图像训练样本路径的文本文件;val和test参数的含义与train参数含义相同,只是对验证集和测试集的区别;names指明了数据信中包含的所有类别的标签和对应的释义。具体目录结构如下:

在images目录下存放的是训练图片,而labels目录下存放的是与训练图片同名的txt文件,以其中一个为例:

该文件中存放了000000000659.jpg图片中的目标类别和位置。在该文件中图像中的每个目标使用一行记录,包含用空格分隔的5个数值,分别是目标的类别标签值、归一化的目标中心点x坐标、归一化的目标中心点y坐标、归一化的目标的宽度和归一化的目标的高度。

## 模型训练方式
1. 从预处理权重开始 建议用于中小型数据集。将模型名称传递给 --weights 。模型会自动下载。
```bash
python train.py --data custom.yaml --weights yolov5s.pt
                                             yolov5m.pt
                                             yolov5l.pt
                                             yolov5x.pt
                                             custom_pretrained.pt
```
2. 从零开始 建议用于大型数据集(即 COCO, 对象365, OIv6)。给出感兴趣或自定义的模型架构 YAML 以及空的 --weights '' :
```bash
python train.py --data custom.yaml --weights '' --cfg yolov5s.yaml
                                                      yolov5m.yaml
                                                      yolov5l.yaml
                                                      yolov5x.yaml
```

## 模型训练与预测

执行train.py进行模型训练,并使用coco128数据集和yolov5s预训练模型。
```bash
python train.py --data data/coco128.yaml --weights yolov5s.pt
```

模型训练完成后,执行detect.py进行预测,结果如下:
```bash
python detect.py --weights ./runs/train/exp5/weights/best.pt --source 000000000529.jpg
```

freebsder 发表于 2024-12-18 20:03

<p>这是自己训练的还是直接用的训练好的参数?</p>

waterman 发表于 2024-12-19 10:19

freebsder 发表于 2024-12-18 20:03
这是自己训练的还是直接用的训练好的参数?

<p>用预训练模型微调的</p>
页: [1]
查看完整版本: 【读书】《计算机视觉之PyTorch数字图像处理》6.目标检测