#问题
笔者最近在学人工智能领域的深度学习技术,在 fast.ai的课程里,我学会了:复用简洁的示例代码来训练卷积神经网络CNN。它能够精准地让机器对图片进行分类。(课程里的例子是识别猫狗图片的二元分类任务,在2000张测试图片中,它的识别准确率达到了99%。)
我认为,真正的学习,是带着好奇心,自己来解决实际问题,探究输入-输出之间的关系,从而构建自己的知识体系。
因为自己是多年的足球迷,从兴趣出发,我“凿开”了一个脑洞:能否训练一个卷积神经网络训练,识别区分两件相似足球队衣图片?
于是,我搜索到了公众号点妹侃球的一篇帖子 《撞衫不可怕,谁丑谁尴尬!这些球衣相似度竟高达99%》,看看都有哪些足球队的队服比较相似。
其中,我发现,大名鼎鼎的巴塞罗那队服是红蓝箭条衫,而瑞士巴赛尔队的队服也是红蓝箭条衫,两队的主场战袍相似度很高。因此,我打算用 fast.ai的模块来以及预训练的 CNN 卷积神经网络(比如,resnet34)来进行迁移学习,看看我们的 AI 图片分类器,能否较好地识别两个队的队服。
下面是两队的队服示例:
任务定义:区分图片是「巴塞罗那队队服」还是「巴赛尔队队服」?
数据集
- 通过开源的 Python 脚本 google-images-download,根据关键词来批量谷歌图片里的图像。每队批量下载了140张图片,训练集每队约83张图片,验证集每队约60张图片。
训练
预训练模型
定义数据路径及图片大小(324*324)
设置预训练模型为resnet34,然后生成模型,学习率设为0.01,并训练10次
采用预训练的模型,120多张的测试数据,准确率达到了77.6%,还不错。这是最简单的办法,fast.ai课程还讲授了其他的提示准确率的办法,对于这个小型的足球图片数据集,我来实验一下,看看准确率能否有明显提升。
寻找最佳学习率
使用了一个寻找最佳学习率的函数,但是数据图里是空的,没有曲线,暂时无解,先跳过,我决定沿用0.01的学习率。
数据扩充(Data Argumentation)
|
|
随机对图片进行水平旋转,并放大1.5倍
|
|
用了 数据扩充(Data Argumentation) 之后,第一次训练,准确率较低,只有52.8%。
|
|
解冻-微调
之前训练的是最后一层,通过 Unfreeze函数,“解冻”所有神经层,进一步做 Fine-Tuning 参数微调,并且,不同深浅的神经层,采用不同的学习率。
|
|
|
|
采用了 TTA(测试集也使用 Data Argumentation) 之后,最后的准确率达到了89.2%。
结果
混淆矩阵(Confusion Matrix)
画出一个混淆矩阵——查看不同分类,识别错误的图片都有哪些?
看图可知
巴塞罗那队服:54张正确,6张错误。
巴塞尔队服:54张正确,7张错误。
下面我们看看具体哪些图片识别错了:
第一行几张图片,判断错误还是有点奇怪的,因为图片本身有着巴塞罗那队的标志,标志人物梅西和队徽。也许是训练集还太小的缘故吧。
第二行判断错误的巴赛尔队服,第二张是异常图片,呈黑白色。其他三张与训练集里典型的巴赛尔队服还是有点区别的。这样也许解释得过去。
参考资料:
Fun with small image data-sets
Case Study: A world class image classifier for dogs and cats
fastai-doc
changelog
2019.01.04 初稿
2019.04.05 删除时效图片,发布至博客