一些零基础的课堂笔记,往期在同专栏里
pytorch核心概念
pytorch是什么
PyTorch = NumPy + GPU
痛点:NumPy 很好用,但只能用 CPU,在大数据面前太慢。
PyTorch解法:Tensors(张量:多维数组)用法和 NumPy 几乎一样(ones, zeros, add),唯一的区别是它可以被搬运到显卡(GPU)上跑,有很多的核,速度快几十倍。
Tensor运算
import torch
x = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
求幂运算
print(x.pow(-1.0))
print(x.pow(2.0))
按列求和
print(x.sum(dim = 0))
print(torch.sum(x, 0))
按行求和
print(x.sum(dim = 1))
print(torch.sum(x, 1))
按行求和,求导数,
temp = x.sum(dim = 1).pow(-1.0)
print(temp)
对角矩阵
print(temp.diag_embed())
torch功能函数
F.conv1d(input, weight, bias=None, stride=1, padding=0, dilation=1,groups=1) → Tensor
对由多个输入平面组成的输入信号进行一维卷积(卷积:对图像做特征提取)
F.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1,groups=1) → Tensor
对由多个输入平面组成的输入图像应用二维卷积
F.relu(input, inplace=False) → Tensor :使用激活函数relu
F.max_pool1d(*args, **kwargs)
在由多个输入平面组成的输入信号上应用1D 最大池化.
F.max_pool2d(*args, **kwargs)
在由多个输入平面组成的输入信号上应用2D 最大池化.
F.dropout(input, p=0.5, training=True, inplace=False)(dropout:丢弃)
在训练过程中, 使用伯努利分布的样本, 随机的用概率p将输入张量的元素归零p,丢掉概率, 默认值为0.5
training,如果 True 使用 dropout,默认为True
inplace,如果设置为 True, 将会原地操作,默认为False
数学太难:卷积、反向传播的导数公式很难推导,PyTorch 帮我们内置好了。
性能优化:Python 写循环很慢,PyTorch 这些内置函数底层是用 C++ 和 CUDA(显卡语言)写的,速度快几百倍。
自动求导
PyTorch = 自动求导机 (Autograd)
痛点:神经网络需要通过"反向传播"更新参数,也就是求导数(梯度),手算微积分太难了。
PyTorch解法:你只管写前向计算公式(如 y = wx + b),PyTorch 会记录你的操作。调用 .backward(),它自动就把所有导数算好了。(可以计算梯度,找到每个层次里前进的方向)
python
x = torch.tensor(2.0, requires_grad=True)
y = x**2
y.backward() # 梯度 dy/dx = 2x = 4
动态图
PyTorch = 动态图 (Dynamic Graph)
痛点:TF 1.x 像是在写"C++代码",写完要编译才能跑,报错看不懂。
PyTorch解法:
与静态图框架(如TensorFlow 1.x:需要预先编译)不同,PyTorch的计算图是动态的,每次前向传播都会实时构建新图。这使得调试更直观(可逐行执行),并支持灵活的网络结构(如循环或条件分支)。(不需要预先编译)
它是"所见即所得"。可以在代码中间随便插入 print(x) 查看变量,就像写 Python 脚本一样方便。
PyTorch支持多GPU和分布式训练:
• DataParallel(单机多GPU)
最简单的多GPU训练方式,只需用DataParallel包装模型,数据会自动拆分到不同GPU:
python
model = nn.DataParallel(model, device_ids=[0, 1])
缺点:主GPU负载不均衡,效率较低。
• DistributedDataParallel(DDP,多机多GPU)
更高效的分布式训练方案,每个GPU独立计算梯度,再同步聚合:
python
torch.distributed.init_process_group(backend='nccl')
model = DDP(model, device_ids=[local_rank])
PyTorch Lightning简化训练:
PyTorch Lightning封装了分布式训练的复杂细节,只需设置accelerator="gpu"和devices=N即可自动启用多GPU
python
trainer = Trainer(accelerator="gpu", devices=4, strategy="ddp")
trainer.fit(model)
总结一下:
PyTorch 是一个灵活、易用的深度学习框架,是研究和工业界的首选框架之一。
• 张量计算与自动微分
核心数据结构是 Tensor,支持 GPU 加速和自动求导(autograd),适合动态构建和调试模型。
• 动态计算图
计算图在运行时动态生成,比静态图更直观,便于调试和实现复杂模型(如 RNN、GAN)。
• 丰富的模块化设计
torch.nn 提供预定义层(如卷积、LSTM),torch.optim 包含优化器(如 SGD、Adam),可快速搭建神经网络。
• 分布式训练支持
支持 DataParallel(单机多卡)和 DistributedDataParallel(多机多卡),结合 PyTorch Lightning 可进一步简化流程。

