1.转换成分类问题,一张图片一个类,比如库里有1w张图片,就做1w二分类,分类结果作为相似度得分;缺点:(1)类别过多,在线负担重(2)训练样本收集成本太高
2.计算两张图片的损失,但是图形位置不同,即使一样损失也很大;可以把图像重心移动到同一个位置,消除位置不一致。缺点:一模一样的可以找出,相似的不一定找出,解决方案还是计算距离
3.用对应位置像素差距离,最大的问题就是容易被扰动
(1)扰动:图像位置偏差,多余像素点,书写风格
(2)把图像用靠谱的方法进行有损压缩,压缩的结果里面的噪声应该会大大减少;但是有损压缩会尽量留住最重要的轮廓信息,损失那些噪声信息
(3)encoder进行信息损失的时候,会尽量留下关键信息(字符的骨架),decoder尽量学习怎么从骨架进行还原(有损恢复)
4.记住:关键信息看整体,而不是看单个,具体是自身和其他最具区分能力的信息
5.计算图像之间的相似度:
- 防止噪声,包括污染的像素点,图像的变形
- 避免硬匹配
6.做项目的图像需求:查找类似的图片,相似;去重复,防抄袭,相同
7.以前图像的方法:统计每一个小区域的几何特征,有多少个圆弧,有多少条直线
- 最大问题就是需要很强的领域知识,不同领域换不用的方法,差异很大
- 最大的惊喜:特征自动学习,深度学习也叫自动特征提取器(书法,风格)
8.编码:
- 通信领域:信号无损传递,在传递过程中能够抵抗噪声干扰 信号可以理解成几乎没有噪声的信号 奇偶校验编码只和自身有关
- 机器学习领域:编码是有损编码,希望通过编码对特征进行提取,消除信息量少的东西,原因:信号本身有噪声编码需要考虑全局信息 (要求有一定的数据量,并且数据变化时,需要适时重新编码)
9.项目收获:a理解需求 b编码角度思考问题 c考虑长期更新的问题
10.拓展:
- 以图搜图:需要重视准确率
- 公安找嫌疑犯:需要重视召回率,
11.降维:特征维度低,每个图像在各个特征上都有取值;升维:特征维度高,但是每个图像智能选择最重要的特征进行拓展
12.图片特征的正排索引:
import keras
from keras.models import Model
from keras.layers import Input,Dense,Lambda
from keras import backend as K
from keras import regularizers
import numpy as np
from PIL import Image
import random
import scipy.misc
def convert(x,width,height):
img = x.reshape(width,height)
img=np.floor(255*img)
img.dtype="int32"
return img
def read_data(path):
with open(path) as f :
lines=f.readlines()#[0:100]
lines=[eval(line.strip()) for line in lines]
random.shuffle(lines)
X,_=zip(*lines)
t=int(0.98*len(lines))
x_train=np.array(X[0:t])
x_test=np.array(X[t:])
return x_train,x_test
def get_model():
input_img = Input(shape=(28*28,))
encoded = Dense(100, activation='relu')(input_img)
decoded = Dense(784, activation='sigmoid')(encoded)
autoencoder = Model(inputs=input_img, outputs=decoded)
encoder = Model(inputs=input_img, outputs=encoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
return autoencoder,encoder
x_train,x_test=read_data("../img_data")
x_train = x_train.astype('float32')/255.0
x_train_nosiy = x_train + 0.3 * np.random.normal(loc=0., scale=1., size=x_train.shape)
x_test = x_test.astype('float32')/255.0
x_train = x_train.reshape(x_train.shape[0], -1)
x_train_nosiy = x_train.reshape(x_train.shape[0], -1)
x_test = x_test.reshape(x_test.shape[0], -1)
#print x_train.shape
model1,encoder1=get_model()
model2,encoder2=get_model()
epochs=50
# train without noise
model1.fit(x_train, x_train, epochs=epochs, batch_size=128)
# train with noise
model2.fit(x_train_nosiy, x_train, epochs=epochs, batch_size=128)
x_test1=model1.predict(x_test)
x_test2=model2.predict(x_test)
i=0
for x,x1,x2 in zip(x_test,x_test1,x_test2):
x=convert(x,28,28)
x1=convert(x1,28,28)
x2=convert(x2,28,28)
scipy.misc.imageio.imwrite("result/{}-0.png".format(i),x) #原
scipy.misc.imageio.imwrite("result/{}-1.png".format(i),x1)#压缩
scipy.misc.imageio.imwrite("result/{}-2.png".format(i),x2)#噪声
i+=1
encoder2.save("../search_img_project/img_model.h5")