狗盲不存在!印度小哥实战搭建狗品种识别算法,只要7步
共 3295字,需浏览 7分钟
· 2021-08-11
![](https://filescdn.proginn.com/ffaf399416790065f37f069a069f5753/04c1bce725e211965acfdee3e4424d88.webp)
新智元报道
新智元报道
来源:网络
编辑:yaxin、su
【新智元导读】狗的品种有多少,你能否一一道来?若将不同品种的狗拉到你面前,你又能认识几个?别急,国外小哥搭建了一个专门对狗的品种进行分类的CNN模型,「狗盲」不存在!
在路上偶然见到一只狗狗觉得很可爱,但是不知道它的品种?
觉得某个喜欢的明星很像……狗狗?
最近,一位印度小哥搭建了一个CNN模型,专门对狗的品种进行分类!
识别到人脸怎么办呢?它会告诉我们与此人最相似的狗狗品种。
该模型使用的狗数据集和人体数据集来自Kaggle。
包括8351张狗图像,分为训练(6680)、验证(835)和测试(836)数据集,以及13233 张人脸。
训练数据集中,图像数量最多的阿拉斯加雪橇犬(77),最少的是挪威布哈德犬 ( 26 )。
如图从上到下依次为:阿拉斯加雪橇犬、挪威布哈德犬
该模型的评估指标是准确性,即正确预测的数量与所有预测的比值。
同时,在总结时使用精度进行评估,避免误报率(False Positive Ratio)。
具体步骤分为七步:
第 1 步:检测人类
第 2 步:检测狗
第 3 步:创建一个CNN 来对狗品种进行分类
第 4 步:使用 CNN 对狗品种进行分类(使用迁移学习)
第 5 步:创建一个CNN来对狗品种进行分类(使用迁移学习)
第 6 步:最终算法
第 7 步:测试算法
七步走,狗狗检测器诞生
第1步 检测人类
研究人员尝试将2种不同的算法来检测人脸:OpenCV 和 MTCNN。
如何实现?
OpenCV 是一个 python 库,它使用基于 Haar 特征的级联分类器,通过各种过滤器/内核函数提取特征,然后应用 Adaboost 算法对不良特征进行处罚。
OpenCV 的 Haar 级联分类器准确预测 100%的人类图像,约12%的狗图像错误地预测为人类。
再来看另一个检测人脸的分类器 MTCNN(多任务级联卷积网络)。
它由三个卷积网络(P-Net、R-Net 和 O-Net)组成,负责实时检测的鲁棒性。
事实证明,MTCNN 是检测「模糊图像」更好选择。
OpenCV和MTCNN对比
然而,当研究者在狗图像上评估 MTCNN 算法时,检测出的比率却是不同的。
尽管它完美地检测了所有人脸,但大约23%的狗图像被检测为人类,这比 OpenCV 的 12% 错误率要大得多。
这表明 MTCNN 中的误报率高于 OpenCV。
第2步 检测狗
为了检测狗,研究人员使用预训练的 Resnet-50 模型。该神经网络已在ImageNet数据集上进行了训练,可直接加载模型利用。
在把图像提供给 Resnet-50模型之前,必须将图像重塑 n(图像的预处理)m为 Keras 接受的张量 (4D 数组)。
预处理图像数据
接下来便是预测。预测前,研究者对输入图像也进行一些额外的处理。
Resnet-50 模型在这方面的表现相当出色,狗和人脸的图像都能正确标记。
第3步 创建一个 CNN 来对狗品种进行分类
现在有了在图像中检测人类和狗的功能,必须设计出一种从图像中预测品种的方法。
研究人员尝试创建了自己的卷积神经网络和训练狗的数据集,如下:
狗品种分类器 CNN
研究者在最初的几个层中使用了Conv2D和MaxPooling的组合,然后是GlobalAveragePooling2D、Dropout和Dense图层。
模型概述
模型编译
模型训练
当前,研究者已经对模型进行了 25 次训练,批量大小为 20。使用的优化器是rmsprop。使用该模型获得的准确度和精密度分别为15.5%和14%。
第4步 使用 CNN 对狗品种进行分类
上面的模型没有给出理想的准确度,值得庆幸的是,「迁移学习」可以帮助实现。
这样,研究者可以在不牺牲准确性的情况下减少训练时间。
因为只需要训练最后几层并利用已经训练好的 CNN 模型的权重,在这种情况下是VGG-16。
VGG 16 CNN 模型
VGG16 模型的上述实现产生了45.5%的准确率,远高于研究者自己的 CNN 模型。
第5步 创建一个 CNN 来对狗品种进行分类(使用迁移学习)
接下来,研究者对下载到各自架构的瓶颈特性上训练更多模型 (Resnet-50,InceptionV3)。
在实现方面,它们与 VGG-16 模型完全相似,只有架构不同。
他们创建了一组函数来构建架构、编译和训练模型,以及报告准确性和热图。
犬种预测的 Inception V3 模型热图
因此,我们使用InceptionV3网络来训练我们的模型。从上图中可以明显看出,这是一个更好的热图,大多数预测都沿着对角线。它产生了81.2%的准确度和大约84%的精度。
第6步 最终算法
将人脸检测器、狗检测器和狗品种分类器整合到一个算法中。
然后就可以拍摄图像并预测狗的品种啦!当然,如果是人类,则预测与此人最相似的狗品种。
狗品种预测
输入图像后,softmax分类器会将最大概率的索引定为最终品种。
此外,算法还会显示5个最有可能的犬种及其softmax概率。
最终算法
输入狗和人脸的图片后,上述函数将调用final_breed_prediction方法进行预测,并显示相关信息。
第7步 测试算法
最后,研究人员分别检测了5张狗的图像以及2张人的图像。
结果显示,它准确地预测了所有5只狗图像的品种。然而,就人类图片预测而言,并不完全令人信服。
比如下面这张图就闹了一个笑话,「你看起来像一只獒犬」。
准确度还不错!但也存在改进空间
总的来说,这一模型准确度还可以。
对提取的瓶颈特征进行训练后,基准模型的准确度如下:
VGG16:45%、InceptionV3:82%、Resnet50:81%
研究人员发现,增加epoch的数量并不能减少验证损失。也就是说,在20次迭代内就可以实现最佳的验证损失和准确性。
此外,在CNN结构中添加太多层并不能提高准确性。
因而,最终模型保留了1 个GAP 2D层和1个Dense Softmax层。
当然,改进的空间是存在的!
比如,最近开发的其他先进人脸检测方法可以降低在MTCNN实现中观察到的误报率。
此外,通过增加训练数据可以使提取的瓶颈特征更完整,并且创建更丰富的图像表示,从而提高准确性。
制作一个狗狗检测器,你学废了吗?
参考资料:
https://winxzenpiyush23.medium.com/dog-breed-classifier-using-cnn-4f408d04ff86
-往期精彩-