基于快速理解Yolo算法原理视频上,记录对于算法的理解
基于快速理解Yolo算法原理视频上,记录对于算法的理解
Yolo算法的训练过程
-
训练时输入的参数:
也就是打标签时给予算法的信息:框的大小——xywh;置信度——1;类别——c1、c2、c3(是该类型,对应的种类参数就是1,不是该类型对应的种类参数就是0);这些信息总共包含8个参数可以记作: $$ y=[P,x,y,w,h,c1,c2,c3] $$
-
对于我们打了标签的图像处理:

假如以上这张图就是打好标签的图片数据,yolo算法首先会对图片进行n✖n的拆分(这里假设是3乘3),紧接着遍历拆分好的每一个小格子,对应有框的格子予以保留,没有框的格子剔除。例子图片中,4、5、6号格子都有框,该怎么处理呢?我们的锚点框都有中心点,yolo算法采取的方法是:格子中有中心点的格子予以保留,没有中心点的剔除
-
训练过程:

简单来说,就是通过反复的迭代,将模型预测出来的目标和正确标定好的目标进行比较,不断缩小预测目标和真实目标之间的差距,而这其中的比较可以简单总结为目标函数的比较:
位置损失(Localization Loss):衡量预测的边界框和真实边界框之间的差异。 置信度损失(Confidence Loss):衡量预测的目标物体存在置信度与实际情况的差异。 分类损失(Class Loss):衡量预测的类别概率分布与真实类别之间的差异。
比较后不断缩小目标和真实值之间的差距,其中的“缩小”就是反向传播。反向传播具体解释如下:
反向传播(Backward Propagation) 假设在进行了一次投篮之后,你发现投篮没有命中(损失值高),你需要调整你的投篮姿势和力量,以提高命中率。这时,你会思考:
姿势:是不是手臂抬得太低了?下次抬高点。 力量:是不是用了太多力?下次稍微减一点。 这个过程就是“计算梯度”,即找到哪些投篮姿势和力量的改变有助于降低损失值。
梯度下降算法 计算梯度:确定姿势和力量的哪些微小调整会让投篮结果变得更好(即损失值降低)。 更新参数:根据这些梯度信息,微调你的投篮姿势和力量。 梯度下降算法:每次调整的幅度可以很小,从而逐步找到最佳的投篮姿势和力量。 Adam算法和SGD算法:这些是不同的微调方法,Adam算法考虑了前几次调整的历史信息,可以更快找到最佳解;SGD(随机梯度下降)每次调整一个小批次的数据,适合处理大规模数据。 通过反复练习(即多次正向传播和反向传播),你的投篮姿势和力量会逐渐优化,命中率就会越来越高。这就是深度学习中训练模型的过程——通过不断调整网络参数,使得模型预测更加准确。
训练结果为best.pt,也就是能够最好识别目标的参数
-
推理过程:

对于输入的图片,使用best.pt对其进行卷积操作,也就是将图片分为很多小格子,然后获得每个格子的 $$ y=[P,x,y,w,h,c1,c2,c3] $$ 这里引入一个问题:无论如何训练,精度多么高,每个小格子都会被识别出有一定几率为某目标,这么多有几率的格子,画出很多的框,如何确定哪些框为最终检测到的目标物呢?这里就要用到一个概念叫交并比——也就是交集和并集的比。如下图:对于汽车的目标检测画出了许多检测框,如何选取最符合的检测结果,将其余对于同一目标不精确、多余的框舍去呢?

首先先说右边的汽车,使用算法选取置信度最大的框,也就是0.9的框,对图中剩余的检测框进行遍历,对于它附近的两个0.6和0.7的检测框,显然交并比都大于0.5了,这就意味着0.6和0.7的框是对于此目标多余的框,就将其去掉,留下置信度最高的0.9检测框作为最终识别结果。而左侧的两个框对于0.9检测框来说,交并比为0<0.5,显然是对于另一目标的检测框,便予以保留。
接下来对于左边的汽车,就选取置信度最高的0.8检测框,再次使用算法进行遍历,最后留下0.8的框。
上面的内容其实就是推理过程中最重要的一步:非极大抑制值
-
其实视频讲的还是比较粗糙,在训练过程中确实很多具体的东西,听的云里雾里不明所以,检测过程也有待完善,例如检测框如何生成?怎么连起来的?后续还要看更具体的理论继续学习。
宇的回收站


