下面以 BelgiumTS 识别交通标志数据集为例子来说明如何使用 tarfile
与 zipfile
。首先,需要载入相关包:
from pathlib import Path
import tarfile
import numpy as np
import imageio
from matplotlib import pyplot as plt
%matplotlib inline
将下载好的数据存放在 root 下:
root = Path('D:/data/BelgiumTS')
借助 tarfile
处理 jp2 格式的数据
需要注意的是 opencv 最新版已经不支持 jp2 格式的数据的处理,因而我转而使用 imagio
(如果有报错,请升级 pillow):
for t in root.glob('camera*'):
print(t)
打印下载的 jp2 格式的数据:
D:\data\BelgiumTS\camera00.tar
D:\data\BelgiumTS\camera01.tar
D:\data\BelgiumTS\camera02.tar
D:\data\BelgiumTS\camera03.tar
D:\data\BelgiumTS\camera04.tar
D:\data\BelgiumTS\camera05.tar
D:\data\BelgiumTS\camera06.tar
D:\data\BelgiumTS\camera07.tar
为了代码的可复用性,定义 tar 文件的解码器:
class DecodeTar:
def __init__(self, tar_name):
'''
tarfile 解码器
'''
self.tar_name = tar_name
def __iter__(self):
with tarfile.open(self.tar_name) as tar:
for name in tar.getnames():
if name.endswith('jp2'):
buffer = tar.extractfile(name).read()
yield imageio.imread(buffer)
调用解码器:
dt = DecodeTar(t)
使用 plt
可视化:
for img in dt:
plt.imshow(img)
plt.show()
break
我们也可以查看背景图片:
dt = DecodeTar(root / 'NonTS_TestingBG.tar')
for img in dt:
plt.imshow(img)
plt.show()
break
借助 zipfile
处理 ppm 图片
import zipfile
train = root / 'BelgiumTSC_Training.zip'
test = root / 'BelgiumTSC_Testing.zip'
z = zipfile.ZipFile(train)
z.namelist()[:4]
['Training/',
'Training/00000/',
'Training/00000/01153_00000.ppm',
'Training/00000/01153_00001.ppm']
可视化:
img = z.read('Training/00000/01153_00000.ppm') # buffer
img = imageio.imread(img)
plt.imshow(img)
plt.show()
网友评论