目标检测基础与R-CNN实现
立即解锁
发布时间: 2025-09-01 01:19:29 阅读量: 4 订阅数: 17 AIGC 

### 目标检测基础与R-CNN实现
在目标检测领域,我们不仅要得到图像中每个物体周围的边界框以及边界框内物体对应的类别,还需要量化模型预测的准确性。同时,训练基于R-CNN的自定义目标检测器也是重要的任务。下面将详细介绍相关内容。
#### 1. 平均精度均值(mAP)
在评估模型预测的准确性时,mAP起到了关键作用。在理解mAP之前,我们需要先了解精度(Precision)和平均精度(Average precision)。
- **精度(Precision)**:通常计算方式为:$Precision = \frac{True\ Positives}{True\ Positives + False\ Positives}$。真正例(True positive)指的是预测出物体正确类别且与真实标注的交并比(IoU)大于某个阈值的边界框;假正例(False positive)则是预测类别错误或者与真实标注的重叠度小于定义阈值的边界框。若针对同一个真实标注的边界框识别出多个边界框,只有一个能作为真正例,其余均为假正例。
- **平均精度(Average precision)**:是在不同IoU阈值下计算得到的精度值的平均值。
- **平均精度均值(mAP)**:是在数据集内所有物体类别上,不同IoU阈值下计算得到的精度值的平均值。
#### 2. 基于R-CNN的自定义目标检测器训练
R-CNN即基于区域的卷积神经网络,其中“基于区域”指的是用于识别图像中物体的区域建议。R-CNN有助于识别图像中存在的物体及其位置。
##### 2.1 R-CNN的工作细节
使用R-CNN技术进行目标检测时,需执行以下步骤:
```mermaid
graph LR
A[从图像中提取区域建议] --> B[调整所有提取区域的大小]
B --> C[将调整大小后的区域建议通过网络]
C --> D[创建模型训练数据]
D --> E[连接两个输出头]
E --> F[编写自定义损失函数并训练模型]
```
1. **提取区域建议**:从图像中提取区域建议,要确保提取大量建议,以免遗漏图像中的潜在物体。
2. **调整区域大小**:将所有提取的区域调整为相同大小。
3. **通过网络提取特征**:将调整大小后的区域建议通过预训练模型(如VGG16或ResNet50),并在全连接层中提取特征。
4. **创建训练数据**:输入是通过预训练模型提取的区域建议特征,输出是每个区域建议对应的类别以及该区域建议相对于图像真实标注的偏移量。若区域建议与物体的IoU大于特定阈值,则创建训练数据。
5. **连接输出头**:连接两个输出头,一个对应图像类别,另一个对应区域建议与真实标注边界框的偏移量,以提取物体的精确边界框。
6. **训练模型**:编写自定义损失函数,最小化物体分类误差和边界框偏移误差,然后训练模型。
#### 3. 在自定义数据集上实现R-CNN进行目标检测
要在自定义数据集上实现R-CNN进行目标检测,需按以下步骤创建训练数据:
1. **下载数据集**:从Google Open Images v6数据集(https://storage.googleapis.com/openimages/v5/test-annotations-bbox.csv)下载数据,但在代码中仅处理公交车或卡车的图像。
```python
%pip install -q --upgrade selectivesearch torch_snippets
from torch_snippets import *
import selectivesearch
from google.colab import files
files.upload() # upload kaggle.json file
!mkdir -p ~/.kaggle
!mv kaggle.json ~/.kaggle/
!ls ~/.kaggle
!chmod 600 /root/.kaggle/kaggle.json
!kaggle datasets download -d sixhky/open-images-bus-trucks/
!unzip -qq open-images-bus-trucks.zip
from torchvision import transforms, models, datasets
from torch_snippets import Report
from torchvision.ops import nms
device = 'cuda' if torch.cuda.is_available() else 'cpu'
```
2. **准备数据集**:
- 提取每个图像及其对应的类别和边界框值。
- 提取每个图像内的区域建议、对应的IoU以及区域建议相对于真实标注的校正量。
- 为每个类别分配数字标签(除公交车和卡车类别外,还有背景类别,当与真实标注边界框的IoU低于阈值时为背景类别)。
- 将每个区域建议调整为相同大小,以便传入网络。
```python
IMAGE_ROOT = 'images/images'
DF_RAW = pd.read_csv('df.csv')
print(DF_RAW.head())
class OpenImages(Dataset):
def __init__(self, df, image_folder=IMAGE_ROOT):
self.root = image_folder
self.df = df
self.unique_images = df['ImageID'].unique()
def __len__(self): return len(self.unique_images)
def __getitem__(self, ix):
image_id = self.unique_images[ix]
image_path = f'{self.root}/{image_id}.jpg'
# Convert BGR to RGB
image = cv2.imread(image_path, 1)[...,::-1]
h, w, _ = image.shape
df = self.df.copy()
df = df[df['ImageID'] == image_id]
boxes = df['XMin,YMin,XMax,YMax'.split(',')].values
boxes = (boxes*np.array([w,h,w,h])).astype(np.uint16).tolist()
classes = df['LabelName'].values.tolist()
return image, boxes, classes, image_path
ds = OpenImages(df=DF_RAW)
im, bbs, clss, _ = ds[9]
show(im, bbs=bbs, texts=clss, sz=10)
def extract_candidates(img):
img_lbl,regions = selectivesearch.selective_search(img,
scale=200
```
0
0
复制全文
相关推荐









