像素坐标
一张图片是一个高 、宽 的像素矩阵,其大小简称作 。
在图片上建立坐标系,是以左上角 为原点, 轴正半轴向右 延伸、 轴正半轴向下 延伸,如图所示:
图源:https://interfacelift.com/wallpaper/details/3852/red_demons.html
图像上一个像素点的坐标就是指某像素点在上述坐标系中的坐标,如下图所示,图片大小 ,狐狸耳朵尖的坐标是 。
在目标检测任务中,经常与检测框打交道。检测框一般有两种表示方式: 和 ,均是相对上述坐标系而言的,例如下图中,检测框的两种表示方式分别是 和 。
图源:https://interfacelift.com/wallpaper/details/3852/red_demons.html
图像的加载
概述
众所周知,一张图片就是一个像素矩阵,且对于 RGB 格式而言,每个像素点都有 3 个值:R、G、B,它们的取值范围都是 ,分别可以用 1 个字节存储。因而,一个高 宽 通道数 的图片,就需要 个字节表示出来。这个 矩阵通常就是我们神经网络的输入。
但是在磁盘上,一张图片的存在形式并不一定是这个 矩阵,而是被编码(encode)成了各种格式,例如 jpeg
、png
、bmp
等等。jpeg
和 png
都是会压缩图片的,所以它们实际占的存储空间会比 小。从被编码的格式恢复到 矩阵的过程称作解码(decode)。
举个例子,这张图是图像处理领域最经典的图了:
lena.jpeg
查看图片信息,可以看到它的尺寸是 ,色彩空间是 ,那么它解码之后应占用 的空间,但它在磁盘上只占用了 ;类似地,这张图片的 png 格式占用磁盘空间为 。
torchvision.io
torchvision.io
(文档 )提供了许多图片加载和存储的函数,它们的作用就是让我们能够对图像编码、解码以及对图像文件读写。我画了一个图直观理解:
注意到文档里 decode_jpeg
有一个与众不同的参数:
device (str or torch.device ) – The device on which the decoded image will be stored. If a cuda device is specified, the image will be decoded with nvjpeg . This is only supported for CUDA version >= 10.1
nvjpeg
是 nvidia 的 gpu 上加速 jpeg 图像解码、编码和转码的库。所以我们在写 DataSet
时用这个库,可能会加快数据的读取,因而加快训练。
实验
用几个常用的库:cv2
、matplotlib.pylot
、PIL
、skimage
和 torchvision.io
,读取图像文件为矩阵形式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 st_time = time.time()for i in range (0 , 100 ): img = cv2.imread(paths[i])print (time.time() - st_time, '\tcv2' ) st_time = time.time()for i in range (0 , 100 ): img = plt.imread(paths[i])print (time.time() - st_time, '\tplt' ) st_time = time.time()for i in range (0 , 100 ): img = np.array(Image.open (paths[i]))print (time.time() - st_time, '\tPIL' ) st_time = time.time()for i in range (0 , 100 ): img = skimage.io.imread(paths[i])print (time.time() - st_time, '\tskimage' ) st_time = time.time()for i in range (0 , 100 ): img = torchvision.io.read_image(paths[i])print (time.time() - st_time, '\ttorchvision' )
PYTHON
本地(cpu)运行结果如下:
1 2 3 4 5 1 .4684679508209229 cv22 .0799291133880615 plt2 .2181248664855957 PIL2 .2203478813171387 skimage1 .4794716835021973 torchvision
APACHE
可以看到,plt
、PIL
和 skimage
落后 cv2
和 torchvision
很多,而后两者之间 cv2
略胜一筹。我反复运行了多次均是类似的结果。
有趣的是,这段代码在服务器上的运行结果是:
1 2 3 4 5 1 .348557472229004 cv21 .6608097553253174 plt1 .7273526191711426 PIL1 .660323143005371 skimage0 .5512754917144775 torchvision
APACHE
torchvision
完胜其他方式。