importterror: Imageio枕头需要枕头,而不是PIL!



这个问题可能已经被问过几次了,但我无法解决这个错误。我在我的M1 Mac上安装了pillow, imageio和其他库。但是当我在下面运行代码时,我仍然得到错误。

注意:我已经使用miniforge创建了我的环境。

代码:形象= imread (source_path +‘/’+ t[文件夹+(批* batch_size)] .strip () .split(";")[0]+‘/’+一个[项目]).astype (np.float32)

如果需要任何其他信息来解决这个问题,很高兴添加到这里。

错误:

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
Input In [11], in <cell line: 1>()
----> 1 model.fit(train_generator, steps_per_epoch=steps_per_epoch, epochs=num_epochs, verbose=1, 
2                     callbacks=callbacks_list, validation_data=val_generator, 
3                     validation_steps=validation_steps, class_weight=None, workers=1, initial_epoch=0)
File ~/miniforge3/envs/tensorflow/lib/python3.9/site-packages/tensorflow/python/keras/engine/training.py:1133, in Model.fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
1127   self._cluster_coordinator = cluster_coordinator.ClusterCoordinator(
1128       self.distribute_strategy)
1130 with self.distribute_strategy.scope(), 
1131      training_utils.RespectCompiledTrainableState(self):
1132   # Creates a `tf.data.Dataset` and handles batch and epoch iteration.
-> 1133   data_handler = data_adapter.get_data_handler(
1134       x=x,
1135       y=y,
1136       sample_weight=sample_weight,
1137       batch_size=batch_size,
1138       steps_per_epoch=steps_per_epoch,
1139       initial_epoch=initial_epoch,
1140       epochs=epochs,
1141       shuffle=shuffle,
1142       class_weight=class_weight,
1143       max_queue_size=max_queue_size,
1144       workers=workers,
1145       use_multiprocessing=use_multiprocessing,
1146       model=self,
1147       steps_per_execution=self._steps_per_execution)
1149   # Container that configures and calls `tf.keras.Callback`s.
1150   if not isinstance(callbacks, callbacks_module.CallbackList):
File ~/miniforge3/envs/tensorflow/lib/python3.9/site-packages/tensorflow/python/keras/engine/data_adapter.py:1364, in get_data_handler(*args, **kwargs)
1362 if getattr(kwargs["model"], "_cluster_coordinator", None):
1363   return _ClusterCoordinatorDataHandler(*args, **kwargs)
-> 1364 return DataHandler(*args, **kwargs)
File ~/miniforge3/envs/tensorflow/lib/python3.9/site-packages/tensorflow/python/keras/engine/data_adapter.py:1154, in DataHandler.__init__(self, x, y, sample_weight, batch_size, steps_per_epoch, initial_epoch, epochs, shuffle, class_weight, max_queue_size, workers, use_multiprocessing, model, steps_per_execution, distribute)
1152 adapter_cls = select_data_adapter(x, y)
1153 self._verify_data_adapter_compatibility(adapter_cls)
-> 1154 self._adapter = adapter_cls(
1155     x,
1156     y,
1157     batch_size=batch_size,
1158     steps=steps_per_epoch,
1159     epochs=epochs - initial_epoch,
1160     sample_weights=sample_weight,
1161     shuffle=shuffle,
1162     max_queue_size=max_queue_size,
1163     workers=workers,
1164     use_multiprocessing=use_multiprocessing,
1165     distribution_strategy=ds_context.get_strategy(),
1166     model=model)
1168 strategy = ds_context.get_strategy()
1170 self._current_step = 0
`enter code here`File ~/miniforge3/envs/tensorflow/lib/python3.9/site-packages/tensorflow/python/keras/engine/data_adapter.py:809, in GeneratorDataAdapter.__init__(self, x, y, sample_weights, workers, use_multiprocessing, max_queue_size, model, **kwargs)
805 super(GeneratorDataAdapter, self).__init__(x, y, **kwargs)
807 # Since we have to know the dtype of the python generator when we build the
808 # dataset, we have to look at a batch to infer the structure.
--> 809 peek, x = self._peek_and_restore(x)
810 peek = self._standardize_batch(peek)
811 peek = _process_tensorlike(peek)
File ~/miniforge3/envs/tensorflow/lib/python3.9/site-packages/tensorflow/python/keras/engine/data_adapter.py:866, in GeneratorDataAdapter._peek_and_restore(x)
864 @staticmethod
865 def _peek_and_restore(x):
--> 866   peek = next(x)
867   return peek, itertools.chain([peek], x)
Input In [4], in generator(source_path, folder_list, batch_size)
16 imgs = os.listdir(source_path+'/'+ t[folder + (batch*batch_size)].split(';')[0]) # read all the images in the folder
17 for idx,item in enumerate(img_idx): #  Iterate iver the frames/images of a folder to read them in
---> 18     image = imread(source_path+'/'+ t[folder + (batch*batch_size)].strip().split(';')[0]+'/'+imgs[item]).astype(np.float32)
20     #crop the images and resize them. Note that the images are of 2 different shape 
21     #and the conv3D will throw error if the inputs in a batch have different shapes
22     # Let us resize all the images.Let's use PIL.Image.NEAREST (use nearest neighbour) resampling filter. 
23     resized_image = resize(image,(y,z)) ##default resample=1 or 'P' which indicates PIL.Image.NEAREST
File ~/miniforge3/envs/tensorflow/lib/python3.9/site-packages/imageio/core/functions.py:206, in imread(uri, format, **kwargs)
202     raise TypeError('Invalid keyword argument "mode", '
203                     'perhaps you mean "pilmode"?')
205 # Get reader and read first
--> 206 reader = read(uri, format, 'i', **kwargs)
207 with reader:
208     return reader.get_data(0)
File ~/miniforge3/envs/tensorflow/lib/python3.9/site-packages/imageio/core/functions.py:123, in get_reader(uri, format, mode, **kwargs)
121     format = formats[format]
122 else:
--> 123     format = formats.search_read_format(request)
124 if format is None:
125     raise ValueError('Could not find a format to read the specified file '
126                      'in mode %r' % mode)
File ~/miniforge3/envs/tensorflow/lib/python3.9/site-packages/imageio/core/format.py:673, in FormatManager.search_read_format(self, request)
671 # Select the first that can
672 for format in selected_formats:
--> 673     if format.can_read(request):
674         return format
676 # If no format could read it, it could be that file has no or
677 # the wrong extension. We ask all formats again.
File ~/miniforge3/envs/tensorflow/lib/python3.9/site-packages/imageio/core/format.py:188, in Format.can_read(self, request)
183 def can_read(self, request):
184     """ can_read(request)
185     
186     Get whether this format can read data from the specified uri.
187     """
--> 188     return self._can_read(request)
File ~/miniforge3/envs/tensorflow/lib/python3.9/site-packages/imageio/plugins/pillow.py:97, in PillowFormat._can_read(self, request)
96 def _can_read(self, request):
---> 97     Image = self._init_pillow()
98     if request.mode[1] in (self.modes + '?'):
99         if self.plugin_id in Image.OPEN:
File ~/miniforge3/envs/tensorflow/lib/python3.9/site-packages/imageio/plugins/pillow.py:81, in PillowFormat._init_pillow(self)
79 import PIL
80 if not hasattr(PIL, 'PILLOW_VERSION'):  # pragma: no cover
---> 81     raise ImportError('Imageio Pillow requires '
82                       'Pillow, not PIL!')
83 from PIL import Image
84 self._Image = Image
ImportError: Imageio Pillow requires Pillow, not PIL!

我知道了下面的决议。

这是imageio的问题,已于2018年4月解决:https://github.com/imageio/imageio/pull/336

请更新到imageio 2.4.0或更新版本。

你正在使用的库有bug,我建议向他们报告

PILLOW_VERSION在枕头9.0.0中被移除:

https://github.com/python-pillow/Pillow/blob/638ba163f425fd586ded4780b8024536819922f8/src/PIL/__init__.py由于

# VERSION was removed in Pillow 6.0.0.
# PILLOW_VERSION was removed in Pillow 9.0.0.
# Use __version__ instead.
__version__ = _version.__version__

的一个变通方法是注释掉

那一行。

最新更新