В последнее время я работаю над глубоким обучением, используя мою обученную модель dlib для прогнозирования ориентиров на некоторой картинке. Как сказал мой последний вопрос, у меня есть два набора точек, один из которых является истинным ориентиром (от xml
), другой - прогнозируемым ориентиром (от dlib
way).
Я использую sklearn roc_curve
и precision_recall_cure
для кривая графика, а y_test - это двоичный набор, равный 1, если обозначенное расстояние (расстояние между прогнозируемым ориентиром и делением истинного ориентира на расстояние двух глаз в истинном ориентире) <0,10, y_socre - это набор чисел с плавающей точкой, который равен 1 - нормализовано расстояние. <br>Я строю кривую RO C и кривую PR на основе этих данных, но кривая ro c всегда идеальна (от (0,0) до (1,0) до (1,1)) и точность всегда равна 1 (кривая PR - горизонтальная линия).
Вот ro c кривая. введите описание изображения здесь Я действительно запутался. Вот мой код:
import *
root = et.parse("***/training_with_face_landmarks.xml").getroot()
images = {}
for ima in root.find('images').findall('image'):
images[ima.attrib['file']] = ima.find('box').attrib
predictor = dlib.shape_predictor('sp.dat')
alllandmark = {}
for i in images:
img_mat = cv2.imread('dogs/' + i)
alllandmark[i] = predictor(img_mat,dlib.rectangle(int(images[i]['left']),int(images[i]['top']),int(images[i]['left'])+int(images[i]['width']),int(images[i]['top'])+int(images[i]['height'])))
truelandmark = {}
for ima in root.find('images').findall('image'):
temp = []
for part_im in ima.find('box').findall('part'):
temp.append(dlib.point(int(part_im.attrib['x']), int(part_im.attrib['y'])))
truelandmark[ima.attrib['file']] = temp
score_temp = []
temp = []
for name in truelandmark:
stand = ((truelandmark[name][1].x - truelandmark[name][5].x) ** 2 + (truelandmark[name][1].y - truelandmark[name][5].y)**2)**0.5
differ = ((truelandmark[name][1].x - alllandmark[name].part(1).x) ** 2 + (truelandmark[name][1].y - alllandmark[name].part(1).y)**2)**0.5
score_temp.append(1-differ/stand)
if rate < 0.10:
temp.append(1)
else:
temp.append(0)
y_test = np.array(temp)
y_score = np.array(score_temp)
fpr, tpr, thr = roc_curve(y_test, y_score, pos_label=1)
auc = roc_auc_score(y_test, y_score)
then plot...
Если честно, у меня есть представление об этом. Может быть, кривая на самом деле идеальна из-за выбора y_score и y_test. В моей стратегии они тесно связаны (если y_score [x]> 0,9, y_test [x] = 1). Так что, возможно, мой способ построения кривой ro c совершенно неверен. Я добавил случайные числа с плавающей точкой от 0 до 0,04 к y_score, чтобы кривая ro c выглядела более нормальной. По моему мнению, поскольку я всегда добавляю числа с плавающей точкой в диапазоне от 0 до 0,04, добавленные числа могут быть уменьшены при сравнении двух алгоритмов. Я сказал своему учителю, что он считает, что это неправильно.
Кривая PR такая же.
Итак, я выбрал неправильно y_test
или y_score
? Или я сделал что-то не так на ранней стадии?