首先,您需要准确定义您的任务 . F.ex给出R ^(MxN)中的图像I,我们希望将I分类为包含面部的图像或没有面部的图像 .
我经常使用像素分类器,其任务类似于:对于图像,我决定每个像素是面像素还是非面像素 .
定义任务的一个重要部分是提出可以用作训练分类器的基础的假设 . F.ex我们相信像素强度的分布可用于区分面部图像和不包含面部的图像 .
然后,您需要选择一些定义图像的功能 . 这可以通过多种方式完成,您应该在分析您正在使用的相同类型的图像时搜索其他人的行为 .
像素分类中一种广泛使用的方法是使用像素强度值并对图像进行多尺度分析 . 多尺度分析的想法是不同的结构在称为尺度的不同模糊水平上最明显 . 作为例证考虑树的图像 . 没有模糊,我们注意到精细的结构,如小树枝和树叶 . 当我们模糊图像时,我们会注意到树干和主要树枝 . 这通常用作分割方法的一部分 .
当您了解任务和功能时,可以训练分类器 . 如果您使用kNN和交叉验证来查找最佳k,则应在训练/测试中拆分数据集,然后在训练/验证集中拆分训练集 . 然后使用简化训练集训练并使用验证集来确定哪个k是最佳的 . 在二元分类的情况下,例如面对非面,错误率通常用作性能的度量 .
最后,使用参数在完整数据集上训练分类器并估计其在测试集上的性能 .
A classification example: With or without milk?
作为一个完整的例子,考虑从上面拍摄的一杯咖啡的图像,因此它显示了杯子的边缘围绕着棕色的盘 . 进一步假设所有图像都被缩放和裁剪,因此盘的直径是相同的,并且图像的尺寸是相同的 . 为了简化任务,我们将彩色图像转换为灰度,并将像素强度缩放到范围[0,1] .
我们想要训练一个分类器,这样它可以区分咖啡加牛奶和没有牛奶的咖啡 . 通过检查一些咖啡图像的直方图,我们看到每个图像在直方图中有两个明显分开的“凸起” . 我们相信这些颠簸对应于前景(咖啡)和背景 . 现在我们假设前景的平均强度可以用来区分咖啡牛奶/咖啡 .
为了找到前景像素,我们观察到因为前景/背景比率是相同的(按设计),我们可以找到给出每个图像的比率的强度值 . 然后我们计算前景像素的平均强度,并将此值用作每个图像的特征 .
如果我们有N个手动标记的图像,我们将其分为训练和测试集 . 然后,我们计算训练集中每个图像的平均前景强度,给出一组(平均前景强度,标签)值 . 我们想要使用kNN,其中图像被分配与k个最近图像的多数类相同的类 . 我们将距离测量为平均前景像素强度的差的绝对值 .
我们通过交叉验证搜索最优k . 我们使用2倍交叉验证(aka holdout)来找到最佳k . 我们测试k = {1,3,5}并选择在验证集上给出最小预测误差的k .