精易论坛

标题: 易语言 OPENCV DNN YOOLv11 OBB 带角度的目标检测实现 [打印本页]

作者: z13228604287    时间: 2025-2-28 18:36
标题: 易语言 OPENCV DNN YOOLv11 OBB 带角度的目标检测实现

  
窗口程序集名保 留  保 留备 注
程序集1   
变量名类 型数组备 注
置信度阈值小数型检测到的目标置信度分数
分数阈值小数型指类别分数,预测某个目标属于特定类别的概率。
非极大值抑制阈值小数型去除重叠检测框
输入高整数型模型输入高 训练时已决定
输入宽整数型模型输入宽 训练时已决定

子程序名返回值类型公开备 注
_启动子程序整数型 本子程序在程序启动后最先执行
' 根据选择的检测模型文件进行配置
分数阈值 = 0.25
置信度阈值 = 0.45
非极大值抑制阈值 = 0.5
输入高 = 1024
输入宽 = 1024
旋转目标检测 (“D:\新建文件夹\train\yolo11n-obb.onnx”, “C:\Users\Administrator\Desktop\plane.png”, )
返回 (0)  ' 可以根据您的需要返回任意数值
子程序名返回值类型公开备 注
旋转目标检测  
参数名类 型参考可空数组备 注
模型路径文本型
图片路径文本型
是否填充为正方形逻辑型
变量名类 型静态数组备 注
YOLO网络神经网络类 
输出层名称数组数组容器 
图片数据矩阵类 
拷贝图数据矩阵类 
数据块数据矩阵类 
张量数组数组容器推理输出结果集
' 加载模型
YOLO网络 = 视觉_从ONNX读取网络 (模型路径)
输出层名称数组 = YOLO网络.获取未连接输出层名称 ()
' 读取图片
图片 = 视觉_图像读取 (图片路径, #读图_彩色 )
如果真 (图片. ())
视觉_控制台输出 (“无法打开或找到图像 :%T”, 图片路径)
返回 ()
拷贝图 = 图片.克隆 ()
如果真 (是否填充为正方形 输入高 = 输入宽)
拷贝图 = 填充为正方形 (拷贝图)
数据块 = 视觉_从图像创建数据块 (拷贝图, 1 ÷ 255, 尺寸整数 (输入宽, 输入高), 标量 (0, 0, 0), 真, 假, 5)
YOLO网络.设置输入 (数据块, “”, 1, 标量 ())
YOLO网络.前向传播V (张量数组, 输出层名称数组)
后期处理 (图片, 拷贝图.尺寸整型 (), 张量数组, YOLO网络, 15)
视觉_显示图像 (“小白鼠YOLO11 OBB”, 图片)
视觉_等待按键 (0)
子程序名返回值类型公开备 注
后期处理  
参数名类 型参考可空数组备 注
图片数据矩阵类
输入尺寸尺寸整型结构
张量数组数组容器1维 数据矩阵类: 包含检测信息
YOLO网络神经网络类
类数整数型
变量名类 型静态数组备 注
缩放因子X小数型 
缩放因子Y小数型 
置信度数组数组容器1维 小数型:用于存储检测到的目标的置信度
目标类别ID数组数组容器1维 整数型:用于存储检测到的目标的类别 ID
边界框数组数组容器1维 旋转矩形类:存储检测到的目标的旋转边界框
边界框数顶点二维数组数组容器2维 坐标二维小数型结构:存储旋转边界框的四个顶点坐标,用于减少后续绘制时的计算量
边界框数顶点数组数组容器 
检测框数整数型 
属性数整数型 
二维矩阵数据矩阵类 
数据指针小数型指针类 
i整数型 
类别分数小数型指针类 
分数数据矩阵类 
类最大分数位置坐标二维整型结构 
类最小分数位置坐标二维整型结构 
类最大分数双精度小数型 
类最小分数双精度小数型 
横坐标小数型 
纵坐标小数型 
小数型 
小数型 
角度小数型 
余弦值小数型 
正弦值小数型 
高旋转量坐标二维小数型结构 
宽旋转量坐标二维小数型结构 
顶点坐标坐标二维小数型结构 
检测框的索引数组容器用于存储经过非极大值抑制(NMS)后保留的检测框的索引
索引整数型 
' 计算输入图像尺寸与模型输入尺寸的缩放因子
缩放因子X = 输入尺寸.宽 ÷ 输入宽
缩放因子Y = 输入尺寸.高 ÷ 输入高
' 获取输出张量的形状信息
' [1, 84, 8400] -> [8400, 84],其中 8400 是检测框的数量,84 是每个检测框的属性数量
检测框数 = 张量数组.取数据矩阵类 (1).尺寸属性 (2)
属性数 = 张量数组.取数据矩阵类 (1).尺寸属性 (1)
' 对输出张量进行形状调整,将其转换为二维矩阵
二维矩阵 = 张量数组.取数据矩阵类 (1).重塑 (1, 属性数)
' 对矩阵进行转置操作
视觉_转置 (二维矩阵, 二维矩阵)
' 获取矩阵的数据指针
数据指针.指针 = 二维矩阵.数据指针
' 遍历所有检测框
计次循环首 (检测框数, i)
' 跳过前 4 个元素(边界框的中心坐标和宽高),获取类别分数
类别分数.指针 = 数据指针.指针
类别分数.偏移 (4)
' 创建一个 数据矩阵 对象来存储类别分数
分数.初始化指针 (1, 类数, #矩阵_单通道小数型, 类别分数.指针)
' 找出类别分数中的最大值及其对应的类别 ID
视觉_最小最大位置 (分数, 类最小分数, 类最大分数, 类最小分数位置, 类最大分数位置, )
' 如果最大类别分数大于设定的置信度阈值
如果真 (类最大分数 > 置信度阈值)
' 将置信度和类别 ID 分别存入对应的数组容器中
置信度数组.加入小数型 (类最大分数)
目标类别ID数组.加入整数型 (类最大分数位置.横坐标)
' 计算边界框的中心坐标、宽高和旋转角度,并根据缩放因子进行缩放
横坐标 = 数据指针. (0) × 缩放因子X
纵坐标 = 数据指针. (1) × 缩放因子Y
宽 = 数据指针. (2) × 缩放因子X
高 = 数据指针. (3) × 缩放因子Y
角度 = 数据指针. (19)
' 计算旋转角度的余弦和正弦值
余弦值 = 求余弦 (角度)
正弦值 = 求正弦 (角度)
' 计算边界框的四个顶点相对于中心的偏移向量
宽旋转量.初始化 (宽 ÷ 2 × 余弦值, 宽 ÷ 2 × 正弦值)
高旋转量.初始化 (-高 ÷ 2 × 正弦值, 高 ÷ 2 × 余弦值)
' 计算边界框的四个顶点坐标
顶点坐标.初始化 (横坐标, 纵坐标)
边界框数顶点数组.清空 ()
边界框数顶点数组.加入坐标二维小数型结构 (顶点坐标. (宽旋转量). (高旋转量))
边界框数顶点数组.加入坐标二维小数型结构 (顶点坐标. (宽旋转量). (高旋转量))
边界框数顶点数组.加入坐标二维小数型结构 (顶点坐标. (宽旋转量). (高旋转量))
边界框数顶点数组.加入坐标二维小数型结构 (顶点坐标. (宽旋转量). (高旋转量))
' 根据三个顶点创建旋转边界框 加入数组
边界框数组.加入旋转矩形类 (旋转矩形P (边界框数顶点数组.取坐标二维小数型结构 (1), 边界框数顶点数组.取坐标二维小数型结构 (2), 边界框数顶点数组.取坐标二维小数型结构 (3)))
' 将四个顶点坐标存入对应的向量中
边界框数顶点二维数组.加入数组容器 (边界框数顶点数组)

' 移动数据指针到下一个检测框的起始位置
数据指针.偏移 (属性数)
计次循环尾 ()
' 执行非极大值抑制,过滤掉重叠的检测框
视觉_非最大抑制旋转框 (边界框数组, 置信度数组, 置信度阈值, 非极大值抑制阈值, 检测框的索引, 1, 0)
' 遍历经过 NMS 后保留的检测框的索引
计次循环首 (检测框的索引.成员数 (), i)
索引 = 检测框的索引.取整数型 (i) + 1  ' 索引0开始 需要+1 符合易语言
绘制预测 (目标类别ID数组.取整数型 (索引), 置信度数组.取小数型 (索引), 边界框数顶点二维数组.取数组容器 (索引), 图片)
计次循环尾 ()
子程序名返回值类型公开备 注
绘制预测  
参数名类 型参考可空数组备 注
类ID整数型
置信度小数型
边界框数顶点数组数组容器
图片数据矩阵类
变量名类 型静态数组备 注
标签文本型 
i整数型 
基线整数型 
左边整数型 
顶边整数型 
标签尺寸尺寸整型结构 
标签 = 到文本 (类ID)“:”到文本 (四舍五入 (置信度 × 100, 1)) + “%”
' 绘制旋转框
计次循环首 (4, i)
视觉_线小数 (图片, 边界框数顶点数组.取坐标二维小数型结构 (i), 边界框数顶点数组.取坐标二维小数型结构 (i % 4 + 1), 标量 (255, 255, 255), 2, 8, 0)
计次循环尾 ()
视觉_圆小数 (图片, 边界框数顶点数组.取坐标二维小数型结构 (1), 3, 标量 (0, 0, 255), -1, 8, 0)
标签尺寸 = 视觉_获取文本尺寸 (标签, #字体_简易无衬线, 0.5, 1, 基线)
左边 = 边界框数顶点数组.取坐标二维小数型结构 (1).横坐标
顶边 = 视觉_取最大值 (边界框数顶点数组.取坐标二维小数型结构 (1).纵坐标, 标签尺寸.高)
视觉_矩形坐标 (图片, 坐标二维整型 (左边, 顶边 - 标签尺寸.高), 坐标二维整型 (左边 + 标签尺寸.宽, 顶边 + 基线), 标量 (255, 255, 255), -1, 8, 0)
视觉_放置文本 (图片, 标签, 坐标二维整型 (左边, 顶边), #字体_简易无衬线, 0.5, 标量 (), 1, 8, )
子程序名返回值类型公开备 注
填充为正方形数据矩阵类 
参数名类 型参考可空数组备 注
数据矩阵类
变量名类 型静态数组备 注
最大值整数型 
返回图数据矩阵类 
最大值 = 视觉_取最大值 (图.列数, 图.行数)
返回图.初始化 (最大值, 最大值, #矩阵_三通道字节型U, 标量 (114, 114, 114))
图.复制 (返回图.感兴区域 (矩形整型 (0, 0, 图.列数, 图.行数)), )
返回 (返回图)


i支持库列表   支持库注释   
OpenCV(未知支持库)


作者: 江山少主    时间: 2025-2-28 19:00
看起来很高级,留下痕迹
作者: jdlz2001    时间: 2025-2-28 21:47
看起来很高级
作者: wan942182718    时间: 2025-3-1 11:57
官方的例子多简洁,再来看你们的例子,花里胡哨的,看不懂,对新手不友好,分享技术值得点赞,CUDA不支持32位,可惜了
作者: wan942182718    时间: 2025-3-1 14:23
wan942182718 发表于 2025-3-1 11:57
官方的例子多简洁,再来看你们的例子,花里胡哨的,看不懂,对新手不友好,分享技术值得点赞,CUDA不支持32 ...

官方例子都是c++代码,最重要点:

yolov11相较于yolov8的层方面有改动,目前可以使用yolov8的加载方式加载yolov11模型,但是要禁用层融合。
net.enableFusion(false);  // 禁用层融合
作者: wan942182718    时间: 2025-3-1 21:58
易语言支持库编译出来还需要依赖什么dll吗?  我没研究过易语言的支持库;所以问问、c++编译静态库再链接易语言支持库?
作者: wan942182718    时间: 2025-3-1 21:59
易语言支持库编译出来还需要依赖什么dll吗?  我没研究过易语言的支持库;所以问问、c++编译静态库再链接易语言支持库?
作者: 徐某    时间: 2025-3-4 19:43
6666666666666666666666666
作者: 邓福坤    时间: 2025-3-8 21:16
看起来很高级,留下痕迹 不邦定电脑也不可能 吧
作者: yangshengxi    时间: 2025-3-13 11:09
66666666666666
作者: huangjiahong    时间: 2025-3-14 16:46
6666666666666666666666666
作者: URANT    时间: 2025-3-20 11:10

作者: 不离01    时间: 2025-6-2 23:46
感谢分享  6666




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4