0 簡(jiǎn)介
今天學(xué)長(zhǎng)向大家分享一個(gè)畢業(yè)設(shè)計(jì)項(xiàng)目
畢業(yè)設(shè)計(jì) 深度學(xué)習(xí)圖像搜索算法-圖像搜索引擎(源碼分享)
項(xiàng)目運(yùn)行效果:
畢業(yè)設(shè)計(jì) 深度學(xué)習(xí)圖像搜索算法-圖像搜索引擎
項(xiàng)目獲?。?/strong>文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-847828.html
https://gitee.com/assistant-a/project-sharing文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-847828.html
1 前言
圖像檢索:是從一堆圖片中找到與待匹配的圖像相似的圖片,就是以圖找圖。 網(wǎng)絡(luò)時(shí)代,隨著各種社交網(wǎng)絡(luò)的興起,網(wǎng)絡(luò)中圖片,視頻數(shù)據(jù)每天都以驚人的速度增長(zhǎng),逐漸形成強(qiáng)大的圖像檢索數(shù)據(jù)庫(kù)。針對(duì)這些具有豐富信息的海量圖片,如何有效地從巨大的圖像數(shù)據(jù)庫(kù)中檢索出用戶需要的圖片,成為信息檢索領(lǐng)域研究者感興趣的一個(gè)研究方向。2 圖像檢索介紹
給定一個(gè)包含特定實(shí)例(例如特定目標(biāo)、場(chǎng)景、建筑等)的查詢圖像,圖像檢索旨在從數(shù)據(jù)庫(kù)圖像中找到包含相同實(shí)例的圖像。但由于不同圖像的拍攝視角、光照、或遮擋情況不同,如何設(shè)計(jì)出能應(yīng)對(duì)這些類內(nèi)差異的有效且高效的圖像檢索算法仍是一項(xiàng)研究難題。
圖像檢索的典型流程 首先,設(shè)法從圖像中提取一個(gè)合適的圖像的表示向量。其次,對(duì)這些表示向量用歐式距離或余弦距離進(jìn)行最近鄰搜索以找到相似的圖像。最后,可以使用一些后處理技術(shù)對(duì)檢索結(jié)果進(jìn)行微調(diào)??梢钥闯?,決定一個(gè)圖像檢索算法性能的關(guān)鍵在于提取的圖像表示的好壞。
(1) 無(wú)監(jiān)督圖像檢索
無(wú)監(jiān)督圖像檢索旨在不借助其他監(jiān)督信息,只利用ImageNet預(yù)訓(xùn)練模型作為固定的特征提取器來(lái)提取圖像表示。
直覺(jué)思路 由于深度全連接特征提供了對(duì)圖像內(nèi)容高層級(jí)的描述,且是“天然”的向量形式,一個(gè)直覺(jué)的思路是直接提取深度全連接特征作為圖像的表示向量。但是,由于全連接特征旨在進(jìn)行圖像分類,缺乏對(duì)圖像細(xì)節(jié)的描述,該思路的檢索準(zhǔn)確率一般。
利用深度卷積特征 由于深度卷積特征具有更好的細(xì)節(jié)信息,并且可以處理任意大小的圖像輸入,目前的主流方法是提取深度卷積特征,并通過(guò)加權(quán)全局求和匯合(sum-pooling)得到圖像的表示向量。其中,權(quán)重體現(xiàn)了不同位置特征的重要性,可以有空間方向權(quán)重和通道方向權(quán)重兩種形式。
CroW 深度卷積特征是一個(gè)分布式的表示。雖然一個(gè)神經(jīng)元的響應(yīng)值對(duì)判斷對(duì)應(yīng)區(qū)域是否包含目標(biāo)用處不大,但如果多個(gè)神經(jīng)元同時(shí)有很大的響應(yīng)值,那么該區(qū)域很有可能包含該目標(biāo)。因此,CroW把特征圖沿通道方向相加,得到一張二維聚合圖,并將其歸一化并根號(hào)規(guī)范化的結(jié)果作為空間權(quán)重。CroW的通道權(quán)重根據(jù)特征圖的稀疏性定義,其類似于自然語(yǔ)言處理中TF-IDF特征中的IDF特征,用于提升不常出現(xiàn)但具有判別能力的特征。
Class weighted features 該方法試圖結(jié)合網(wǎng)絡(luò)的類別預(yù)測(cè)信息來(lái)使空間權(quán)重更具判別能力。具體來(lái)說(shuō),其利用CAM來(lái)獲取預(yù)訓(xùn)練網(wǎng)絡(luò)中對(duì)應(yīng)各類別的最具代表性區(qū)域的語(yǔ)義信息,進(jìn)而將歸一化的CAM結(jié)果作為空間權(quán)重。
PWA PWA發(fā)現(xiàn),深度卷積特征的不同通道對(duì)應(yīng)于目標(biāo)不同部位的響應(yīng)。因此,PWA選取一系列有判別能力的特征圖,將其歸一化之后的結(jié)果作為空間權(quán)重進(jìn)行匯合,并將其結(jié)果級(jí)聯(lián)起來(lái)作為最終圖像表示。
(2) 有監(jiān)督圖像檢索
有監(jiān)督圖像檢索首先將ImageNet預(yù)訓(xùn)練模型在一個(gè)額外的訓(xùn)練數(shù)據(jù)集上進(jìn)行微調(diào),之后再?gòu)倪@個(gè)微調(diào)過(guò)的模型中提取圖像表示。為了取得更好的效果,用于微調(diào)的訓(xùn)練數(shù)據(jù)集通常和要用于檢索的數(shù)據(jù)集比較相似。此外,可以用候選區(qū)域網(wǎng)絡(luò)提取圖像中可能包含目標(biāo)的前景區(qū)域。
孿生網(wǎng)絡(luò)(siamese network) 和人臉識(shí)別的思路類似,使用二元或三元(+±)輸入,訓(xùn)練模型使相似樣本之間的距離盡可能小,而不相似樣本之間的距離盡可能大。
3 圖像檢索步驟
圖像檢索技術(shù)主要包含幾個(gè)步驟,分別為:
-
輸入圖片
-
特征提取
-
度量學(xué)習(xí)
-
重排序
-
特征提?。杭磳D片數(shù)據(jù)進(jìn)行降維,提取數(shù)據(jù)的判別性信息,一般將一張圖片降維為一個(gè)向量;
-
度量學(xué)習(xí):一般利用度量函數(shù),計(jì)算圖片特征之間的距離,作為loss,訓(xùn)練特征提取網(wǎng)絡(luò),使得相似圖片提取的特征相似,不同類的圖片提取的特征差異性較大。
-
重排序:利用數(shù)據(jù)間的流形關(guān)系,對(duì)度量結(jié)果進(jìn)行重新排序,從而得到更好的檢索結(jié)果。
4 應(yīng)用實(shí)例
學(xué)長(zhǎng)在這做了個(gè)圖像檢索器的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
#配置項(xiàng)文件
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
#忽略正負(fù)性
#if abs(rela)>abs(leastNearRInFive):
#考慮正負(fù)
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("")
效果
項(xiàng)目運(yùn)行效果:
畢業(yè)設(shè)計(jì) 深度學(xué)習(xí)圖像搜索算法-圖像搜索引擎
最后
項(xiàng)目獲取:
https://gitee.com/assistant-a/project-sharing
到了這里,關(guān)于畢設(shè)開(kāi)源 深度學(xué)習(xí)圖像搜索算法-圖像搜索引擎(源碼分享)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!