任务描述
Data
训练数据为120个品种狗狗的照片,共10222张。共10357张测试样本。
检测
下图为提供的一张训练样本的示例,可以看到不仅有目标物,还有人,可能还会有其他各种各样的物体,因此需要将狗狗从图像中检测出来,考虑到已经有训练好的可以进行狗狗检测的模型,直接调用训练好的模型对狗狗进行检测。
这里使用 tf-faster-rcnn 项目下提供的 voc_2007_trainval+voc_2012_trainval 预训练好的模型进行检测,该模型是在VOC 2007以及2012数据集上训练的模型,pascal_voc 包含20个分类,如bicyle、cow、dog 等等,因此利用该模型直接进行检测。
分类
检测完成后, 检测结果保存在tf-faster-rcnn/data/VOCdevkit2007/results/VOC2007/Main
目录下,共20个txt文件夹,对应20个种类
对于检测失败的104张图像,可以选择
- 降低置信阈值,如0.3,再人工筛选并归类;
- 人工标记并分类
- 将检测的其他类的结果(主要是动物,如牛,马等等)进行显示,可能会误检测,再人工分类
我比较懒,觉得剩下的样本也不多,就没有进行处理,由于训练样本较少,斯坦福大学提供了Stanford Dogs Dataset 数据集,也是120个品种,20580张图片,并提供了标记文档,这里可以作为训练样本的扩充,但是这次比赛的数据集也是imagenet上提供的(10222+10357=20579),斯坦福的这个数据集也是imagenet提供的,包含图像20580张,我怀疑两个两个数据会不会重合,先下载下来进行后续分析决定是否适用。分析过后大致可以确定这两个数据集是一样的,以Chihuahua为例,kaggle比赛提供的train里边的图片在斯坦福提供的这个chihuahua里边都可以找到,因此调整一下训练策略。首先使用斯坦福提供的这个数据集,因为自己检测的时候有的没有检测到,其次这个数据集更丰富,直接使用会与训练样本有重合,而且相当于测试样本也已经训练了,所以将这些样本根据标记文档进行检测,水平翻转,与训练样本一起进行训练,从而丰富数据集。
3、下载斯坦福的数据集,Annotations和Images,Annotations都是没有后缀的达标文档,为了后续方便,将标记文档重新命名并放在一个文件夹内。遍历文件夹图像进行检测,检测结果归类放置。
4、 stanford数据集水平镜像,合并两个数据集。
5、在做完狗狗的检测后,接下来是分类,目前网络上已经公开了许多训练好的模型,如VGG、ResNet、google的inception系列,都可以用来进行分类,但是由于比赛提供的训练数据比较有限,所以这里可以采用迁移学习的思想进行网络的学习,使用谷歌的inception v4进行训练。
6、进一步进行度量学习,减小类内间距,增大类间间距,如centerloss、triptloss.由于centerloss每次需要得到同类的特征中心,同类的狗由于不同的位姿,会导致特征中心不稳定,效果不好,将数据划分位10分,随机选取9份进行训练,一份测试,训练多个模型进行测试。将不同分类器得到的特征进行融合,拼接在一起训练。