1.5 抽象
在生活中,抽象工具是广泛存在的。例如,键盘就是一个抽象工具,它封装了所有功能,帮我们屏蔽了所有无关细节。在使用键盘时,我们无须关注键盘的内部结构,也无须关注其内部涉及的物理、电路等相关知识,更无须关注其使用的相关算法原理。我们只需要知道按下一个键,显示器上就会输出该操作的执行结果。这样的设计,让我们在打字时,能够专注于将键盘作为输入工具使用,极大地提高了工作效率。在使用键盘时,我们的核心诉求是打字,需要做的就是不断地练习指法,从而达到“运指如飞”的目的,并不需要掌握键盘内的电路是如何传递信号的。我们对其机械原理、电路原理了解的深入与否,并不会影响我们打字的速度。
键盘的抽象层次结构如图1-24所示。实际上,生活中的很多工具都有类似的结构。通常情况下,每一层的用户只需要关心本层的知识,无须过度关注其下一层知识。
图1-24 键盘的抽象层次结构
计算机中也存在大量抽象工具。例如,图像处理工具Photoshop就是一个抽象工具,它把功能抽象为一个又一个按钮或菜单。需要实现某个特定功能时,只需单击特定的按钮或菜单即可。在使用Photoshop时,我们的诉求是更好、更快地使用该工具完成图像处理,并不需要了解每个按钮对应的功能到底是如何实现的。
现代编程的核心是“抽象”,类似于键盘、Photoshop的设计,会把要实现的某些非常复杂的功能封装起来,构成函数。在实现相应功能时,只需要调用函数就可以了,不需要再把程序从头到尾写一遍。
预先写好的函数集合叫作“库”(模块、包)。开发者开发了各种各样的库,并提供给我们免费使用,这大幅提高了我们的工作效率。库中的函数,为处理图像提供了方便。使用函数几乎和使用Photoshop处理图像一样简单方便。通常情况下,只需要把要处理的图像传递给库函数,它就能把处理结果返回给我们。
图像处理领域有非常多的高质量库。其中,OpenCV的影响力最大、应用最广。OpenCV提供了机器学习模块用以实现机器学习功能,提供了DNN(Deep Neural Networks,深度神经网络)模块用以实现深度学习功能。
在人脸识别领域中,可以借助dlib库中关于人脸识别的部分实现易容术、驾驶员疲劳检测、面部表情识别、性别和年龄识别等。
库函数屏蔽了许多细节,我们无须关注实现的具体过程。在使用库函数完成图像处理任务时,只需把符合要求的输入作为参数传递给库函数即可得到想要的处理结果。库函数工作示意图如图1-25所示。
图1-25 库函数工作示意图
抽象后的键盘让我们无须关注任何相关技术知识,只需关注打字就好。但是,需要注意的是,抽象后的层次并不都像键盘的顶层抽象一样无须关注实现原理。在图像处理中,对下层抽象的了解有助于在本层更好地开展工作。
简单来说,图像处理领域有各种各样的抽象好的函数,这些函数能帮助我们完成特定的功能。我们可以将这些函数称为“黑盒”,无须关注其内部的构造也能够正常使用它。但为了更好地使用函数,我们有必要了解该函数是如何设计构造的。当我们打开函数,理解函数的具体实现时,函数对于我们来说就是个“白盒”。
将函数作为“黑盒”使用,我们无法深入了解函数所使用的算法原理,很难将函数的功能发挥好。但是,将函数作为“白盒”认真研究,相当于从头造轮子,会浪费大量的精力。
实践中,我们要控制好“白盒”和“黑盒”的平衡。既要掌握库函数的使用方法,也要掌握一定的函数实现涉及的算法原理。我们既要善于使用库来完成工作,也要对实现这些库的原理有所了解。了解原理能够帮助我们更好地使用库、配置库函数的参数;了解算法的原理,能够帮助我们在实践中进行更有针对性的开发。