vlfeat-0.9.20inwin32
加到系統(tǒng)的Path路徑中,以便在命令行用sift命令pip install pysqlite
pip isntall matplotlib
pip install cherrypy
Step1.py
# -*- coding:utf⑻ -*-
# Step1.py:提取圖片的特點點并生成單詞文件vocabulary.pkl
import pickle
import vocabulary
import imtools
import sift
# imlist是圖片名字的列表,圖片放在static文件夾下
imlist = imtools.get_imlist('static/')
# 圖片的總數(shù)
nbr_images = len(imlist)
# 將每張圖片的特點點寄存進對應(yīng)的.sift特點文件中
featlist = [ imlist[i][:-3]+'sift' for i in range(nbr_images)]
for i in range(nbr_images):
sift.process_image(imlist[i], featlist[i])
# 利用k-means對圖片特點文件聚類訓(xùn)練出對應(yīng)的單詞
# 時間關(guān)系,這里只用了46張圖做例子,所以只創(chuàng)建46個單詞
voc = vocabulary.Vocabulary('imagewords')
voc.train(featlist, 46, 10)
# 將單詞都保存到vocabulary.pkl中
with open('vocabulary.pkl', 'wb') as f:
pickle.dump(voc,f)
# 打印出單詞總數(shù)量
print 'vocabulary is:', voc.name, voc.nbr_words
Step2.py
# -*- coding:utf⑻ -*-
# Step2.py:根據(jù)單詞文件,將圖片單詞入sqlite數(shù)據(jù)庫
import pickle
import sift
import imagesearch
import imtools
# 圖片名字的列表
imlist = imlist = imtools.get_imlist('static/')
# 圖片的數(shù)量
nbr_images = len(imlist)
# 對應(yīng)圖片特點文件的列表
featlist = [ imlist[i][:-3]+'sift' for i in range(nbr_images)]
# 載入單詞文件
# 將單詞,圖片名,地址存進數(shù)據(jù)庫images.db
with open('vocabulary.pkl', 'rb')as f:
voc = pickle.load(f)
indx = imagesearch.Indexer('images.db', voc)
indx.create_tables()
for i in range(nbr_images):
locs,descr = sift.read_features_from_file(featlist[i])
indx.add_to_index(imlist[i],descr)
# 將命令提交履行
indx.db_commit()
Step3.py
127.0.0.1:8080
# -*- coding:utf⑻ -*-
# Step3.py:用cherryPy做交互界面,顯示結(jié)果
import cherrypy, os, urllib, pickle
import imtools
from numpy import *
import imagesearch
# cherryPy頁面
# 網(wǎng)頁根目錄在配置文件service.conf中設(shè)置
# 默許端口是8080
class SearchImage:
def __init__(self):
# 加載圖片名字列表
self.imlist = imtools.get_imlist('static/')
self.nbr_images = len(self.imlist)
self.ndx = range(self.nbr_images)
# 加載生成好的單詞文件
f = open('vocabulary.pkl', 'rb')
self.voc = pickle.load(f)
f.close()
# 設(shè)置開始顯示的圖片數(shù)目
self.maxres = 15
# 設(shè)置頁面的結(jié)構(gòu)
self.header = """
<!doctype html>
<head>
<title>Image search example</title>
</head>
<body>
"""
self.footer = """
</body>
</html>
"""
# 響應(yīng)index頁面
# 沒有搜索的時候隨機顯示圖片
# 搜索的時候顯示與該圖片類似的圖片,根據(jù)視覺單詞
def index(self,query=None):
self.src = imagesearch.Searcher('images.db', self.voc)
html = self.header
html += """
<br />
Click an image to search. <a href='?query='> Random selection </a> of images.
<br /><br />
"""
if query:
# 顯示查詢結(jié)果的圖片
res = self.src.query(query)[:self.maxres]
for dist,ndx in res:
imname = self.src.get_filename(ndx)
html += "<a href='?query="+imname+"'>"
html += "<img src='"+imname+"' width='100' />"
html += "</a>"
else:
# 隨機顯示圖片
random.shuffle(self.ndx)
for i in self.ndx[:self.maxres]:
imname = self.imlist[i]
html += "<a href='?query="+imname+"'>"
html += "<img src='"+imname+"' width='100' />"
html += "</a>"
html += self.footer
return html
index.exposed = True
# 啟動利用
cherrypy.quickstart(SearchImage(), '/', os.path.join(os.path.dirname(__file__), 'service.conf'))
不搜索時:
點擊搜索時: