使用LayoutParser调用Detectron2模型时遇Pillow导入错误求解决
问题
运行以下代码时出现Pillow相关的ImportError,重新安装Pillow后问题仍未解决:
import layoutparser as lp model = lp.Detectron2LayoutModel( config_path ='lp://PubLayNet/faster_rcnn_R_50_FPN_3x/config', # In model catalog label_map ={0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"}, # In model`label_map` extra_config=["MODEL.ROI_HEADS.SCORE_THRESH_TEST", 0.8] # Optional ) model.detect(image)
错误信息:
ImportError Traceback (most recent call last) [<ipython-input-6-59f0fb07b7e3>](https://localhost:8080/#) in <module> 1 import layoutparser as lp ----> 2 model = lp.Detectron2LayoutModel( 3 config_path ='lp://PubLayNet/faster_rcnn_R_50_FPN_3x/config', # In model catalog 4 label_map ={0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"}, # In model`label_map` 5 extra_config=["MODEL.ROI_HEADS.SCORE_THRESH_TEST", 0.8] # Optional 31 frames [/usr/local/lib/python3.7/dist-packages/PIL/ImageFont.py](https://localhost:8080/#) in <module> 35 from . import Image 36 from ._deprecate import deprecate ---> 37 from ._util import is_directory, is_path 38 39 ImportError: cannot import name 'is_directory' from 'PIL._util' (/usr/local/lib/python3.7/dist-packages/PIL/_util.py)
原因
这个错误是Pillow版本和layoutparser/Detectron2不兼容导致的:is_directory和is_path是Pillow较新版本(比如9.1.0及以上)新增的函数,但如果当前环境的Pillow版本太旧,或者依赖库适配的是旧版Pillow的结构,就会触发这个导入失败的问题;反过来装了过高版本的Pillow,也可能和旧依赖的逻辑冲突。
解决办法
1. 彻底卸载现有Pillow
先完全移除当前的Pillow,避免残留文件干扰:
pip uninstall -y pillow # 用conda环境的话,换成这个命令: # conda uninstall -y pillow
2. 安装兼容版本的Pillow
推荐安装Pillow 9.0.1或8.4.0,这两个版本在大多数layoutparser和Detectron2的环境里都能稳定运行:
pip install pillow==9.0.1 # 或者选8.4.0版本: # pip install pillow==8.4.0
3. 验证安装
安装完后,在Python里测试导入:
from PIL._util import is_directory, is_path
如果没报错,说明安装成功,再重新运行你的代码就行。
额外方案
要是上面的方法没用,试试把layoutparser和Detectron2更到最新版,确保所有依赖版本匹配:
pip install --upgrade layoutparser detectron2
内容的提问来源于stack exchange,提问作者Arham Shah
相关产品推荐
相关产品推荐

