tensorflow提取VGG特征 - weixin_38208741的博客 - CSDN博客
vgg-16一种深度卷积神经网络模型,16表示其深度。模型可以达到92.7%的测试准确度。它的数据集包括1400万张图像,1000个类别。
- import scipy.io as sio
- from scipy.misc import imread, imresize
- sess = tf.Session()
- imgs = tf.placeholder(tf.float32, [None, 224, 224, 3])
- vgg = vgg16(imgs, '/aa/data/vgg16_weights.npz', sess)
- img1 = imread('/aa/data/laska.png', mode='RGB')
- img1 = imresize(img1, (224, 224))
- path = '/aa/data/AllSample/'
- for i in range(1,211):
- img = imread(path+str(i)+'.jpg',mode='RGB')
- print(path+str(i)+'.jpg')
- img = imresize(img, (224, 224))
- feature = sess.run(vgg.pool5, feed_dict={vgg.imgs: [img]})
- feature = np.reshape(feature,[7,7,512])
- dic = {'features':feature}
- sio.savemat('/aa/data/features/'+str(i)+'.mat',dic)
- # features = feature.eval(session=sess)
- # features = np.reshape(features,[7,7,512])
-
在我们的实际项目中,一般不会直接从第一层直接开始训练,而是通过在大的数据集上(如ImageNet)训练好的模型,把前面那些层的参数固定,在运用到我们新的问题上,修改最后一到两层,用自己的数据去微调(finetuning),一般效果也很好。
所谓finetuning,就是说我们针对某相似任务已经训练好的模型,比如CaffeNet, VGG-16, ResNet等, 再通过自己的数据集进行权重更新, 如果数据量比较小,可以只更新最后一层,其他层的权重不变,如果数据量中等,可以训练后面几层,如果数据量很大,那OK,直接从头训练,只不过在训练时间上,需要花费比较多。
在网络训练好之后,只需要forward过程就能做预测,当然,我们也可以直接把这个网络当成一个feature extractor来用,可以直接用任何一层的输出作为特征,根据R-CNN论文对Alexnet的实验结果,如果不做fine-tuning,pool5和fc6和fc7的特征效果并没有很强的提升,所以,如果直接用作feature extractor,直接用pool的最后一层输出就OK。
vgg-16一种深度卷积神经网络模型,16表示其深度。模型可以达到92.7%的测试准确度。它的数据集包括1400万张图像,1000个类别。
https://github.com/ry/tensorflow-vgg16
vgg-16是我最喜欢运行的图像分类的模型,因为它的简单性和准确性。这种模型的创造者发表了可用于Caffe的预先训练二进制。
https://gist.github.com/ksimonyan/211839e770f7b538e2d8#file-readme-md
MD5 (VGG_ILSVRC_16_layers.caffemodel) = 441315b0ff6932dbfde97731be7ca852
这是将特定的文件转换到一个tensorflow模型并检查其正确性。
运行make下载原始的caffe模型并转换。tf_forword.py里有一个怎样使用产生的vgg16.tfmodel的例子。如果你不想按照caffe,你可以从这下载输出 https://github.com/ry/tensorflow-vgg16/raw/master/vgg16-20160129.tfmodel.torrent
TF模型的输入(“image”)应该是[批次,高度,宽度,通道],其中高度=宽度=224,通道=3.值应该在0到1之间。
输出(“prob”)是一个1000维的类概率向量,这个向量的索引对应syset.txt里的行号。
https://github.com/leihe001/tensorflow-vgg
这是个基于 tensorflow-vgg16和 Caffe to TensorFlow的VGG16和VGG19的一个TensorFlow的实现。
我们修改了tensorflow-vgg16的实现使用numpy加载取代默认的tensorflow加载,目的是加速初始化和减少总的内存使用量。此实现允许进一步修改网络,例如移除FC层,或者增加批大小。
为了使用VGG网络,需要下载 VGG16 NPY和 VGG19的npy文件。
## 使用 使用这个编译VGG工程
vgg = vgg19.Vgg19()
vgg.build(images)
或者
vgg = vgg16.Vgg16()
vgg.build(images)
图像是一个维度是[None,224,224,3]的张量。
张量可以是一个占位,一个变量甚至是一个常量。
所有的VGG层(张量)可以通过vgg对象访问。例如,vgg.conv1_1, vgg.conv1_2, vgg.pool5, vgg.prob, ...test_vgg16.py and test_vgg19.py包含样例的使用。
##额外 在我的另一个tensorflow图像风格合成项目中使用了这个库: stylenet
##更新 添加一个可训练的VGG19版本vgg19_trainable.支持从现有的变量或从开始训练。(但是不包括训练器)
test_vgg19_trainabel里添加了一个简单的测试。switch里有如何训练,关闭训练模型进行验证,以及如何保存的例子。
我添加了一个单独的文件(不是修改现有的),因为我想保持原始VGG网络的简单性。