以图搜图之模型篇: 基于 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> ...
随机推荐
- linux修改时间显示格式
1. 问题描述 Linux下经常使用 "ls - ll"命令查看文件夹或文件创建及权限信息,但是满屏的Mar .May.Jul有点小难受. 2. 解决方案 修改bash_profi ...
- tomcat配置https以及配置完成后提示服务器缺少中间证书(已解决)
#### tomcat配置https 准备工作 下载好证书文件,下载的时候可以选择为tomcat文件.我这下载下来是压缩包.解压后就是下图的样子. 以.key结尾的文件是证书的key 以.pem结尾的 ...
- Java编程思想:File类getCanonicalFile()方法,listFile()方法
import java.io.IOException; import java.util.*; import java.util.regex.Pattern; import java.io.File; ...
- 跨站脚本攻击(存储型xss)笔记(二)
测试目标字段:页面下方的红色框位置. 由于编辑状态是编辑器,所以有可能出现跨站! 我插了个input然而并没有当代码执行 可能有些测试人员就认为被过滤掉了,因为尝试了各种尖括号.js事件.转义.编码等 ...
- c# Inner Join sql 和 Enumerable.Join
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp1 { class Pro ...
- 转载《Flex 布局》
网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂 ...
- 整型,布尔值,字符串详解,for语句
整型 -- 数字 用于比较和计算 + - * / // python 2 int --- long (长整型) /获取的是整数 Python3 int---整型 / 获取的浮点数 二进制 --- 就是 ...
- golang开发:类库篇(四)配置文件解析器goconfig的使用
为什么要使用goconfig解析配置文件 目前各语言框架对配置文件书写基本都差不多,基本都是首先配置一些基础变量,基本变量里面有环境的配置,然后通过环境变量去获取该环境下的变量.例如,生产环境跟测试环 ...
- exe崩溃用windbgattach后有宝贵现场,可看程序退出线程等,千万不要清屏
exe崩溃用windbgattach后有宝贵现场,可看程序退出线程等,千万不要清屏
- 和朱晔一起复习Java并发(四):Atomic
本节我们来研究下并发包中的Atomic类型. AtomicXXX和XXXAdder以及XXXAccumulator性能测试 先来一把性能测试,对比一下AtomicLong(1.5出来的).LongAd ...