随着第三版imgproxy Pro的发布,我们宣布了一个早期访问计划,可以免费获得3.0版本,还有一些来自机器学习这一需求领域的新功能--包括面向对象的作物引力和SSIM的自动质量。除此之外,我们还增加了自定义管道、调色板处理、回退图像和更方便的管理功能。
智能功能
面向对象的作物引力
我们想了很久,现在终于实现了--我们将机器学习(ML)引入Imgproxy Pro。更准确地说,是物体检测。这一切都始于使我们的智能裁剪更加智能的愿望。一个典型的用例是,用户生成的内容应满足特定的形状和尺寸限制,但任何形状和尺寸都可能被上传。当我们根据给定的参数应用 "调整大小以填充 "时,imgproxy应该确切地知道如何裁剪照片,以避免删除某人的头部。当然,这些参数可以在处理选项中定义,但当系统可以在没有帮助的情况下确定什么应该被剔除时,那就方便多了。
到目前为止,imgproxy使用内置的libvps方法来做这件事,但它的算法没有使用机器学习--它们是用像素强度工作的。这意味着它们不能识别图像中的特定对象,而是以边缘、饱和度、肤色等为指导。不幸的是,除非在一个特定的位置有一个尖锐的强度,否则它很可能对该图像不起作用(大多数图像都是这种情况)。例如,在一张穿着商务套装的人的照片中,要确定正确的部分进行裁剪以创造一个头像,是相当困难的。
为了解决这个问题,我们正在使用机器学习算法,所以用户可以找到特定的对象并进行分类。你可以上传你自己的模型,或者你可以使用我们之前训练的ML模型(这避免了上传沉重的模型文件)。我们已经训练了我们的模型来检测人脸,但如果有必要,用户可以使用他们的模型来识别其他目标对象,如未成年人、动物、汽车等。

智能裁剪,图片来源--布鲁克-卡格尔
为了检查我们的模型,我们还实现了绘图检测功能,以显示图像上的边界框--算法已经检测到并确定为目标的区域。欢迎用户为自己的目的使用这一功能。
匿名化或模糊化检测
所有被检测到的东西也可以被模糊化。这一功能有助于对照片中的人进行匿名化,模糊特定的元素(如照片中的儿童),或图像中 "对工作不安全 "的部分。我们使用成熟的开源算法,但用户也可以利用他们自己的预训练模型。

模糊,照片来源 -Shane
通过SSIM或图像质量系数自动拘留的自动质量
通常情况下,用户倾向于对他们所有的图像应用相同的质量系数,但这往往不能提供文件大小和图像质量之间的完美平衡。有些图像文件可以用较小的质量系数保存,同时仍有令人满意的质量。
我们决定自动确定质量系数。我们用ML算法进行了实验,以找到一种预测保存图像的最佳系数的方法。我们的目标是达到一定的、非常低的压缩损失份额。我们能够在保持图像质量的前提下,通过尽可能多的压缩来减少文件的大小。
我们并不满足于自动质量的最简单实现--不断地重新保存图片,直到达到所需的系数--这可能需要相当长的时间。因此,我们发明了一种组合方法,即首先通过神经网络运行图片,确定系数,如果神经网络的预测不够准确,再进行微调。
我们使用SSIM(结构相似性)家族中的DSSIM(结构不相似性)指标,使我们能够确定两张图片之间的相似程度。就图像压缩而言,它是这样的:我们拍摄一张图片,在一些算法(如JPEG)的帮助下进行压缩,解码,然后计算原始图片和压缩图片的SSIM。更多的SSIM意味着更少的压缩损失。DSSIM的工作原理正好相反--数值越大意味着压缩过程中损失越大。因此,我们试图达到一个质量系数,即DSSIM非常接近所需的质量系数(而且这个限制可以调整)。
自动量化或启用动态PNG压缩
量化是一种有损失的压缩技术,通过将一系列的值压缩成一个单一的量值来实现。在我们的案例中,我们生成一个调色板,并将这个调色板的颜色指数分配给每个图像的像素。
图像可以用不同的方式进行编码,例如,系统可以为每个像素分配颜色值,也可以使用有限的调色板。对于PNG格式的图像,imgproxy已经支持后一种方法(这个选项必须在设置中指定)。
然而,我们的用户有时会面临一个问题:当PNG量化被禁用,而源PNG利用调色板时,产生的文件会大很多。相反的问题也会发生:当源PNG是全色的,但量化功能被启用时,结果文件会失去质量。
为了解决这个问题,我们引入了自动识别。如果原始图片包含一个调色板,那么我们也会对结果进行量化,反之亦然。现在我们在保存PNG图片时有两种模式--它们要么自动保存,要么我们总是量化它们。
ETag或转发请求头
在第三个版本中,我们已经实现了HTTP协议的ETags智能生成,以便在请求原始图像时更有效地进行缓存。如果一个浏览器的请求带有ETag,我们首先检查处理选项是否有变化,然后请求具有相同ETag的图像。如果服务器确认原始图像没有改变,我们就以 "未修改 "的状态回应浏览器,并且不处理图像(浏览器从缓存中获取图像)。与第二版的imgproxy Pro相比,不再需要下载一张没有变化的图片并再次处理,这就消除了大量的处理和内存负载。
链式处理流水线
在imgproxy中,我们设置了一个预设的处理流水线。经过一系列的测试,我们实现了一个处理顺序,使每一个操作都能尽快完成,减少不必要的内存成本。
但现在,为了几个使用案例,我们决定让用户有机会定制这个处理顺序。imgproxy Pro的第3版允许用户使用一个URL指定多个管道,然后这些管道将被一致执行。服务器根据第一条管道处理图片,在不保存图片的情况下完成处理,并使用下一条管道开始处理结果。因此,用户可以根据需要建立任何流程。
让我们讨论一下这在什么时候能派上用场。首先,这个功能对于需要多次迭代的情况很有价值,而且这些迭代可能包括更多的图像变化。例如,你可能需要调整一张照片的大小,然后进行裁剪,然后再次调整裁剪后的图像大小,以正确满足给定的参数。当你需要在同一张图片上同时添加几个水印时,定制处理顺序也很有用。
更容易管理
对于两个版本--开源版和专业版--我们还增加了一些新的管理功能。
- 我们增加了DataDog监控服务支持。
- 引入了 "skip_processing "选项,因此你可以指定你不希望用URL处理的格式。
- 我们增加了 "回退 "处理选项,所以你可以为每个请求指定一个自定义的回退图像URL。
- 我们为回退图像响应实现了一个HTTP代码。用户现在可以在没有找到图片和利用回退时指定HTTP响应代码。
- 我们增加了 "expires "处理选项--这有助于设置链接过期的日期/时间/周期。
此外,"像素化 "过滤器现在是一个开放源码的功能,每个人都可以免费使用。
![]()
像素化,图片来源--美国国家航空航天局
我们还利用第三个版本的发布,在整个产品中实施大规模的重构。我们的目的是简化产品支持,并删除任何不必要的和被废弃的功能。这使我们能够清理出一些空间来引入一些更复杂的功能,即机器学习功能。
在这里了解更多关于所有专业功能:imgproxy.net。