我试图在tensorflow中的对象检测模型中执行一些数据扩充,所以我检查了不同图像表示的兼容性。
首先,我只是使用PIL
(Pillow
准确)阅读图像文件
full_path = 'path/to/my/image.jpg'
image = PIL.Image.open(full_path)
image_np = np.array(image)
encoded_jpg_io1 = io.BytesIO(image_np)
然后我使用了tensorflow版本(也用于创建tfrecords):
with tf.gfile.GFile(full_path, 'rb') as fid:
encoded_jpg = fid.read()
encoded_jpg_io2 = io.BytesIO(encoded_jpg)
然后我检查了上述操作的相等性:
if encoded_jpg_io1 == encoded_jpg_io2:
print('Equal')
我期待那两个人是平等的。那么,为什么这不是这里的情况呢?
如果我使用字节,我会得到相同的结果:
v1 = encoded_jpg_io1.getvalue()
v2 = encoded_jpg_io2.getvalue()
if encoded_jpg_io1.getvalue() == encoded_jpg_io2.getvalue():
print('Equal')
if v1.__eq__(v2):
print('Equal')
我需要用numpy操作我的图像,然后创建一些tfrecords,这样就需要相等。
一些有趣的事实:
1. PIL
根本无法以np.array
格式阅读图片:
image1 = PIL.Image.open(encoded_jpg_io1)
OSError:无法识别图像文件
使用GFile
时工作正常:
image2 = PIL.Image.open(encoded_jpg_io2)
2. PIL
图片无法直接转换为BytesIO
:
encoded_jpg_io1 = io.BytesIO(image)
TypeError:需要类似字节的对象,而不是'JpegImageFile'