学习对象分类与定位
立即解锁
发布时间: 2025-09-13 01:58:21 阅读量: 1 订阅数: 17 AIGC 

# 学习对象分类与定位
## 1. 准备工作
我们将使用与之前相同的预训练分类器网络 MobileNetV2,但这次用于对象定位而非分类。以下是导入所需模块和基础模型的代码:
```python
import tensorflow.keras as K
from data import ds
base_model = K.applications.MobileNetV2(
input_shape=(224, 224, 3), include_top=False)
```
这里,我们不冻结基础模型的层。
## 2. 准备定位器模型
### 2.1 思路
基础模型的输出张量形状为 `(None, 7, 7, 1280)`,代表卷积网络提取的特征,我们假设空间信息编码在 `(7, 7)` 的空间索引中。我们将使用几个卷积层降低特征图的维度,并创建一个回归器来预测数据集中宠物头部边界框的角坐标。
### 2.2 卷积层选项
```python
conv_opts = dict(
activation='relu',
padding='same',
kernel_regularizer="l2")
```
- **激活函数**:使用 ReLU 函数,当输入小于 0 时输出为 0,大于等于 0 时输出等于输入。
- **填充方式**:`padding='same'` 表示卷积操作不会减小特征图的大小,会用零填充特征图。
- **正则化**:使用 `l2` 核正则化,通过在损失函数中添加项来正则化卷积核权重的欧几里得范数。
### 2.3 定义卷积层
#### 第一个卷积层
```python
x = K.layers.Conv2D(256, (1, 1), **conv_opts)(base_model.output)
```
- 第一个参数 256 是输出通道数,也是卷积滤波器的数量。
- 第二个参数 `(1, 1)` 描述卷积滤波器的大小。虽然单像素卷积核不能编码特征图的上下文信息,但这里用于将输入特征图的深度从 1280 降低到 256。
#### 第二个卷积层
```python
x = K.layers.Conv2D(256, (3, 3), strides=2, **conv_opts)(x)
```
- `strides=2` 表示卷积滤波器每次移动 2 个像素,用于在不丢失空间信息的情况下减小激活图的大小。
### 2.4 其他减小激活图大小的操作
除了使用 `strides`,还可以使用最大池化操作。最大池化操作在现代卷积网络中广泛使用,它在一个小窗口(如 `2 x 2`)中选取最大值,然后按指定像素移动(如 2),重复此过程以减小激活图的大小。与使用 `strides` 相比,最大池化操作更适合对空间信息不太感兴趣的任务,如分类任务。
### 2.5 连接全连接层
```python
out = K.layers.Flatten()(x)
out = K.layers.Dense(4, activation="sigmoid")(out)
```
将卷积层连接到一个包含 4 个神经元的全连接层,用于回归边界框的两个角坐标。由于边界框坐标是归一化的,使用 sigmoid 函数作为激活函数,其输出范围在 `(0, 1)` 之间。
### 2.6
0
0
复制全文
相关推荐









