影象相似度計算-kmeans聚類
阿新 • • 發佈:2018-11-06
關於影象相似度,主要包括顏色,亮度,紋理等的相似度,比較直觀的相似度匹配是直方圖匹配.直方圖匹配演算法簡單,但受亮度,噪聲等影響較大.另一種方法是提取影象特徵,基於特徵進行相似度計算,常見的有提取影象的sift特徵,再計算兩幅影象的sift特徵相似度.對於不同的影象型別,也可以採用不同的特徵,例如對於人臉如下,可以採用人臉識別網路提取人臉特性向量.本文介紹利用LightCNN提取人臉特徵向量,並進行影象聚類的方法.
首先提取影象特徵向量,由於是對人臉影象進行聚類,因此採用LightCNN提取影象的特徵向量,github程式碼和模型下載:https://github.com/AlfredXiangWu/LightCNN
下載程式碼和模型後,執行,extract_features.py提取影象的特徵向量,LightCNN提取特徵向量為256維.
將所有圖片的特徵向量儲存在一個矩陣中,特徵矩陣.例如有10張影象,則特徵矩陣為 的矩陣.
之後採用kmeans對特徵向量進行聚類:
feature_matrix = np.asarray(cPickle.load (open('features.pkl','rb')),'rb')))
num_clusters = 6
km_cluster = KMeans(n_clusters=num_clusters, max_iter=300, tol=1e-10,n_init=40, \
init='k-means++',algorithm='full', n_jobs=-1)
result = km_cluster.fit(feature_matrix)
feature_matrix為特徵矩陣,將影象聚類為num_clusters 類,result為聚類結果,包含聚類類別,聚類中心等.
關於影象聚類結果顯示,由於每張影象大小不同,而影象的特徵向量為256維,不能直接顯示.因此採用pca對特徵向量進行降為.具體為將256維特徵向量降為2維,即座標點x,y,這樣便可以在二維空間將聚類結果視覺化.
pca = PCA(n_components=2) #輸出兩維
newData = pca.fit_transform(feature_matrix ) #載入N維
最後每張影象的座標點按照聚類類別標記為不同的顏色,從而視覺化:
x1 = []
y1 = []
x2 = []
y2 = []
x3 = []
y3 = []
x4 = []
y4 = []
x5 = []
y5 = []
labels=result.labels_
for i in xrange(len(feature_matrix)):
if labels[i] == 0:
x1.append(newData[i][0])
y1.append(newData[i][1])
elif labels[i] == 1:
x2.append(newData[i][0])
y2.append(newData[i][1])
elif labels[i] == 2:
x3.append(newData[i][0])
y3.append(newData[i][1])
elif labels[i] == 3:
x4.append(newData[i][0])
y4.append(newData[i][1])
elif labels[i] == 4:
x5.append(newData[i][0])
y5.append(newData[i][1])
# 四種顏色 紅 綠 藍 黑
plt.plot(x1, y1, 'or')
plt.plot(x2, y2, 'og')
plt.plot(x3, y3, 'ob')
plt.plot(x4, y4, 'ok')
plt.plot(x5, y5, 'om')
plt.show()
聚類效果: