从0开始的视觉研究生涯(5)模型训练测试导出及相关任务指标_metrics.box.map # map50-95-程序员宅基地

技术标签: python  1024程序员节  计算机视觉  深度学习  人工智能  

第4节计划讲图像基础以及有用的传统图像算法,比如keams、边缘检测等等,这些内容后面有个项目会用到,所以放在后面再一块整合了。

第5节的主要目标是教会萌新如何训练测试一个视觉深度学习模型,以及各种指标的含义和作用。

一、训练及测试模型

一般的深度学习模型框架中的train文件代表着训练模型的脚本,训练一个模型我们首先需要输入数据集,所以一般会有一个描述数据集的文件,然后我们需要确定模型的具体结构,所以通常也会有一个描述模型结构的文件,以YOLOv8为例,描述数据集的文件在ultralytics/cfg/datasets路径下,可以看到有各种数据集的描述文件,每份数据集描述文件通常需要写明数据集的路径以及类别,部分描述文件还会对数据集进行下载:

# Ultralytics YOLO , AGPL-3.0 license
# COCO8-seg dataset (first 8 images from COCO train2017) by Ultralytics
# Example usage: yolo train data=coco8-seg.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── coco8-seg  ← downloads here (1 MB)


# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco8-seg  # dataset root dir
train: images/train  # train images (relative to 'path') 4 images
val: images/val  # val images (relative to 'path') 4 images
test:  # test images (optional)

# Classes
names:
  0: person
  1: bicycle
  2: car
  3: motorcycle
  4: airplane
  5: bus
  6: train
  7: truck
  8: boat
  9: traffic light
  10: fire hydrant
  11: stop sign
  12: parking meter
  13: bench
  14: bird
  15: cat
  16: dog
  17: horse
  18: sheep
  19: cow
  20: elephant
  21: bear
  22: zebra
  23: giraffe
  24: backpack
  25: umbrella
  26: handbag
  27: tie
  28: suitcase
  29: frisbee
  30: skis
  31: snowboard
  32: sports ball
  33: kite
  34: baseball bat
  35: baseball glove
  36: skateboard
  37: surfboard
  38: tennis racket
  39: bottle
  40: wine glass
  41: cup
  42: fork
  43: knife
  44: spoon
  45: bowl
  46: banana
  47: apple
  48: sandwich
  49: orange
  50: broccoli
  51: carrot
  52: hot dog
  53: pizza
  54: donut
  55: cake
  56: chair
  57: couch
  58: potted plant
  59: bed
  60: dining table
  61: toilet
  62: tv
  63: laptop
  64: mouse
  65: remote
  66: keyboard
  67: cell phone
  68: microwave
  69: oven
  70: toaster
  71: sink
  72: refrigerator
  73: book
  74: clock
  75: vase
  76: scissors
  77: teddy bear
  78: hair drier
  79: toothbrush


# Download script/URL (optional)
download: https://ultralytics.com/assets/coco8-seg.zip

以我们自建YOLO系列数据集为例,根据第一讲中的流程数据集建立格式如下

从0开始的视觉研究生涯(1)从数据集开始讲起(入门)-程序员宅基地

那么只要复制新建一个yaml,替换其中的相关路径即可。

YOLOv5是有现成的train.py脚本的,我们只需替换其中的数据集路径即可。YOLOv8在文档中给出了模型训练的示例

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n.yaml')  # build a new model from YAML
model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)
model = YOLO('yolov8n.yaml').load('yolov8n.pt')  # build from YAML and transfer weights

# Train the model
results = model.train(data='coco128.yaml', epochs=100, imgsz=640)

 当然我们可以设置更多的和训练有关的参数,详情可见ultralytics/cfg/default.yaml

在训练的过程中,一般模型会默认边训练边测试模型的性能,这个过程称之为val,val测试的不是损失函数是否达到最优值,而是相关任务的测试指标是否达到最优值。

