用图片搜索相似图片(视觉单词)

来源:互联网 发布:中国mysql用户组 编辑:程序博客网 时间:2024/05/21 11:25

代码地址

  • 代码GitHub地址

准备文件

  • vlfeat(SIFT的开源实现):下载地址
  • 解压后将vlfeat-0.9.20\bin\win32加到系统的Path路径中,以便在命令行用sift命令
  • 安装pysqlite:pip install pysqlite
  • 安装matplotlib:pip isntall matplotlib
  • 安装cherryPy(轻量级网页服务器):pip install cherrypy
  • 图片库:10000张猫咪图片

流程

  • 用vlfeat(SIFT特征模型)提取每一张图片的特征点
  • 将每一张图的特征点采样聚类成图片的视觉单词
  • 即视觉单词,就是对应图片的代表
  • 创建数据库,将每张图片的视觉单词入库,并建立索引
  • 编写cherryPy的web应用,根据点击的图片搜索相似的图片

提取图片特征点并生成单词文件

  • 前提保证cmd能执行sift命令
  • CMD执行Step1.py
# -*- coding:utf-8 -*-# Step1.py:提取图片的特征点并生成单词文件vocabulary.pklimport pickleimport vocabularyimport imtoolsimport sift# imlist是图片名字的列表,图片放在static文件夹下imlist = imtools.get_imlist('static/')# 图片的总数nbr_images = len(imlist)# 将每张图片的特征点存放进对应的.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对图片特征文件聚类训练出对应的单词# 时间关系,这里只用了46张图做例子,所以只创建46个单词voc = vocabulary.Vocabulary('imagewords')voc.train(featlist, 46, 10)# 将单词都保存到vocabulary.pkl中with open('vocabulary.pkl', 'wb') as f:    pickle.dump(voc,f)# 打印出单词总数量print 'vocabulary is:', voc.name, voc.nbr_words

将图片单词信息存进数据库

  • 数据库是sqlite
  • CMD执行:Step2.py
# -*- coding:utf-8 -*-# Step2.py:根据单词文件,将图片单词入sqlite数据库import pickleimport siftimport imagesearchimport imtools# 图片名字的列表imlist = imlist = imtools.get_imlist('static/')# 图片的数量nbr_images = len(imlist)# 对应图片特征文件的列表featlist = [ imlist[i][:-3]+'sift' for i in range(nbr_images)]# 载入单词文件# 将单词,图片名,地址存进数据库images.dbwith 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()

配置cherryPy网页应用

  • 没点击图片时随机显示15张图片
  • 点击其中一张猫猫图片,搜索相似的图片显示出来
  • 本质是根据点击图片的单词,寻找在数据库中与之相近的单词,并将其显示出来
  • CMD执行Step3.py
  • 在浏览器浏览:127.0.0.1:8080
# -*- coding:utf-8 -*-# Step3.py:用cherryPy做交互界面,显示结果import cherrypy, os, urllib, pickleimport imtoolsfrom numpy import *import imagesearch# cherryPy页面# 网页根目录在配置文件service.conf中设置# 默认端口是8080class 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()        # 设置开始显示的图片数目        self.maxres = 15        # 设置页面的结构        self.header = """            <!doctype html>            <head>            <title>Image search example</title>            </head>            <body>            """        self.footer = """            </body>            </html>            """    # 响应index页面    # 没有搜索的时候随机显示图片    # 搜索的时候显示与该图片相似的图片,根据视觉单词    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:            # 显示查询结果的图片            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'))

效果

  • 不搜索时:

  • 点击搜索时:

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我老婆是二婚带的小孩怎么办户口 ck手表带了脱不下来怎么办 消毒柜开孔尺寸高度太高了怎么办 苏宁易购买的东西比专卖店贵怎么办 手机打字键盘上没有语音功能怎么办 网贷催收发语音侮辱人怎么办 康力无机房电梯到楼层不关门怎么办 档案工龄少算了工资领开了怎么办 别人骚扰我打电话报警人走了怎么办 因外借医保卡被香港保险拒保怎么办 医保和社保断了一个月怎么办 苹果8呼叫受限请勿越权使用怎么办 药物储存2~8度没冰箱怎么办 利仁分体电饼铛做饼熟的慢怎么办 闲鱼买的东西自提有问题怎么办 老板油烟机的表层的膜掉了怎么办 给老板打工老板跑路了怎么办 公司要业务员承担客户的欠款怎么办 从自己公司出去抢自己客户怎么办? 在苏宁买东西买贵了怎么办 苏宁购物小票不见了未提货怎么办 结痂的地方扣掉了颜色不一样怎么办 实体店买手机不给发票怎么办 小孩学英语字母怎么都记不住怎么办 聊客老是提示网络连接失败怎么办? 天猫购物漏发客服不理怎么办 京东二维码被骗怎么办联系客服号码 京东客服打电话来让自己退款怎么办 淘宝上买到的衣服是坏的怎么办 淘宝上买到的产品是坏的怎么办? 在淘宝买到东西是坏的怎么办 冰箱冷冻室门生锈变形关不严怎么办 诲信电冰箱电脑板坏了怎么办 冰箱里放了热水后就不制冷了怎么办 双温冰柜冷藏矿泉水不冰怎么办 美的电饭煲e一传感器也没坏怎么办 美的电饭煲不工作显示C3怎么办 美的电饭煲啪一声响不工作了怎么办 误给宝宝吃了坏的饭怎么办 鼠标没反应键盘指示灯不亮怎么办 新买变频冰箱风机声音大怎么办