本篇博客主要为学习斯坦福cs231n第二讲图像分类的学习笔记…
2. 图像分类
2.1 数据驱动方法
- 对于猫咪分类出现的几个问题:
- 形态多变
- 遮挡问题
- 目标与背景混乱
- 种间差异
- 图片分类python接口
def classify_image(image):
# Some magic here?
return class_label
-
图像分类步骤(数据驱动方法)(最近邻算法)
- 收集含有图像和标签的数据集
- 一个常用数据集:CIFAR10(32×32×3:3种颜色通道)
- 10个类别
- 50000张训练图片
- 10000张测试图片
- 一个常用数据集:CIFAR10(32×32×3:3种颜色通道)
- 使用机器学习训练一个分类器
-
def train(images,labels): #Machine learning! return model
-
- 评估新图像的类别
-
def predict(model,test_images): #Use model to predict labels return tast_labels
-
- 收集含有图像和标签的数据集
-
距离度量(范数)
- https://www.jianshu.com/p/4bad38fe07e6
- L1范数:曼哈顿距离(像素间绝对值的总和),大小与所选的坐标系统有很大关系
- L2范数:欧氏距离(取平方和的平方根),大小与坐标系统无关
-
Nearest Neighbor classifier
- NN算法的训练和预测算法复杂度是多少
- Train:O(1)
- Predict:O(N)
- 但实际中,一般需要测试速度足够快,而训练可以相对比较慢
- 最近邻算法并不好,可能会导致过拟合,所以衍生出K-近邻算法(k为1时,为最近邻算法)
2.2 k近邻算法
- K-nearest nerghbor
- 先通过一定的方式找到k个最近的点,然后将投票数多的邻近点预测结果
- KNN三要素
- k值选取(超参数:不需要学习,在算法开始前就给定的参数)
- 数据集全部作为训练集(×):总是在训练集上表现完美,甚至可能出现过拟合
- 数据集一部分作为训练集,一部分作为测试集(×):这样并不能知道该算法在新数据上的效果如何
- 数据集分为训练集、验证集和测试集(√):将算法在训练集上训练,利用验证集调参,选择在验证集上表现最好的超参数,再在测试集上泡一泡。
- 利用交叉验证集,但一般用在数据量比较小的数据集中,深度学习中并不常用
- 方法:将数据集分为训练集和测试集,再将训练集n等分,每次选取n-1份训练,剩下一分作为验证集,循环迭代,直至所有验证集都使用完毕。
- 距离度量的方式(好坏根据实际问题决定)
- L1:依赖于数据坐标。如果问题中每个特征有实际的意义,用L1更好一些
- L2:对于微微改变的图片,L2可能是相等的
- 分类决策规则
- 多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别。
- 图像处理为什么很少使用KNN?
- 测试时速度慢
- 距离函数用在比较像素上不合适
- 维度灾难
- k值选取(超参数:不需要学习,在算法开始前就给定的参数)
2.3 线性分类
- 线性分类
- 线性分类器
- 通过特征的线性组合做出分类决定
- 感知机、svm、Fisher、Logistic
- 线性分类器与knn的区别
- knn算法中没有参数 ,而是保留所有种类的训练数据并用于测试
- 线性分类是有参数的算法,直接训练参数,把信息保存到了所学的参数中,不再需要实际的训练数据,用参数来测试
- 缺点
- 线性分类每次只能学习一个模板
2.4 作业
- 图像分类数据和label分别是什么?图像分类存在的问题与挑战
- 数据即为含有分类目标的图像
- label则是该图像的一个标签(类别)
- 图像分类的问题与挑战
- 形态多变
- 遮挡问题
- 目标与背景混乱
- 种间差异
- 使用python加载一张彩色图片,观察像素值
2.5 KNN分类算法实现
- some point
- plt.rcParams[]:设置图像细节
- %load_ext autoreload:在执行用户代码前,重新装入软件的扩展和模块
- 无参:装入所有模块。
- 0:不执行 装入命令。
- 1: 只装入所有 %aimport 要装模块
- 2:装入所有 %aimport 不包含的模块。
classes = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] #类别列表
num_classes = len(classes) #类别数目
samples_per_class = 7 # 每个类别采样个数
for y, cls in enumerate(classes): # 对列表的元素位置和元素进行循环,y表示元素位置(0,num_class),cls元素本身'plane'等
idxs = np.flatnonzero(y_train == y) #找出标签中y类的位置
idxs = np.random.choice(idxs, samples_per_class, replace=False) #从中选出我们所需的7个样本
for i, idx in enumerate(idxs): #对所选的样本的位置和样本所对应的图片在训练集中的位置进行循环
plt_idx = i * num_classes + y + 1 # 在子图中所占位置的计算
plt.subplot(samples_per_class, num_classes, plt_idx) # 说明要画的子图的编号
plt.imshow(X_train[idx].astype('uint8')) # 画图
plt.axis('off')
if i == 0:
plt.title(cls) # 写上标题,也就是类别名
plt.show() # 显示
来源:https://www.cnblogs.com/eilearn/p/9014864.html