It’s not useful to dump all the training arguments because it’s hard to tell what were changed and what were kept as default. You should post only the arguments that were updated.
Do you just have single camera? You should get the undistorted image and train the model on those. It will probably work better. During inference, you run the inference on frames after undistorting them.
These performance seem quite good, but in all likelihood you are the best person to judge the if it’s “good enough” (maybe if you’re delivering it to someone, they would be the judge). Could it be better, probably. Does it need to be better, again you’re the best person to decide that.
Glad it helped! Two quick closing tips you may find useful:
Single-class training: you can largely ignore classification loss, but don’t ignore box and dfl losses—they drive localization quality and your mAP50–95.
Fisheye → undistort: calibrate once, undistort every frame, and retrain on undistorted images; then run inference on undistorted frames. This usually boosts high-IoU metrics and counting stability. A minimal OpenCV fisheye snippet:
import cv2, numpy as np
# K, D from calibration; choose K_new via cv2.getOptimalNewCameraMatrix or scale K
map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, np.eye(3), K_new, (w, h), cv2.CV_16SC2)
undistorted = cv2.remap(frame, map1, map2, cv2.INTER_LINEAR)
For counting, use tracking with a line/polygon ROI so each person is only counted once:
from ultralytics import YOLO
model = YOLO("best.pt")
model.track(source="bus.mp4", tracker="botsort.yaml", persist=True)
# apply your ROI/line-crossing logic on tracked IDs
If you want a last bit of accuracy: slightly increase imgsz (e.g., 800–960) and reduce overly strong geometric augments for this fixed top-down view. A short overview of why calibration helps is in our guide on camera calibration, and practical steps for region-based counting are outlined in our region-based counting article:
See the camera fundamentals in the 2025 Vision AI camera calibration guide on the Ultralytics blog.
Explore practical region-based counting workflows in the Region-Based Object Counting with YOLO11 article.
If you share one short undistorted clip plus your current best.pt, we can sanity-check results.