背景
最近大实验要弄一个用python写基于深度学习的作弊检测的系统。
于是参考了一下别的项目。发现相关需要的知识都不太清楚,于是记录一下。
技术
相关技术
- Python 3.7
- PyQt5
- Pytorch1.8.1
Python都了解过,就不讲了。
PyQt5
PyQt是一个用于创建GUI应用程序的跨平台工具包,将Python和Qt融为一体。PyQt允许使用Python语言调用Qt库中的API,做了完整的封装。
界面样式编写采用xml类型编写,类似如下。控制代码则用python。
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="font">
<font>
<family>华文琥珀</family>
<pointsize>10</pointsize>
<weight>50</weight>
<italic>false</italic>
<bold>false</bold>
</font>
</property>
<property name="windowTitle">
<string>智慧教室</string>
</property>
</ui>
Pytorch
PyTorch 是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。
要了解 PyTorch,我们需要 CUDA 是什么以及它如何与 PyTorch 配合使用。
更重要的是,为什么我们在深度学习或神经网络编程中使用GPU。
CPU
要了解 CUDA,我们需要对图形处理单元(GPU)有一定的了解。
最适合GPU的计算类型是可以并行完成的计算。
GPU是显卡的计算单元,就好比CPU是电脑的计算核心,有时我们直接就把GPU称为显卡。
我们知道,显示器的每一个像素应该显示什么颜色、什么亮度都是需要计算的。
我们屏幕分辨率一般都为1920*1080,即 2073600(207.36万)个像素,游戏中每个像素都需要根据光影参数来计算显示的颜色和明暗。
而两百万个像素只是一帧,在游戏中,游戏一般都是60帧。 所以60帧,代表着一秒钟计算机需要处理 1200 万个像素。
CPU还要处理很多键盘指令、游戏后台计算,还要每秒处理那么多像素,似乎有点吃力。
其实CPU面临的主要问题是,虽然每一次光影计算都非常简单,但经不住像素太多啦,还都得排队一个一个做。
然后工程师们想到 其实任何一个像素的计算与其他像素的计算结果关系不大”,那为啥不多整几个计算核心并行计算呢,于是GPU就出现了。
图片来自nVidia CUDA文档。其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。
GPU的工作大部分就是这样,计算量大,而且要重复很多很多次。
深度学习与图形处理也是这样,它需要大量的数据来“训练”模型。
类似一个猫图识别AI,你需要提供数以万计的猫图供其“学习”。而每一张猫图的学习又与其他猫图没有先后关系,即你可以同时并行100、1000张猫图的学习。
又比如卷积的计算
每个计算都独立于其他计算,这意味着任何计算都不依赖于任何其他计算的结果。
结果,所有这些独立的计算都可以在GPU上并行发生。
CUDA
这就是CUDA出现的地方。
Nvidia是一家设计GPU的技术公司,他们已经创建了CUDA作为与GPU硬件配对的软件平台,使开发人员更容易构建使用Nvidia GPU的并行处理能力来加速计算的软件。
所以CUDA就是为开发人员提供API的软件层。
开发人员通过下载CUDA工具包来使用CUDA。 该工具包附带专门的库,例如cuDNN,CUDA深度神经网络库
PyTorch
回到 PyTorch,
使用PyTorch好处之一是将并行性引入了API中。 我们可以将更少的精力放在性能上. 同时还有其他功能,但是我暂时用不到。
加法例子如下:
import torch
# 创建两个张量
# 使用 .cuda() 方法将张量 a 和 b 移到GPU上
a = torch.tensor([2, 4, 6]).cuda()
b = torch.tensor([1, 3, 5]).cuda()
# 执行加法运算
result = a + b
# 将结果移回CPU并打印
result_cpu = result.cpu()
print("张量 a:", a.cpu())
print("张量 b:", b.cpu())
print("a + b =", result_cpu)
跑环境经历
- 安装Anaconda
Anaconda可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。
- 在Anaconda中创建虚拟Python环境,版本是3.7
感觉类似 nvm, 但是Anacond能对每个环境配置的更详细 - 安装cmake:pip install cmake
- 安装boost:pip install boost
- 安装项目工程根目录下的requirements.txt:pip install -r requirements.txt
- 上pytorch官网找 pytorch 的安装指令. 比如pip3 install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio===0.11.0+cu113 -f
pytorch安装需要根据自身电脑的情况. 需要根据自己的CUDA版本我第一次就装错了
可以看到显卡是"GeForce CTX 1650",cuda版本是11.2。
然后去 pytorch官网, 查看对应版本
我没找到11.2,然后降成11.1了
然后中间就解决了各种版本不正确的报错, 这里就不说. 到这里环境就装好了.
检测原理YOLO
YOLO是目标检测模型。
目标检测是计算机视觉中比较简单的任务,用来在一张图篇中找到某些特定的物体,目标检测不仅要求我们识别这些物体的种类,同时要求我们标出这些物体的位置。
YOLO的全称是you only look once,指只需要浏览一次就可以识别出图中的物体的类别和位置。
YOLO原理
我们的目的是在一张图片中找出物体,并给出它的类别和位置。
第一步分割图片
YOLO的第一步是分割图片,它将图片分割为 s平方个grid,每个grid的大小都是相等的
如果我们让每个框只能识别出一个物体,且要求这个物体必须在这个框之内,这个就是滑窗法,但是效率很低。
YOLO的聪明之处在于,它只要求这个物体的中心落在这个框框之中。
这意味着,只需要让物体的中心在这个框中就可以.
第二步 预测bounding box
第二步: 我们要让每个框都预测出B个bounding box,
这个bounding box有5个量,分别是物体的中心位置(x,y)和它的高(h)和宽(w),以及这次预测的置信度。
这里的confidence置信度是什么呢?
比如:老师问小明1+1等于几。小明说等于2,老师又问你有多大的把握你的回答是对的,小明说有80%
这里的80%就是置信度.
第三步: 计算置信度
confidence的计算公式是:
第一个Pr 指的是是一个grid有物体的概率,在有物体的时候ground truth为1,没有物体的时候ground truth为0.
第二个 这个IOU的全称是intersection over union,也就是交并比,它反应了两个框框的相似度。也就是预测的bounding box和真实的物体位置的交并比。
第四步: 获得结果
这里,比如某个grid中的某个bounding box预测到了一个物体,送入神经网络
神经网络对bounding box说: 你这里有一个物体的概率是0.8.
然后神经网络又对grid说: grid里物体最可能是狗,概率是0.7。
那最后这里是狗的概率就是 0.8*0.7 = 0.56 。
最后我们选取概率最大的值。
最后
所以模型需要训练, 可以自己训练,也可以拿别人训练好的。
参考:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。