【CV】手把手教你使用OpenCV,ONNXRuntime部署yolov5旋转目标检测

作者丨王博,极视角科技算法研究员

编辑丨极市平台

导读

 

本文从旋转角度、旋转角度的余弦值、不规则四边形的目标检测三个方向讲述了模型需要注意的细节,并附有代码链接。 

1.学习旋转角度

在无人机/遥感目标检测领域,拍摄到的物体通常是,如下图中红色矩形框里的飞机,这是用ultralytics/yolov5检测到的目标,很明显水平矩形检测框在检测旋转目标时,检测框里包含了无关背景区域,因此ultralytics/yolov5检测旋转目标,不是一个理想的解决方案。

e637a9f54a26153e6946169cf1e19148.png

在ultralytics/yolov5的检测头里添加一个学习旋转角度angle的分支,考虑到旋转角度是分布在0到180度之内的一个整数值,因此把旋转角度angle做为一个分类问题来学习。

这时模型输出的每一个候选检测框里的信息是 x,y,w,h,box_score,class_score,angle_score 这种形式的,其中x,y,w,h表示检测框的中心点坐标,宽度和高度,box_score表示检测框的置信度,class_score表示类别置信度,假如在coco数据集上训练的,coco数据集里有80个类别,那么class_score是一个长度为80的数组,它里面第i个元素表示第i个类别的置信度。angle_score表示倾斜角度的置信度,它是一个长度为180的数组,它里面第i个元素表示检测矩形框的倾斜角等于i度的置信度。那么这时检测框里包含信息的长度是5+80+180=265,这就使得yolov5的检测头里的最后3个1x1卷积的输出通道数也别大,这时无疑会增大模型的计算量。

我在github发布了一套分别使用OpenCV,ONNXRuntime部署yolov5旋转目标检测的demo程序,分别包含C++和Python两个版本的程序。程序输出矩形框的中心点坐标(x, y),矩形框的高宽(h, w),矩形框的倾斜角,源码地址是:https://github.com/hpc203/rotate-yolov5-opencv-onnxrun

在编写后处理NMS函数时,需要注意的一个问题是用C++编程实现计算两个旋转矩形框的重叠面积,实现细节可以参考源码。

1eaaedba80234963f54ef151a3824b5d.png
程序读取一张C++程序的运行结果图

2.学习旋转角度的余弦值

在第1部分里讲到学习旋转角度会存在的一个问题是:由于旋转角度是分布在0到180度之内的一个整数值,也就是说有180种取值的可能,把旋转角度作为一个分类任务,会使得yolov5的检测头里的最后3个1x1卷积的输出通道数也别大,这时会增大模型的计算量。注意到角度的余弦值是分布在-1到1之间的小数值,那么可以考虑学习旋转角度的余弦值和正弦值。如下图所示:

0fa2522cc839864f13072b4b71b12abb.png

损失函数是SmoothL1Loss,示意图如下:

8b03c4ef209daa5575fe02161f7af889.png

这时,模型输出的每个候选框里包含的信息是x,y,w,h, cos,sin, box_score,class_score这种形式的,其中cos表示检测矩形框的倾斜角的余弦值,sin表示检测矩形框的倾斜角的正弦值。假如在coco数据集上训练的,那么这时候选框的长度是4+2+1+80=87,很明显这时模型的计算量会减少很多。

程序输出矩形框的中心点坐标(x, y),矩形框的高宽(h, w),矩形框的倾斜角的余弦值和正弦值的GitHub源码地址:https://github.com/hpc203/rotateyolov5-opencv-onnxrun

b4be30cfd5673cd2b78f2b79876848a2.png
程序读取一张航拍图片的C++程序的运行结果图

3.不规则四边形的目标检测

最近在极市平台的打榜项目里有车牌识别项目,项目里要求检测车牌的4个角点。可以仿照第1部分里的思路,在ultralytics/yolov5的检测头里添加一个学习四个角点的分支,这时,模型输出的每个候选框里包含的信息是 x,y,w,h, box_score, x1,y1,x2,y2,x3,y3,x4,y4, class_score这种形式,其中x1,y1,x2,y2,x3,y3,x4,y4表示4个角点的坐标值x和y。这时候的模型就能满足项目的需求,但是注意到水平矩形框的位置信息x,y,w,h在项目里并没有起作用,因此水平矩形框的位置信息是一个冗余的信息。

接着对模型继续做修改,使模型输出的是x1,y1,x2,y2,x3,y3,x4,y4,box_score,class_score,也就是去掉box分支,这时可以减小模型体积,减少计算量。修改的地方在yolov5的检测头和loss函数,图解如下:

(1).build_targets函数和检测头Detect

be2c5b2843c291797cffc5fab72f8eea.png

(2). 4个角点逆时针排序

b918b35ab7db8f561d8f6a5b31336512.png

(3). polygon box loss

7f1bf6a23df0c17eb863c5d50a4dd05c.png

程序输出不规则四边形的4个角点的坐标x,y的源码地址:https://github.com/hpc203/polygonyolov5-opencv-onnxrun

在编写后处理NMS函数时,一个棘手的问题是计算不规则四边形的面积,计算两个不规则四边形的重叠面积。如果是编写Python程序,可以直接调用shapely库解决,如果是编写C++程序,那就比较棘手了,C++编程实现的细节可以参考源码。

7dc624eb77d2da9a124a532e6d5805de.png
读取一张航拍图片的C++程序的运行结果图

为了便于直观理解第2节里的旋转目标检测和第3节里的不规则四边形目标检测,它们的差异,图解如下:

73d4f6ff0f57c185eaa8aa494c7e0acd.png
 
 
 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码:

ddb34bc6f6042dac8da7e95e790668ad.png

  • 0
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值