Keras是动态的,讲究性能部署用TensorFlow,讲究学术快速搭建用pytorch。
图像识别
输入->数据获取->预处理->特征提取->决策分类->输出
**数据获取:**通过图像输入设备实现。
**预处理:**提高图像质量,包括滤波、平滑、增强、复原、提取边缘、图像分割等方法
**特征提取和选择:**将预处理后的图像转化为若干特征
常见特征有:幅度特征,统计特征,几何特征,变换系数特征等
人脑是通过分级的、多层网络模型来识别;从像素点到边缘线到局部信息到整体画面相关模型;
减少数据量,保留物体的有用信息。
图像识别的神经网络技术:
视觉是最重要的感知系统,人类的大脑皮层中有几乎一半的神经元与视觉有关
ImageNet是一个超过15 million的图像数据集,大约有22,000类(ImageNet挑战赛:现代ai的起源,能不能做一个识别准确的识别器),ILSVRC全称ImageNet Large-Scale Visual Recognition Challenge 。从2010年开始举办到2017年最后一届,使用ImageNet数据集的一个子集,总共有1000类。自 2012 年 AlexNet取得里程碑式突破,各种网络模型层出不穷,刷新了历届 ImageNet 分类准确率,这些结构包括 VGG、GoogLeNet、ResNet、DenseNet、ResNeXt等。
可以说从2012年后,图像识别领域神经网络取代了传统的识别技术。
缺陷检测overview
视觉检测方法
传统视觉检测:
依靠特征工程,制定一系列的规则 =>确定检测目标是否符合标准
代表软件:Halcon, Visionpro, OpenCV
Thinking:传统视觉通常处理容易提取,容易量化的特征,都有哪些容易提取,好量化的特征?
颜色、面积、圆度、角度、长度、宽度、长宽比、形状等
Thinking:传统视觉检测在很多场景中应用的不错,不足是什么?
适应能力差,检测物体发生了变动,所有的规则和算法都要重新设计,即使是同样的产品,不同的批次也会带来变化,很难有一种规则适用所有的情况。
深度学习视觉检测:
采用深度神经网络 、CNN是目前深度学习最广泛的模型之一
Thinking:为什么需要深度学习进行检测
传统的机器视觉检测中,有许多不易被识别的变量,他能通过数据去拟合这些标准。比如:照明、颜色变化、曲面、或视野
Thinking:深度学习检测的不足是什么?是否有对应的解决方法?
数据量要求大,工业数据收集成本高 => 采用数据增强,无监督学习,学术界在研究的,自动数据标注等

缺陷检测方案:
制定缺陷检测方案,需要考虑:
1)数据量
能获取多少数据量,尤其是缺陷的数据量
2)人工是如何判断的
将人工判异的方法写下来,思考是否有量化的指标可以辅助进行判断
3)是否有类似的公开图片
数据量是深度学习的重要指标,当数据量不足的时候,可以考虑类似的公开图片 => 进行迁移学习
当缺陷较多,有很多特定情况的时候只使用传统的OpenCV识别方法,难以使用神经网络,因为ai没有见过足够多的样例,没有充足的样本,没有泛化的能力。这怎么办呢->迁移学习
Thinking:早期新冠病毒肺部CT检测图片较少,仅有349张缺陷样本,如何搭建识别准确率较高的模型?
使用其他肺部CT检测的模型,进行迁移学习。用充足的相似样本经过非常多的layer(层)用于图像的特征提取,提取出相关的特征之后最后一层进行传统的识别,比如提取出重要特征后让医生辨认。
feature extraction + classification
除了算法层面,还有哪些需要考虑的?
• 硬件相关
1)相机 2)镜头 3)光源 (安装的位置,角度,数量)
• 数据相关
是否录用到数据中 ;是否和PLC打通,比如发现明显缺陷,需要报警提示...
Thinking:工业相机,使用黑白相机,还是彩色相机?
工业视觉检测,推荐使用黑白相机,因为算法是基于灰度值来处理,以颜色为特征进行检测,需要使用彩色相机。
在相同分辨率下,黑白相机的精度会高许多,对于边缘检测及细节瑕疵检测,是更好的选择
Thinking:手机像素高,是否用手机更好?
手机传感器的芯片非常小(只有小拇指指甲盖大小)
工业相机传感器,即使是几百万像素的传感器,大小也相当于邮票大小
好处:更大的传感器能接受更多的光线,同样的亮度,工业相机可以实现非常高速的拍照,同时保证,图像在低光照下仍然能进行成像(而手机此时已经无法拍出有效的图像)
光源的选择


