Данные методы, касающиеся выбора триплетов в режиме онлайн для распознавания лиц
train_dir="/content/training/"
def get_random_faces():
face_folder=os.listdir(train_dir)
face_path=[os.path.join(train_dir,face_) for face_ in face_folder]
random_face_folder=numpy.random.choice(face_path,32,replace=False)
random_face_values=[cv2.imread(os.path.join(facedir,facename))/255. for facedir in random_face_folder for facename in os.listdir(facedir)]
random_face_names=[facedir[len(train_dir):] for facedir in random_face_folder for facename in os.listdir(facedir)]
#print("Face values")
#print(random_face_values)
#print("Face Names")
#print(random_face_names)
return random_face_values,random_face_names
def triplet(random_face_values,random_face_names):
anchor=[]
positive=[]
negative=[]
anchor_labels=[]
positive_labels=[]
negative_labels=[]
random_face_values=numpy.array(random_face_values)
random_face_values=random_face_values.reshape(len(random_face_values),96,96,3)
random_face_names=numpy.array(random_face_names)
#print(random_face_values[0])
with graph.as_default():
random_face_embedding=model.predict(random_face_values,batch_size=32)
distance_matrix=pairwise_distances(random_face_embedding,metric="sqeuclidean")
class_labels=numpy.unique(random_face_names,axis=0)
for label in class_labels:
pos_samples=numpy.where(label==numpy.array(random_face_names))[0]
if(len(pos_samples)==1):
continue
for i,j in itertools.combinations(pos_samples,2):
positive_distance=distance_matrix[i,j]
neg_bool=numpy.where((label!=numpy.array(random_face_names))*(distance_matrix[i]-positive_distance<0.25))
if len(neg_bool)>0:
random_negative_index=numpy.random.choice(len(neg_bool))
neg_index=neg_bool[random_negative_index]
anchor.append(random_face_values[i])
positive.append(random_face_values[j])
negative.append(random_face_values[neg_index])
anchor_labels.append(random_face_names[i])
positive_labels.append(random_face_names[j])
negative_labels.append(random_face_names[neg_index])
del random_face_values
del random_face_names
#print(len(anchor))
gc.collect()
return anchor,positive,negative,anchor_labels,positive_labels,negative_labels
def generate():
while True:
anchor=[]
positive=[]
negative=[]
random_face_values,random_face_names=get_random_faces()
anch,pos,neg,anch_label,pos_label,neg_label=triplet(random_face_values,random_face_names)
anchor.extend(anch)
positive.extend(pos)
negative.extend(neg)
del anch
del pos
del neg
gc.collect()
while(len(anchor)<32):
random_face_values,random_face_names=get_random_faces()
anch,pos,neg,anch_label,pos_label,neg_label=triplet(random_face_values,random_face_names)
anchor.extend(anch)
positive.extend(pos)
negative.extend(neg)
del anch
del pos
del neg
gc.collect()
anchor=numpy.array(anchor[:32])
print(anchor[0])
positive=numpy.array(positive[:32])
print(positive[0])
negative=numpy.array(negative[:32])
print(negative[0])
yield [anchor,positive,negative],None
Я использовал train_gen=generate()
orig_model.fit_generator(train_gen,steps_per_epoch=100,epochs=100,verbose=1)
для передачи генератора с вычисленным значением триплета.
Я пыталсяТренировал модель, но объем оперативной памяти превысил, а ядро вымерло.
Я попробовал наивный подход для выбора триплетов, и хотя он работал нормально, но он не дает точных результатов.
Можете ли вы помочь мне в этом какпочему ОЗУ превышает и вымирает?