【发布时间】:2017-11-05 20:52:37
【问题描述】:
我正在尝试使用中文耳语算法进行人脸聚类。我使用 dlib 和 python 来提取每个人脸的特征并映射到 128 D 向量中,如 Davisking 在https://github.com/davisking/dlib/blob/master/examples/dnn_face_recognition_ex.cpp 中所述。
然后我按照那里给出的说明构建了一个图表。我实现了中文耳语算法并应用于此图。谁能告诉我我犯了什么错误?任何人都可以使用中文耳语算法上传用于面部聚类的python代码吗?这是我的中文耳语代码:
import networkx as nx
import random
from random import shuffle
import math
def chinese_whispers(nodes,edges,iterations):
G = nx.Graph()
G.add_nodes_from(nodes)
#print(G.node)
for n, v in enumerate(nodes):
G.node[n]['class'] = v
#print(n,v)
G.add_edges_from(edges)
#gn=G.nodes()
#for node in gn:
#print((node,G[node],G.node,G.node[node]))
#(0, {16: {'weight': 0.49846761956907698}, 14: {'weight': 0.55778036559581601}, 7: {'weight': 0.43902511314524784}}, {'class': 0})
for z in range(0, iterations):
gn = G.nodes()
# I randomize the nodes to give me an arbitrary start point
shuffle(gn)
for node in gn:
neighs = G[node]
classes = {}
# do an inventory of the given nodes neighbours and edge weights
for ne in neighs:
if isinstance(ne, int):
key=G.node[ne]['class']
if key in classes:
classes[key] += G[node][ne]['weight']
else:
classes[key] = G[node][ne]['weight']
# find the class with the highest edge weight sum
max = 0
maxclass = 0
for c in classes:
if classes[c] > max:
max = classes[c]
maxclass = c
# set the class of target node to the winning local class
G.node[node]['class'] = maxclass
n_clusters = []
for node in G.nodes():
n_clusters.append(G.node[node]['class'])
return(n_clusters)
这里是面部特征提取和128D向量中每个人脸的编码代码,以及这些用于应用中文耳语的图的构造。
from sklearn import cluster
import cv2
import sys
import os
import dlib
import glob
from skimage import io
import numpy as np
from sklearn.cluster import KMeans
from sklearn.manifold import TSNE
from matplotlib import pyplot as plt
import chinese
from chinese import chinese_whispers
predictor_path = "/home/deeplearning/Desktop/face_recognition
examples/shape_predictor_68_face_landmarks.dat"
face_rec_model_path = "/home/deeplearning/Desktop/face_recognition
examples/dlib_face_recognition_resnet_model_v1.dat"
faces_folder_path = "/home/deeplearning/Desktop/face_recognition
examples/test11/"
# Load all the models we need: a detector to find the faces, a shape predictor
# to find face landmarks so we can precisely localize the face, and finally the
# face recognition model.
detector = dlib.get_frontal_face_detector()
#print (detector)
sp = dlib.shape_predictor(predictor_path)
facerec = dlib.face_recognition_model_v1(face_rec_model_path)
#win = dlib.image_window()
# Now process all the images
dict={}
for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")):
print("Processing file: {}".format(f))
img = io.imread(f)
dets = detector(img, 3)
for k, d in enumerate(dets):
shape = sp(img, d)
face_descriptor = facerec.compute_face_descriptor(img, shape)
a=np.array(face_descriptor)
dict[(f,d)] = (a,f)
answ=np.array(list(dict.values()))
tmp=answ.shape[0]
ans=np.zeros((tmp,128))
for i in range(tmp):
ans[i]=np.array(answ[i][0])
nodes=[]
for i in range(tmp):
nodes.append(i)
edges=[]
for i in range(tmp):
for j in range(i+1,tmp):
dist=np.sqrt(np.sum((ans[i]-ans[j])**2))
if dist < 0.6:
edges.append((i,j,{'weight': dist}))
iterations=10
cluster=chinese_whispers(nodes,edges,iterations)
我不明白我做错了什么。有人可以帮我解决这个问题吗? 提前致谢。
【问题讨论】:
-
欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。
-
“但我没有得到很好的准确性”不是一个很有帮助的问题描述。堆栈溢出最适合解决具体问题,还有这类问题