图像分类的基本知识
介绍
之前已经学会了如何使用图像金字塔和滑动窗口在图片中寻找目标,以及通过方向梯度直方图的方法对图像进行特征描述,但是光靠这些方法还不足以实现一个目标检测项目。对一张图片进行目标检测还需要判断滑动窗口寻找的物体是否是想要检测到,这就涉及到图像分类问题。
计算机视觉中的图像分类,简单来说就是为一张图片赋予一个标签(Label),一个标签就是人为定义的集合中的一个元素,例如下面公式表示我们定义了一个集合 $D$,$cat$ 、$dog$ 则被称为集合 $D$ 的 2 个不同标签。
$$ D = {cat,\ dog} $$
以下图为例,图像分类任务就是希望给计算机提供左边的图片,则计算机将赋予其 $cat$ 标签,提供右边的图片,则赋予其 $dog$ 标签。在计算机视觉中我们希望构建一个系统,当给系统输入一张图片时,系统会分析该图片然后输出一系列标签的概率值(例如 $cat = 0.89$,$dog = 0.1$),而这些标签属于我们事先定义的一个类别集合(例如 $cat$ 和 $dog$ 属于集合 $D$)。更具体的来说假设我们有一张宽和高分别为 $W,\ H$ 的 3 通道的彩色图片,则图片共有 $W\times H\times 3$ 个像素,我们希望将所有这些像素值输入一个机器学习或深度学习模型,然后该模型通过计算将图片正确的分到所属类别。
要想通过机器学习或深度学习实现图像分类,我们还需要为其提供数据集。数据集是由许多数据组成的集合,数据集中的任意一个元素可以是图片、文本、音频等。我们希望机器学习或深度学习算法通过学习和提炼数据集中的规律,并运用这些规律正确地分类它从未 $\lceil 看 \rfloor$ 到过的图片。故机器学习和深度学习是数据驱动的方法,而数据集则是不可或缺的前提。 其中学习和提炼的过程我们称之为训练(Train)也可称为建模的过程,最后习得数据集中的规律表示我们已经完成了建模并获得一个模型(Model)。
下面更进一步介绍如何构建一个图像分类模型。构建一个分类模型基本上可以分为下面几个步骤
收集数据
为了构建一个图像分类模型,我们首先需要收集不同的图片创建一个数据集,对于数据集中的每张图片我们都有一个对应的标签,这些标签都属于一个预先定义好的集合(例如前面提到的 $cat$ 和 $dog$ 属于集合 $D$)。还有一点需要注意的是我们在创建数据集时要尽量让每种类别的图片数量相差不太大,例如假设我们构建一个只有猫和狗的数据集,那么猫这个类别(或称为标签)的图片数量尽量不要与狗这个类别(或称为标签)的图片数量相差太大。如果数量相差太大(例如猫的图片数量是狗的图片数量的三倍,这种情况通常称为样本不均衡)则会导致模型的性能较差。
数据集划分
收集好数据集后通常我们会将其分为三份:训练集、验证集、测试集。训练集就是用于让机器学习或深度学习算法(也可称为分类器)从中学习每个类别的特征规律,我们将数据输入分类器,然后分类器通过计算输出分类结果,如果输出结果与输入数据所对应标签不一致则分类错误,分类器将进行自我修正,最后完成训练生成一个模型。
训练完成后我们用测试集评估模型性能,注意测试集和训练集必须是数据集中的两个没有交集的子集,因为如果用于评估模型的测试集中掺杂了训练集中的样本评估的结果就不够准确。通常数据集会被按比例分为:训练集占 75%,测试集占 25%。数据集的比例划分没有明确规定,可以是 60% 和 40%、90% 和 10% 等。如果数据集中的样本数量有 100 万个,则将 25% 的样本划分为用于评估模型的测试集显然是不合理的。
验证集主要用于评估模型效果以及调整超参数。在机器学习和深度学习中会有一些需要设置的参数,这些参数不是通过训练过程得到的而是需要事先设定,通常我们需要对这些参数调优以便提高模型的性能和效果,这些参数被称为超参数。验证集不是必需的,如果不需要调参可以不划分验证集,通常会从训练集中抽取 10% 到 20% 作为验证集。
训练
有了数据集并且划分了训练集和测试集,我们就可以训练自己的模型了。首先我们需要一个评分函数(Score Function)将输入图片映射到类别标签。例如,假设我们有一个评分函数 $f(x;w)$,我们将训练集中的图片作为函数的输入,函数通过计算输出预测的类别标签。然后一个损失函数(Loss Function)将会被用于评估输出的结果与该数据所对应的真实标签的近似程度,两个标签的相似程度越高,损失函数的值就越小。我们希望通过整个训练过程最小化损失函数以提高分类的准确度。
评估
完成训练后我们用测试集评估获得的模型,简单来说就是我们会将测试集中的每张图片输入模型,看看模型对每张图片分类后的标签是否正确。