畢業(yè)設(shè)計 python圖像檢索系統(tǒng)
0 前言
?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項目系統(tǒng)達不到老師的要求。
為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天要分享的是
?? ?python圖像檢索系統(tǒng)設(shè)計與實現(xiàn)
??學(xué)長這里給一個題目綜合評分(每項滿分5分)
工作量:3分
創(chuàng)新點:4分
畢設(shè)幫助,選題指導(dǎo),技術(shù)解答,歡迎打擾,見B站個人主頁
https://space.bilibili.com/33886978
1 課題簡介
圖像檢索:是從一堆圖片中找到與待匹配的圖像相似的圖片,就是以圖找圖。
網(wǎng)絡(luò)時代,隨著各種社交網(wǎng)絡(luò)的興起,網(wǎng)絡(luò)中圖片,視頻數(shù)據(jù)每天都以驚人的速度增長,逐漸形成強大的圖像檢索數(shù)據(jù)庫。針對這些具有豐富信息的海量圖片,如何有效地從巨大的圖像數(shù)據(jù)庫中檢索出用戶需要的圖片,成為信息檢索領(lǐng)域研究者感興趣的一個研究方向。
2 圖像檢索介紹
給定一個包含特定實例(例如特定目標(biāo)、場景、建筑等)的查詢圖像,圖像檢索旨在從數(shù)據(jù)庫圖像中找到包含相同實例的圖像。但由于不同圖像的拍攝視角、光照、或遮擋情況不同,如何設(shè)計出能應(yīng)對這些類內(nèi)差異的有效且高效的圖像檢索算法仍是一項研究難題。

圖像檢索的典型流程 首先,設(shè)法從圖像中提取一個合適的圖像的表示向量。其次,對這些表示向量用歐式距離或余弦距離進行最近鄰搜索以找到相似的圖像。最后,可以使用一些后處理技術(shù)對檢索結(jié)果進行微調(diào)??梢钥闯?,決定一個圖像檢索算法性能的關(guān)鍵在于提取的圖像表示的好壞。
(1) 無監(jiān)督圖像檢索
無監(jiān)督圖像檢索旨在不借助其他監(jiān)督信息,只利用ImageNet預(yù)訓(xùn)練模型作為固定的特征提取器來提取圖像表示。
直覺思路 ?由于深度全連接特征提供了對圖像內(nèi)容高層級的描述,且是“天然”的向量形式,一個直覺的思路是直接提取深度全連接特征作為圖像的表示向量。但是,由于全連接特征旨在進行圖像分類,缺乏對圖像細節(jié)的描述,該思路的檢索準(zhǔn)確率一般。
利用深度卷積特征 ?由于深度卷積特征具有更好的細節(jié)信息,并且可以處理任意大小的圖像輸入,目前的主流方法是提取深度卷積特征,并通過加權(quán)全局求和匯合(sum-pooling)得到圖像的表示向量。其中,權(quán)重體現(xiàn)了不同位置特征的重要性,可以有空間方向權(quán)重和通道方向權(quán)重兩種形式。
CroW ?深度卷積特征是一個分布式的表示。雖然一個神經(jīng)元的響應(yīng)值對判斷對應(yīng)區(qū)域是否包含目標(biāo)用處不大,但如果多個神經(jīng)元同時有很大的響應(yīng)值,那么該區(qū)域很有可能包含該目標(biāo)。因此,CroW把特征圖沿通道方向相加,得到一張二維聚合圖,并將其歸一化并根號規(guī)范化的結(jié)果作為空間權(quán)重。CroW的通道權(quán)重根據(jù)特征圖的稀疏性定義,其類似于自然語言處理中TF-IDF特征中的IDF特征,用于提升不常出現(xiàn)但具有判別能力的特征。
Class weighted features ?該方法試圖結(jié)合網(wǎng)絡(luò)的類別預(yù)測信息來使空間權(quán)重更具判別能力。具體來說,其利用CAM來獲取預(yù)訓(xùn)練網(wǎng)絡(luò)中對應(yīng)各類別的最具代表性區(qū)域的語義信息,進而將歸一化的CAM結(jié)果作為空間權(quán)重。
PWA ?PWA發(fā)現(xiàn),深度卷積特征的不同通道對應(yīng)于目標(biāo)不同部位的響應(yīng)。因此,PWA選取一系列有判別能力的特征圖,將其歸一化之后的結(jié)果作為空間權(quán)重進行匯合,并將其結(jié)果級聯(lián)起來作為最終圖像表示。

(2) 有監(jiān)督圖像檢索

