Bug in detectron2 import, PILLOW version needs a fix
AttributeError Traceback (most recent call last)
/tmp/ipykernel_578/1987038964.py in <cell line: 0>()
1 import layoutparser as lp
2 import detectron2
----> 3 model = lp.models.Detectron2LayoutModel(
4 config_path ='lp://PubLayNet/faster_rcnn_R_50_FPN_3x/config', # In model catalog
5 label_map ={0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"}, # In modellabel_map
/usr/local/lib/python3.11/dist-packages/layoutparser/file_utils.py in getattr(self, name) 219 return self._objects[name] 220 if name in self._modules: --> 221 value = self._get_module(name) 222 elif name in self._class_to_module.keys(): 223 module = self._get_module(self._class_to_module[name])
/usr/local/lib/python3.11/dist-packages/layoutparser/file_utils.py in _get_module(self, module_name) 230 231 def _get_module(self, module_name: str): --> 232 return importlib.import_module("." + module_name, self.name) 233 234 def reduce(self):
/usr/lib/python3.11/importlib/init.py in import_module(name, package) 124 break 125 level += 1 --> 126 return _bootstrap._gcd_import(name[level:], package, level) 127 128
/usr/lib/python3.11/importlib/_bootstrap.py in _gcd_import(name, package, level)
/usr/lib/python3.11/importlib/_bootstrap.py in find_and_load(name, import)
/usr/lib/python3.11/importlib/_bootstrap.py in find_and_load_unlocked(name, import)
/usr/lib/python3.11/importlib/_bootstrap.py in _load_unlocked(spec)
/usr/lib/python3.11/importlib/_bootstrap_external.py in exec_module(self, module)
/usr/lib/python3.11/importlib/_bootstrap.py in _call_with_frames_removed(f, *args, **kwds)
/usr/local/lib/python3.11/dist-packages/layoutparser/models/init.py in
/usr/local/lib/python3.11/dist-packages/layoutparser/models/detectron2/init.py in
/usr/local/lib/python3.11/dist-packages/layoutparser/models/detectron2/layoutmodel.py in
/usr/local/lib/python3.11/dist-packages/detectron2/engine/init.py in
/usr/local/lib/python3.11/dist-packages/detectron2/engine/hooks.py in
/usr/local/lib/python3.11/dist-packages/detectron2/evaluation/init.py in
/usr/local/lib/python3.11/dist-packages/detectron2/evaluation/cityscapes_evaluation.py in
/usr/local/lib/python3.11/dist-packages/detectron2/data/init.py in
/usr/local/lib/python3.11/dist-packages/detectron2/data/transforms/init.py in
/usr/local/lib/python3.11/dist-packages/detectron2/data/transforms/transform.py in
/usr/local/lib/python3.11/dist-packages/detectron2/data/transforms/transform.py in ExtentTransform() 44 """ 45 ---> 46 def init(self, src_rect, output_size, interp=Image.LINEAR, fill=0): 47 """ 48 Args:
AttributeError: module 'PIL.Image' has no attribute 'LINEAR'
I solved this by monkeypatching PIL... I created layout_detector_patch.py with the following contents
"""Patch for PIL compatibility issues with older detectron2 versions."""
import PIL.Image
# Add missing LINEAR attribute for compatibility with detectron2 0.4
if not hasattr(PIL.Image, 'LINEAR'):
PIL.Image.LINEAR = PIL.Image.BILINEAR
Then importing this patch before layoutparser:
# Apply PIL compatibility patch before importing layoutparser
from . import layout_detector_patch
import layoutparser as lp
import numpy as np
from PIL import Image
It's a little dirty, but allowed me to get on with my day 😉