快速调整视频吉普音

在处理图像的应用程序中,调整吉普(使用JPEG算法压缩的图像)大小的任务非常普遍。 在这种情况下,您不能立即调整大小,必须先解码原始数据。 这没有什么复杂和新鲜的问题,但是如果您每天需要进行数百万次操作,那么优化这种解决方案的性能(应该很快)就显得尤为重要。



在为图片存储库组织远程托管时,经常会遇到此问题,因为大多数相机和电话都以JPEG格式拍摄。 每天,领先的Web服务(社交网络,论坛,照片托管等)的照片档案都充斥着大量此类图像,因此,如何存储此类图像的问题极为重要。 为了减小传出流量的大小并改善对用户请求的响应时间,许多Web服务为不同分辨率的单个图像存储了数十个文件。 响应速度很好,但是这些副本占用了大量空间。 这是一个主要问题,尽管此方法还有其他缺点。

解决此问题的想法不是在服务器上以不同分辨率为原始图像存储很多选项,而是从先前准备的原始图像中以给定的尺寸动态地创建所需的图像,并且尽快。 因此,您可以实时创建所需分辨率的图像并将其立即发送给用户。 非常重要的是,可以立即做出此图像的分辨率,以使用户的设备不进行屏幕调整大小,因为这根本没有必要。

使用JPEG以外的格式作为组织此类图像存储库的基础似乎是不合理的。 当然,有一些标准的,广泛使用的格式可以提供相同质量的更好压缩效果(JPEG2000,WebP),但是与JPEG相比,此类图像的编码和解码速度非常低,因此选择JPEG作为存储原始照片的基本格式是有道理的,如有必要,将在收到用户请求后实时缩放。

当然,除吉普车外,每个站点通常都具有PNG和GIF图像,但是通常它们的相对数量很少,并且使用这些格式的照片极为罕见。 因此,在大多数情况下,这些格式不会对所讨论的任务产生重大影响。

动态调整大小算法的说明


因此,输入数据为JPEG文件,并且要实现快速解码(对于CPU和GPU都是如此),压缩的图像必须具有内置的重新启动标记。 这些标记在JPEG标准中进行了描述,部分编解码器可以使用它们,其余的知道如何不注意它们。 如果吉普车没有这样的标记,则可以使用jpegtran实用程序预先添加它们。 添加标记后,图像不会改变,但文件大小会稍大。 结果,我们得到以下工作方案:

  1. 从CPU内存中获取图像数据
  2. 如果有颜色配置文件,请从EXIF部分获取并保存
  3. 将图片复制到视频卡
  4. 解码JPEG
  5. 我们根据Lanczos算法调整大小(减少)
  6. 清晰度
  7. 我们使用JPEG对图像进行编码
  8. 复制图片到主机
  9. 将原始颜色配置文件添加到生成的文件中。

您可以在调整大小之前将反伽马叠加在像素的每个分量上,以使调整大小位于线性空间中,然后再次应用伽玛,但在锐化之后再进行更精确的决策 用户的实际差异很小,但是存在,并且这种修改的计算成本最小。 仅需要将反伽马和反伽马的叠加插入到常规处理方案中。

使用libjpeg-turbo库在多核CPU上对吉普车进行解码时,还有一种可能的解决方案。 在这种情况下,每个图片在单独的CPU流中解码,并且所有其他操作在视频卡上执行。 在拥有大量CPU内核的情况下,这可能会更快地发生,但是会导致严重的延迟损失。 如果在单个CPU内核上解码吉普车时的延迟是可以接受的,则此选项可以非常快,特别是对于原始吉普车具有较小分辨率的情况。 随着原始图像分辨率的提高,吉普车在一个CPU流中的解码时间将增加,因此此选项仅适用于小分辨率。

Web调整大小任务的基本要求


  • 建议不要在服务器上以不同的分辨率存储每个图像的几十个副本,而应在收到请求后立即以正确的分辨率快速创建所需的图片。 这对于减小存储空间的大小很重要,因为否则您将必须存储每个图像的许多不同副本。
  • 必须尽快解决该问题。 这是关于减少对用户请求的响应时间方面所提供的服务质量的问题。
  • 发送的图像的质量应该很高。
  • 发送的图像的文件大小应尽可能小,其分辨率必须与显示窗口的大小完全匹配。 以下几点在这里很重要:

a)如果图像大小与窗口大小不匹配,则用户设备(电话,平板电脑,笔记本电脑)将在解码后进行硬件调整大小,然后再在屏幕上显示图像。 在OpenGL中,仅根据双线性算法来完成此硬件调整大小,这通常会导致在包含小细节的图像中出现波纹(污点)和其他伪像。

b)屏幕调整大小还会消耗设备能量。

c)如果您使用一系列预先缩放的图像来解决问题,则并非总是能够获得正确的尺寸,这意味着您将必须发送更高分辨率的图片。 图片大小的增加导致流量增加,我也想避免。

总体工作计划说明


  1. 我们以任何格式和任何分辨率从用户那里接收图像。 原稿存储在单独的数据库中(如有必要)。
  2. 脱机使用ImageMagick或类似软件,保存颜色配置文件,将原始原始图像转换为标准BMP或PPM格式,然后将其尺寸调整为1K或2K分辨率并压缩为JPEG,然后使用jpegtran实用程序以指定的固定间隔添加重新启动标记。
  3. 我们组成了一个1K或2K图像的数据库。
  4. 收到用户的请求后,我们获得有关图片和应显示此图片的窗口大小的信息。
  5. 我们在数据库中找到图像并将其发送到调整大小。
  6. 调整大小器接收图像文件,解码,调整大小,锐化,编码并将原始颜色配置文件插入到生成的吉普车中。 之后,它将图片提供给外部程序。
  7. 在每个视频卡上,您可以运行多个线程,并且可以在计算机上安装多个视频卡-从而实现性能扩展。
  8. 所有这些操作都可以在NVIDIA Tesla视频卡(例如P40或V100)的基础上完成,因为NVIDIA GeForce视频卡不是为连续长期运行而设计的,并且NVIDIA Quadro具有许多在这种情况下不需要的视频输出。 为解决此问题,对GPU内存大小的要求降至最低。
  9. 另外,从具有准备好的图像的数据库中,您可以为经常使用的文件动态分配缓存。 在那里根据前一时期的统计数据存储经常使用的图像是有意义的。



程序参数


  1. 新图像的宽度和高度。 它们可以是任何一个,最好对其进行显式设置。
  2. JPEG稀疏模式(二次采样)。 共有三个选项:4:2:0、4:2:2和4:4:4,但它们通常使用4:4:4或4:2:0。 最大质量为4:4:4,最小帧大小为4:2:0。 细化了色差成分,人的视力不及亮度。 每种抽取模式都有自己的最佳间隔,用于重新启动标记以实现最大的编码或解码速度。
  3. 创建图像数据库时的JPEG压缩质量和抽取模式。
  4. 在3x3窗口中进行锐化,可以控制sigma(半径)。
  5. 编码最终图像时的JPEG压缩质量和抽取模式。 通常,至少90%的质量表示此压缩是“视觉上无损的”,即 未经培训的用户在标准查看条件下不应看到JPEG算法的伪像。 相信对于受过训练的用户,需要93-95%。 该值越大,发送给用户的帧的大小越大,并且解码和编码时间越长。

重要限制


重新启动标记。 仅在视频卡中有重新启动标记的情况下,我们才能快速解码JPEG图像。 在正式的JPEG标准中,描述了这些标记,这是一个标准参数。 如果没有重新启动标记,则不可能并行化视频卡上图片的解码,这将导致解码器速度非常低。 因此,我们需要一个准备好的图像数据库,其中包含这些标记。

图像编解码器的固定算法。 到目前为止,使用JPEG算法对图像进行解码和编码是最快的选择。

准备的数据库中图像的分辨率可以是任何分辨率,但是作为选项,我们将考虑1K和2K(您可以选择4K)。 调整大小时,不仅可以减少图像,还可以增加图像。

快速调整大小性能


我们通过NVIDIA Tesla V100视频卡(OS Windows Server 2016,64位,驱动程序24.21.13.9826)上的Fastvideo SDK上的快速调整大小应用程序,在分辨率为1K和2K(1280x720和1920x1080)。 针对同一视频卡上运行的不同数量的线程进行了测试。 每个流视频卡上需要不超过11​​0 MB的内存。 4个流不需要超过440 MB。

首先,我们将原始图像以90%的质量压缩为JPEG,并以4:2:0或4:4:4的间隔进行细化。 然后,我们解码宽度和高度的2倍并调整其大小,使其清晰,然后再次以4:2:2或4:4:4的质量进行90%编码。 源数据在RAM中,最后一张图片放置在其中。

