You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派5运行YOLOv8车牌识别时SORT模块导入错误求助

YOLOv8车牌检测项目ImportError问题解决

问题背景

我在实现视频中车牌检测与自动识别的YOLOv8项目时,跟着教程运行到30:02处(教程此处代码运行正常),但本地执行报错。

运行代码

from ultralytics import YOLO
import cv2
from sort.sort import *
import string
import easyocr
import numpy as np  # 补充缺失的numpy导入

mot_tracker = Sort()
results = {}

coco_model = YOLO('yolov8n.pt')
license_plate_detector = YOLO('/home/pi/Desktop/license_plate_detector.pt')

cap = cv2.VideoCapture('/home/pi/Desktop/carvid.mp4')

# Initialize the OCR reader
reader = easyocr.Reader(['en'], gpu=False)

# Mapping dictionaries for character conversion
dict_char_to_int = {'O': '0',
                    'I': '1',
                    'J': '3',
                    'A': '4',
                    'G': '6',
                    'S': '5'}

dict_int_to_char = {'0': 'O',
                    '1': 'I',
                    '3': 'J',
                    '4': 'A',
                    '6': 'G',
                    '5': 'S'}


def get_car(license_plate, vehicle_track_ids):
    x1, y1, x2, y2, score, class_id = license_plate

    foundIt = False
    for j in range(len(vehicle_track_ids)):
        xcar1, ycar1, xcar2, ycar2, car_id = vehicle_track_ids[j]

        if x1 > xcar1 and y1 > ycar1 and x2 < xcar2 and y2 < ycar2:
            car_indx = j
            foundIt = True
            break

    if foundIt:
        return vehicle_track_ids[car_indx]

    return -1, -1, -1, -1, -1


ret = True
frame_nmr = -1

vehicles = [2, 3, 5, 7]

while ret:
    frame_nmr += 1
    ret, frame = cap.read()
    if ret and frame_nmr < 10:
        # 移除pass,否则后续代码不会执行
        detections = coco_model(frame)[0]
        detections_ = []
        
        for detection in detections.boxes.data.tolist():
            x1, y1, x2, y2, score, class_id = detection
            
            if int(class_id) in vehicles:
                detections_.append([x1,y1,x2,y2,score])
        
        track_ids = mot_tracker.update(np.asarray(detections_))
        
        license_plates = license_plate_detector(frame)[0]
        for license_plate in license_plates.boxes.data.tolist():
            x1, y1, x2, y2, score, class_id = license_plate

            xcar1, ycar1, xcar2, ycar2, carid = get_car(license_plate, track_ids)
            
            license_plate_crop = frame[int(y1):int(y2), int(x1): int(x2), :]
            
            license_plate_crop_gray = cv2.cvtColor(license_plate_crop, cv2.COLOR_BGR2GRAY)  # 修正COLOR拼写
            _, license_plate_crop_thresh = cv2.threshold(license_plate_crop_gray, 64, 255, cv2.THRESH_BINARY_INV)  # 修正阈值参数
            
            cv2.imshow('original_crop', license_plate_crop)
            cv2.imshow('threshold', license_plate_crop_thresh)
            cv2.waitKey(0)

报错信息

Traceback (most recent call last):
  File "/home/pi/yolotest.py", line 3, in <module>
    from sort.sort import *
  File "/home/pi/sort/sort.py", line 23, in <module>
    matplotlib.use('TkAgg')
  File "/home/pi/env/lib/python3.11/site-packages/matplotlib/__init__.py", line 1255, in use
    plt.switch_backend(name)
  File "/home/pi/env/lib/python3.11/site-packages/matplotlib/pyplot.py", line 415, in switch_backend
    module = backend_registry.load_backend_module(newbackend)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/pi/env/lib/python3.11/site-packages/matplotlib/backends/registry.py", line 323, in load_backend_module
    return importlib.import_module(module_name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/pi/env/lib/python3.11/site-packages/matplotlib/backends/backend_tkagg.py", line 1, in <module>
    from . import _backend_tk
  File "/home/pi/env/lib/python3.11/site-packages/matplotlib/backends/_backend_tk.py", line 16, in <module>
    from PIL import Image, ImageTk
ImportError: cannot import name 'ImageTk' from 'PIL' (/usr/lib/python3/dist-packages/PIL/__init__.py)

环境说明

  • 设备:树莓派5(4GB RAM)
  • 系统:64位树莓派OS
  • 运行环境:Python虚拟环境,所有依赖包及sort文件夹均在虚拟环境内

解决步骤

1. 修复PIL的ImageTk缺失问题

树莓派系统默认的PIL包可能未包含ImageTk组件,按以下步骤处理:

  • 激活虚拟环境:
    source /home/pi/env/bin/activate
    
  • 升级或重新安装Pillow(确保虚拟环境内的包完整):
    pip install --upgrade pillow
    
  • 若仍报错,先安装系统级的ImageTk依赖:
    sudo apt-get update && sudo apt-get install python3-pil.imagetk
    
    之后回到虚拟环境重新安装Pillow。

2. 替换matplotlib的GUI后端

sort.py中强制指定了TkAgg后端,而树莓派可能缺少Tkinter环境或无需GUI可视化,修改方式:

  • 打开/home/pi/sort/sort.py,找到matplotlib.use('TkAgg')这一行,替换为非交互式后端:
    # matplotlib.use('TkAgg')
    matplotlib.use('Agg')  # 无GUI环境下的后端
    
  • 若不需要sort中的绘图功能,可直接注释掉所有matplotlib相关的导入和绘图代码,彻底规避依赖问题。

3. 修正代码中的语法错误

原代码存在几处小问题,需提前修正避免后续报错:

  • 添加numpy导入:import numpy as np(代码中使用了np.asarray但未导入)
  • 移除循环内的pass语句(会跳过后续所有代码)
  • 修正颜色转换参数:cv2.COLOUR_BGR2GRAY改为cv2.COLOR_BGR2GRAY
  • 修正阈值处理参数:cv2.THRESH_BNARY_INV改为cv2.THRESH_BINARY_INV

内容的提问来源于stack exchange,提问作者su542sa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 21:42:32