有監(jiān)督圖像檢索首先將ImageNet預(yù)訓(xùn)練模型在一個額外的訓(xùn)練數(shù)據(jù)集上進行微調(diào),之后再從這個微調(diào)過的模型中提取圖像表示。為了取得更好的效果,用于微調(diào)的訓(xùn)練數(shù)據(jù)集通常和要用于檢索的數(shù)據(jù)集比較相似。此外,可以用候選區(qū)域網(wǎng)絡(luò)提取圖像中可能包含目標(biāo)的前景區(qū)域。
孿生網(wǎng)絡(luò)(siamese network) ?和人臉識別的思路類似,使用二元或三元(++-)輸入,訓(xùn)練模型使相似樣本之間的距離盡可能小,而不相似樣本之間的距離盡可能大。
3 圖像檢索步驟
圖像檢索技術(shù)主要包含幾個步驟,分別為:
輸入圖片
特征提取
度量學(xué)習(xí)
重排序
特征提?。杭磳D片數(shù)據(jù)進行降維,提取數(shù)據(jù)的判別性信息,一般將一張圖片降維為一個向量;
度量學(xué)習(xí):一般利用度量函數(shù),計算圖片特征之間的距離,作為loss,訓(xùn)練特征提取網(wǎng)絡(luò),使得相似圖片提取的特征相似,不同類的圖片提取的特征差異性較大。
重排序:利用數(shù)據(jù)間的流形關(guān)系,對度量結(jié)果進行重新排序,從而得到更好的檢索結(jié)果。

4 應(yīng)用實例
學(xué)長在這做了個圖像檢索器的demo,效果如下
工程代碼:

關(guān)鍵代碼:
# _*_ coding=utf-8 _*_
from math import sqrt
import CV2
import time
import os
import numpy as np
from scipy.stats.stats import ?pearsonr
#配置項文件
import ?pymysql
from config import *
from mysql_config import *
from utils import getColorVec, Bdistance
db = pymysql.connect(DB_addr, DB_user, DB_passwod, DB_name )
def query(filename):
? ?if filename=="":
? ? ? ?fileToProcess=input("輸入子文件夾中圖片的文件名")
? ?else:
? ? ? ?fileToProcess=filename
? ?#fileToProcess="45.jpg"
? ?if(not os.path.exists(FOLDER+fileToProcess)):
? ? ? ?raise RuntimeError("文件不存在")
? ?start_time=time.time()
? ?img=CV2.imread(FOLDER+fileToProcess)
? ?colorVec1=getColorVec(img)
? ?#流式游標(biāo)處理
? ?conn = pymysql.connect(host=DB_addr, user=DB_user, passwd=DB_passwod, db=DB_name, port=3306,
? ? ? ? ? ? ? ? ? ? ? ? ? charset='utf8', cursorclass = pymysql.cursors.SSCursor)
? ?leastNearRInFive=0
? ?Rlist=[]
? ?namelist=[]
? ?init_str="k"
? ?for one in range(0, MATCH_ITEM_NUM):
? ? ? ?Rlist.append(0)
? ? ? ?namelist.append(init_str)
? ?with conn.cursor() as cursor:
? ? ? ?cursor.execute("select name, featureValue from "+TABLE_NAME+" order by name")
? ? ? ?row=cursor.fetchone()
? ? ? ?count=1
? ? ? ?while row is not None:
? ? ? ? ? ?if row[0] == fileToProcess:
? ? ? ? ? ? ? ?row=cursor.fetchone()
? ? ? ? ? ? ? ?continue
? ? ? ? ? ?colorVec2=row[1].split(',')
? ? ? ? ? ?colorVec2=list(map(eval, colorVec2))
? ? ? ? ? ?R2=pearsonr(colorVec1, colorVec2)
? ? ? ? ? ?rela=R2[0]
? ? ? ? ? ?#R2=Bdistance(colorVec1, colorVec2)
? ? ? ? ? ?#rela=R2
? ? ? ? ? ?#忽略正負性
? ? ? ? ? ?#if abs(rela)>abs(leastNearRInFive):
? ? ? ? ? ?#考慮正負
? ? ? ? ? ?if rela>leastNearRInFive:
? ? ? ? ? ? ? ?index=0
? ? ? ? ? ? ? ?for one in Rlist:
? ? ? ? ? ? ? ? ? ?if rela >one:
? ? ? ? ? ? ? ? ? ? ? ?Rlist.insert(index, rela)
? ? ? ? ? ? ? ? ? ? ? ?Rlist.pop(MATCH_ITEM_NUM)
? ? ? ? ? ? ? ? ? ? ? ?namelist.insert(index, row[0])
? ? ? ? ? ? ? ? ? ? ? ?namelist.pop(MATCH_ITEM_NUM)
? ? ? ? ? ? ? ? ? ? ? ?leastNearRInFive=Rlist[MATCH_ITEM_NUM-1]
? ? ? ? ? ? ? ? ? ? ? ?break
? ? ? ? ? ? ? ? ? ?index+=1
? ? ? ? ? ?count+=1
? ? ? ? ? ?row=cursor.fetchone()
? ?end_time=time.time()
? ?time_cost=end_time-start_time
? ?print("spend ", time_cost, ' s')
? ?for one in range(0, MATCH_ITEM_NUM):
? ? ? ?print(namelist[one]+"\t\t"+str(float(Rlist[one])))
if __name__ == '__main__':
? ?#WriteDb()
? ?#exit()
? ?query("")
效果




畢設(shè)幫助,選題指導(dǎo),技術(shù)解答,歡迎打擾,見B站個人主頁
https://space.bilibili.com/33886978