这是本学期机器学习课程的项目。通过这个项目了解了不少东西,希望通过博客记录下整个项目过程。
国外有一个网站
http://www.alllooksame.com/
上有一个非常有趣的测试,他们在街头收集了一共18名中国人、韩国人、日本人的照片,放在网站上,让人去识别。博主自己尝试过一次,18个对了7个,38%的正确率,跟猜的概率并没有相差太多,恰好刚在学习深度学习一些模型,了解到可以通过深度的学习模型构建分类器去识别。在一时冲动之下,有了这个项目。废话不多说,直接开始博主完成整个项目的过程。
名称 | 数据来源 | 样本数目 |
---|---|---|
中国人 | 政府网站、明星、老师、学生 | 483 |
日本人 | 政府网站、明星、老师、学生 | 407 |
韩国人 | 408 |
ps:这里我们韩国人的数据存在问题,因为直接来源于Google,真实性不如收集到的中国人和日本人,很可能原始标记就存在问题。
学长说这样的人脸检测会丢失很多有用的信息,要在人脸检测之后做一些人脸补全的工作,目前还不知道怎么弄,先码着,等期末结束之后有空了再来折腾一下。
具体做法的代码参照这篇博文,修改了一下。
https://blog.csdn.net/u012162613/article/details/43523507
饱和度
im_1 = ImageEnhance.Color(img).enhance(random_factor)
这里直接调用了ImageEnhance模块的Color类,其中random_factor是一个随机变量。random_factor=1的时候为原图,random_factor越大饱和度越大。
亮度
im_2 = ImageEnhance.Brightness(img).enhance(random_factor)
这里直接调用了ImageEnhance模块的Brightness类,其中random_factor是一个随机变量。random_factor=1的时候为原图,random_factor越大饱和度越大。
对比度
im_3 = ImageEnhance.Contrast(img).enhance(random_factor)
这里直接调用了ImageEnhance模块的Contrast类,其中random_factor是一个随机变量。random_factor=1 的时候为原图,random_factor越大饱和度越大。
锐度
im_4 = ImageEnhance.Sharpness(img).enhance(random_factor)
这里直接调用了ImageEnhance模块的Sharpness类,其中random_factor是一个随机变量。random_factor=1 的时候为原图,random_factor越大饱和度越大。
这里主要是参考了这边博文。
http://blog.csdn.net/icamera0/article/details/50753705
旋转角度 改变旋转角度同样也可以做数据增强。
下图是博主两次做数的两次数据增强。左边是没有任何经验,完全随机的做出来的数据集增强,右边是学长指导之后做出来的增强结果,把这两个数据集在博主训练得到最好的分类器上面跑,左边只有86%左右的正确率,右边却达到了94%左右的正确率。
左边主要存在的问题是,数据增强的幅度过大,导致图片有点失真(跟正常相机拍出来的相差太大);随机调整的角度也过大;这两种方式得到的照片跟实际相差太大,没有很大的实际应用价值。Ps:学长还说,在实际工作中,添加随机噪声得到的数据集没有价值。。。目前还没有弄明白为啥,先码着。 下面是我得到右边数据集的代码:
def randomRotation(image):
"""
对图像进行随机任意角度(0~360度)旋转
:param mode 邻近插值,双线性插值,双三次B样条插值(default)
:param image PIL的图像image
:return: 旋转转之后的图像
"""
random_angle = np.random.randint(-15, 15) return image.rotate(random_angle)def randomColor(image):
"""
对图像进行颜色抖动
:param image: PIL的图像image
:return: 有颜色色差的图像image
"""
random_factor = np.random.randint(8, 12) / 10. # 随机因子
color_image = ImageEnhance.Color(image).enhance(random_factor) # 调整图像的饱和度
random_factor = np.random.randint(8, 12) / 10. # 随机因子
brightness_image = ImageEnhance.Brightness(color_image).enhance(random_factor) # 调整图像的亮度
random_factor = np.random.randint(8, 12) / 10. # 随机因1子
contrast_image = ImageEnhance.Contrast(brightness_image).enhance(random_factor) # 调整图像对比度
random_factor = np.random.randint(8, 10) / 10. # 随机因子
return ImageEnhance.Sharpness(contrast_image).enhance(random_factor) # 调整图像锐度
因为VGG对输入图片有要求,在放入VGG模型之前首先对图片进行了如下处理:
在Batch size = 16、#training = 1082、#validation = 16、 #test = 200、 Dropout = 1时训练上述分类器得到正确率随着训练步数的变化如下:
发现训练集上面的正确率接近100%,然而验证集上面的正确率却58%,显然出现了过拟合,为了避免过拟合,提高泛化能力,我们队对参数进行调整。 这里图像波动很大,因为我们的batch_size只有16,若batch_size大一些,图像会更加平滑一点,但是总体局势还是能够反映的。
https://blog.csdn.net/mr_curi0sity/article/details/72927941