[转] 轻松使用多种预训练卷积网络抽取图像特征

选自GitHub,机器之心整理。

最近 GitHub 有一个非常有意思的项目,它可以使用多种预训练 TensorFLow 模型计算图像特征。对于每一个模型,它们都会输出最后的全连接层,即 AlexNet 的第七个全连接层、VGG_19 的第 8 个全连接层等。这些层级将最终抽取出图像的特征,并能进一步用于图像分类和聚类等。机器之心简要地介绍了该项目,并测试了使用Inception_V1预训练模型抽取图像特征。

项目地址:https://github.com/cameronfabbri/Compute-Features

这个项目的用法非常简单,我们只需要下载项目中的预训练模型检查点,例如 Inception V1 等。然后再使用如下命令行加载数据与预训练模型就能抽取出图像的特征:

tar -xvf inception_v1_2016_08_28.tar.gz
python compute_features.py --data_dir=test_images/ --checkpoint_file=inception_v1.ckpt --model=inception_v1

预训练模型的输出将会写入 inception_v1_features.pkl 文件,它包含了一个如下形式的字典:{image_path:feature}。案例 load_features.py 展示了如何使用预计算的特征。例如我们可以使用如下命令行将预抽取的特征用于其它任务:

python load_features.py features/inception_v1_features.pkl

有一些模型用上述方法可能并不能加载,例如 inception_v4 有不同的模型检查点和模型定义等。读者可查与具体的模型定义并构建适合于我们自己任务的用法。

预训练模型

我们下载所有的预训练模型:https://drive.google.com/file/d/13pyno-mdbazKs0o4N_Pk8ArDtk1RcE-U/view?usp=sharing

所有模型的独立下载地址在项目中都有展示。这些预训练的卷积神经网络都在 ILSVRC-2012-CLS 图像分类数据集中训练,且它们在 ImageNet 测试集中的 Top-1 和 Top-5 准确度都在下表给出。每个模型都给出了对应的论文和 TF-Sim 写的模型代码,这些模型代码都来自 TensorFLow 中的 models 子项目。

注意 VGG 和 ResNet V1 的参数转换自它们的原始 Caffe 格式,而 Inception 和 ResNet V2 的预训练参数由谷歌内部完成。此外,这些准确度都是在单个图像 crop 下评估的,也有一些学术论文使用多个 crops 在不同规模上有更好的准确度。

在使用预训练模型抽取图像特征的同时,我们还需要了解各个模型的架构与特点,这样才能更有效地利用它们抽取出来的特征向量。如下展示了经典 Inception_V3 模型的一个 Inception 模块,卷积层都是使用 TensorFlow-Slime 实现,因此我们可以在一行中实现一个卷积层的前向传播算法。一般而言,slim.conv2d 有三个参数必填,第一个参数是输入矩阵、第二个是当前卷积层的卷积核数量,最后就是卷积核尺寸。

with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d],
 stride=1, padding=‘SAME‘):
 # mixed: 35 x 35 x 256.
 end_point = ‘Mixed_5b‘
 with tf.variable_scope(end_point):
 with tf.variable_scope(‘Branch_0‘):
 branch_0 = slim.conv2d(net, depth(64), [1, 1], scope=‘Conv2d_0a_1x1‘)
 with tf.variable_scope(‘Branch_1‘):
 branch_1 = slim.conv2d(net, depth(48), [1, 1], scope=‘Conv2d_0a_1x1‘)
 branch_1 = slim.conv2d(branch_1, depth(64), [5, 5],
 scope=‘Conv2d_0b_5x5‘)
 with tf.variable_scope(‘Branch_2‘):
 branch_2 = slim.conv2d(net, depth(64), [1, 1], scope=‘Conv2d_0a_1x1‘)
 branch_2 = slim.conv2d(branch_2, depth(96), [3, 3],
 scope=‘Conv2d_0b_3x3‘)
 branch_2 = slim.conv2d(branch_2, depth(96), [3, 3],
 scope=‘Conv2d_0c_3x3‘)
 with tf.variable_scope(‘Branch_3‘):
 branch_3 = slim.avg_pool2d(net, [3, 3], scope=‘AvgPool_0a_3x3‘)
 branch_3 = slim.conv2d(branch_3, depth(32), [1, 1],
 scope=‘Conv2d_0b_1x1‘)
 net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3])
 end_points[end_point] = net

以上展示了 Inception_V3 的一个模块,简单而言,该模块就是将四个并行的卷积(branch_0 到 branch_3)分别执行不同的卷积运算,例如 branch_2 是由三个卷积层叠加而成,然后再将 4 份卷积特征图拼接起来作为这一模块的输出。

其它还有很多如特征抽取的效果或模型架构等还需要各位读者自己尝试。

我们测试了 inception_V1 预训练模型,它完成特征计算后会输出一个包含特征的 pkl 文件。我们发现其它如 Inception V3 会报错说权重文件中名为 InceptionV3/AuxLogits/Conv2d_2a_3x3/BatchNorm/beta 的张量没有定义,Inception V4 中会报错 tf.train.Saver() 没有需要保存的变量。

也许这些错误可能是由环境配置或其它问题,但还有很多如特征抽取的效果或模型架构等还需要各位读者自己尝试。

原文地址:https://www.cnblogs.com/luofeel/p/9182367.html

时间: 2024-10-09 23:50:14