从开始从RAM加载原始图像到将处理后的图像保存到RAM的时间开始计算操作时间。 测量中不包括程序初始化时间和视频卡上的内存分配。

24位1K图像的示例命令行
PhotoHostingSample.exe -i 1k_wild.90.444.jpg -o 1k_wild.640.jpg -outputWidth 640 -q 90 -s 444 -sharp_after 0.95 -repeat 200

在一个线程中处理1K图像的基准


解码(包括向视频卡的数据传输):0.70毫秒
调整大小两次(宽度和高度):0.27 ms
尖锐:0.02毫秒
JPEG编码(包括从视频卡传输的数据):0.20毫秒
每帧总时间:1.2毫秒

1K的性能


质素细化调整大小帧频(Hz)
1个90%4:4:4/4:2:02次1个868/682
290%4:4:4/4:2:02次21039/790
390%4:4:4/4:2:02次3993/831
490%4:4:4/4:2:02次41003/740


2K的性能


质素细化调整大小帧频(Hz)
1个90%4:4:4/4:2:02次1个732/643
290%4:4:4/4:2:02次2913/762
390%4:4:4/4:2:02次3891/742
490%4:4:4/4:2:02次4923/763


源映像的稀疏4:2:0会降低速度,但是源文件和目标文件的大小会变小。 当切换到4:2:0时,并行度下降4倍,因为现在将16x16块视为一个单元,因此在此模式下,速度低于4:4:4。

性能主要由JPEG解码阶段决定,因为在此阶段,图片具有最大的分辨率,并且此处理阶段的计算复杂度高于所有其他阶段。

总结


测试结果表明,对于NVIDIA Tesla V100视频卡,当同时启动2-4个流时,其1K和2K图像的处理速度最大,范围为每视频卡每秒800至1000帧。 处理1K图像要比2K快,处理4:2:2图像总是比处理4:4:4慢。 为了获得性能的最终结果,您需要准确确定程序的所有参数,并针对特定型号的视频卡对其进行优化。

一个毫秒量级的延迟是一个很好的结果。 据我们所知,对于CPU上的类似调整大小任务(即使不需要对吉普车进行编码和解码)也无法获得这样的延迟,因此这是在高性能图像处理解决方案中支持使用视频卡的另一个重要论点。

每天可能需要多达16块NVIDIA Tesla V100图形卡来处理1K或2K分辨率的十亿吉普车。 我们的一些客户已经在使用此解决方案,而其他客户则在其任务中对其进行了测试。

调整视频卡上吉普车的大小不仅对Web服务非常有用。 可能需要大量功能的高性能图像处理应用程序。 例如,在监视器上显示图片之前,对于从相机接收到的图像的几乎任何处理方案,通常都需要快速调整大小。 该解决方案可在任何NVIDIA显卡上适用于Windows / Linux:Tegra K1 / X1 / X2 / Xavier,GeForce GT / GTX / RTX,Quadro,Tesla。

图形卡上快速调整大小解决方案的优点


  • 大大减少了源图像的存储大小
  • 减少基础设施成本的主要成本(硬件和软件)
  • 响应时间短,提高了服务质量
  • 减少流量
  • 降低用户设备的功耗
  • 提出的解决方案的可靠性和速度,已经在庞大的数据集上进行了测试
  • 缩短了面向Linux和Windows的此类应用程序的上市时间
  • 可在单个视频卡上或作为群集一部分使用的解决方案的可伸缩性
  • 此类项目的快速投资回报

谁可能感兴趣


快速调整吉普车尺寸的库可用于几乎所有大型企业管理软件中的高负载Web服务,大型在线商店,社交网络,在线照片管理系统,电子商务中。

软件开发人员可以使用该库,该库提供了几毫秒的延迟,可以在视频卡上以1K,2K和4K的分辨率调整吉普车的大小。

显然,在深度学习神经网络的训练阶段,这种方法可能比NVIDIA DALI解决方案更快,可以快速解析吉普车,调整大小和准备图像。

还有什么可以做的


  • 除了调整大小和锐化之外,还可以将裁切添加到现有算法中,旋转90/180/270,应用水印,控制亮度和对比度。
  • 优化了NVIDIA Tesla P40和V100视频卡的解决方案。
  • 附加的优化性能JPEG解码器。
  • 突发模式,用于解码视频卡上的吉普车。

Source: https://habr.com/ru/post/zh-CN424575/


All Articles