我已经在美国一家科技公司工作快六年了。
在这六年中,我由一名刚刚从学校毕业的研究生,经过多个大小项目的洗礼,从普通的电子工程师,做到了公司研究部门的研究工程师。我的技术水平,在这期间得到了极大的锻炼和扩展;我的交流能力和表达水平,在这期间也得到了不小的提升;我的情商和人际交往能力,通过公司提供的培训课程和自己的实践,也在稳步有计划地进展。
爱因斯坦曾经说过:
当我们的知识之圆扩大之时,我们所面临的未知的圆周也一样。
随着技术水平的提升,我发现自己需要在技术上扩展和深挖的地方越来越多;而随着在公司工作年份的增加,我所要承担的责任也越来越多,相应的需要学习的通用技能也越来越多。我曾经在这两篇文章(《新时代的职业规划》以及《个人计划,这么理解就对了》)中叙述了职业规划和个人计划的重要性。那么作为理论之上的实践,我就在这里描述一下我的职场进阶计划。
专业技能篇
我是一名信号处理算法工程师(Digital Signal Processing (DSP) Algorithm Engineer)。在所在公司,我主要负责的是数字信号处理的算法设计与验证,现有产品算法的维护和性能提升,以及新产品和新算法的研究和设计。在研究生期间,我的研究方向是数字图像处理(Digital Image Processing (DIP))以及模式识别(Pattern Recognition)。本来在毕业时,我想去找数字图像处理相关的工作,但是机缘巧合我找到了现在所在的公司,开始做信号处理相关的工作。
虽然数字图像处理的本质也是数字信号处理,但是在具体的算法设计和应用上还是有极大的不同,这就导致了我必须不断学习才能尽快融入工作的要求中。久而久之,持续学习的习惯就养成了。我觉得自己应该在未来的一两年将下面的技术吃透或者充分了解,从而在保持核心技术竞争力的同时,兼顾未来的技术发展。
数字信号处理
数字信号处理其实是所有平台的本质,不论是语音、视频、光波、还是雷达波,想要被计算机处理,都需要通过模数转换器转换成数字信号。那么深入理解数字信号处理的本质,以及相应的算法和套路,就是作为一个DSP工程师混饭吃的根本技能了。
在研究生阶段学习的课程,我使用的教科书是John G. Proakis的这本《Digital Signal Processing (4th Edition)》。既然作为教科书,那么它必然就是兼容并包,理论描述非常翔实和清晰。但是它的问题同样也在与此,也就是说这本书作为参考书是非常好的,可以随时查阅相关的理论和信息,但是作为一个DSP工程师来说,仅仅有扎实的理论基础是必要的但是不足够的。
在数字信号处理领域,通过MATLAB来做系统设计和模拟,以及算法原型的设计,是常见的工作手段和方法。那么学习和练习MATLAB的编程方法和技巧,以及应用在数字信号处理的基础理论上,就是DSP工程是的看家本领了。最近一段时间Python语言非常火,甚至盖过了同样作为脚本语言的MATLAB的风头,但是在数字信号处理领域,MATLAB目前依然是首先被许多公司采用的工具,也是我这六年以来一直在使用的顺手工具。在我之前的学习中,使用过的Vinay K. Ingle的这本《Digital Signal Processing Using MATLAB》是一本非常棒的,将经典理论和具体代码应用相结合的好书,我曾经跟着书把所有的代码都敲了一遍,非常有收获。
除此之外,还有几本数字信号处理的书籍非常推荐:
Steven Smith - 《Digital Signal Processing: A Practical Guide for Engineers and Scientists》
Richard G. Lyons - 《Understanding Digital Signal Processing》
Alan V. Oppenheim - 《Oppenheim: Discret Signal Process》
数字信号处理的理论是非常经典的,应该在相当长的时间里不会有太大的变化,而不断巩固自己的信号处理知识,其实就是练功者在训练自己的内功心法,或者是健身爱好者在锻炼自己的核心力量。而作为信号处理领域的从业者,我所要做的就是将基础不断夯实,并且结合MATLAB将理论通过代码从容实现,然后结合项目里具体的应用,将这些理论充分在项目中展现出来。
传感器应用
最近几年,随着物联网(Internet of Things (IoT))热度的迅速提升,以及以特斯拉等自动驾驶汽车公司的迅速兴起,传感器的应用就变得非常重要了。总的来说,我们每天都在跟无数的传感器打交道:到处都是的摄像头,是一种光学传感器;最新的iPhone X使用的是近红外点阵投影技术,同样是一种光学传感器;手机上还有各种各样的传感器,比如距离传感器、陀螺仪、磁力计、加速度传感器等等。而自动驾驶汽车上,更是需要强大的光学摄像头+电波雷达+激光雷达三者强力融合的系统来作为汽车的感知单元。如果说数字信号处理系统是大脑,那么各种各样的传感器就是眼睛和耳朵。雷锋网有一篇文章《自动驾驶汽车到底需要哪些类型的传感器?看完这篇你就懂了》很好地总结了这些传感器在自动驾驶汽车上的应用。
我很幸运,在大学本科的时候就主攻数字图像处理的算法,在研究生阶段接触了激光雷达,并且设计了一些图像数据和激光雷达数据融合的算法和应用。在毕业之后的工作岗位上,我有充分沉浸在电波雷达相关的信号处理和算法设计上。总体来说,我已经具备了自动驾驶汽车所需要的光学摄像头+电波雷达+激光雷达的相关知识和技能,而且我对自动驾驶汽车的传感器应用非常感兴趣。
那么接下来要做的,就是深入了解和实践这些传感器在自动驾驶场景的应用,让自己的经验和认知能够紧跟行业技术发展;而且我并不擅长设计这些传感器,我需要提升的是数据融合的能力,因为在单位时间内大量数据的到来,如何更好地将这些数据整合以及做出低误检率的算法设计,就是核心技能了。
在提到传感器数据处理的时候,不得不提的是卡尔曼滤波这项技术。因为传感器总是包含噪声的和不完全准确的,那么如何得到有效的系统状态估计和参数值预估就变得非常重要。卡尔曼滤波是一种高效率的递归滤波器,它的主要用途就是通过处理包含噪声的输入数据,来对所在系统的内部参数进行动态估计,以及根据系统之前的状态和当前观测数值,预估下一时刻的可能的观测数值。我非常喜欢研究卡尔曼滤波和各种非线性变种,以及具体的项目应用,因为我认为这是一种理论模型和现实应用的完美结合,是算法设计的终极目标。Paul Zarchan的这一本《Fundamentals of Kalman Filtering》是一本关于卡尔曼滤波的经典著作,而且配有详尽的MATLAB源代码。如果对Python更感兴趣,那么可以关注Roger R. Labbe在Github上的《Kalman and Bayesian Filters in Python》,我觉得他对卡尔曼滤波的讲解非常深入浅出,适合初学者从基本概念入手,由浅入深进行学习。这两本书都是我正在努力攻读的,而且应该会和数字信号处理的书籍一起,终身学习和应用。
机器学习/深度学习
从大约2012年,吴恩达教授在谷歌大脑部门通过大规模分布式集群计算机开发超大规模神经网络,来让计算机自动学习识别猫,这一个项目开始,以深度学习为代表的人工智能应用就在近几年飞速地发展开来。在这期间,国内诞生了诸如旷视科技、商汤科技为代表的视觉人工智能公司,以及诸如寒武纪、深鉴科技为代表的深度学习芯片公司;传统的大型科技公司阿里巴巴、腾讯、百度都通过深度学习,在数据智能、语音图像识别、自动驾驶汽车等领域收获了巨大的技术进步。
其实现在大家谈论最多的深度学习,只是机器学习这个领域的一个小的分支:深度学习基于的是以神经网络为基础的,通过多层次神经元结构的非线性结合,来对数据进行由浅入深的多层次抽象的算法。而机器学习,分成三个大方向:有监督学习、无监督学习、以及增强学习。现在应用最多的深度学习,属于机器学习里面的有监督学习,也就是说我们需要给深度学习模型提供大量的带标注的真实数据,然后通过对模型的建立,以及对模型结果的对错的目标函数的设计和优化,来实现整个深度学习系统的不断完善。
我2017年花了不少时间学习深度学习和机器学习的基础知识,总的来说还是收获非常大的,主要是通过学习让自己形成了一个机器学习的思维方式。我主要是通过斯坦福大学的两门公开课进行学习的:吴恩达教授的《CS229: Machine Learning 机器学习》以及李飞飞教授的《cs231n: Convolutional Neural Networks for Visual Recognition 视觉识别卷积神经网络》。前者主要是对经典机器学习里诸如线性回归、支持向量机、混合高斯EM算法、主成分分析等等算法进行讲解和描述,而后者则将重心放在卷积神经网络在图像识别、分割、解析上的应用。这两门课太经典了,以至于我已经学了不止两遍,而且对机器学习课程里的每一个公式,我都跟随吴恩达教授的讲解进行了推导,收获非常大。
提到深度学习,就不能不提到现在流行的各种软件框架:经典的Caffe,流行的Tensorflow、PyTorch等等。我现在的主要任务,就是在夯实了机器学习以及深度学习的基础知识之后,通过Tensorflow框架来做一些自己的小项目,从而打通理论到实践的通络。这样一来,在未来的某个时间,也许我就可以通过自己设计的小项目的锻炼,达到大公司需要的深度学习从业者所需要的能力,给自己未来的发展多开拓出一条道路。
嵌入式平台/并行处理平台
我在本科的时候,通过电子设计大赛接触了凌阳公司的单片机;在研究生的时候,通过选择的电子系统设计课程,接触了FPGA和Verilog硬件描述语言;现在通过对深度学习的认识,我知道GPU在深度学习中的大规模应用以及其重要性。总而言之,对嵌入式平台和并行处理平台的认识和应用,在现在就显得非常重要了。
我学习和使用过下面这些平台:
单片机/嵌入式:
KST-51 单片机开发板:适合单片机入门,配套教程很好
韦东山 JZ2440:韦东山老师的开发板,重点是配套的经典驱动编写教程
ODROID-XU4:三星Exynos5422处理器,6核CPU加上Mali-T628GPU,性能非常强劲
FPGA:
Digilent Nexys 2 Sprtan-3E FPGA Trainer Board: Xilinx经典的Spartan-3E系列FPGA
米联客 MIZ702N: 学习Xilinx Zynq SoC的优秀硬件平台
小梅哥 AC620:配套教程非常棒
CrazyBingo的VIP_Board:图像处理算法的FPGA实现独一无二
GPU:
英伟达 GTX 1080:英伟达10系列的显卡,深度学习训练必备
英伟达 Jetson TX2:英伟达的GPU嵌入式平台,非常适合无人机、机器人、自动驾驶汽车等等应用
在这几年,通过这些平台的学习和练习,对各个系统都有了不少的认识。我认为在未来,FPGA和GPU会是应用的主要战场,那么我就应该将学习和练习的重心,放到他们身上。对于FPGA,我现在正在做自己设计的摄像头、SDRAM、FPGA、VGA这样一个图像采集和显示的小项目,让自己理顺这个数据通路,同时巩固自己对FPGA设计流程的理解。对于GPU,我在讨论深度学习的时候已经指出,自己会设计一些图像识别的项目,在建立数据库之后,通过Tensorflow框架在GPU上进行网络的训练。同时我也要对GPU的架构和硬件结构进行学习,以及英伟达的CUDA平台,通过软硬件的完美结合,让数据处理更快更有效率。Tolga Soyata的这本《GPU Parallel Program Development Using CUDA》是一本非常有意思的书,虽然题目是GPU编程,但是它从CPU多线程开始讲起,结合具体案例和代码层层深入,让我看完之后收获非常多。
总结
还记得在大学刚入学的时候,我们电子信息工程学院的院长在新生见面会上说:
你们将来从事的会是“IT行业”,谐音就是“挨踢行业”,这意味着你们必须不断前进,否则就要被后来的人踢屁股了。
当然这是玩笑话,但是也道出了作为电子行业从业者的现实:我必须在技术上不断充实自我,不断拓展自己的技术和能力上的边界,不断扩大自己技术视野的宽广程度,这样才能在激烈竞争中站稳脚跟,不断前进。
希望在文中出现的书籍和资料等信息对你有用。下一次我会谈谈我在通用技能上对自己的展望。