1.转换成分类问题,一张图片一个类,比如库里有1w张图片,就做1w二分类,分类结果作为相似度得分;缺点:(1)类别过多,在线负担重(2)训练样本收集成本太高

2.计算两张图片的损失,但是图形位置不同,即使一样损失也很大;可以把图像重心移动到同一个位置,消除位置不一致。缺点:一模一样的可以找出,相似的不一定找出,解决方案还是计算距离

3.用对应位置像素差距离,最大的问题就是容易被扰动

  (1)扰动:图像位置偏差,多余像素点,书写风格

  (2)把图像用靠谱的方法进行有损压缩,压缩的结果里面的噪声应该会大大减少;但是有损压缩会尽量留住最重要的轮廓信息,损失那些噪声信息

  (3)encoder进行信息损失的时候,会尽量留下关键信息(字符的骨架),decoder尽量学习怎么从骨架进行还原(有损恢复)

java在大图片中找下小图片位置_ci

 

4.记住:关键信息看整体,而不是看单个,具体是自身和其他最具区分能力的信息

5.计算图像之间的相似度:

  1. 防止噪声,包括污染的像素点,图像的变形
  2. 避免硬匹配

6.做项目的图像需求:查找类似的图片,相似;去重复,防抄袭,相同

7.以前图像的方法:统计每一个小区域的几何特征,有多少个圆弧,有多少条直线

  1. 最大问题就是需要很强的领域知识,不同领域换不用的方法,差异很大
  2. 最大的惊喜:特征自动学习,深度学习也叫自动特征提取器(书法,风格)

8.编码:

  1. 通信领域:信号无损传递,在传递过程中能够抵抗噪声干扰 信号可以理解成几乎没有噪声的信号  奇偶校验编码只和自身有关
  2. 机器学习领域:编码是有损编码,希望通过编码对特征进行提取,消除信息量少的东西,原因:信号本身有噪声编码需要考虑全局信息 (要求有一定的数据量,并且数据变化时,需要适时重新编码)

9.项目收获:a理解需求  b编码角度思考问题  c考虑长期更新的问题

10.拓展:

  1. 以图搜图:需要重视准确率
  2. 公安找嫌疑犯:需要重视召回率,

11.降维:特征维度低,每个图像在各个特征上都有取值;升维:特征维度高,但是每个图像智能选择最重要的特征进行拓展

12.图片特征的正排索引:

java在大图片中找下小图片位置_人工智能_02

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")