使用YOLO+DeepSort实现人员计数时出现numpy.float32无len()方法的TypeError错误
YOLO+DeepSort实现人员计数时出现numpy.float32无len()方法的TypeError错误
嘿,我看你在实现YOLOv8+DeepSort的人员计数功能时碰到了TypeError: object of type 'numpy.float32' has no len()这个问题,大概率是因为你传递给DeepSort的检测分数还是numpy.float32类型,而DeepSort内部处理时误将其当作可迭代对象调用了len()方法导致的。我帮你把代码修复好,顺便补全未完成的部分:
修复后的完整代码
import cv2 import numpy as np from ultralytics import YOLO from deep_sort_realtime.deepsort_tracker import DeepSort def count_unique_people(video_path): # 加载YOLOv8n模型,指定只检测人类(类别0) model = YOLO('yolov8n.pt') cap = cv2.VideoCapture(video_path) if not cap.isOpened(): print("Error opening the video file") return # 初始化DeepSort跟踪器,max_age表示目标消失后保留ID的帧数 tracker = DeepSort(max_age=30) unique_ids = set() while cap.isOpened(): ret, frame = cap.read() if not ret: break # 运行YOLO检测,只保留人类类别(classes=0) results = model(frame, classes=0) detections = [] for result in results: boxes = result.boxes.xyxy.cpu().numpy() scores = result.boxes.conf.cpu().numpy() for box, score in zip(boxes, scores): x1, y1, x2, y2 = box[:4] # 关键修复:将numpy.float32类型的score转换为Python原生float detections.append([x1, y1, x2, y2, float(score)]) # 更新跟踪器 tracked_objects = tracker.update_tracks(detections, frame=frame) # 遍历跟踪到的对象,收集唯一ID for obj in tracked_objects: if obj.is_confirmed(): unique_id = obj.track_id unique_ids.add(unique_id) # 可选:在画面上绘制跟踪框和ID(方便调试) for obj in tracked_objects: if obj.is_confirmed(): bbox = obj.to_tlbr() x1, y1, x2, y2 = bbox cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2) cv2.putText(frame, f"ID: {obj.track_id}", (int(x1), int(y1)-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 显示画面(按q退出) cv2.imshow("People Counting", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放资源 cap.release() cv2.destroyAllWindows() # 返回唯一人员数量 print(f"Total unique people counted: {len(unique_ids)}") return len(unique_ids) # 调用示例 # count_unique_people("your_video_path.mp4")
关键修改点说明
- 分数类型转换:把
score直接转为Python原生float类型(float(score)),避免DeepSort处理numpy类型时触发错误。 - 补全跟踪逻辑:完善了
tracker.update_tracks()的调用,并增加了确认跟踪对象、收集唯一ID的逻辑。 - 添加可视化调试:增加了绘制跟踪框和ID的代码,方便你直观看到跟踪效果。
如果运行时还有其他问题,比如依赖版本不兼容,可以检查一下ultralytics和deep_sort_realtime的版本,建议使用最新稳定版。
备注:内容来源于stack exchange,提问作者san4s
相关产品推荐
相关产品推荐

