1. 程式人生 > >影象相似度計算-kmeans聚類

影象相似度計算-kmeans聚類

關於影象相似度,主要包括顏色,亮度,紋理等的相似度,比較直觀的相似度匹配是直方圖匹配.直方圖匹配演算法簡單,但受亮度,噪聲等影響較大.另一種方法是提取影象特徵,基於特徵進行相似度計算,常見的有提取影象的sift特徵,再計算兩幅影象的sift特徵相似度.對於不同的影象型別,也可以採用不同的特徵,例如對於人臉如下,可以採用人臉識別網路提取人臉特性向量.本文介紹利用LightCNN提取人臉特徵向量,並進行影象聚類的方法.

首先提取影象特徵向量,由於是對人臉影象進行聚類,因此採用LightCNN提取影象的特徵向量,github程式碼和模型下載:https://github.com/AlfredXiangWu/LightCNN

.

下載程式碼和模型後,執行,extract_features.py提取影象的特徵向量,LightCNN提取特徵向量為256維.

將所有圖片的特徵向量儲存在一個矩陣中,特徵矩陣.例如有10張影象,則特徵矩陣為 10 × 256 的矩陣.

之後採用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()

聚類效果:

這裡寫圖片描述