Module 02 · Deep Convolutional Models: Case Studies
State of Computer Vision计算机视觉现状
深度学习已经成功地应用于计算机视觉、自然语言处理、语音识别、在线广告、物流等众多领域。计算机视觉的深度学习应用有一些独特之处。在本视频中,我将与大家分享我对计算机视觉中深度学习应用的一些观察,希望能帮助你们更好地理解文献中的概念,以及如何构建这些系统。📚
机器学习问题的范围
你可以将大多数机器学习问题视为在数据量少到数据量多的范围之间,划分出不同的应用场景。例如,今天我们已经拥有了足够的语音识别数据,相较于问题的复杂度,数据量已经足够。但即便图像识别(如图像分类)的数据集相对庞大(例如,超过一百万张图像),由于图像识别本身是一个复杂的问题,需要从大量像素中提取特征,因此尽管数据集庞大,还是会感觉数据量不足。
图像识别与物体检测
- 图像识别(Image Classification):你看到一张图片,任务是判断它是否是一只猫。
- 物体检测(Object Detection):你不仅要识别图片中的物体是否存在,还需要画出物体的边界框,告诉我们这些物体在图像中的具体位置,例如识别图片中的汽车。
由于标注边界框的成本较高,物体检测的数据量通常远少于图像分类。这也是我们下周讨论的主题。
数据量对算法选择的影响
当数据量较大时,通常可以使用较为简单的算法,而无需太多手工特征工程。大数据使得使用一个庞大的神经网络变得可行,甚至可以是简单的网络架构,而无需精心设计特征。相反,当数据量较少时,通常需要更多的手工工程来弥补数据的不足。
手工工程(Hand-engineering)的重要性
机器学习的学习算法通常有两大知识来源:
- 标注数据:即用于监督学习的 (x, y) 对。
- 手工工程:可以是从设计特征、网络架构、系统的其他组件等方面进行的工程化处理。
当数据较少时,我们必须更多依赖手工工程。在计算机视觉中,学习一个复杂的函数常常让人感觉数据不足,尽管数据集逐年增大,但仍然常常缺少足够的数据来完成任务。
因此,计算机视觉领域在数据不足的情况下,往往依赖更多的手工工程,并且在这种情况下,构建更复杂的网络架构是提高性能的有效方式。手工工程并非贬低的做法,而是在数据不足时,精确设计网络架构和特征需要极高的技能和洞察力。
计算机视觉中的网络架构复杂性
由于数据集较小,计算机视觉的文献中有很多复杂的网络架构和超参数选择。这也是为什么计算机视觉中的算法往往比其他领域的要复杂。实际上,由于物体检测数据集通常小于图像分类数据集,物体检测的算法也变得更加复杂,包含更多的专门化组件。
迁移学习的优势
当数据量较少时,**迁移学习(Transfer Learning)**可以大大帮助解决问题。例如,在之前提到的“识别猫咪或其他物体”任务中,如果数据量较少,迁移学习会带来显著的帮助。迁移学习就是通过将一个领域的学习成果迁移到另一个领域,从而有效地提高模型在新任务上的表现。
基准测试和竞赛
计算机视觉领域的研究者对标准化基准数据集和竞赛的成绩非常热衷。在计算机视觉领域,基准测试的成绩通常直接影响到论文的发表。做得好的人更容易在这类领域发表论文,从而推动整个社区找到最有效的算法。
基准测试的技巧
研究人员常常采用以下几种技巧,以便在基准测试中取得更好的成绩,尽管这些技巧并不适用于实际生产环境。
- 集成方法(Ensembling)
- 训练多个神经网络,并将它们的输出结果进行平均。
- 比如训练3个、5个或7个神经网络,最后对它们的输出进行平均。这种方法可以提高1%或2%的成绩,帮助在竞赛中取胜。
- 然而,这也会大幅增加运行时间,因为每次测试时,你需要将每个图像通过3到15个不同的网络进行计算。
- 多裁剪(Multi-Crop)
- 多裁剪是一种数据增强方法,通常在测试时应用。你可以将同一张图像裁剪成多个版本进行测试,之后将结果进行平均。
- 比如使用10-crop方法,将图片从多个位置裁剪并通过网络进行推理,再将结果平均,以提高性能。
- 这种方法提高了测试的计算开销,但对于实际生产系统来说,通常并不推荐。
在实际生产中的应用
尽管集成方法和多裁剪可以提升基准测试的成绩,但在生产环境中,它们往往并不实际。集成方法需要同时运行多个神经网络,消耗大量计算资源。而多裁剪也增加了内存和运行时间的开销。
使用预训练模型
由于计算机视觉任务通常面临较小的数据集,因此我们可以从迁移学习中获益,直接使用已有的预训练模型,并根据自己的数据集进行微调。这样不仅能快速启动应用,而且可以省去训练模型所需的巨大计算资源。
预训练模型通常是在大规模数据集上训练得到的,因此它们在特征提取和参数调整方面已经有了优化,从而为你的项目提供了一个很好的起点。
从头开始训练
当然,如果你拥有足够的计算资源和动力,也可以从头开始训练自己的网络。尤其是当你想要发明新的计算机视觉算法时,从头开始训练可能是必须的。
总结
本周的学习帮助你了解了计算机视觉中深度学习的一些常见方法和挑战。通过这些案例,你可以更好地理解什么方法在实践中有效,并且学会如何在实际项目中选择和应用这些方法。
在本周的编程作业中,你将学习一个新的编程框架,并用它来实现ResNet模型。希望你能享受这次编程挑战,并期待下周的学习内容。🚀
学习要点总结:
- 数据量多时,可以使用较简单的算法和较少的手工工程。
- 数据量少时,需要更多的手工工程,迁移学习是解决这一问题的有效方法。
- 基准测试和竞赛技巧(如集成方法和多裁剪)虽然有助于提高成绩,但并不适合生产环境。
- 使用预训练模型和微调可以加速项目开发,减少计算资源消耗。