Keras Xception Multi loss 细粒度图像分类
作者: 梦里茶
如果觉得我的工作对你有帮助,就点个star吧
关于
这是百度举办的一个关于狗的细粒度分类比赛,比赛链接: http://js.baidu.com/
框架
硬件
- Geforce GTX 1060 6G
- Intel® Core™ i7-6700 CPU
- Memory 8G
模型
- Xception提取深度特征
- 受这篇Person Re-id论文的启发,在多分类基础上增加一个样本是否相同判断的二分类loss,增加类间距离,减小类内距离

Keras实现
- 去掉Xception最后用于imagenet分类的全连接层,获取图像深度特征
- 输入两张图片,可能属于相同类也可能属于不同类
- 根据特征和标签进行多分类训练
- 同时以两图是否属于同一类作为二分类标签训练

数据预处理
- 从Baidu云下载数据
- 训练集: http://pan.baidu.com/s/1slLOqBz Key: 5axb
- 测试集: http://pan.baidu.com/s/1gfaf9rt Key:fl5n
- 按类别把图片放在不同的目录下,方便ImageDataGenerator的使用
- 因为先前我把图片命名为这种格式"typeid_randhash.jpg"了, 所以我写了这段代码来做图片移动的工作img2keras.py
- 数据预处理还有许多细节要处理,遇到问题的话可以先查看keras的文档,如果还有问题,可以提issue.
训练
- 使用Keras的ImageDataGenerator接口进行数据增广
- 同时使用ImageDataGenerator做数据增广并进行正负样本对采样是一个难点.因为从ImageDataGenerator获得的图片被打乱了.
遍历数据集找同类样本作为正样本效率很低,幸运的是,在每个batch中,存在同类的样本,所以我们可以通过在同一个batch中交换同类样本的位置,构造出包含正样本对的另一个输入. - 冻结Xception的卷积层,采用ADMM训练多分类和二分类模型.
- 解冻Xception卷积层的最后两个block(总共有12个block,最后两个block从Xception的105层开始)继续使用SGD训练
- 去掉数据增广,再训练直至收敛
代码
- 单一Xception模型
- 训练: single_model.py
- 测试: single_model_test.py
- Multi loss模型
- 冻结训练全连接层+微调卷积层: froze_fine_tune.py
- Trick微调: trick_tune.py
- 测试: baidu_dog_test.py
一些测试结果
- InceptionV3,多分类模型: 0.2502
- Xception,多分类模型: 0.2235
- Xception, 混合模型: 0.211
- Xception, 混合模型,最后去掉数据增广再训练: 0.2045
如果发现代码里有bug,麻烦开个issue告诉我或者来个PR修复一下,万分感谢!
Keras Xception Multi loss 细粒度图像分类的更多相关文章
- CVPR 2019细粒度图像分类竞赛中国团队DeepBlueAI获冠军 | 技术干货分享
[导读]CVPR 2019细粒度图像分类workshop的挑战赛公布了最终结果:中国团队DeepBlueAI获得冠军.本文带来冠军团队解决方案的技术分享. 近日,在Kaggle上举办的CVPR 201 ...
- keras model.compile(loss='目标函数 ', optimizer='adam', metrics=['accuracy'])
深度学习笔记 目标函数的总结与整理 目标函数,或称损失函数,是网络中的性能函数,也是编译一个模型必须的两个参数之一.由于损失函数种类众多,下面以keras官网手册的为例. 在官方keras.io里 ...
- keras中的loss、optimizer、metrics
用keras搭好模型架构之后的下一步,就是执行编译操作.在编译时,经常需要指定三个参数 loss optimizer metrics 这三个参数有两类选择: 使用字符串 使用标识符,如keras.lo ...
- 实战keras——用CNN实现cifar10图像分类
原文:https://blog.csdn.net/zzulp/article/details/76358694 import keras from keras.datasets import cifa ...
- 【转载】细粒度图像识别Object-Part Attention Driven Discriminative Localization for Fine-grained Image Classification
细粒度图像识别Object-Part Attention Driven Discriminative Localization for Fine-grained Image Classificatio ...
- Keras使用的一些细节
1.Keras输出的loss,val这些值如何保存到文本中去: Keras中的fit函数会返回一个History对象,它的History.history属性会把之前的那些值全保存在里面,如果有验证集的 ...
- TensorFlow2.0教程-使用keras训练模型
1.一般的模型构造.训练.测试流程 # 模型构造 inputs = keras.Input(shape=(784,), name='mnist_input') h1 = layers.Dense(64 ...
- CNN实战篇-手把手教你利用开源数据进行图像识别(基于keras搭建)
我一直强调做深度学习,最好是结合实际的数据上手,参照理论,对知识的掌握才会更加全面.先了解原理,然后找一匹数据来验证,这样会不断加深对理论的理解. 欢迎留言与交流! 数据来源: cifar10 (其 ...
- TensorFlow keras 迁移学习
数据的读取 import tensorflow as tf from tensorflow.python import keras from tensorflow.python.keras.prepr ...
随机推荐
- Java使用条件语句和循环结构确定控制流
与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流.本文将简单讲解条件.循环和switch. 一.块作用域 块(block),即复合语句.是指由一对大括号括起来的若干条简单的Java语句 ...
- docker 汇总
整理中 ... 一. docker 基础 配置参数最佳实践 二. docker 编排工具 docker swarm mesos kubernetes AWS ECS 三. docker 生态 dock ...
- Vulkan Tutorial 20 Vertex buffer creation
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 在Vulkan中,缓冲区是内存的一块区域,该区域用于向显卡 ...
- 原生js在绑定事件时不用获取id名可直接用id名绑定???
<div id="btn"> 点击 </div> <script> btn.onclick=function(){ console.log(bt ...
- 3.Smarty的基本语法
一.注释的方法是 {* 这里填注释 *} 二.在Smarty的输出赋值进来的变量 1.变量是字符串的时候 1)关联数组 $arr = array('a'=>'cai','b'=>'muqi ...
- 什么是VPN,VPN有什么用,怎么获得VPN
什么是VPN? VPN英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”.vpn被定义为通过一个公用网络(通常是因特网)建立一个临时的.安全的连接,是一条穿过混 ...
- DOCKER 从入门到放弃(一)
前言 关于docker的各种概念已有各位大神珠玉在前,请各位自行查看,本系列的目的是各种详细操作步骤 各种概念特别推荐CloudMan的3篇blog: http://www.cnblogs.com/C ...
- 解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 的访问
根据需要进行asp.net的数据导入导出,结果报以下错: mark-1: [报错]SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT ...
- MySQL--当mysqldump --single-transaction遇到alter table(2)
在上篇<MySQL--当mysqldump --single-transaction遇到alter table>中测试发现,在MySQL 5.6版本中,如果在mysqldump期间修改表, ...
- Android 测试 Appium、Robotium、monkey等框架或者工具对比
1. Appium测试 (功能测试,用户接受度测试,黑盒测试) - Rating: 8 Appium测试相当于黑盒测试.只是测试UI逻辑正确性.所以Appium测试框架提供的方法有限.获取一个Appi ...