【深度学习基础】系列博客为学习Coursera上吴恩达深度学习课程所做的课程笔记。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.目标定位(Object Localization)
以检测图片中的汽车为例,目标定位不仅需要判断图片中是否存在汽车,还需要标记出汽车所在位置,即用一个边框(bounding box)将汽车圈起来,如下图所示:
对于图片分类(假设图片中只含有一个待检测的object)问题,构建一个卷积神经网络,输出层为softmax函数,判断图片为汽车、行人、摩托车或者背景(即图片中无object的情况)等四个类别中的哪一类。而对于目标定位问题,我们除了完成上述的分类,还要将汽车、行人或者摩托车的bounding box预测出来。
接下来我们来说一下如何定义网络的输出$y$:
\[y=\begin{bmatrix} P_c \\ b_x \\ b_y \\ b_h \\ b_w \\ c_1 \\ c_2 \\ c_3 \end{bmatrix}\]符号含义:
- $P_c$等于0或1。$P_c=1$表示图片属于汽车、行人、摩托车三个类别中的一个。$P_c=0$表示图片属于背景。
- $b_x,b_y,b_h,b_w$四个数表示bounding box,$(b_x,b_y)$为bounding box中心点的坐标,$b_h,b_w$分别为bounding box的height和width。
- $c_1,c_2,c_3$均等于0或1,分别表示图片是否为汽车、行人或者摩托车。
例如,如果图片属于汽车,则其标签y应该为:
\[y=\begin{bmatrix} 1 \\ b_x \\ b_y \\ b_h \\ b_w \\ 1 \\ 0 \\ 0 \end{bmatrix}\]注意当$P_c=0$时,$b_x,b_y,b_h,b_w,c_1,c_2,c_3$都将失去意义。
知道了如果定义输出,那我们该如何定义loss function呢?例如我们可以构建如下:
\[L(\hat{y},y) = \begin{cases} (\hat{y}_1-y_1)^2+(\hat{y}_2-y_2)^2+ \cdots + (\hat{y}_8-y_8)^2, y_1=1 \\ (\hat{y}_1-y_1)^2, y_1=0 \\ \end{cases}\]在实际应用中,我们可以用逻辑回归来预测$P_c$,用softmax预测$c_1,c_2,c_3$,这样我们可以用交叉熵损失函数来计算这两部分的loss,剩余的bounding box可以用均方误差来表示。
2.特征点检测(Landmark Detection)
例如我们需要在人脸图片中识别出人脸的四个眼角:
我们可以构建网络的输出层如下:
\[y=\begin{bmatrix} l_{1x} \\ l_{1y} \\ l_{2x} \\ l_{2y} \\ l_{3x} \\ l_{3y} \\ l_{4x} \\ l_{4y} \\\end{bmatrix}\]其中,$l_{1x},l_{1y},l_{2x},l_{2y},l_{3x},l_{3y},l_{4x},l_{4y}$分别表示四个眼角位置的坐标。
同样的,我们也可以将人体的关节点作为landmark,从而进一步预测人体姿态: