实训结束:难忘的五周

(漫长的五周转眼间就过去了,本篇博客对过去五周的实训做一个简要的总结......

一:参与实训满满的期待

        (第一周我们初遇杨强老师,他幽默而风趣的言谈吸引了我。他对一些工具和技术的介绍让我对本次实训充满憧憬与期待。)第一周主要是导引的课程,主要介绍了本次实训使用的基本语言,基本工具等。语言方面没什么好说的,python目前已经成为各行各业重要的工具之一,其简单易懂的代码风格、规范的格式、强大的第三方库等给我留下了极深的印象。另外就是几个实用的工具了,如markdown文本格式,和jupyterlab记笔记,这两个真的是很不错的工具,markdown简洁,适合我这种极简主义,jupyterlab对于数学公式很友好,能表示很多复杂的式子,适用于于机器学习这种对数学要求高的课程。另外就是合作开发必备的工具——Git,体验了一把,上传代码什么的很方便,虽然没有用到精髓,但是现在入了门,以后有更多机会深入了解。除此之外就是对于项目思路的构建,使用了Processon这一图构建工具网站,对项目的构建帮助很大。

        本次实训从0开始对python进行讲解,让我对python有了有一次全新的认识,了解到了之前从没有触及到的及其基础的知识:python的路径管理,文件管理,包路径的引用。这些虽然基础,但是之前学的语言从没有涉及到这些,每次操作时有时候也会有一些疑惑,本次很好的解决了这些非常基础但是很有用的问题。

二:初遇Qt与CV

        原来听到谈及Qt和CV的同学,我总是向他们投以崇拜的目光,本次实训中也有幸涉及到这些方面啦。对Qt的使用感触最深的就是对python面向对象的体验——继承,多态。其中重要的步骤有:class 类名(父类):、super(类名, self).__init__() 、override,经过几个星期的练习,已经快写烂了......对于Qt,最核心的我觉得就是对于与用户的交互:事件及其响应。这其中最重要的一个概念就是信号和槽,正是这一对孪生兄弟实现了我们Qt的交互,让它“活”了起来。在我们的最终项目中——手写数字识别的UI设计中,我就负责了一部分页面的跳转,这里面对信号和槽的使用非常灵活,可以实现实时反馈,信息交互,页面跳转等功能。

        对于CV,我们本次使用的主要途径是图像处理和在Qt窗口中实现摄像头的调用,当然这些在最后的项目中也是必备的部分。在学习CV之前,我们先了解了计算机中图像表示的方式:矩阵。python中矩阵的表示我们可以引入numpy来表示。当我们使用CV读入本地的一张图片后,我们将它输出,就会发现是一个(height, width, 颜色通道(颜色通道中0表示b蓝色,1表示g绿色,2表示r红色)有别于我们平常的RGB颜色表示方法)的三维矩阵(黑白图像没有颜色通道就是二维矩阵)。读图片的时候我们采用cv2.imread()函数进行读取,而数组(即矩阵)在python中是通过一种ndarray类型表示的。我们甚至可以通过初始化好的矩阵来生成一张图片,通过设置矩阵的不同行和列的值以改变颜色(可以先通过fill()函数进行全部初始化)。设置矩阵某一连续行列的颜色的值我觉得用切片还是比较舒服的,对于需要渐变的图形,可以使用解析表达式来进行赋值。

        接下来对CV和Qt的结合使用,在此过程中体会到了基本工程的文件管理树形图。这种文件管理模式当然也出现在了我们的最终项目文件中,使人一目了然,组织分明,便于管理。

三:人工智能初体验

        对人工智能的初体验,从基本的高等数学公式开始......有一说一,老师中间讲到的那些公式没几个搞懂的。但是最基本的递归求导思路还是掌握了,虽然只是简单的求导,其中也用到了我们强大的人工智能工具——pytorch不得不说这个工具的强大。求导思路基本上就是逐渐逼近的过程,也没什么好说的,这背后torch对grad的图跟踪是让我很惊奇的一个点,很好奇这背后是如何实现的。

        完成了对求导的思路学习后,我们又往前迈了一大步:对图像求导找特征实现分类——分类器的实现。所谓分类器就是将样本数据和它的标签进行学习之后,再输入的数据我们就可以将其进行分类。而分类的过程中我们要构造出一个近乎完美的函数来对输入的数据进行分类:Wx + b,该函数将输入x转化为一个概率,对于不同种类W和b的值不同,也就是一个种类对应一个W和b。如何得到这个W和b就需要靠我们上面提到的自动求导了。这里需要求出W和b使得预测的误差值最小,这楼里又出现一个问题,拿什么来计算误差呢——就是鼎鼎大名的交叉熵函数(torch.nn.functional.binary_cross_entropy(y_,y))!!其中y_是预测值,y是真实值。就是用这个误差函数使得它最小来不断逼近完美的W和x。接下来的操作就和上面的自动求导类似了。只不过我们这里的函数就是交叉熵函数。经过测试集的学习之后我们就可以对验证集进行分类,并且最终效果很好。最后我们对一个数据集MNIST中的数据进行了分类练习,使用了多层卷积层和池化层进行特征学习,来进行分类。

四:有趣的YOLO网络

        为了更好地完成我们的项目,杨老师针对性的对我们讲解了常用的YOLO网络,以及它的训练,测试和封装。到这里才真正了解到Python强大的第三方库,不用吹灰之力我们就可以使用前辈们写好的的强大的YOLO网络,通过观察参数,YOLO网络中有60多个卷积层进行卷积学习,能很好地保存下来一批图形的特征。此外我们利用精灵标注助手对我们自己采集的人脸,数字进行标注后投进我们构建的YOLO网络中就可以进行学习了。这其中只是对YOLO网络中的参数进行修改,如class类的个数,filter = (5 + 类别数) * 3等一些参数,修改过后我们就可以进行模型的训练了。老师的人脸数据进行了将近1500轮的训练,最终识别的效果特别好,但是由于个人电脑的配置问题,批次最大只能设置到3,且小组内照片较少,导致收敛过快,在训练了300多轮后准确率就稳定到了97%左右。

        在训练结束后,我们实现了模型的封装和测试。在封装过程中要充分考虑到用户的需求:不需要了解到其中的某些细节,能最方便地使用才是最佳选择。所以我们训练探测的函数中返回的是GPU上的torch对象,在封装中我们就要考虑到将其转换成cpu上的numpy数组,这样对于用户来说将是更友好的,体现了用户至上的程序设计思维。

        最后老师将之前展示给我们的项目中的一个亮点:人脸识别登录,并将其实现思路将给了我们,我们也在自己的项目中添加了这一模块,并添加了另一种账号密码登录的模式,实现了两种登录模式。登录后就可以使用我们训练好的数字识别模型进行数字识别,训练的准确率最终可以达到90%左右。

五:告一段落

        漫长却又短暂的五周时间过去了,在实训中我们收获的有多有少,唯一遗憾的是这次实训安排的时间,临近期末和各种结课考试中,让我无法全身心投入到实训的学习中。但是这并不影响从中了解到的计算机前沿的一些知识,以及眼界的开阔。时间不等人,这次实训让我明白了自己的能力的多少,在成为计算机大师的道路上还要更加努力啊!

你可能感兴趣的:(实训结束:难忘的五周)