Когда я загружаю изображение через PIL в Python3, сохраняю его, а затем загружаю снова, я получаю разные значения в Ubuntu 18.04.5 и Ubuntu 20.04. .1. Я понимаю, что повторное сохранение изображения изменит значения из-за сжатия, но почему это изменение отличается в Ubuntu 18.04? Все остальные ОС, которые я пробовал (Ubuntu 20.04+, Fedora 33, Windows 10 20H2), дают одно значение, но Ubuntu 18.04 отличается, даже когда во всех вышеупомянутых операционных системах были одинаковые версии подушек / PIL, numpy и python.
img = Image.open('Sp_D_CNN_A_art0024_ani0032_0268.jpg')
np.sum(np.array(img))
OUTPUT : 28586794 (Same for all the OS)
img.save('temp.jpg', 'JPEG')
tempimg = Image.open('temp.jpg')
np.sum(np.array(tempimg))
OUTPUT : 28581417 (for Ubuntu 18.04.5 and CentOS 8.2.2004)
28582606 (for Ubuntu 20.04+, Fedora 33, Windows 10 20H2)
Теперь разница здесь может показаться очень небольшой, но проблема в том, что после дальнейшей обработки моим алгоритмом анализа уровня ошибок разница становится огромной, и когда я обучил свою модель сегментации на Google Colab (который использует Ubuntu 18.04.5 во время выполнения) сгенерированная маска оказывается очень неточной в Ubuntu 20.04+, Fedora 33, Windows 10 20H2.
Почему это происходит и как я могу это исправить?
Виновником этого является базовая версия libjpeg, используемая библиотекой подушки (PIL). Хотя и Ubuntu 18.04.5, и Ubuntu 20.04.1 имеют один и тот же пакет libjpeg, версия подушки, установленная по умолчанию в Ubuntu 18.04.5, имеет свои собственные двоичные файлы. Таким образом, решение для этого состоит в том, чтобы удалить текущую подушку и переустановить ее, загрузив и собрав ее из исходного кода, чтобы она гарантированно использовала системный libjpeg.
Сначала удалите текущий модуль подушки
python3 -m pip uninstall Pillow
Затем просто установите пакеты зависимостей, перечисленные здесь: https://pillow.readthedocs.io/en/stable/installation.html#building-on-linux
Затем запустите:
python3 -m pip install Pillow --no-binary :all: