树莓派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依赖:
之后回到虚拟环境重新安装Pillow。sudo apt-get update && sudo apt-get install python3-pil.imagetk
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
相关产品推荐
相关产品推荐

