import time import cv2 import numpy as np from openvino.runtime import Core def preprocess_image(image, input_size=(640, 640)): img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转换为 RGB img_resized = cv2.resize(img, input_size) # 调整大小 img_normalized = img_resized / 255.0 # 归一化 img_transposed = np.transpose(img_normalized, (2, 0, 1)) # HWC -> CHW img_batch = np.expand_dims(img_transposed, axis=0).astype(np.float32) # 增加 batch 维度 return img_batch, img_resized def postprocess(output, conf_threshold=0.5, iou_threshold=0.4): # 解析输出 boxes = [] scores = [] class_ids = [] for detection in output[0]: confidence = detection[4] if confidence > conf_threshold: class_id = np.argmax(detection[5:]) cx, cy, w, h = detection[:4] # 中心点和宽高 x_min = int((cx - w / 2) * original_image.shape[1]) # 转换回原始图像尺寸 y_min = int((cy - h / 2) * original_image.shape[0]) width = int(w * original_image.shape[1]) height = int(h * original_image.shape[0]) boxes.append([x_min, y_min, width, height]) scores.append(confidence) class_ids.append(class_id) # 非极大值抑制 (NMS) indices = cv2.dnn.NMSBoxes(boxes, scores, conf_threshold, iou_threshold) final_boxes = [] for idx in indices: box = boxes[idx] final_boxes.append({ "box": box, "score": scores[idx], "class_id": class_ids[idx] }) return final_boxes def draw_detections(image, detections): for det in detections: x_min, y_min, width, height = det["box"] class_id = det["class_id"] score = det["score"] # 确保坐标和尺寸是整数 x_min = int(x_min) y_min = int(y_min) width = int(width) height = int(height) # 绘制边界框 cv2.rectangle(image, (x_min, y_min), (x_min + width, y_min + height), (0, 255, 0), 2) # 显示类别和置信度 label = f"Class {class_id}: {score:.2f}" cv2.putText(image, label, (x_min, y_min - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) return image if __name__ == "__main__": # 初始化 OpenVINO Runtime core = Core() # 加载模型 model_path = "model/safe_det/best.xml" # 替换为你的模型路径 model = core.read_model(model=model_path) compiled_model = core.compile_model(model=model, device_name="CPU") # 设备可以是 "CPU", "GPU", "MYRIAD" 等 # 获取输入和输出层 input_layer = compiled_model.input(0) output_layer = compiled_model.output(0) # 打印输入输出信息 print(f"Input shape: {input_layer.shape}") print(f"Output shape: {output_layer.shape}") # 预处理图像,改为从摄像头获取 cap = cv2.VideoCapture(0) # 初始化变量 start_time = time.time() # 记录开始时间 frame_count = 0 # 帧计数器 while True: ret, frame = cap.read() if not ret: break input_data, original_image = preprocess_image(frame) # 推理 results = compiled_model([input_data])[output_layer] # 输出结果 print(results) detections = postprocess(results) # 打印检测结果 for det in detections: print(det) draw_img = draw_detections(frame, detections) # 计算FPS frame_count += 1 elapsed_time = time.time() - start_time fps = frame_count / elapsed_time # start_time = time.time() # 重置开始时间 # frame_count = 0 # 重置帧计数器 # 显示FPS cv2.putText(draw_img, f"FPS: {fps:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow("Detections", draw_img) if cv2.waitKey(1) & 0xFF == ord('q'): break