Acerca de la implementación de la tasa de precisión y la tasa de recuperación de los indicadores de evaluación yolov5

1. Fórmula principal

Insertar descripción de la imagen aquí

¡Lo principal que hay que decir tres veces es que precisión y exactitud no son lo mismo! ¡Precisión y exactitud no son lo mismo! ¡Precisión y exactitud no son lo mismo! Cuando habitualmente medimos el rendimiento de un modelo, normalmente utilizamos precisión y recuperación.
TP es el número de muestras positivas predichas por muestras positivas.
FP es el número de muestras positivas predichas por muestras negativas.
FN es el número de muestras negativas predichas por muestras positivas.

En segundo lugar, para tareas de detección de múltiples objetivos, ¿cómo codificar con precisión y recuperar usted mismo?
(El requisito previo debe ser información de anotaciones).
1. Análisis de ideas: para tareas de detección de múltiples objetivos, TP (verdadero positivo) representa el cuadro correcto predicho, es decir, el cuadro predicho por el modelo se calcula uno por uno con el cuadro anotado. de la imagen. Si el IOU máximo generado por el cuadro de anotación es mayor que el umbral de IOU establecido previamente, y la etiqueta correspondiente a este cuadro de predicción es consistente con la etiqueta del cuadro de anotación encontrada a través de la operación IOU, el cuadro de predicción se considera ser un verdadero positivo .
Para la tasa de recuperación , el denominador TP + FN se refiere al número de muestras positivas predichas por muestras positivas más el número de muestras negativas predichas por muestras positivas, entonces son todas las muestras positivas, es decir, el número de todas las cajas etiquetadas .
Para mayor precisión, el denominador TP + FP se refiere al número de muestras positivas predichas por muestras positivas más el número de muestras positivas predichas por muestras negativas, que es verdadero positivo más falso positivo, entonces es la muestra positiva predicha, es decir, todas positivo, es decir, el número de todos los cuadros de predicción .
2. Pasos de implementación:
1) Introducir datos en el modelo y obtener información de inferencia;

pred = model(img, augment=opt.augment)[0]

2) El procesamiento NMS obtiene información de predicción y en este momento se obtendrán todos los cuadros de predicción.

pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms)

3) Recorrer la información de predicción, obtener información de anotaciones al mismo tiempo y contar TP, TP+FN, TP+FP

for i, det in enumerate(pred):  # detections per image
			p, s, im0 = path[i], '%g: ' % i, im0s[i].copy()
			base_txt_name = os.path.splitext(os.path.basename(path))[0] + '.txt'  #获取图像名称对应的标注文件名称	
			txt_label=txtpath+"/"+base_txt_name   #获取此图像对应的标注文件
			vecter_labels = []    # 存与原图同样尺寸下标注框
			cls_labels=[]         # 存标签
			person_labels=[]     #存类别1标签
			fire_labels=[]       #存类别2标签
			smoke_labels=[]    #存类别3标签
			with open(txt_label, 'r+', encoding='UTF-8') as f1:       # 打开标注文件,获取标注信息
				lines = f1.readlines()
				for j in range(len(lines)):
					vecter_label = []
					lines[j] = lines[j].replace('\n', '')
					line = lines[j].split(' ')
					x1_=float(line[1])*im0.shape[1]-float(line[3])*im0.shape[1]/2
					vecter_label.append(x1_)
					y1_=float(line[2])*im0.shape[0]-float(line[4])*im0.shape[0]/2
					vecter_label.append(y1_)
					x2_=float(line[1])*im0.shape[1]+float(line[3])*im0.shape[1]/2
					vecter_label.append(x2_)
					y2_=float(line[2])*im0.shape[0]+float(line[4])*im0.shape[0]/2
					vecter_label.append(y2_)
					vecter_labels.append(vecter_label)
					cls_labels.append(int(line[0]))
					if int(line[0])==0:
						person_labels.append(int(line[0]))
					if int(line[0])==1:
						fire_labels.append(int(line[0]))
					if int(line[0])==2:
						smoke_labels.append(int(line[0]))

			total_kuang=total_kuang+len(cls_labels)    #统计所有标注框数量
			person_kuang=person_kuang+len(person_labels)   #统计所有类别1标注框数量
			fire_kuang=fire_kuang+len(fire_labels)       #统计所有类别2标注框数量
			smoke_kuang=smoke_kuang+len(smoke_labels)    #统计所有类别3标注框数量
			
			s += '%gx%g ' % img.shape[2:]  # print string
			gn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwh
			
			if det is not None and len(det):     #遍历预测框
				det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()
				# Print results
				for c in det[:, -1].unique():
					n = (det[:, -1] == c).sum()  # detections per class
					s += '%g %ss, ' % (n, names[int(c)])  # add to string

				for *xyxy, conf, cls in det:
					xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4))).view(-1).tolist()  # normalized xywh
					pre_xywh=[]      #存与原图同样尺寸下预测框
					x1=xywh[0]-xywh[2]/2
					pre_xywh.append(x1)
					y1=xywh[1]-xywh[3]/2
					pre_xywh.append(y1)
					x2=xywh[0]+xywh[2]/2
					pre_xywh.append(x2)
					y2=xywh[1]+xywh[3]/2
					pre_xywh.append(y2)
					ious, i_libie= box12_iou(pre_xywh, vecter_labels,cls_labels)  #筛选出此预测框与此图像标注框最大iou以及对应的标签类别				
					if i_libie==int(cls):  #如果此预测框的类别与最大iou框标注类别一致
						print("label=%s	IOU=%.2f	conf=%.2f" % (names[int(cls)],ious,conf))
						if i_libie==0:       #类别1处理
							person_Positive_num=person_Positive_num+1  #统计所有类别1预测框数量
							if conf>0.3 and ious > 0.4:
								person_Positive_true=person_Positive_true+1    # #统计所有类别1预测框预测正确数量
						if i_libie==1:    #类别2处理
							fire_Positive_num=fire_Positive_num+1    #统计所有类别2预测框数量
							if ious > 0.25:
								fire_Positive_true=fire_Positive_true+1    # #统计所有类别2预测框预测正确数量
						if i_libie==2:    #类别3处理
							smoke_Positive_num=smoke_Positive_num+1   #统计所有类别3预测框数量
							if ious > 0.25:
								smoke_Positive_true=smoke_Positive_true+1    #统计所有类别3预测框预测正确数量

Supongo que te gusta

Origin blog.csdn.net/jiafeier_555/article/details/111287054
Recomendado
Clasificación