我有一个自定义训练的模型(best.pt),它可以检测两种对象:人与车灯。现在我希望根据以下条件输出结果

请问您能帮我吗………我有一个自定义训练的模型(best.pt),它可以检测两种对象:人与车灯。现在我希望根据以下条件输出结果:1. 如果模型只检测到车灯,返回0,2. 如果模型只检测到人,返回1,3. 如果模型同时检测到车灯和人,返回0。

import cv2from ultralytics import YOLOvideo_path = 'data/video1.mp4'video_out_path = 'out.mp4'cap = cv2.VideoCapture(video_path)# Check if the video file is opened successfullyif not cap.isOpened():    print("Error: Could not open the video file.")    exit()ret, frame = cap.read()# Check if the first frame is read successfullyif not ret:    print("Error: Could not read the first frame from the video.")    exit()cap_out = cv2.VideoWriter(video_out_path, cv2.VideoWriter_fourcc(*'MP4V'), cap.get(cv2.CAP_PROP_FPS),                          (int(cap.get(3)), int(cap.get(4))))  # Use cap.get(3) and cap.get(4) for width and heightmodel = YOLO("bestall5.pt")detection_threshold = 0.5while ret:    results_list = model(frame)    headlight_detected = False    person_detected = False    # Iterate through the list of results    for results in results_list:        # Check if the current result has the necessary attributes        if hasattr(results, 'xyxy'):            for result in results.xyxy:                x1, y1, x2, y2, score, class_id = result.tolist()                x1, x2, y1, y2 = int(x1), int(x2), int(y1), int(y2)                # Assuming class_id is the index of the class in the model's class list                class_name = model.names[class_id]                if class_name == "headlight" and score > detection_threshold:                    headlight_detected = True                elif class_name == "person" and score > detection_threshold:                    person_detected = True    # Output based on the specified conditions    if headlight_detected and person_detected:        output = 0    elif headlight_detected:        output = 0    elif person_detected:        output = 1    else:        output = -1  # No person or headlight detected    print("Output:", output)    cap_out.write(frame)    cv2.imshow('Object Detection', frame)        # Break the loop if 'q' key is pressed    if cv2.waitKey(1) & 0xFF == ord('q'):        break    ret, frame = cap.read()cap.release()cap_out.release()cv2.destroyAllWindows()

我尝试了这个方法,但只得到-1作为输出,而我的视频中同时有车灯和人


回答:

这里的条件if hasattr(results, 'xyxy')总是为负。根据文档results的可用属性是:

orig_img, orig_shape, boxes, masks, probs, keypoints, obb, speed, names, path

要获取xyxy框坐标、scoreclass_id,请参考results.boxes。根据文档boxes的可用属性是:

xyxy, conf, cls, id, xywh, xyxyn, xywhn

这些属性都以torch.Tensor的形式返回。要获取行值,您可以这样做:

# Iterate through the list of resultsfor results in results_list:    # Check if the current result has the necessary attributes    if hasattr(results, 'boxes'):        for box in results.boxes:            x1, y1, x2, y2 = box.xyxy.tolist()[0]            x1, x2, y1, y2 = int(x1), int(x2), int(y1), int(y2)            score = box.conf.item()            class_id = int(box.cls.item())

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注