[转] 轻松使用多种预训练卷积网络抽取图像特征的相关文章

CNN基础二:使用预训练网络提取图像特征

上一节中,我们采用了一个自定义的网络结构,从头开始训练猫狗大战分类器,最终在使用图像增强的方式下得到了82%的验证准确率.但是,想要将深度学习应用于小型图像数据集,通常不会贸然采用复杂网络并且从头开始训练(training from scratch),因为训练代价高,且很难避免过拟合问题.相对的,通常会采用一种更高效的方法--使用预训练网络. 预训练网络的使用通常有两种方式,一种是利用预训练网络简单提取图像的特征,之后可能会利用这些特征进行其他操作(比如和文本信息结合以用于image capti

fine-tuning:预训练中的迁移

什么是fine-tuning? 概述 在实践中,由于数据集不够大,很少有人从头开始训练网络.常见的做法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning(也叫微调),或者当做特征提取器. 以下是常见的两类迁移学习场景: 卷积网络当做特征提取器.使用在ImageNet上预训练的网络,去掉最后的全连接层,剩余部分当做特征提取器(例如AlexNet在最后分类器前,是4096维的特征向量).这样提取的特征叫做CNN codes.得到这样的特征后,可以使用

预训练中Word2vec,ELMO,GPT与BERT对比

预训练 先在某个任务(训练集A或者B)进行预先训练,即先在这个任务(训练集A或者B)学习网络参数,然后存起来以备后用.当我们在面临第三个任务时,网络可以采取相同的结构,在较浅的几层,网络参数可以直接加载训练集A或者B训练好的参数,其他高层仍然随机初始化.底层参数有两种方式:frozen,即预训练的参数固定不变,fine-tuning,即根据现在的任务调整预训练的参数. 优势: 1.当前任务数据量少,难以训练更多的网络参数,可以加载预训练的模型,然后根据当前的任务对参数进行fine-tuning,

卷积网络训练太慢?Yann LeCun:已解决CIFAR-10,目标 ImageNet

卷积网络训练太慢?Yann LeCun:已解决CIFAR-10,目标 ImageNet Kaggle近期举办了一场 关于CIFAR-10数据集的竞赛,该数据集包含有6万个32*32的彩色图像,共分为10种类型,由 Alex Krizhevsky, Vinod Nair和 Geoffrey Hinton收集而来. 很多竞赛选手使用了卷积网络来完成这场竞赛,其中一些在该分类任务中靠着超乎人类能力的表现而得分.在本系列的博客中,我们将会分别采访三位选手和卷积网络之父.Facebook人工智能实验室主任

R-FCN:基于区域的全卷积网络来检测物体

http://blog.csdn.net/shadow_guo/article/details/51767036 原文标题为"R-FCN: Object Detection via Region-based Fully Convolutional Networks ",作者代季峰 1,14年毕业的清华博士到微软亚洲研究院的视觉计算组,CVPR 16 两篇一作的会议主持人~ ╰(°▽°)╯ 同时公布了源码~ 2 后面主要内容为原文随便的翻译或概括.必有不紧贴原文原意之处,曲解请指出,否则

【Python图像特征的音乐序列生成】深度卷积网络,以及网络核心

这个项目主要涉及到两个网络,其中卷积神经网络用来提取图片表达的情绪,提取出一个二维向量. 网络结构如图: 词向量采用预训练的glove模型,d=50,其他信息包括了图片的"空旷程度".亮度.对比度等信息,用来更好地描述图片特征. 对于图中的卷积神经网络,需要讲解的地方是:卷积核是一个一维卷积核,每一层卷积层之后都连接了池化层,做的是最大值池化,每一层之间有固定的dropout层,最后输出的向量与我们预先设定的label进行计算,损失函数定义为 \[J(\theta)=-\sum_iy'

深度卷积网络

深度卷积网络 涉及问题: 1.每个图如何卷积: (1)一个图如何变成几个? (2)卷积核如何选择? 2.节点之间如何连接? 3.S2-C3如何进行分配? 4.16-120全连接如何连接? 5.最后output输出什么形式? ①各个层解释: 我们先要明确一点:每个层有多个Feature Map,每个Feature Map通过一种卷积滤波器提取输入的一种特征,然后每个Feature Map有多个神经元. C1层是一个卷积层(为什么是卷积?卷积运算一个重要的特点就是,通过卷积运算,可以使原信号特征增强

深度双向Transformer预训练【BERT第一作者分享】

目录 NLP中的预训练 语境表示 语境表示相关研究 存在的问题 BERT的解决方案 任务一:Masked LM 任务二:预测下一句 BERT 输入表示 模型结构--Transformer编码器 Transformer vs. LSTM 模型细节 在不同任务上进行微调 GLUE SQuAD 1.1 SQuAD 2.0 SWAG 分析 预训练的影响 方向与训练时间的影响 模型规模的影响 遮罩策略的影响 多语言BERT(机器翻译) 生成训练数据(机器阅读理解) 常见问题 结论 翻译自Jacob Dev

BERT论文翻译:用于语言理解的深度双向Transformer的预训练

Jacob Devlin Ming-Wei Chang Kenton Lee kristina Toutanova Google AI Language {jacobdevlin, mingweichang, kentonl, kristout}@google.com 摘要 本文介绍了一种新的语言表示模型BERT,意为“来自transformer的双向编码器表示”(Bidirectional Encoder Representations from Transformers).与最近的语言表示模