Ultralytics YOLO27:

Cách xem kết quả inference của YOLO trong terminal VSCode#

Hình ảnh từ website libsixel.

Động lực#

Khi kết nối với một máy từ xa qua SSH, thông thường không thể trực quan hóa kết quả hình ảnh, hoặc bạn phải chuyển dữ liệu sang thiết bị cục bộ có GUI. Terminal tích hợp của VSCode có thể render hình ảnh trực tiếp, vì vậy bạn có thể kiểm tra kết quả dự đoán ngay tại nơi chạy inference mà không cần sao chép file về laptop. Hướng dẫn này trình bày cách bật thiết lập, kết nối code và giải đáp các câu hỏi thường gặp.

Chỉ dành cho Linux và macOS

Chỉ tương thích với Linux và macOS. Hãy kiểm tra repository của VSCode, trạng thái Issue hoặc tài liệu để xem các cập nhật về việc hỗ trợ Windows hiển thị hình ảnh trong terminal bằng sixel.

Các protocol tương thích với VSCode để xem hình ảnh bằng terminal tích hợp là sixeliTerm. Hướng dẫn này sẽ minh họa cách sử dụng protocol sixel.

Quy trình#

  1. Trước tiên, bạn phải bật các thiết lập terminal.integrated.enableImagesterminal.integrated.gpuAcceleration trong VSCode.

    "terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on"
    "terminal.integrated.enableImages": true

    VSCode enable terminal images setting

  2. Cài đặt thư viện python-sixel trong virtual environment của bạn. Đây là một fork của thư viện PySixel, hiện không còn được duy trì.

    pip install sixel
  3. Load một model và thực thi inference, sau đó plot kết quả và lưu vào một biến. Xem thêm về các đối số inference và cách làm việc với kết quả trên trang predict mode.

    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolo26n.pt")
    
    # Run inference on an image
    results = model.predict(source="ultralytics/assets/bus.jpg")
    
    # Plot inference results
    plot = results[0].plot()  # (1)!
    1. Xem các tham số của phương thức plot để biết những đối số có thể sử dụng.
  4. Bây giờ, sử dụng OpenCV để chuyển đổi np.ndarray thành dữ liệu bytes. Sau đó sử dụng io.BytesIO để tạo một đối tượng "giống file".

    import io
    
    import cv2
    
    # Results image as bytes
    im_bytes = cv2.imencode(
        ".png",  # (1)!
        plot,
    )[1].tobytes()  # (2)!
    
    # Image bytes as a file-like object
    mem_file = io.BytesIO(im_bytes)
    1. Bạn cũng có thể sử dụng các phần mở rộng hình ảnh khác.
    2. Chỉ cần đối tượng tại index 1 được trả về.
  5. Tạo một instance SixelWriter, sau đó sử dụng phương thức .draw() để vẽ hình ảnh trong terminal.

    from sixel import SixelWriter
    
    # Create sixel writer object
    w = SixelWriter()
    
    # Draw the sixel image in the terminal
    w.draw(mem_file)

Ví dụ về kết quả inference#

YOLO inference results displayed in terminal

Video và GIF chưa được kiểm thử

Việc sử dụng ví dụ này với video hoặc các frame GIF động chưa được kiểm thử. Hãy tự chịu rủi ro khi thử.

Ví dụ đầy đủ về code#

import io

import cv2
from sixel import SixelWriter

from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.pt")

# Run inference on an image
results = model.predict(source="ultralytics/assets/bus.jpg")

# Plot inference results
plot = results[0].plot()  # (3)!

# Results image as bytes
im_bytes = cv2.imencode(
    ".png",  # (1)!
    plot,
)[1].tobytes()  # (2)!

mem_file = io.BytesIO(im_bytes)
w = SixelWriter()
w.draw(mem_file)
  1. Bạn cũng có thể sử dụng các phần mở rộng hình ảnh khác.
  2. Chỉ cần đối tượng tại index 1 được trả về.
  3. Xem các tham số của phương thức plot để biết những đối số có thể sử dụng.
Xóa hình ảnh

Bạn có thể cần sử dụng clear để "xóa" phần hiển thị hình ảnh trong terminal.

FAQ#

  • Để xem kết quả inference của YOLO trong terminal VSCode trên macOS hoặc Linux, hãy làm theo các bước sau:

    1. Bật các thiết lập VSCode cần thiết:

      "terminal.integrated.enableImages": true
      "terminal.integrated.gpuAcceleration": "auto"
    2. Cài đặt thư viện sixel:

      pip install sixel
    3. Load model YOLO và chạy inference:

      from ultralytics import YOLO
      
      model = YOLO("yolo26n.pt")
      results = model.predict(source="ultralytics/assets/bus.jpg")
      plot = results[0].plot()
    4. Chuyển đổi hình ảnh kết quả inference thành bytes và hiển thị trong terminal:

      import io
      
      import cv2
      from sixel import SixelWriter
      
      im_bytes = cv2.imencode(".png", plot)[1].tobytes()
      mem_file = io.BytesIO(im_bytes)
      SixelWriter().draw(mem_file)

    Để biết thêm chi tiết, hãy truy cập trang predict mode.

  • Hiện tại, protocol sixel chỉ được hỗ trợ trên Linux và macOS vì các nền tảng này có khả năng terminal native tương thích với đồ họa sixel. Hỗ trợ đồ họa terminal bằng sixel trên Windows vẫn đang được phát triển. Để cập nhật về khả năng tương thích với Windows, hãy kiểm tra trạng thái Issue của VSCodetài liệu.

  • Nếu không có gì được render, hãy lần lượt thực hiện các bước kiểm tra sau:

    1. Xác nhận cả terminal.integrated.enableImagesterminal.integrated.gpuAcceleration đều đã được bật như minh họa trong phần Quy trình, sau đó khởi động lại terminal tích hợp để các thiết lập có hiệu lực.
    2. Xác minh sixel được cài đặt trong cùng virtual environment mà script của bạn chạy (pip install sixel).
    3. Đảm bảo plot là một np.ndarray hợp lệ trước khi mã hóa, vì cv2.imencode sẽ phát sinh lỗi nếu hình ảnh rỗng hoặc không phải là array hợp lệ. Xem các tham số của phương thức plot để biết các giá trị mà results[0].plot() chấp nhận.

    Nếu vấn đề vẫn tiếp diễn, hãy tham khảo repository của VSCode để xem trạng thái hỗ trợ hình ảnh trong terminal.

  • Việc hiển thị kết quả inference video hoặc các frame GIF động bằng sixel trong terminal hiện chưa được kiểm thử và có thể không được hỗ trợ. Chúng tôi khuyến nghị bắt đầu với hình ảnh tĩnh và xác minh khả năng tương thích. Hãy tự chịu rủi ro khi thử với kết quả video, đồng thời lưu ý các giới hạn về hiệu năng. Để biết thêm thông tin về việc plot kết quả inference, hãy truy cập trang predict mode.

  • Package sixel là một fork của thư viện PySixel không còn được duy trì và là một Python wrapper mỏng trên Pillow (PIL). Nếu import sixel không hoạt động hoặc SixelWriter().draw() phát sinh lỗi, hãy xác nhận package được cài đặt trong virtual environment đang hoạt động, đảm bảo Pillow khả dụng và kiểm tra repository GitHub của python-sixel để xem các lưu ý dành riêng cho từng nền tảng. Để biết thêm về cách tạo hình ảnh truyền vào draw(), hãy xem tài liệu predict mode.

Bình luận