$yolo 返回
目标检测
介绍
Yolo全系列包含Yolo5、6、7、8、9、10、11全部版本
科普
YOLO是一种目标检测算法。简单来说,它能让计算机 “看懂” 图片或视频里有什么物体,还能标出物体的位置和类别,比如判断出图片里是人、汽车还是猫。
它的全称是“You Only Look Once”意思是“你只需要看一次”。传统的目标检测方法可能需要多次扫描图片才能找到物体,而YOLO只需要“扫一眼”图片就能直接给出结果,所以速度非常快。
YOLO原理:首先,它会把图片分成很多小格子,比如切成N×N的网格,每个格子负责“预测”是否有物体的中心位置。举个例子,如果一只猫的中心在某个格子里,这个格子就会判断“这里有猫”,并给出猫的边界框(也就是方框)和类别。 每个格子不仅能预测一个物体,还能同时预测多个边界框。比如同一格子里可能有重叠的物体,最后通过算法筛选出最准确的结果。传统方法可能分两步,先找“可能有物体的区域”,再判断是什么物体,而YOLO用一个神经网络直接输出所有物体的位置和类别,省去了中间步骤,所以实时性很强,适合用于摄像头实时监控。
YOLO优点:它速度快,适合实时场景,比如自动驾驶、安防监控、机器人视觉等,能快速处理视频流。它也很简单直接,不需要复杂的预处理步骤,一张图输入,直接出结果,应用也非常广泛,从日常图片识别,比如朋友圈自动打标签,到工业检测,比如找零件缺陷,都能用到。
YOLO缺点:它对小物体的检测能力较弱,比如图片里的小蚂蚁,可能因为格子分得不够细,容易漏检。它预测的边界框精度可能也不够,比如预测的方框可能比物体实际范围“大一圈”或“小一圈”。
YOLO版本:我当前集成了Yolo V5、V6、V7、V8、V9、V10、V11、以及YoloX 全部版本。
总之,YOLO 就像计算机的 “眼睛”,能让机器快速 “看懂” 画面里的物体。虽然它并不完美,但胜在又快又实用,是人工智能领域很“接地气”的技术。
函数
v(version)
版本:1.1.7
配置版本
配置yolo版本,默认为8
此函数必须要在init之前调用,若不设置,则默认使用Yolo V8
- 参数 : version {int} 版本号
$yolo.v(8);
config(targetSize,meanVals,normVals,useGpu,probThreshold,nmsThreshold)
版本:1.1.7
配置模型
配置模型的参数
此函数必须要在init之前调用,当然也可以不设置,因为有默认的配置
- 参数 : targetSize {int} 目标大小a
- 参数 : meanVals {float[3]} 均值
- 参数 : normVals {float[3]} 归一化
- 参数 : useGpu {boolean} 是否使用GPU
- 参数 : probThreshold {float} 置信度阈值
- 参数 : nmsThreshold {float} 非极大值抑制阈值
init(binPath,paramPath,labels)
版本:1.1.6
初始化模型
默认不使用GPU
- 参数 : binPath {string} 模型bin文件路径(支持相对路径)
- 参数 : paramPath {string} 模型param文件路径(支持相对路径)
- 参数 : labels {string[]} 标签列表
let labels = ["自行车", "火车", "杯子"];
let result = $yolo.init("yolo/yolo-nano.bin", "yolo/yolo-nano.param", labels);
if (result.success) {
alert("初始化成功", "初始化成功");
} else {
alert("初始化失败", result.des);
}
init(binPath,paramPath,labelsPath)
版本:1.1.6
初始化模型
默认不使用GPU
- 参数 : binPath {string} 模型bin文件路径(支持相对路径)
- 参数 : paramPath {string} 模型param文件路径(支持相对路径)
- 参数 : labelsPath {string} 标签文件路径(支持相对路径)
let result = $yolo.init("yolo/yolo-nano.bin", "yolo/yolo-nano.param", "yolo/label.text");
if (result.success) {
alert("初始化成功", "初始化成功");
} else {
alert("初始化失败", result.des);
}
detect()
版本:1.1.6
检测屏幕
获取截屏后,使用yolo模型进行检测
- 返回 : {YoloResult} 检测结果
$screen.getPermit();
//如果初始化成功了一次
//就不需要重复的初始化了
//直接开始识别
let res = $yolo.detect();//识别整个屏幕
alert("识别结果", res);
detect(img)
版本:1.1.6
检测图片
- 参数 : img {Image} 图片
- 返回 : {YoloResult} 检测结果
//如果初始化成功了一次
//就不需要重复的初始化了
//直接开始识别
let img = $img.read("yolo/t01.png");
let res = $yolo.detect(img);//识别图片
alert("识别结果", res);
detect(path)
版本:1.1.6
检测图片
- 参数 : path {string} 图片路径(支持相对路径)
- 返回 : {YoloResult} 检测结果
//如果初始化成功了一次
//就不需要重复的初始化了
//直接开始识别
let res = $yolo.detect("yolo/t01.png");//识别图片
alert("识别结果", res);
检测结果
{
//data是识别到的数据集合,有时会识别到很多结果,所以是数组
"data": [
{
"similar": 0.9527874,
//相似度
"index": 1,
//标签索引
"label": "自行车",
//标签名称
"x": 71.103,
//x坐标
"cx": 291.58154,
//中心点x坐标
"y": 56.355305,
//y坐标
"cy": 189.29092,
//中心点y坐标
"w": 512.06006,
//宽度
"h": 322.22653
//高度
}
],
"success": true,
//是否成功
"des": "执行成功",
//描述
"err": "暂无异常"
//异常信息
}
配置支持
使用$yolo.config()
即可配置参数,设计这个函数的主要作用是用来调优的,如果不配置则使用默认配置数据。
//首先指定版本,若不指定版本,默认使用Yolo V8
$yolo.v(5);//指定使用的yolo版本为:Yolo V5
//为Yolo V5设置配置参数
$yolo.config(targetSize, meanVals, normVals, useGpu, probThreshold, nmsThreshold);
参数说明:不需要配置的参数填null即可
- targetSize {int} : 期望的输入图像边长(通常为正方形),例如 640 表示 640×640 像素。图像会被缩放至该尺寸后输入网络
- meanVals {float[3]} : 图像通道归一化的均值,格式为[B_mean, G_mean, R_mean] 元素范围:(0-255)
- normVals {float[3]} : 图像通道归一化的标准差,格式为[B_std, G_std, R_std] 元素范围:(0.001-0.1)
- useGpu {boolean} : 是否使用 GPU 加速
- probThreshold {float} : 过滤低置信度预测框的阈值,范围[0,1]
- nmsThreshold {float} : 抑制重叠检测框的阈值,范围[0,1]
但是我在开发yolo系列的时候,发现有些版本对于配置参数的支持也是不一样的,所以我在C/C++中尽可能的完善了所有yolo的配置参数, 不过呢还是存在无法完成的配置参数,具体的配置支持度如下:
打Y
的表示支持配置此参数,打N
表示不支持此参数,如果配置了这个参数也不会生效。
版本 | targetSize | meanVals | normVals | useGpu | probThreshold | nmsThreshold |
---|---|---|---|---|---|---|
V5 | Y | Y | Y | Y | Y | Y |
V6 | Y | Y | Y | Y | Y | Y |
V7 | Y | Y | Y | Y | Y | Y |
V8 | Y | Y | Y | Y | Y | Y |
V9 | Y | Y | Y | Y | Y | Y |
V10 | Y | Y | Y | Y | Y | N |
V11 | Y | Y | Y | Y | Y | Y |
VX | Y | Y | Y | Y | Y | Y |
默认 | 640 | [103.53, 116.28, 123.675] | [0.0039,0.0039,0.0039] | false | 0.5 | 0.45 |
总的来说,除了YoloV10不支持NMS阈值配置外,其他版本都支持全部配置,实际上,官方示例中并没有这些配置,有些yolo版本甚至没有任何的配置, 不过为了更好的调优,我在C/C++中尽可能的完善了所有yolo的配置参数。