val和train一样应用角度只要修改相关脚本中的路径即可,从原理上讲,val的流程会更加简单,没有数据增强、反向传播、优化梯度等过程,只要过一遍模型得出结果,然后计算相关指标。

YOLOv8的val脚本示例如下

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n.pt')  # load an official model
model = YOLO('path/to/best.pt')  # load a custom model

# Validate the model
metrics = model.val()  # no arguments needed, dataset and settings remembered
metrics.box.map    # map50-95
metrics.box.map50  # map50
metrics.box.map75  # map75
metrics.box.maps   # a list contains map50-95 of each category

一般模型都会有predict脚本或者demo脚本,即利用训练得到的模型对图像进行检测,可以得到检测后的图像,用来看模型效果到底好不好,毕竟只看指标也有可能出错的时候。其基本流程就是先初始化模型,然后读取图像,然后将图像输入进模型得到预测结果,非常简单,还是以YOLOv8为例,YOLOv8docs中给出了很多示例,包括图像和视频的demo,在demo脚本中通常会一并测试pytorch模型的推理速度

Predict - Ultralytics YOLOv8 Docs

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n.pt')  # pretrained YOLOv8n model

# Run batched inference on a list of images
results = model(['im1.jpg', 'im2.jpg'])  # return a list of Results objects

# Process results list
for result in results:
    boxes = result.boxes  # Boxes object for bbox outputs
    masks = result.masks  # Masks object for segmentation masks outputs
    keypoints = result.keypoints  # Keypoints object for pose outputs
    probs = result.probs  # Probs object for classification outputs

 此外还有一些benchmark等脚本,来测试模型的推理速度以及模型的参数量等信息。

二、视觉任务指标

在深度学习中,定义了三个最基本的测试指标

精确率:在被识别为正类别的样本(预测分类结果)中,确实为正类别的比例是多少
召回率:在
所有正类别样本(真实分类结果)中,被正确识别为正类别的比例是多少?
准确率:在所有样本中,被正确识别的样本的比例是多少?

还定义了四类目标,

若一个实例为正类,实际预测为正类,即为真正类(True Positive TP)
若一个实例为负类,实际预测为负类,即为真负类(True Negative TN)
若一个实例为负类,实际预测为正类,即为假正类(False Positive FP)
若一个实例为正类,实际预测为负类,即为假负类(False Negative, FN)


图像分类任务较为常用的指标是准确率Accuracy和错误率(error rate)

Accuracy:(TP+TN)÷(TP+NP+TN+FN),分类器对整体的判断能力,即正确预测的比例

错误率(error rate)则与正确率相反,描述被分类器错分的比例,error rate = (FP+FN)/(P+N),对某一个实例来说,分对与分错是互斥事件,所以accuracy =1 - error rate;

有时候还会提到top1-Accuracy和top5-Accuracy,含义如下
top1----- 就是你预测的label取最后概率向量里面最大的那一个作为预测结果,如过你的预测结果中概率最大的那个分类正确,则预测正确。否则预测错误
top5----- 就是最后概率向量最大的前五名中,只要出现了正确概率即为预测正确。否则预测错误。

准确率的弊端:准确率作为我们最常用的指标,当出现样本不均衡的情况时,并不能合理反映模型的预测能力。例如测试数据集有90%的正样本,10%的负样本,假设模型预测结果全为正样本,这时准确率为90%,然而模型对负样本没有识别能力,此时高准确率不能反映模型的预测能力。

目标检测任务中的指标则较为复杂,这里涉及到如何判断一个框是正样本还是负样本,图像分类任务中分类正确的图像即为TP和TN这很好理解。而检测框除了是否检测出了目标,检测框位置也同样需要正确,所以又引入了IoU的概念

IoU指的是预测框和真实框的重叠比例,由此就可以判断预测框的位置是否准确

在目标检测任务中最常用的检测指标是mAP,这个指标综合考虑了精确率(precision)和召回率(recall)。准确率(accuracy)在目标检测任务中应用较少,其并不能很好的反应目标检测模型的性能,首先是目标检测不会有真负类(TN,若一个实例为负类,实际预测为负类,即为真负类(True Negative TN)),这点很好理解,我们不会去框背景或者不关注的东西。

