我有一个自定义训练的模型(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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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