在上一篇博客中,我们简单介绍了如何基于 OpenCV.js 或 Rust/WebAssembly 设计并实现技术方案,在前端业务中实现计算机视觉类(下文简称 CV)的功能。感兴趣的同学可以点击下方链接回顾上一期博客:
在本文中,我们将从算法、系统、业务三个方面,分享在进一步的性能优化上的一些经验。
一、优化对象
在我们的业务系统中,大量的 CV 计算函数均以实现“风格转换”为目标,亦即通过变换、增强原始的生物特征图像,方便系统使用者观察、标注、比对。
根据我们的内部数据统计,“图像风格转换”的使用频次较高,且短时间内使用密度大,用户期待快速的视觉反馈。因而以此类函数作为主要的优化目标能带来较高的收益。
锐化、颜色混合是 2 个高频使用的风格转换函数。锐化往往能增强图像纹理细节,加大特征与背景的区分度,对于在较差环境下拍摄、提取的模糊图像,较为实用。颜色混合函数则将单一底色,以线性混合的方式与原图混合,可用于突出生物特征的纹线。常用的为某一特定色度、明度、饱和度下的蓝色。
下文将主要以这 2 个函数为例,介绍性能优化的主要思路与方法。
二、优化思路
对于如 CV 函数般的计算密集型任务,有常见的 3 个性能优化方向。
1.算法
优化算法从而降低时间复杂度、减少高耗时的操作数往往是第一步。例如,对于最常见的卷积操作,我们可以使用 Winograd 算法计算小核(e. g. 3x3, stride 1)以减少乘法计算次数;使用离散傅里叶变换计算大核降低时间复杂度(e.