选择适合的光照角度:
• 照明原理:通过感光芯片捕获进入的光线,进入的光线越多,获得的图像越亮
• 不同放置角度成像不同:
直射光:光线直接摄入相机,背遮挡的地方会形成黑色剪影
反射光:照射到物体上会形成反射进入相机。反射光又分镜面反射和漫反射。不仅要选择好光源,还要选择好放置的距离和角度(调试过程很重要)

总结一下:
缺陷检测是一个软硬件结合的系统工程。通常有三类人合作完成,即:
1)硬件/打光工程师(相机、镜头、光源)
2)算法工程师(传统opencv...深度学习yolo、RCNN...)
3)自动化/PLC工程师(数据打通、工业云、现场PLC控制)
算法工程师是在办公室(甚至异地)工作的。现场工程师把图传回来,算法工程师跑模型,这种离线开发模式非常普遍。
在实际配合中,经常出现这种情况:图片里缺陷看不清,准确率上不去。
如果我们死磕模型,疯狂调参,加深网络层数 => 结果提升0.1%
另一种可能:现场换个灯(成本几百块),图片质量提升50%,算法甚至不需要改代码,准确率提升10%
CNN(卷积神经网络)
CNN的由来
卷积神经网络(CNN)是人工神经网络的一种,是多层感知机(MLP)的一个变种模型,它是从生物学概念中演化而来的。
Hubel和Wiesel早期对猫的视觉皮层的研究中得知在视觉皮层存在一种细胞的复杂分布,这些细胞对于外界的输入局部是很敏感的,它们被称为"感受野"(细胞),它们以某种方法来覆盖整个视觉域。这些细胞就像一些滤波器一样,够更好地挖掘出自然图像中的目标的空间关系信息。
视觉皮层存在两类相关的细胞,S细胞(Simple Cell)和C(Complex Cell)细胞。S细胞在自身的感受野内最大限度地对图像中类似边缘模式的刺激做出响应,而C细胞具有更大的感受野,它可以对图像中产生刺激的模式的空间位置进行精准地定位。

卷积神经网络的作用就是局部信息的一个特征提取,卷积神经网络就是让权重在不同位置共享的神经网络,局部区域圈起来的所有节点会被连接到下一层的一个节点上。
卷积核,称为 kernel 或 filter 或 feature detector,filter的范围叫做filter size,比如 2x2,捕捉卷积特征。
w是权重,当filter 扫描到其他位置计算输出节点 yi时,w1,w2,w3,w4以及b0是共用的。

feature detector计算后得到的粉红色区域叫做一个Convolved Feature 或 Activation Map 或Feature Map。卷积核大小3×3,每个3×3的黄色区域按照一定的权重得到输出(如图为粉色区域最右下角的4)
训练就是修改权重(红色的小字里的数)以及多次特征提取(对粉色区域继续特征提取)

二维卷积可以处理二维数据
.Conv2d(self, in_channels, out_channels, kernel_size, stride=1,padding=0, dilation=1, groups=1, bias=True))
in_channel: 输入数据的通道数,例RGB图片通道数为3;out_channel: 输出数据的通道数,根据模型调整。
kennel_size: 卷积核大小,可以是int,或tuple;kennel_size=2,代表卷积大小(2,2) ;kennel_size=(2,3),代表卷积大小 (2,3)。
卷积神经网络可视化
CNN学习可以帮我们进行特征提取,比如我们想要区分人脸和狗头,那么通过CNN学习,背景部位的激活度基本很少
• CNN layer越多,学习到的特征越高阶
layer 1、layer 2学习到的特征基本上是颜色、边缘等低层特征
layer 3开始稍微变得复杂,学习到的是纹理特征,比如网格纹理,
layer 4学习到的是比较有区别性的特征,比如狗头
layer 5学习到的则是完整的,具有辨别性关键特征
本质是多层拼图游戏
• 先用S细胞(卷积) 找到无数个小碎片(横线、竖线、圆弧)。
• 再用C细胞(池化:做压缩的过程) 忽略掉无关紧要的位置抖动。
• 最后层层叠加,把线条拼成眼睛,把眼睛拼成脸,把脸拼成完整的人。
YOLO
yolo是什么
CNN (卷积神经网络) 是 技术组件。
它的功能只有一个:看图。它负责从图片里提取特征(比如一只猫,CNN 负责找出横线、竖线、眼睛、耳朵)。
YOLO (You Only Look Once) 是 解决方案/架构 。(有定位功能)
它是一个设计精妙的算法框架。把这一堆 CNN 按照特定的顺序组装起来,不仅要看懂图,还要算出物体在哪个位置(坐标)。
=> CNN 是砖块,YOLO 是用砖块盖起来的摩天大楼。
yolo发展
• DL检测中最大的痛点,就是速度问题
• YOLO的特点:速度快,能够达到实时的要求,泛化能力强
• YOLO 一共发布了13个版本,其中 YOLOv1 奠定了整个系列的基础,后面系列是在v1基础上改进,提升性能
• YOLOv4,v5的作者不是前三篇 YOLO 的一作(YOLO 原作者之宣布退出CV界)
• Yolact :Real-time Instance Segmentation, 2019 (实时实例分割)
yolo-v1
目标检测算法:
• 第一类方法,基于Region Proposal的R-CNN系列算法,比如R-CNN,Fast R-CNN, Faster R-CNN,属于two-stage
即需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal,然后再在Region Proposal上做分类与回归
• 第二类方法,Yolo,SSD这类one-stage算法,只使用一个CNN网络直接预测不同目标的类别与位置
• Two-stage方法准确度高一些,但速度慢,one-stage算法是速度快,但是准确性低一些
一步走的yolo相当于同时实现识别结果和定位结果,更快;两步走分阶段实现,准确度更高。
• You Only Look Once: Unified, Real-Time Object Detection;You Only Look Once =>只需要一次CNN运算
• Unified => 指的是这是一个统一的框架,提供end-to-end的预测
YOLO将检测变为一个 regression问题,从输入的图像,只经过一个 neural network,直接得到 bounding boxes 以及每个bounding box 所属类别的概率 => 因为整个的检测过程仅仅有一个网络,所以可以直接 end-to-end 的优化(端到端)
• Real-Time => 说明Yolo算法速度快
速度快,标准版YOLO每秒实时处理 45 帧图像。较小版本Fast YOLO,每秒处理 155 帧图像, mAP(mean Average Precision) 依然可以达到其他实时检测算法的两倍

算法:
• YOLO的第一步是分割图片,它将图片分割为 S*S个grid ,每个grid的大小都是相等的
• 如果我们让每个框只能识别出一个物体,且要求这个物体必须在这个框之内,YOLO则不适合
• YOLO的聪明之处在于,它只要求这个物体的中心落在这个框之中 => 不用设计很大的框
• S*S个框中,每个都预测出B个bounding boxs,这个bounding boxs有5个量,分别是物体的中心位置(x,y)和它的高(h)和宽(w),以及预测的置信度confidence
虽然一个框有多个bounding boxes,但是只能识别出一个物体,所以每个框需要预测物体的类别,而bounding box不需要
如果有S*S个框,每个框的bounding boxes个数为B,分类器可以识别出C种物体,那么ground truth的长度为:

上图:图片被分成了49个框,每个框预测2个bounding boxs,图片中有98个bounding boxs。boxs中有的边框比较粗,有的比较细,是因为置信度不同的表现(置信度高的粗)
Thinking:PASCAL VOC数据共有20个类别,如果使用 S=7,B=2,那么最终的预测结果的张量大小 =?
7*7*30
Thinking:网络的最后输出为 7*7*30大小的张量,30维的向量具体的含义是什么?
前20个元素是类别概率值,后面2个元素是边界框置信度,两者相乘可以得到类别置信度,最后8个元素是边界框(x,y,w,h)
Thinking:每个grid产生2个预测框,可以预测出多少个物体?
每个Grid只能预测一个物体,两个矩形框,最后选定置信度更大的矩形框作为输出
Thinking:7*7的Grid,最多可以预测出多少个物体?
49个
网络设计:
• Yolo采用CNN提取特征,使用全连接层进行预测。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层
• 对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数max(x,0.1x) 最后一层采用线性激活函数

损失函数:
Output:S x S x (5*B+C)的一个tensor
B:(x, y, w, h, confidence)
C:Pi(C) of Category
误差 = 定位误差 + 分类误差
误差 = 定位误差 + 置信度误差 + 分类误差
误差 = 定位误差 + 包含目标的框置信度误差 + 不包含目标的框置信度误差 + 分类误差
逐级细化误差
总结一下yolo-v1
• 用回归做目标检测,即用一个网络同时输出:位置和类别,实现了unified system,从检测的角度是 one-stage
• 速度快,因为回归问题没有复杂的流程相比于其他实时检测系统,性能明显,mAP(准确率)高
• 与基于滑动窗口和区域提议的技术不同,YOLO在训练和测试期间会看到整个图像,所以与Fast R-CNN 相比,YOLO 预测背景出错的次数少了一半(背景不作为识别物品若识别出来算干扰)
• 能学习到物体的通用表示,泛化能力好
• Fast YOLO 具有更少的卷积层( 用9 个替代原来 24 个),并且这些层中的过滤器较少。 除了网络的规模外,YOLO 和Fast YOLO 之间的所有训练和测试参数都相同

非极大值抑制(NMS)
由于一个物体可能会被多个边界框检测到 => 需要通过非极大值抑制来筛选出最佳的边界框。简单来说,就是把置信度最高的边界框保留下来,把其他与它重叠度高的边界框去掉。
• 为了去掉模型预测后的多余框,一般设有一个nms_threshold=0.5,
• Step1,选取这类box中scores最大的哪一个,记为box_best
• Step2,计算box_best与其余的box的IOU
• Step3,如果其IOU>0.5了,那么就舍弃这个box(由于可能这两个box表示同一目标,所以保留分数高的哪一个)
• Step4,从最后剩余的boxes中,再找出最大scores的哪一个,如此循环往复

重叠度(IOU):
• 物体检测需要定位出物体的bounding box,不仅要定位出车辆的bounding box 我们还要识别出
bounding box 里面的物体就是车辆
• 对于bounding box的定位精度,不可能百分百跟人工标注的数据完全匹配,所以存在一个定位精度评价公式 IOU,用于定义两个bounding box的重叠度

当两个识别框重叠程度过大(大于限制值)时,就判定识别为同一个物体,保留自信度最高的框剩下的省略。(重叠程度IOU用并集除以交集)
• 就是抑制不是极大值的元素,搜索局部的极大值
• Yolo会从一张图片中找出n个可能是物体的矩形框,然后为每个矩形框为做类别分类概率
• 非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F
• Step1,从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值
• Step2,假设B、D与F的重叠度超过阈值,那么就扔掉B、D,并标记第一个矩形框F,是需要保留下来的
• Step3,从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框一直重复,找到所有被保留下来的矩形框
总结一下:
YOLO广泛应用于各种需要目标检测的场景:
• 自动驾驶:检测道路上的车辆、行人、交通标志等,为自动驾驶系统提供决策依据。
• 安防监控:在视频监控中实时检测可疑人物或物体,提高安防效率。
• 机器人视觉:帮助机器人识别和定位周围的物体,实现自主导航和操作。
• 智能交通:用于交通流量监测、违章检测等,提高交通管理的智能化水平。
YOLO是一种非常有影响力的实时目标检测算法,以快速、高效的特点在很多领域都发挥了重要作用。
纯粹课堂笔记,有任何侵权,联系我,马上删。