1

背景

4dd647b1855dceef36433a2d32fb9e4.jpg

最近大实验要弄一个用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

image.png

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就出现了。

image.png

图片来自nVidia CUDA文档。其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。

GPU的工作大部分就是这样,计算量大,而且要重复很多很多次。

深度学习与图形处理也是这样,它需要大量的数据来“训练”模型。

类似一个猫图识别AI,你需要提供数以万计的猫图供其“学习”。而每一张猫图的学习又与其他猫图没有先后关系,即你可以同时并行100、1000张猫图的学习。

又比如卷积的计算

每个计算都独立于其他计算,这意味着任何计算都不依赖于任何其他计算的结果。

结果,所有这些独立的计算都可以在GPU上并行发生。

CUDA

这就是CUDA出现的地方。

Nvidia是一家设计GPU的技术公司,他们已经创建了CUDA作为与GPU硬件配对的软件平台,使开发人员更容易构建使用Nvidia GPU的并行处理能力来加速计算的软件。
image.png

所以CUDA就是为开发人员提供API的软件层。

开发人员通过下载CUDA工具包来使用CUDA。 该工具包附带专门的库,例如cuDNN,CUDA深度神经网络库

PyTorch

image.png
回到 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)

跑环境经历

  1. 安装Anaconda
Anaconda可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。
image.png
  1. 在Anaconda中创建虚拟Python环境,版本是3.7
    image.png
    感觉类似 nvm, 但是Anacond能对每个环境配置的更详细
  2. 安装cmake:pip install cmake
  3. 安装boost:pip install boost
  4. 安装项目工程根目录下的requirements.txt:pip install -r requirements.txt
  5. 上pytorch官网找 pytorch 的安装指令. 比如pip3 install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio===0.11.0+cu113 -f

pytorch安装需要根据自身电脑的情况. 需要根据自己的CUDA版本我第一次就装错了

image.png

可以看到显卡是"GeForce CTX 1650",cuda版本是11.2。

然后去 pytorch官网, 查看对应版本

我没找到11.2,然后降成11.1了
image.png

然后中间就解决了各种版本不正确的报错, 这里就不说. 到这里环境就装好了.

检测原理YOLO

YOLO是目标检测模型。

目标检测是计算机视觉中比较简单的任务,用来在一张图篇中找到某些特定的物体,目标检测不仅要求我们识别这些物体的种类,同时要求我们标出这些物体的位置

image.png

YOLO的全称是you only look once,指只需要浏览一次就可以识别出图中的物体的类别和位置。

YOLO原理

我们的目的是在一张图片中找出物体,并给出它的类别和位置。

第一步分割图片

YOLO的第一步是分割图片,它将图片分割为 s平方个grid,每个grid的大小都是相等的

image.png

如果我们让每个框只能识别出一个物体,且要求这个物体必须在这个框之内,这个就是滑窗法,但是效率很低。

YOLO的聪明之处在于,它只要求这个物体的中心落在这个框框之中。

这意味着,只需要让物体的中心在这个框中就可以.

第二步 预测bounding box

第二步: 我们要让每个框都预测出B个bounding box

这个bounding box有5个量,分别是物体的中心位置(x,y)和它的高(h)和宽(w),以及这次预测的置信度。

image.png

这里的confidence置信度是什么呢?

比如:老师问小明1+1等于几。小明说等于2,老师又问你有多大的把握你的回答是对的,小明说有80%

这里的80%就是置信度.

第三步: 计算置信度

confidence的计算公式是:

image.png

第一个Pr 指的是是一个grid有物体的概率,在有物体的时候ground truth为1,没有物体的时候ground truth为0.

第二个 这个IOU的全称是intersection over union,也就是交并比,它反应了两个框框的相似度。也就是预测的bounding box和真实的物体位置的交并比。

image.png

第四步: 获得结果

image.png

这里,比如某个grid中的某个bounding box预测到了一个物体,送入神经网络

神经网络对bounding box说: 你这里有一个物体的概率是0.8.

然后神经网络又对grid说: grid里物体最可能是狗,概率是0.7。

那最后这里是狗的概率就是 0.8*0.7 = 0.56 。

最后我们选取概率最大的值。

最后

所以模型需要训练, 可以自己训练,也可以拿别人训练好的。

参考:


weiweiyi
1k 声望123 粉丝

引用和评论

0 条评论