设置IoU的阈值,如IoU=0.5,预测框的IoU值大于0.5  预测结果  正确,认定为真正类(TP,若一个实例为正类,实际预测为正类,即为真正类(True Positive TP));否则, 预测结果错误,认定为假正类(FP,若一个实例为负类,实际预测为正类,即为假正类(False Positive FP)),此时没有被检测出的剩余目标即为假负类(FN,若一个实例为正类,实际预测为负类,即为假负类),此外还有同一个正类可能有多个检测框的情况,此时取IoU最大的作为唯一的TP,其他则作为FP

基于此我们可以计算出模型的精确率(precision)和召回率(recall),除了IoU阈值外,还有置信度阈值来反映检测框的可信程度,很显然,置信度设置得越高,错误框越少,模型的精确度就越高,但反过来,一些正确的框也可能被排除了,导致召回率变低了。因此需要找到一个合适的置信度阈值,从而合理的计算P和R,这也就是F1指标,又称为平衡F分数(BalancedScore),它被定义为精确率和召回率的调和平均数。

此外还有不同的F指标,来为P和R赋上不同的权重,F0.5分数和F2分数,在统计学中也得到了大量应用,其中,F2分数中,召回率的权重高于精确率,而F0.5分数中,精确率的权重高于召回率。

 另一种更为全面的评价方法就是设置不同的置信度阈值,然后计算出所有的PR值,再画出相关图像计算mAP值,一张mAP图一般是下面这样的,在YOLOv5中,置信度设置为从0.01开始到1之间的101个值,计算对应的PR值画在这张图上,计算器包含的面积即AP,如果IoU阈值设置的是50%,那么此时称之为AP@50,所有类别的平均AP值就是mAP

 

图像分割的指标大体上与目标检测类似,其特有的指标如下:

PA:像素准确率
对应:准确率(Accuracy)
含义:预测类别正确的像素数占总像素数的比例
混淆矩阵计算:
对角线元素之和 / 矩阵所有元素之和
PA = (TP + TN) / (TP + TN + FP + FN)
CPA:类别像素准确率
对应:精准率(Precision)
含义:在类别 i 的预测值中,真实属于 i 类的像素准确率,换言之:模型对类别 i 的预测值有很多,其中有对有错,预测对的值占预测总值的比例
混淆矩阵计算:
类1:P1 = TP / (TP + FP)
类2:P2 = TN / (TN + FN)
类3:…
MPA:类别平均像素准确率
含义:分别计算每个类被正确分类像素数的比例,即:CPA,然后累加求平均
混淆矩阵计算:
每个类别像素准确率为:Pi(计算:对角线值 / 对应列的像素总数)
MPA = sum(Pi) / 类别数
IoU:交并比
含义:模型对某一类别预测结果和真实值的交集与并集的比值
混淆矩阵计算:
以求二分类:正例(类别1)的IoU为例
交集:TP,并集:TP、FP、FN求和
IoU = TP / (TP + FP + FN)
MIoU:平均交并比
含义:模型对每一类预测的结果和真实值的交集与并集的比值,求和再平均的结果
混淆矩阵计算:
以求二分类的MIoU为例
MIoU = (IoU正例p + IoU反例n) / 2 = [ TP / (TP + FP + FN) + TN / (TN + FN + FP) ] / 2

 关于模型轻量级的指标计算量FLOPs和参数量Params

计算量对应我们之前的时间复杂度,参数量对应于我们之前的空间复杂度,也就是计算量要看网络执行时间的长短,参数量要看占用显存的量

计算量:FLOPs,FLOP时指浮点运算次数,s是指秒,即每秒浮点运算次数的意思,考量一个网络模型的计算量的标准。

参数量:Params,是指网络模型中需要训练的参数总数。

以卷积层为例,参数量就是(kernel*kernel) *channel_input*channel_output

