项目概述
本项目旨在完成对 AI 计算机视觉的入门学习,并在 Intel CPU 上完成以 ResNet50 为基础的神经网络的全部手写实现及性能优化。
首先通过对一些经典的传统计算机视觉算法进行实操,理解计算机视觉的基本含义;随后以 ResNet50 神经网络为例子,系统地讲解一个 AI 模型的基础算法原理和相关背景知识。最后通过代码实战,从零手写 ResNet50 神经网络,完成任意一张图片的识别,以及神经网络模型的性能优化。
核心内容模块
1. 传统计算机视觉部分
包含灰度图处理、RGB 转换、均值/高斯滤波器应用、利用 Canny 算子对图像进行边缘检测、利用大津算法(Otsu)对图像进行分割等小型实操项目。这些是理解数字图像处理基础的关键步骤。
2. AI 基础部分
以一个手写数字识别项目(MNIST)作为引子,帮助理解一个 AI 模型的训练和推理过程,建立对神经网络输入输出及损失函数的直观认识。
3. AI 原理部分
详细阐述和解析 ResNet50 中用到的算法和背景知识,包括卷积操作、池化层、激活函数、批量归一化(BatchNorm)以及残差结构(Residual Block)的设计思想。
4. 实战部分
使用 Python 和 C++ 两种语言完成 ResNet50 模型的从零手写。
- 核心算法全手写:ResNet50 的所有核心算法和网络结构(包括 Conv2d、AvgPool、MaxPool、fc、Relu、残差结构)全部手写,不借用任何第三方深度学习框架的封装接口。
- 性能优化迭代:由于是自己手写的算法和模型结构,拥有很大的自由度进行性能优化。性能优化是本项目最后进行的部分,会迭代多个版本,一步步将模型的性能调到比较不错的效果。
- 精度验证:在完成手写算法的基础上,除了要保证网络精度可用(即任意给一张图片,经过预处理之后,Top1/Top5 可以正确预测出图片)之外,还会关注性能优化部分。
为什么要全部手写核心算法
目前网上有很多教程,在教你搭建神经网络的时候,基本都是基于 PyTorch 的 nn 模块或其他模块,用 nn.conv2d 就完成了卷积计算。对于想深究算法和学习算法的同学,或者一些初学者而言,即使按照教程将神经网络搭建出来了,或将图片推理出来了,依旧是云里雾里,不知其原理,始终浮于表面,心里学的也不踏实。
事实上,nn.conv2d 是将 conv2d 的算法实现给封装起来了,我们看不到它的实现机制,很难学到里面的实现细节,更别提如何在此基础上进行性能优化了(虽然该接口已经被优化过)。
于是便有了这个项目。最初仅仅是想自己动手完成一个简单的 ResNet50 的模型的手写。随后开始系统的写文章,结果越写越多,索性做了一个小册,通过小册的写作,激励我不断的维护和更新这个项目。该项目中的代码从 2023 年 4 月开始编写,陆续调试了很多次,所有代码都是我手动编写而成。目前项目中所有代码已经完全跑通,精度也很 OK,性能经过 5 个版本的迭代,也基本达到了不错的效果。
你可以学到什么
通过本项目,你可以一窥传统计算机视觉的经典算法,理解传统计算机视觉和基于深度学习的计算机视觉算法的联系和区别,深入理解 ResNet50 中用到的所有算法原型、算法背景原理、ResNet50 的思想、ResNet50 的网络结构、以及常见的神经网络优化方法。
你可以参考项目中的代码,真正运行一个 ResNet50 神经网络,完成一张或多张图片的推理。在项目的 new_version_with_notes 目录下是带有注释的版本,代码中关键的地方我会给出文字详解。如果你把项目代码和配套的文章都阅读一遍,完全实操一遍,我觉得入门 AI 视觉并不是难事,同时关于 ResNet50 这个经典模型,即使你是一个小白,完全实操一遍之后也可以出师了。
仓库结构说明
0_gray: 为灰度图相关代码1_RGB: 为灰度图与 RGB 转换相关代码2_mean_blur: 为均值滤波相关代码3_gaussian_blur: 为高斯滤波相关代码4_canny: 为 Canny 算法相关,用来完成图片的边缘检测5_dajin: 为大津算法相关,用来完成图片的分割6_mnist: 为一个经典的手写数字识别 AI 模型(神经网络),可以在笔记本(CPU)上进行模型的训练和推理


