以图搜图之模型篇: 基于 InceptionV3 的模型 finetune
在以图搜图的过程中,需要以来模型提取特征,通过特征之间的欧式距离来找到相似的图形。
本次我们主要讲诉以图搜图模型创建的方法。
图片预处理方法,看这里:https://keras.io/zh/preprocessing/image/
本文主要参考了这位大神的文章, 传送门在此: InceptionV3进行fine-tuning
训练模型代码如下:
# 基本流程
#
import os
import sys
import glob
import argparse
import matplotlib.pyplot as plt from keras.applications.inception_v3 import InceptionV3, preprocess_input
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import SGD # 一、定义函数
IM_WIDTH, IM_HEIGHT = 299, 299 # inceptionV3 指定图片尺寸
FC_SIZE = 1024 # 全连接层的数量 # 二、数据处理
# 图片归类放在不同文件夹下
train_dir = 'E:/Project/Image/data/finetune/train' # 训练集数据
val_dir = 'E:/Project/Image/data/finetune/test' # 验证集数据
nb_epoch = 1
batch_size = 15
nb_classes = len(glob.glob(train_dir + "/*")) # 分类数 # 图片增强
# ImageDataGenerator 会自动根据路径下的文件夹创建标签,所以在代码中只看到输入的 x, 看不到 y
train_datagen = ImageDataGenerator(
preprocessing_function=preprocess_input,
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True
) train_generator = train_datagen.flow_from_directory(
train_dir, target_size=(IM_WIDTH, IM_HEIGHT),batch_size=batch_size, class_mode='categorical'
) validation_generator = train_datagen.flow_from_directory(
val_dir, target_size=(IM_WIDTH, IM_HEIGHT),batch_size=batch_size, class_mode='categorical'
) # 三、使用 bottleneck finetune
# 去掉 模型最外层的全连接层,添加上自己的 全连接层
# 添加新层函数
def add_new_last_layer(base_model, nb_classes):
x = base_model.output
x = GlobalAveragePooling2D()(x) # 下采样
x = Dense(FC_SIZE, activation='relu')(x)
predict_bottle_feat = Dense(nb_classes, activation='softmax')(x)
model = Model(input=base_model.input, output=predict_bottle_feat)
return model # 冻结 base_model 所有层
def setup_to_transfer_learn(model, base_model):
for layer in base_model.layers:
layer.trainable = False
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) # 定义网络框架
base_model = InceptionV3(weights='imagenet', include_top=False)
model = add_new_last_layer(base_model, nb_classes)
setup_to_transfer_learn(model, base_model) # 训练
# 模式一训练
steps = 20 # 可以自由定义,越大结果越精准,但过大容易过拟合
history_tl = model.fit_generator(
train_generator,
epochs=nb_epoch,
steps_per_epoch=steps,
validation_data=validation_generator,
validation_steps=steps,
class_weight='auto') # 保存模型
model.save("my_inceptionV3.h5")
使用模型提取指定层的特征:
from keras.preprocessing import image
from keras_applications.inception_v3 import preprocess_input
from keras.models import Model, load_model
import numpy as np target_size = (229, 229) #fixed size for InceptionV3 architecture
base_model = load_model(filepath="my_inceptionV3.h5") # 需要提取那一层的特征,此处就写入指定层的名称
model = Model(input=base_model.input, output=base_model.get_layer('block4_pool').output) img_path = "C:/Users/Administrator/Pictures/搜图/horse.jpg"
img = image.load_img(img_path, target_size=target_size)
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x) block4_pool_features = model.predict(x)
使用模型进行预测:
from keras.preprocessing import image
from keras.models import load_model
import numpy as np
import json
from keras_applications.imagenet_utils import decode_predictions def predict(model, img, target_size):
"""Run model prediction on image
Args:
model: keras model
img: PIL format image
target_size: (w,h) tuple
Returns:
list of predicted labels and their probabilities
"""
if img.size != target_size:
img = img.resize(target_size) x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
preds = model.predict(x) # 此处获取的为
return preds[0] # 返回 numpy array [classes, ] def decode_predict(probalities_list):
with open("img_classes.json", 'r') as load_f:
load_dict = json.load(load_f)
index = probalities_list.index(max(probalities_list))
target_class = load_dict[str(index)]
return target_class target_size = (229, 229) #fixed size for InceptionV3 architecture
model = load_model(filepath="my_inceptionV3.h5")
img = image.load_img("C:/Users/Administrator/Pictures/搜图/horse.jpg") res_numpy = predict(model, img, target_size=target_size)
res_list = res_numpy.tolist()
target_class = decode_predict(res_list)
print(target_class)
以图搜图之模型篇: 基于 InceptionV3 的模型 finetune的更多相关文章
- Google 以图搜图 - 相似图片搜索原理 - Java实现
前阵子在阮一峰的博客上看到了这篇<相似图片搜索原理>博客,就有一种冲动要将这些原理实现出来了. Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相 ...
- Google 以图搜图 - 相似图片搜索原理 - Java实现 (转)
前阵子在阮一峰的博客上看到了这篇<相似图片搜索原理>博客,就有一种冲动要将这些原理实现出来了. Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相 ...
- 使用 selenium 实现谷歌以图搜图爬虫
使用selenium实现谷歌以图搜图 实现思路 原理非常简单,就是利用selenium去操作浏览器,获取到想要的链接,然后进行图片的下载,和一般的爬虫无异. 用到的技术:multiprocessing ...
- 以图搜图(一):Python实现dHash算法(转)
近期研究了一下以图搜图这个炫酷的东西.百度和谷歌都有提供以图搜图的功能,有兴趣可以找一下.当然,不是很深入.深入的话,得运用到深度学习这货.Python深度学习当然不在话下. 这个功能最核心的东西就是 ...
- 实践torch.fx第一篇——基于Pytorch的模型优化量化神器
第一篇--什么是torch.fx 今天聊一下比较重要的torch.fx,也趁着这次机会把之前的torch.fx笔记整理下,笔记大概拆成三份,分别对应三篇: 什么是torch.fx 基于torch.fx ...
- 【Python之路】特别篇--基于领域驱动模型架构设计的京东用户管理后台
一.预备知识: 1.接口: - URL形式 - 数据类型 (Python中不存在) a.类中的方法可以写任意个,想要对类中的方法进行约束就可以使用接口: b.定义一个接口,接口中定义一个方法f1: c ...
- [No000007]搜索引擎以图搜图的原理
之前,Google把"相似图片搜索"正式放上了首页. 你可以用一张图片,搜索互联网上所有与它相似的图片.点击搜索框中照相机的图标. 一个对话框会出现. 你输入网片的网址,或者直接上 ...
- php 以图搜图
感知哈希算法count < =5 匹配最相似count > 10 两张不同的图片var_dump(ImageHash::run('1.jpg’, '2.jpg’)); <?php c ...
- 谷歌百度以图搜图 "感知哈希算法" C#简单实现
/// <summary> /// 感知哈希算法 /// </summary> public class ImageComparer { /// <summary> ...
随机推荐
- 串门赛: NOIP2016模拟赛——By Marvolo 丢脸记
前几天liu_runda来机房颓废,顺便扔给我们一个网址,说这上面有模拟赛,让我们感兴趣的去打一打.一开始还是没打算去看一下的,但是听std说好多人都打,想了一下,还是打一打吧,打着玩,然后就丢脸了. ...
- 【基本数据结构-集合(set)详解】-C++
集合是数学中的一个基本概念,通俗地理解,集合是由一些不重复的数据组成的.比如 就是{1,2,3} 一个有1,2,3三个元素的集合. 在 C++ 中我们常用的集合是 set . 它包含在头文件#incl ...
- CAxWindow
AtlAxWinInit(); CAxWindow m_wndFlashPlayer; CComPtr<IShockwaveFlash> m_FlashPtr; CComPtr<IU ...
- Excel催化剂开源第45波-按原图大小导出图片
从Excel中导出图片,是一个很常规的需求,也有一些久旧不衰的界面操作法小技巧从OpenXml文件中批量导出,在VBA开发中,也会使用Chart对象的背景图的技巧来导出.总体来说,和真正想要的效果还是 ...
- Excel催化剂开源第43波-Excel选择对象Selection在.Net开发中的使用
Excel的二次开发有一极大的优势所在,可以结合用户的交互进行程序的运行,大量用户的交互,都是从选择对象开始,用户选择了单元格区域.图形.图表等对象,之后再进行程序代码的加工处理,生成用户所需的最终结 ...
- 在Ubuntu中安装Docker和docker的使用
1.在Ubuntu中安装Docker 更新ubuntu的apt源索引 sudo apt-get update 安装包允许apt通过HTTPS使用仓库 sudo apt-get install \ ap ...
- python List交集、并集、差集
工作中遇到了求两个集合的差集,但是集合集合中包含字典,所以使用difference方法会报错,看了一些别人的博客,整理了一下. 1. 获取两个list 的交集print list(set(a).int ...
- JAVA-注解(2)-自定义注解及反射注解
自定义注解开发 1.开发一个注解类 开发一个注解类的过程,非常类似于开发一个接口,只不过需要通过@interface关键字来声明 2.使用元注解修饰注解的声明 所谓的原注解是用来修饰注解声明的注释,可 ...
- 仿制shazzam的简单功能,将hlsl转换为WPF中的ShaderEffect
(此文章只是在对WPF的Effect产生兴趣才稍微研究了一点后面的知识;需要了解更多可参考https://archive.codeplex.com/?p=shazzam的源代码以及WPF基础知识) 1 ...
- Linux常用命令3
useradd 添加用户账号 -n 制定uid标记号 -d 指定宿主目录,缺省默认为/home/用户名 -e 制定账号失效时间 -M 不为用户建立初始化宿主目录(通常作为不登陆账号) -s 指定用户的 ...