Skip to content

Commit

Permalink
[polish] chapter 6,7,13 peer review (#1030)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaotinghe authored Dec 6, 2021
1 parent 3016db9 commit b2db840
Show file tree
Hide file tree
Showing 23 changed files with 208 additions and 215 deletions.
102 changes: 51 additions & 51 deletions chapter_computer-vision/anchor.md

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions chapter_computer-vision/bounding-box.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
在前面的章节(例如 :numref:`sec_alexnet`— :numref:`sec_googlenet`)中,我们介绍了各种图像分类模型。
在图像分类任务中,我们假设图像中只有一个主要物体对象,我们只关注如何识别其类别。
然而,很多时候图像里有多个我们感兴趣的目标,我们不仅想知道它们的类别,还想得到它们在图像中的具体位置。
在计算机视觉里,我们将这类任务称为*目标检测*(object detection)或*对象识别*(object recognition)。
在计算机视觉里,我们将这类任务称为*目标检测*(object detection)或*目标识别*(object recognition)。

目标检测在多个领域中被广泛使用。
例如,在无人驾驶里,我们需要通过识别拍摄到的视频图像里的车辆、行人、道路和障碍的位置来规划行进线路
例如,在无人驾驶里,我们需要通过识别拍摄到的视频图像里的车辆、行人、道路和障碍物的位置来规划行进线路
机器人也常通过该任务来检测感兴趣的目标。安防领域则需要检测异常目标,如歹徒或者炸弹。

在接下来的几节中,我们将介绍几种用于目标检测的深度学习方法。
我们将首先介绍对象的*位置*
我们将首先介绍目标的*位置*

```{.python .input}
%matplotlib inline
Expand Down Expand Up @@ -54,10 +54,10 @@ d2l.plt.imshow(img);
## 边界框

在目标检测中,我们通常使用*边界框*(bounding box)来描述对象的空间位置。
边界框是矩形的,由矩形左上角的$x$和$y$坐标以及右下角的坐标决定
边界框是矩形的,由矩形左上角的以及右下角的$x$和$y$坐标决定
另一种常用的边界框表示方法是边界框中心的$(x, y)$轴坐标以及框的宽度和高度。

在这里,我们[**定义在这两种表示之间进行转换的函数**]`box_corner_to_center`从两角表示转换为中心宽度表示,而`box_center_to_corner`反之亦然。
在这里,我们[**定义在这两种表示法之间进行转换的函数**]`box_corner_to_center`从两角表示法转换为中心宽度表示法,而`box_center_to_corner`反之亦然。
输入参数`boxes`可以是长度为4的张量,也可以是形状为($n$,4)的二维张量,其中$n$是边界框的数量。

```{.python .input}
Expand Down Expand Up @@ -86,15 +86,15 @@ def box_center_to_corner(boxes):
```

我们将根据坐标信息[**定义图像中狗和猫的边界框**]
图像中坐标的原点是图像的左上角,右侧和向下分别是$x$$y$轴的正方向。
图像中坐标的原点是图像的左上角,向右的方向为$x$轴的正方向,向下的方向为$y$轴的正方向。

```{.python .input}
#@tab all
# bbox是边界框的英文缩写
dog_bbox, cat_bbox = [60.0, 45.0, 378.0, 516.0], [400.0, 112.0, 655.0, 493.0]
```

我们可以通过转换两次来验证两个边界框转换函数的正确性
我们可以通过转换两次来验证边界框转换函数的正确性

```{.python .input}
#@tab all
Expand Down Expand Up @@ -133,7 +133,7 @@ fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'));

## 练习

1. 找到另一张图像,然后尝试标记包含该对象的边界框。比较标签边界框和类别:哪些通常需要更长时间
1. 找到另一张图像,然后尝试标记包含该对象的边界框。比较标注边界框和标注类别哪个需要更长的时间
1. 为什么`box_corner_to_center``box_center_to_corner`的输入参数的最内层维度总是4?

:begin_tab:`mxnet`
Expand Down
24 changes: 12 additions & 12 deletions chapter_computer-vision/fcn.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# 全卷积网络
:label:`sec_fcn`

如 :numref:`sec_semantic_segmentation`中所介绍的那样,语义分割能对图像中的每个像素分类
如 :numref:`sec_semantic_segmentation`中所介绍的那样,语义分割是对图像中的每个像素分类
*全卷积网络*(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换 :cite:`Long.Shelhamer.Darrell.2015`
与我们之前在图像分类或目标检测部分介绍的卷积神经网络不同,全卷积网络将中间层特征图的高和宽变换回输入图像的尺寸:这是通过 :numref:`sec_transposed_conv`中引入的*转置卷积*(transposed convolution)实现的。
因此,输出的类别预测与输入图像在像素级别上具有一一对应关系:给定空间维上的位置,通道维的输出即该位置对应像素的类别预测。
与我们之前在图像分类或目标检测部分介绍的卷积神经网络不同,全卷积网络将中间层特征图的高和宽变换回输入图像的尺寸:这是通过在 :numref:`sec_transposed_conv`中引入的*转置卷积*(transposed convolution)实现的。
因此,输出的类别预测与输入图像在像素级别上具有一一对应关系:通道维的输出即该位置对应像素的类别预测。

```{.python .input}
%matplotlib inline
Expand All @@ -29,13 +29,13 @@ from torch.nn import functional as F

下面我们了解一下全卷积网络模型最基本的设计。
如 :numref:`fig_fcn`所示,全卷积网络先使用卷积神经网络抽取图像特征,然后通过$1\times 1$卷积层将通道数变换为类别个数,最后在 :numref:`sec_transposed_conv`中通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。
因此,模型输出与输入图像的高和宽相同,且最终输出的通道包含了该空间位置像素的类别预测
因此,模型输出与输入图像的高和宽相同,且最终输出通道包含了该空间位置像素的类别预测

![全卷积网络](../img/fcn.svg)
:label:`fig_fcn`

下面,我们[**使用在ImageNet数据集上预训练的ResNet-18模型来提取图像特征**]并将该网络实例记为`pretrained_net`
该模型的最后几层包括全局平均汇聚层和全连接层,然而全卷积网络中不需要它们。
下面,我们[**使用在ImageNet数据集上预训练的ResNet-18模型来提取图像特征**]并将该网络记为`pretrained_net`
ResNet-18模型的最后几层包括全局平均汇聚层和全连接层,然而全卷积网络中不需要它们。

```{.python .input}
pretrained_net = gluon.model_zoo.vision.resnet18_v2(pretrained=True)
Expand All @@ -48,8 +48,8 @@ pretrained_net = torchvision.models.resnet18(pretrained=True)
list(pretrained_net.children())[-3:]
```

接下来,我们[**创建一个全卷积网络实例`net`**]
它复制了Resnet-18中大部分的预训练层,但除去最终的全局平均汇聚层和最接近输出的全连接层
接下来,我们[**创建一个全卷积网络`net`**]
它复制了ResNet-18中大部分的预训练层,除了最后的全局平均汇聚层和最接近输出的全连接层

```{.python .input}
net = nn.HybridSequential()
Expand All @@ -62,7 +62,7 @@ for layer in pretrained_net.features[:-2]:
net = nn.Sequential(*list(pretrained_net.children())[:-2])
```

给定高度和宽度分别为320和480的输入`net`的前向传播将输入的高和宽减小至原来的$1/32$,即10和15。
给定高度为320和宽度为480的输入`net`的前向传播将输入的高和宽减小至原来的$1/32$,即10和15。

```{.python .input}
X = np.random.uniform(size=(1, 3, 320, 480))
Expand All @@ -76,7 +76,7 @@ net(X).shape
```

接下来,我们[**使用$1\times1$卷积层将输出通道数转换为Pascal VOC2012数据集的类数(21类)。**]
最后,我们需要(**将要素地图的高度和宽度增加32倍**),从而将其变回输入图像的高和宽。
最后,我们需要(**将特征图的高度和宽度增加32倍**),从而将其变回输入图像的高和宽。
回想一下 :numref:`sec_padding`中卷积层输出形状的计算方法:
由于$(320-64+16\times2+32)/32=10$且$(480-64+16\times2+32)/32=15$,我们构造一个步幅为$32$的转置卷积层,并将卷积核的高和宽设为$64$,填充为$16$。
我们可以看到如果步幅为$s$,填充为$s/2$(假设$s/2$是整数)且卷积核的高和宽为$2s$,转置卷积核会将输入的高和宽分别放大$s$倍。
Expand Down Expand Up @@ -226,7 +226,7 @@ train_iter, test_iter = d2l.load_data_voc(batch_size, crop_size)
## [**训练**]

现在我们可以训练全卷积网络了。
这里的损失函数和准确率计算与图像分类中的并没有本质上的不同,因为我们使用转置卷积层的通道来预测像素的类别,所以在损失计算中通道维是指定的
这里的损失函数和准确率计算与图像分类中的并没有本质上的不同,因为我们使用转置卷积层的通道来预测像素的类别,所以需要在损失计算中指定通道维
此外,模型基于每个像素的预测类别是否正确来计算准确率。

```{.python .input}
Expand Down Expand Up @@ -331,7 +331,7 @@ d2l.show_images(imgs[::3] + imgs[1::3] + imgs[2::3], 3, n, scale=2);
1. 如果将转置卷积层改用Xavier随机初始化,结果有什么变化?
1. 调节超参数,能进一步提升模型的精度吗?
1. 预测测试图像中所有像素的类别。
1. 最初的全卷积网络的论文中 :cite:`Long.Shelhamer.Darrell.2015`还使用了卷积神经网络的某些中间层的输出。试着实现这个想法。
1. 最初的全卷积网络的论文中 :cite:`Long.Shelhamer.Darrell.2015`还使用了某些卷积神经网络中间层的输出。试着实现这个想法。

:begin_tab:`mxnet`
[Discussions](https://discuss.d2l.ai/t/3298)
Expand Down
Loading

0 comments on commit b2db840

Please sign in to comment.