计算机视觉中的目标检测与语义分割实践
立即解锁
发布时间: 2025-09-04 00:25:33 阅读量: 14 订阅数: 23 AIGC 


Kaggle竞赛实战指南
# 计算机视觉中的目标检测与语义分割实践
## 1. 目标检测概述
目标检测是计算机视觉和图像处理中的一项重要任务,旨在识别图像或视频中特定类别的语义对象实例。与图像分类问题不同,目标检测不仅要为图像分配类别,还需在感兴趣的对象周围绘制边界框以确定其在图像中的位置。
### 1.1 数据集选择
我们使用全球小麦检测竞赛(https://www.kaggle.com/c/global-wheat-detection)的数据,竞赛要求检测小麦穗,这一检测有助于估计不同作物品种中小麦穗的大小和密度。
### 1.2 边界框标注格式
常见的边界框标注格式有 coco、voc - pascal 和 yolo。不同格式在描述矩形坐标上存在差异。
| 格式 | 描述 |
| --- | --- |
| coco | 特定的标注格式,常用于相关竞赛和研究 |
| voc - pascal | 另一种常见的标注规范 |
| yolo | 通过在图像上放置网格来检测对象,将边界框在图像的相关单元格内进行偏移,并将 (x, y, w, h) 参数缩放到单位区间 |
### 1.3 数据处理步骤
1. **加载数据**:
```python
import pandas as pd
import numpy as np
df = pd.read_csv('../input/global-wheat-detection/train.csv')
df.head(3)
```
2. **提取边界框坐标**:
```python
bboxs = np.stack(df['bbox'].apply(lambda x: np.fromstring(x[1:-1], sep=',')))
bboxs
```
3. **转换为 Yolo 格式**:
```python
for i, column in enumerate(['x', 'y', 'w', 'h']):
df[column] = bboxs[:,i]
df.drop(columns=['bbox'], inplace=True)
df['x_center'] = df['x'] + df['w']/2
df['y_center'] = df['y'] + df['h']/2
df['classes'] = 0
df = df[['image_id','x', 'y', 'w', 'h','x_center','y_center','classes']]
df.head(3)
```
4. **创建数据集文件夹**:
```python
import os
import shutil as sh
from tqdm import tqdm
source = 'train'
fold = 0
val_index = set(df[df['fold'] == fold]['image_id'])
for name,mini in tqdm(df.groupby('image_id')):
if name in val_index:
path2save = 'valid/'
else:
path2save = 'train/'
if not os.path.exists('convertor/fold{}/labels/'.format(fold)+path2save):
os.makedirs('convertor/fold{}/labels/'.format(fold)+path2save)
with open('convertor/fold{}/labels/'.format(fold)+path2save+name+".txt", 'w+') as f:
row = mini[['classes','x_center','y_center','w','h']].astype(float).values
row = row/1024
row = row.astype(str)
for j in range(len(row)):
text = ' '.join(row[j])
f.write(text)
f.write("\n")
if not os.path.exists('convertor/fold{}/images/{}'.format(fold,path2save)):
os.makedirs('convertor/fold{}/images/{}'.format(fold,path2save))
sh.copy("../input/global-wheat-detection/{}/{}.jpg".format(source,name),
'convertor/fold{}/images/{}/{}.jpg'.format(fold,path2save,name))
```
### 1.4 安装 Yolo 包
```python
!git clone https://github.com/ultralytics/yolov5 && cd yolov5 && pip install -r requirements.txt
```
### 1.5 配置 YAML 文件
```python
yaml_text = """train: /kaggle/working/convertor/fold0/images/train/
val: /kaggle/working/convertor/fold0/images/valid/
nc: 1
names: ['wheat']"""
with open("wheat.yaml", 'w') as f:
f.write(yaml_text)
```
### 1.6 训练模型
```python
!python ./yolov5/train.py --img 512 --batch 2 --epochs 3 --workers 2 --data wheat.yaml --cfg "./yolov5/models/yolov5s.yaml" --name yolov5x_fold0 --cache
```
训练命令参数说明:
- `train.py`:用于从预训练权重开始训练 YoloV5 模型的脚本。
- `--img 512`:将原始图像重新缩放到 512x512 大小。
- `--batch`:训练过程中的批量大小。
- `--epochs 3`:训练模型的轮数。
- `--workers 2`:数据加载器中的工作线程数。
- `--data wheat.yaml`:指向数据规范 YAML 文件的路径。
- `--cfg "./yolov5/models/yolov5s.yaml"`:指定模型架构和用于初始化的权重集。
- `--name`:指定训练结果模型的存储位置。
### 1.7 模型推理与结果提交
```python
!python ./yolov5/detect.py --weights ./yolov5/runs/train/yolov5x_fold0/weights/best.pt --img 512 --conf 0.1 --source /kaggle/input/global-wheat-detection/test --save-txt --save-conf --exist-ok
```
推理参数说明:
- `--weights`:指向训练好的最佳权重文件的位置。
- `--conf 0.1`:指定保留模型生成的候选边界框的置信度阈值。
- `--source`:测试数据的位置。
转换坐标格式并生成提交文件:
```python
def convert(s):
x = int(1024 * (s[1] - s[3]/2))
y = int(1024 * (s[2] - s[4]/2))
w = int(1024 * s[3])
h = int(1024 * s[4])
return(str(s[5]) + ' ' + str(x) + ' ' + str(y) + ' ' + str(w) + ' ' + str(h))
with open('submission.csv', 'w') as myfile:
wfolder = './yolov5/runs/detect/exp/labels/'
for f in os.listdir(wfolder):
fname = wfolder + f
xdat = pd.read_csv(fname, sep = ' ', header = None)
outline = f[:-4] + ' ' + ' '.join(list(xdat.apply(lambda s: convert(s), axis = 1)))
myfile.write(outline + '\n')
myfile.close()
```
## 2. 语义分割概述
语义分割是将图像中的每个像素分类到相应的类别,这些像素组合形成感兴趣的区域,如医学图像中器官上的病变区域。与目标检测不同,目标检测是将图像的斑块分类为不同的对象类别并创建边界框。
### 2.1 数据集与工具选择
我们使用 Sartorius – Cell Instance Segmentation 竞赛(https://www.kaggle.com/c/sartorius-cell-instance-segmentation)的数据,基于 Facebook AI Research 开发的 Detectron2 库进行建模,该库支持多种检测和分割算法。
### 2.2 安装必要的包
```python
!pip install pycocotools
!pip install 'git+https://github.com/facebookresearch/detectron2.git'
```
### 2.3 数据预处理:RLE 到 COCO 格式转换
1. **RLE 解码为二进制掩码**:
```python
def rle_decode(mask_rle, shape):
s = mask_rle.split()
starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]
starts -= 1
ends = starts + lengths
img = np.zeros(shape[0]*shape[1], dtype=np.uint8)
for lo, hi in zip(starts, ends):
img[lo:hi] = 1
return img.reshape(shape)
```
2. **二进制掩码转换为 RLE**:
```python
import itertools
def binary_mask_to_rle(binary_mask):
rle = {'counts': [], 'size': list(binary_mask.shape)}
counts = rle.get('counts')
for i, (value, elements) in en
```
0
0
复制全文
相关推荐









