如何将Pillow3.1.1中使用的libjpeg9切换到libjpeg8?

问题描述 投票:0回答:1

背景

我的最终目标是运行https://github.com/tkarras/progressive_growing_of_gans/blob/master/h5tool.py

这需要Pillow3.1.1和libjpeg8。检查数据集的第一个图像的MD5时发生错误。它似乎是由枕头中使用的不同版本的libjpeg引起的。我在Pillow3.1.1中使用libjpeg9,而建议的版本是libjpeg8。我在另一台机器上测试了它并得到了这些结果:

在我的机器上

# python
import hashlib
from PIL import Image
md = hashlib.md5()
md.update(Image.open('000001.jpg').tobytes())
print(md.hexdigest())
# 92a0d5f96769de4e68a0ce40e7f0c13f
# It is incorrect

在另一台机器上

# python
import hashlib
from PIL import Image
md = hashlib.md5()
md.update(Image.open('000001.jpg').tobytes())
print(md.hexdigest())
# 9cad8178d6cb0196b36f7b34bc5eb6d3
# It is correct.

但是,当我尝试使用md5sum在不同的机器上检查这两个图像时,我得到了相同的代码。这意味着文件完全相同。所以我认为问题可能是libjpeg的版本。

在我的机器上

ldd /home/liyh/anaconda2/envs/theano/lib/python2.7/site-packages/PIL/_imaging.so
linux-vdso.so.1 =>  (0x00007ffe4e3f6000)
**libjpeg.so.9 => /home/liyh/anaconda2/envs/theano/lib/libjpeg.so.9 (0x00007fbeb418a000)**
libz.so.1 => /home/liyh/anaconda2/envs/theano/lib/libz.so.1 (0x00007fbeb3f74000)
libtiff.so.5 => /home/liyh/anaconda2/envs/theano/lib/libtiff.so.5 (0x00007fbeb3cf6000)
libpython2.7.so.1.0 => /home/liyh/anaconda2/envs/theano/lib/libpython2.7.so.1.0 (0x00007fbeb38fa000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbeb36dc000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbeb3313000)
liblzma.so.5 => /home/liyh/anaconda2/envs/theano/lib/./liblzma.so.5 (0x00007fbeb30ee000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fbeb2ee6000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbeb2be0000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbeb29dc000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fbeb27d9000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbeb4631000)

在另一台机器上

$ldd /home/liyh/anaconda2/lib/python2.7/site-packages/PIL/_imaging.so
linux-vdso.so.1 =>  (0x00007ffff4791000)
**libjpeg.so.8 => /home/liyh/anaconda2/lib/python2.7/site-packages/PIL/../../../libjpeg.so.8 (0x00007f217847f000)**
libz.so.1 => /home/liyh/anaconda2/lib/python2.7/site-packages/PIL/../../../libz.so.1 (0x00007f2178268000)
libtiff.so.5 => /home/liyh/anaconda2/lib/python2.7/site-packages/PIL/../../../libtiff.so.5 (0x00007f2177fea000)
libpython2.7.so.1.0 => /home/liyh/anaconda2/lib/python2.7/site-packages/PIL/../../../libpython2.7.so.1.0 (0x00007f2177bf0000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f21779b5000)
libc.so.6 => /lib64/libc.so.6 (0x00007f21775f4000)
liblzma.so.5 => /home/liyh/anaconda2/lib/python2.7/site-packages/PIL/../../.././liblzma.so.5 (0x00007f21773ce000)
librt.so.1 => /lib64/librt.so.1 (0x00007f21771c6000)
libm.so.6 => /lib64/libm.so.6 (0x00007f2176ec4000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f2176cc0000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f2176abc000)
/lib64/ld-linux-x86-64.so.2 (0x00007f217890e000)

我试图重新安装Pillow == 3.1.1,但它继续使用libjpeg9而不是libjpeg8。

如果我删除/home/liyh/anaconda2/envs/theano/lib/libjpeg.so.9并将libjpeg.so.8添加到目录中并重新安装Pillow == 3.1.1,我得到了

ImportError: libjpeg.so.9: cannot open shared object file: No such file or directory

我的问题是:

  • 如何使用libjpeg8或者安装Pillow3.1.1
  • 如何使用libjpeg9生成正确的MD5代码,或者
  • 导致不同MD5代码的其他可能原因是什么?

Ubuntu 4.8.4-2ubuntu1~14.04.3 Python 2.7

编辑:我使用的图像是CelebA dataset中的第一个图像(000001.jpg)(“in-the-wild”版本,而不是“对齐和裁剪”)。

$md5sum /data2/pub_data/CelebA/Img/img_celeba/000001.jpg
39d4f4f149cf541601ad334ea98c822d  
pillow libjpeg
1个回答
0
投票

我碰巧通过用pillow==3.1.1而不是conda安装pip来解决这个问题。这样,枕头就像我们想要的那样使用libjpeg8作为它的jpeg解码器。

conda create -n new_env
source activate new_env    
conda install pillow==3.1.1
conda install ...(other needed libs)
© www.soinside.com 2019 - 2024. All rights reserved.