Ánh xạ đối tượng bằng VisionEye với Ultralytics YOLO26#
Ánh xạ đối tượng VisionEye là gì?#
VisionEye của Ultralytics YOLO26 cho phép máy tính nhận diện và định vị đối tượng, mô phỏng độ chính xác quan sát của mắt người. Chức năng này giúp máy tính phân biệt và tập trung vào các đối tượng cụ thể, tương tự cách mắt người quan sát chi tiết từ một góc nhìn nhất định.
Ánh xạ đối tượng bằng YOLO26#
VisionEye cố định một điểm quan sát duy nhất trong khung hình và vẽ một tia từ điểm đó đến mọi đối tượng được theo dõi, giúp bạn hình dung cảnh vật từ một góc nhìn. Đặt vision_point thành tọa độ pixel của người quan sát, sau đó chạy solution trên video bằng Python API hoặc CLI.
# Monitor objects position with visioneye
yolo solutions visioneye show=True
# Pass a source video
yolo solutions visioneye source="path/to/video.mp4"
# Monitor the specific classes
yolo solutions visioneye classes="[0, 5]"Các đối số của VisionEye#
Dưới đây là bảng các đối số của VisionEye:
| Đối số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
model | str | None | Đường dẫn đến tệp model Ultralytics YOLO. |
vision_point | tuple[int, int] | (20, 20) | Điểm mà VisionEye Solution sẽ theo dõi đối tượng và vẽ đường đi. |
line_width | int | 2 | Độ dày đường viền của box, keypoint và số đếm mà giải pháp vẽ. |
verbose | bool | True | Bật nhật ký theo từng frame của giải pháp, gồm shape đầu vào, số lượng class và tốc độ xử lý. Bản thân lệnh gọi tracking luôn không ghi nhật ký. |
Bạn cũng có thể sử dụng nhiều tham số track trong solution VisionEye:
| Đối số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
tracker | str | 'tracktrack.yaml' | Chỉ định thuật toán theo dõi cần sử dụng. Các tùy chọn tích hợp sẵn: botsort.yaml, bytetrack.yaml, ocsort.yaml, deepocsort.yaml, fasttrack.yaml, tracktrack.yaml. |
conf | float | 0.25 | Đặt ngưỡng confidence cho các đối tượng được phát hiện; giá trị thấp hơn cho phép theo dõi nhiều đối tượng hơn nhưng có thể bao gồm cả kết quả dương tính giả. |
iou | float | 0.7 | Đặt ngưỡng Intersection over Union (IoU) để lọc các đối tượng phát hiện bị chồng lấn. |
classes | list | None | Lọc kết quả theo chỉ mục class. Ví dụ: classes=[0, 2, 3] chỉ theo dõi các class được chỉ định. |
device | str | None | Chỉ định thiết bị dùng để suy luận (ví dụ: cpu, cuda:0 hoặc 0). Cho phép người dùng chọn CPU, một GPU cụ thể hoặc thiết bị tính toán khác để chạy model. |
imgsz | int or tuple | 640 | Kích thước ảnh suy luận mục tiêu: số nguyên cho ảnh vuông hoặc cặp (height, width). Kích thước sẽ được điều chỉnh theo stride của model. |
max_det | int | 300 | Số lượng đối tượng phát hiện tối đa được giữ lại trong mỗi khung hình trước khi theo dõi, giới hạn số đối tượng mà một giải pháp xử lý trong các cảnh dày đặc. |
quantize | int or str | None | Độ chính xác suy luận: 16 (FP16) hoặc 32/unset (FP32) cho model PyTorch và TorchScript khi chạy ngoài CPU; các định dạng khác sử dụng độ chính xác do artifact và runtime của chúng lựa chọn. Thay thế đối số half đã lỗi thời. |
Ngoài ra, một số tham số trực quan hóa cũng được hỗ trợ, như liệt kê bên dưới:
| Đối số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
show | bool | False | Nếu True, hiển thị ảnh hoặc video đã được chú thích trong một cửa sổ. Hữu ích để nhận phản hồi trực quan ngay lập tức trong quá trình phát triển hoặc kiểm thử. |
show_conf | bool | True | Hiển thị điểm confidence bên cạnh nhãn của mỗi detection. Cho biết mức độ chắc chắn của model đối với từng detection. |
show_labels | bool | True | Hiển thị nhãn cho mỗi detection trong đầu ra trực quan. Giúp nhận biết ngay các đối tượng được phát hiện. |
Cách VisionEye hoạt động#
VisionEye hoạt động bằng cách thiết lập một điểm nhìn cố định trong khung hình và vẽ các đường từ điểm này đến những đối tượng được phát hiện. Cách này mô phỏng việc thị giác con người tập trung vào nhiều đối tượng từ một góc nhìn duy nhất. Solution sử dụng theo dõi đối tượng để duy trì khả năng nhận diện nhất quán các đối tượng qua nhiều khung hình, tạo ra hình ảnh trực quan về mối quan hệ không gian giữa người quan sát (điểm nhìn) và các đối tượng trong cảnh.
Phương thức process trong lớp VisionEye thực hiện một số thao tác chính:
- Trích xuất các track (bounding boxes, class và ID track) từ ảnh đầu vào
- Tạo annotator để vẽ bounding box và nhãn
- Với mỗi đối tượng được phát hiện, vẽ nhãn hộp và tạo một đường nhìn từ điểm nhìn
- Trả về ảnh đã được chú thích cùng với thống kê theo dõi
Phương pháp này đặc biệt hữu ích cho các ứng dụng đòi hỏi nhận biết không gian và trực quan hóa mối quan hệ giữa các đối tượng, chẳng hạn như hệ thống giám sát, điều hướng tự động và các hệ thống tương tác.
Ứng dụng của VisionEye#
Ánh xạ đối tượng VisionEye có nhiều ứng dụng thực tế trong các ngành khác nhau:
- An ninh và giám sát: Theo dõi nhiều đối tượng đáng chú ý từ một vị trí camera cố định
- Phân tích bán lẻ: Theo dõi kiểu di chuyển của khách hàng so với các quầy trưng bày trong cửa hàng
- Phân tích thể thao: Phân tích vị trí và chuyển động của cầu thủ từ góc nhìn của huấn luyện viên
- Xe tự hành: Trực quan hóa cách phương tiện "nhìn thấy" và ưu tiên các đối tượng trong môi trường xung quanh
- Tương tác người-máy tính: Tạo giao diện trực quan hơn, có khả năng phản hồi các mối quan hệ không gian
Kết hợp VisionEye với các solution khác của Ultralytics như tính khoảng cách hoặc ước tính tốc độ, bạn có thể xây dựng các hệ thống toàn diện không chỉ theo dõi đối tượng mà còn hiểu được mối quan hệ không gian và hành vi của chúng.
Câu hỏi thường gặp#
Để bắt đầu sử dụng VisionEye Object Mapping với Ultralytics YOLO26, trước tiên hãy cài đặt package Ultralytics bằng pip. Sau đó, bạn có thể dùng mã mẫu trong tài liệu để thiết lập phát hiện đối tượng với VisionEye. Sau đây là ví dụ đơn giản để bạn bắt đầu:
import cv2 from ultralytics import solutions cap = cv2.VideoCapture("path/to/video.mp4") assert cap.isOpened(), "Error reading video file" # Bộ ghi video w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS)) video_writer = cv2.VideoWriter("vision-eye-mapping.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h)) # Khởi tạo đối tượng vision eye visioneye = solutions.VisionEye( show=True, # hiển thị đầu ra model="yolo26n.pt", # sử dụng bất kỳ model nào được Ultralytics hỗ trợ, ví dụ: yolo26s.pt classes=[0, 2], # tạo chế độ xem visioneye cho các lớp cụ thể ) # Xử lý video while cap.isOpened(): success, im0 = cap.read() if not success: print("Video frame is empty or video processing has been successfully completed.") break results = visioneye(im0) print(results) # truy cập đầu ra video_writer.write(results.plot_im) # ghi tệp video cap.release() video_writer.release() cv2.destroyAllWindows() # đóng tất cả cửa sổ đang mởUltralytics YOLO26 kết hợp tốc độ, độ chính xác và khả năng tích hợp dễ dàng, nhờ đó rất phù hợp cho việc lập bản đồ và theo dõi đối tượng. Các ưu điểm chính gồm:
- Hiệu năng thời gian thực: Mang lại độ chính xác cao khi phát hiện đối tượng theo thời gian thực.
- Tính linh hoạt: Hỗ trợ phát hiện, theo dõi và tính khoảng cách trong cùng một pipeline.
- Cộng đồng và hỗ trợ: Tài liệu toàn diện và cộng đồng GitHub năng động giúp xử lý sự cố và cải tiến.
- Dễ sử dụng: API trực quan giúp đơn giản hóa các tác vụ phức tạp, cho phép triển khai và lặp lại nhanh chóng.
Để biết thêm thông tin về ứng dụng và lợi ích, hãy xem tài liệu Ultralytics YOLO26.
Ultralytics YOLO26 tích hợp với nhiều công cụ machine learning như Comet và ClearML để theo dõi thử nghiệm, cộng tác và tái lập kết quả. Hãy làm theo các hướng dẫn chi tiết về tích hợp YOLO26 với Comet và tích hợp YOLO26 với ClearML để bắt đầu.
Để tìm hiểu thêm và xem các ví dụ tích hợp, hãy tham khảo Hướng dẫn tích hợp Ultralytics.
Bình luận60
TranDHoa Hey, you can adjust the viewing angle of the eyes and make it measure the distance from the center of an object instead of from the edge.
Glenn JocherUltralytics VisionEye already draws the ray from
vision_pointto the bounding-box centroid (not the edge) viaSolutionAnnotator.visioneye()as shown in the VisionEye guide and the SolutionAnnotatorvisioneye()reference; there isn’t a separate “viewing angle” parameter today since it’s a 2D overlay, so the intended control is movingvision_point, and if you need an actual distance value (vs just a line), please use the Distance Calculation solution and share your desired behavior here (plus a short clip/frame +vision_point) so the team can advise the cleanest extension.
dixroby What dependencies are included in the requirements.txt file?
Glenn JocherUltralytics @dixroby the
requirements.txtfile typically includes dependencies liketorch,opencv-python, and other libraries necessary for running Ultralytics YOLO models. For a detailed list, please check the file directly in the repository.
FarrelCulbert Hi, I would like to know if this is only compatible with YOLOv8, or can I use it with all models?
Glenn JocherUltralytics(đã chỉnh sửa) @FarrelCulbert VisionEye Object Mapping is not limited to YOLOv8: it works with the tracking-capable Ultralytics models you pass via
model=, including YOLO26 (recommended) and YOLO11. For more detailed information and examples, you can refer to the VisionEye documentation at https://docs.ultralytics.com/guides/vision-eye/.
skp4595 rather than taking video as input fro testing, I want to test for an image, how can I do that? guide me on this.
Glenn JocherUltralytics(đã chỉnh sửa) Hi there!
Great question! If you want to test an image instead of a video using Ultralytics YOLO, it's quite straightforward. Below is a simple example to guide you through the process:
Testing on an Image
First, ensure you have the latest versions of
torchandultralyticsinstalled. If not, please update them:pip install --upgrade torch ultralyticsNext, you can use the following code to test an image:
import cv2 from ultralytics import YOLO from ultralytics.utils.plotting import Annotator, colors # Load the model model = YOLO("yolo26n.pt") # Load the image image_path = "path/to/your/image.jpg" im0 = cv2.imread(image_path) # Perform prediction results = model.predict(im0) boxes = results[0].boxes.xyxy.cpu() clss = results[0].boxes.cls.cpu().tolist() # Annotate the image annotator = Annotator(im0, line_width=2) names = model.model.names for box, cls in zip(boxes, clss): annotator.box_label(box, label=names[int(cls)], color=colors(int(cls))) # Display the annotated image cv2.imshow("YOLO Image Prediction", im0) cv2.waitKey(0) cv2.destroyAllWindows()Explanation
- Load the Model: We load the YOLO model.
- Load the Image: Read the image using OpenCV.
- Perform Prediction: Use the model to predict objects in the image.
- Annotate the Image: Draw bounding boxes and labels on the image.
- Display the Image: Show the annotated image using OpenCV.
This should help you get started with testing images. If you encounter any issues or have further questions, feel free to ask! 😊
For more detailed information, you can refer to the VisionEye Object Mapping Guide.
Happy coding! 🚀
skp4595 I want to run VisionEye Object Mapping using YOLOv8 code on KITTI data set. the KITTI dataset is labeled as <class_name1, truncation, occlusion, observation angle alpha, bbox cordinantes, Dimension of object, Location, rotation_y, score > for each image. While model training, I'm getting this error train: WARNING ⚠️ /content/dataset/train/images/005936.png: ignoring corrupt image/label: could not convert string to float: 'Car' train: WARNING ⚠️ /content/dataset/train/images/005937.png: ignoring corrupt image/label: could not convert string to float: 'Pedestrian' train: WARNING ⚠️ /content/dataset/train/images/005938.png: ignoring corrupt image/label: could not convert string to float: 'Truck'
with these args { EPOCHS = 5 !yolo
task=detect
mode=train
model=yolov8s.pt
imgsz=640
data=depth_estimation_using_YOLOv8.yaml
epochs={EPOCHS}
batch=16
name=yolov8s
exist_ok=True
amp=False } how do I fix this?skp4595 how is this model trained? some details on dataset would be great help
Paula DerrengerUltralytics(đã chỉnh sửa) Hi! The model is trained using the YOLOv8 framework. You can train it on custom datasets like KITTI by converting the dataset to the YOLO format. The dataset should have labels in the format
<class_id> <x_center> <y_center> <width> <height>.For more details on VisionEye Object Mapping, check out the Ultralytics VisionEye guide. If you have any specific questions, feel free to ask! 🚀
Here's a sample training command:
yolo task=detect mode=train model=yolo26s.pt data=your_dataset.yaml epochs=5 batch=16Happy training! 😊
1
skp4595 what does this mean "It calculates this distance by analyzing the size and position of the object within the frame, using the camera's field of view and other calibration parameters if available"? what do you mean by 'other calibration parameter if possible'? The model is not a blackbox. Is it? there must be some calibration, some ground truth from where model must have learned. please explain this.
Glenn JocherUltralytics(đã chỉnh sửa) Hello! Great questions about the VisionEye Object Mapping using Ultralytics YOLOv8.
-
Distance Calculation: The phrase "It calculates this distance by analyzing the size and position of the object within the frame, using the camera's field of view and other calibration parameters if available" was inaccurate. The VisionEye distance example does not estimate camera-to-object distance from object size or field of view. It computes the pixel distance between the vision point and the bounding-box centroid and divides it by the
pixel_per_metervalue you set, so you calibrate that scale yourself. -
Other Calibration Parameters: The example uses none of these. You would need data such as camera intrinsic parameters (focal length, optical centers), extrinsic parameters (orientation and position of the camera), object size references, or a depth sensor only if you build a true camera-to-object distance estimate yourself.
-
Model Transparency: YOLOv8 models are not black boxes in the sense that their architecture and training processes are open for examination and modification. They learn from labeled data (ground truth) where objects are manually annotated in images, teaching the model how to recognize similar objects in new images.
For further details or specific implementations, feel free to check out our guide on VisionEye Object Mapping at Ultralytics VisionEye Guide. If you have more questions or need clarification, don't hesitate to reach out! 😊
-
mirhasnainsiba i am getting version incompatiblity issues, tell me your system's python version
Paula DerrengerUltralytics(đã chỉnh sửa) Hey there! 😊 It sounds like you're encountering some version compatibility issues. For Ultralytics YOLOv8, we generally recommend using Python 3.8 or newer as it strikes a good balance between being up-to-date and maintaining compatibility with most dependencies.
If you're using a Python version older than 3.7, you might run into issues, and it's a good idea to update to at least version 3.7 or newer if possible. Here's a quick way to check your current Python version from your terminal:
python --version # or if you have Python 3 installed as 'python3' python3 --versionAnd if you need to update Python, the official Python Downloads page is a great place to start.
If you're still facing issues after checking your Python version, could you please provide more details about the error messages you're seeing? This information can help us pinpoint the problem more accurately. Thanks!
mirhasnainsiba it is telling distance 61m while object is almost 1 m far
Paula DerrengerUltralytics @mirhasnainsiba hi there! 👋 It seems there might be a discrepancy with the distance calculation in your setup. Typically, the distance calculated by the model would depend on the scale set in your system (for example,
pixel_per_meterin the example). If the object is being reported as 61m away while it's actually about 1m away, you might want to adjust this scale factor accordingly. Here's a brief example:pixel_per_meter = 100 # Adjust this value based on your actual scaleThis adjustment helps calibrate the distance calculation to more accurately reflect real-world distances. If you continue to experience issues, double-check the calibration process or consider revisiting the portion of your code responsible for calculating distances. If further assistance is needed, feel free to reach out! 🛠️
mirhasnainsiba thanks
Paula DerrengerUltralytics Hey there! 😊 Thanks for reaching out. If you're observing an object distance as 61m while it's almost 1m away, you might want to adjust the
pixel_per_meterscaling factor in your VisionEye implementation. This adjustment is crucial for accurate distance calculation.Here's a simplified approach:
pixel_per_meter = 100 # This is just an example value. # You'll need to calibrate this based on your specific setup and camera properties.By fine-tuning this variable, you can achieve more accurate distance measurements. Calibration involves comparing known distances with the pixel distances detected by your model to find the most suitable
pixel_per_metervalue. 🛠️Hope this helps! Let us know if you have any further questions or if there are more details you'd like to dive into.
magickoo where is the dataset(video file)?
Paula DerrengerUltralytics Hey there! 🌟
The video files used in our examples are not provided in the repository. You can use any video file that you have access to by placing it in an accessible directory and then modifying the
"path/to/video/file.mp4"placeholder in the code snippets to point to your video file's location.For example:
cap = cv2.VideoCapture("your/video/path/here.mp4")Just replace
"your/video/path/here.mp4"with the actual path to your video. If you're looking for sample videos, online resources like Pexels Video or Pixabay Videos offer free footage that you might find useful for your projects.If you have any more questions or need further assistance, don't hesitate to reach out. Happy coding! 🚀
1magickoo Okay thankyou!
Paula DerrengerUltralytics Hey! Thank you for checking out the VisionEye Object Mapping with Ultralytics YOLOv8. 🚀 If you're keen to dive into VisionEye Object Mapping for pinpoint precision or even integrate object tracking and distance calculation, the provided Python examples can guide you seamlessly through the process.
Just remember to replace
"path/to/video/file.mp4"with the specific path to your video file, and you’re all set to explore the amazing capabilities of YOLOv8 with VisionEye!For pinpoint object mapping:
model = YOLO("yolov8n.pt") # Adjust model as needed cap = cv2.VideoCapture("your/video/path.mp4") # Your video path hereFor any additional queries or discussions, feel free to drop a message in our GitHub Issue Section. Happy coding! 🎉
AdadAlShabab Hi, I just wanted to know about "VisionEye View with Distance". What does this 'Distance' means? I mean does it measure the distance from the camera to object? Please let me know. TIA.
Paula DerrengerUltralytics(đã chỉnh sửa) @AdadAlShabab hey there! 👋
No, the "Distance" in the VisionEye example is not a camera-to-object distance. It is the pixel distance between the vision point and the detected object's bounding-box centroid, divided by a
pixel_per_meterscale that you set and calibrate yourself. Here's a simplified example of how you might calculate distance in a custom script:import cv2 import math from ultralytics import YOLO model = YOLO("yolo26s.pt") cap = cv2.VideoCapture("path/to/video.mp4") while True: ret, im0 = cap.read() if not ret: break results = model.track(im0, persist=True) for box in results[0].boxes.xyxy.cpu(): # Example: Calculate distance based on object size or position here # This is a placeholder for actual distance calculation logic distance = calculate_distance(box) print(f"Distance: {distance} meters")In this example,
calculate_distancewould be a function you define based on your specific distance estimation method. Keep in mind, accurate distance measurement might require camera calibration and knowing the actual size of the object or using depth sensors in conjunction with the camera.Hope this helps! Let us know if you have any more questions. 😊
AdadAlShabab Hi @pderrenger. Thanks a lot for your reply. I just wanted to know how can I divide the results by 10 ( ex: distance/10)? I'm dropping the code, please let me know in which line/lines I should make the changes? TIA.
Code:
if results[0].boxes.id is not None: track_ids = results[0].boxes.id.int().cpu().tolist() for box, track_id in zip(boxes, track_ids): annotator.box_label(box, label=str(track_id), color=bbox_clr) annotator.visioneye(box, center_point) x1, y1 = int((box[0] + box[2]) // 2), int((box[1] + box[3]) // 2) # Bounding box centroid distance = (math.sqrt((x1 - center_point[0]) ** 2 + (y1 - center_point[1]) ** 2))/pixel_per_meter text_size, _ = cv2.getTextSize(f"Distance: {distance:.2f} m", cv2.FONT_HERSHEY_SIMPLEX,1.2, 3) cv2.rectangle(im0, (x1, y1 - text_size[1] - 10),(x1 + text_size[0] + 10, y1), txt_background, -1) cv2.putText(im0, f"Distance: {distance:.2f} m",(x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 1.2,txt_color, 3)Paula DerrengerUltralytics Hi @AdadAlShabab! 👋
To divide the calculated distance by 10, you can adjust the line where
distanceis calculated. Here's how you can modify it:distance = (math.sqrt((x1 - center_point[0]) ** 2 + (y1 - center_point[1]) ** 2)) / pixel_per_meter / 10This change will effectively scale down the calculated distance by a factor of 10. Just add
/ 10at the end of the existing distance calculation line in your code.Hope this helps! Let me know if there's anything else you need. 😊
skp4595 what does this mean "It calculates this distance by analyzing the size and position of the object within the frame, using the camera's field of view and other calibration parameters if available"? what do you mean by 'other calibration parameter if possible'? The model is not a blackbox. Is it? there must be some calibration, some ground truth from where model must have learned. please explain this.
skp4595 why are we dividing "distance " by 'pixel_per_meter' ? what is the logic or explaination for this ?
Paula DerrengerUltralytics Hey there! 👋
The division by
pixel_per_meteris used to convert the measured pixel distance into real-world units like meters. This conversion factor helps translate the scale of the image to actual distances based on how many pixels represent one meter in the image. It's essential for applications where you need to know the physical separation between objects or from the camera to an object, not just the distance in pixels.If you have more questions or need further clarification, feel free to ask! 😊
skp4595 you mean to say, if there's 1 unit Euclidean distance between two pixels in an image, than it'd be 10m in real world scenarios? And this scale can be adjusted according to our will as per "pixel_per_meter = 10" this code. Isn't it?
if so, how is this calibration done? where's the ground truth?
Paula DerrengerUltralytics Hey there! 👋
Yes, exactly! If the
pixel_per_meteris set to 10, it means that 1 pixel in the image corresponds to 0.1 meters in the real world. You can adjust this scale to fit the specific context or calibration of your camera setup.Calibration is typically done by measuring known distances in the real world and adjusting the
pixel_per_metervalue so that the distances in the image accurately reflect these measurements. Ground truth data for calibration might come from physical measurements or known dimensions within the scene.If you have any more questions or need further clarification, feel free to ask! 😊
skp4595 Thank you @pderrenger
Paula DerrengerUltralytics(đã chỉnh sửa) You're welcome! 😊
The "VisionEye View with Distance" feature calculates the pixel distance between a reference point and the detected object's centroid, not a true camera-to-object distance. The
pixel_per_metervalue is used to convert pixel measurements to real-world distances. Calibration involves setting this value based on known distances in your scene.To divide the distance by 10, modify the distance calculation line like this:
distance = (math.sqrt((x1 - center_point[0]) ** 2 + (y1 - center_point[1]) ** 2)) / pixel_per_meter / 10For more details, check out the VisionEye guide.
1
leongjy2005 Traceback (most recent call last): File "d:\Random_YOLO8_Tutorials\Human_Detection\visioneye.py", line 28, in <module> annotator.visioneye(box, center_point) ^^^^^^^^^^^^^^^^^^^ AttributeError: 'Annotator' object has no attribute 'visioneye'
leongjy2005 I'm facing this issue, PLEASE HELP. Much Appreciated
Glenn JocherUltralytics(đã chỉnh sửa) @leongjy2005
visioneyeis not a method of the baseAnnotator; it lives onSolutionAnnotator. Usefrom ultralytics.solutions.solutions import SolutionAnnotatorandannotator = SolutionAnnotator(im0, line_width=2), or use thesolutions.VisionEyesolution from the VisionEye guide.1leongjy2005 Problem Solved! Thanks!

