Torchvision transforms.toPILImage () TypeError: функция принимает ровно 1 аргумент (3 дано) - PullRequest
0 голосов
/ 31 марта 2020

С подушки Anaconda -> 7.00 torchvision -> 0.5.0

Сегодня я установил последнюю Anaconda для Linux (Anaconda3-2020.02- Linux -x86_64. sh), и я запускаю следующие команды,

conda create -n py36 python=3.6
conda activate py36
conda install -c pytorch torchvision
conda install -c pytorch pytorch
conda install -c conda-forge opencv
conda install -c conda-forge python-pptx
conda install -c conda-forge labelme
conda install -c conda-forge tensorboardx
conda install -c anaconda ipywidgets
conda install -c conda-forge ipyvolume
conda install -c conda-forge jupyter_contrib_nbextensions 
conda install -c anaconda pytables

jupyter-notebook

Выполнение того же точного кода, который я выполняю уже несколько месяцев,

trusted code

# visualize a single example to verify that it is correct
( img, patch_mask, patch_mask_weight, fname) = dataset[ "train"][ 70]

I получаю следующую ошибку,

error

Как это можно решить? Пожалуйста, дайте мне знать, если требуется больше кода.

ОБНОВЛЕНИЕ I

Показанный код применяет серию преобразований к двум изображениям RGB и изображению метки, имеющему уникальные значения 0, 1, 2 для фона, переднего плана и регионов, которые будут игнорироваться при глубоком обучении, соответственно. Вывод ниже получен из добавленных операторов print в код, показанный в трассировке ошибок, показанной выше.

Output

Похоже, что для первого RGB image все работает нормально, тогда как для изображения метки есть проблема. В частности, преобразование вращения является проблемным c, где атрибут color имеет кортеж в качестве значения. Однако тот же атрибут в преобразовании ToPILImage имеет значение одного целого числа.

Спасибо

1 Ответ

0 голосов
/ 01 апреля 2020

Ошибка возникает при вызове преобразования RandomRotation и создании нового экземпляра класса Image. В частности, функция core.fill() в строке 2544 return im._new( core.fill(mode, size, color)) в функции new в файле anaconda3/envs/py36/lib/python3.6/site-packages/PIL/Image.py является источником «зла».

core является псевдонимом файла anaconda3/envs/py36/lib/python3.6/site-packages/PIL/_imaging.cpython-36m-x86_64-linux-gnu.so при импорте как from . import _imaging as core в строке 69 в том же файле (Image.py).

Функция core.fill(mode, size, color)) в зависимости от mode имеет различные ожидания относительно color. color всегда 3-кортеж, строки 726-727 в файле anaconda3/envs/py36/lib/python3.6/site-packages/torchvision/transforms/functional.py, функция rotate т.е. RandomRotation transform.

Если mode == RGB, то все в порядке. Если mode == L, то TypeError: function takes exactly 1 argument (3 given) повышается. Если mode == F, TypeError: must be real number, not tuple повышен. Я обнаружил, что при преобразовании моих изображений.

Для mode in [ 'L', 'F'] параметр color должен быть одним целым числом. Для других mode s это также может быть истиной.

Таким образом, я решил свою проблему, обновив код как

if mode in [ 'L', 'F'] and isinstance( color, tuple):
     color = color[ 0]

return im._new( core.fill(mode, size, color))

в файле anaconda3/envs/py36/lib/python3.6/site-packages/PIL/Image.py, функция new.

Это изменение наиболее близко к проблеме. Однако, поскольку new, по-видимому, используется для каждого преобразования, может быть лучше изменить код где-то еще, чтобы изменение имело минимальное влияние на остальную часть кода.

...