计算量就是(kernel*kernel*map*map) *channel_input*channel_output

池化层无参数

全连接层参数量=计算量=weight_in*weight_out

import torch
import torchvision
from thop import profile
 
print('==> Building model..')
model = torchvision.models.alexnet(pretrained=False)
 
input = torch.randn(1, 3, 224, 224)
flops, params = profile(model, (input,))
print('flops: %.2f M, params: %.2f M' % (flops / 1e6, params / 1e6))

模型推理速度的指标通常可以直接用推理所需的平均时间,或者FPS,在不同的硬件设备上会有不同的推理速度。

三、导出模型 

 如果仅仅是写论文的话,第三节加上上面的内容基本上就够用了,也可以用pytorch文件结合pyqt或者gradio做出可视化的界面,应付本科或者研究生毕业设计基本上足够了。

但是在工业应用领域,python的效率太低了,而且在各种嵌入式设备上都是用C++进行的开发,所以导出模型的任务就是将pytorch模型转为C++模型,正如pytorch是基于python实现的网络各个层的计算API,在C++中也有各种API

最基础的导出就是ONNX了,开放神经网络交换(Open Neural Network Exchange)简称ONNX是微软和Facebook提出用来表示深度学习模型的开放格式。所谓开放就是ONNX定义了一组和环境,平台均无关的标准格式,来增强各种AI模型的可交互性。换句话说,无论你使用何种训练框架训练模型(比如TensorFlow/Pytorch/OneFlow/Paddle),在训练完毕后你都可以将这些框架的模型统一转换为ONNX这种统一的格式进行存储。注意ONNX文件不仅仅存储了神经网络模型的权重,同时也存储了模型的结构信息以及网络中每一层的输入输出和一些其它的辅助信息。

onnx/onnx: Open standard for machine learning interoperability (github.com)

我们可以用netron来查看导出后的onnx结构

Netron 

onnx的使用也非常简单,可以直接用opencv中的dnn来跑, 不同的视觉任务再使用不同的后处理即可。

OpenVINO是英特尔推出的一款全面的工具套件(2023.0版本已经发布),用于快速部署应用和解决方案,支持计算机视觉的CNN网络结构超过200余种。 

Intel Distribution of OpenVINO Toolkit

TensorRT则是在英伟达自家GPU上的推理库

TensorRT SDK | NVIDIA Developer

 Core ML 则是苹果提出的推理库。

Core ML - 简体中文文档 - Apple Developer 

大家一眼就看明白了,追求速度的话,我要应用到什么设备上就用什么推理库就行了呗,相关企业自己优化的那肯定是最好的,都不用比较了,贪图简单的话就直接onnx搞定。

当然在工业领域可能这几款设备都不怎么适用,而是用RAM式架构嵌入式单片机之类的,一些相关的芯片厂商也推出了对应的推理库,比如瑞芯微的RKNN,这里个人推荐如果是自己做实验的话,瑞芯微芯片效率还是很不错的,教程也比较详细。

RKNN 是 Rockchip npu 平台使用的模型类型,以.rknn后缀结尾的模型文件。Rockchip 提供了完整了模型转换 Python 工具,方便用户将自主研发的算法模型转换成 RKNN 模型,同时 Rockchip 也提供了C/C++Python API 接口。

RKNN 使用 — Firefly Wiki (t-firefly.com)

还有在手机上或者其他芯片上的推理库,安卓手机一般也是RAM式架构芯片,推荐NCNN,啥?你问我苹果手机?那直接就CoreML啦

Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform (github.com)

另外华为有MindSpore官网 ,阿里有MNNalibaba/MNN: MNN is a blazing fast, lightweight deep learning framework, battle-tested by business-critical use cases in Alibaba (github.com)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fisherisfish/article/details/134016669

智能推荐

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

分布式系统_分布式系统运维工具-程序员宅基地

文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具

用Exce分析l数据极简入门_exce l趋势分析数据量-程序员宅基地

文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线

推荐文章

热门文章

相关标签