Python可视化目标检测框的实现代码

目录
  • 1 引言
  • 2 举个栗子
  • 3 实现
    • 3.1 函数讲解
    • 3.2 读入图像
    • 3.3 标签美化
    • 3.4 角点美化
    • 3.5 综合效果
  • 4 透明效果实现
  • 5 扩展应用
  • 6 总结
  • 7 参考

1 引言

随着计算机视觉算法工程师的内卷,从事目标检测的小伙伴们越来越多了.
很多时候我们费了九牛二虎之力训练了一版模型,可是可视化出来的效果平淡无奇.
是不是有点太不给力啦,作为计算机视觉工程师,我们是不是应该关注下如何优雅地可视化我们模型地检测结果呢?

2 举个栗子

最常用的可视化目标检测结果的就是我们所说的矩形框,矩形框的画法也可以分为好多中,我们以下图进行说明:

我们以上图皮卡丘的矩形检测框为例,左上为我们常用的不带标签的输出框,右上为YOLO系列美化带标签后的矩形框,左下为四个角点美化后的矩形框,右下为带标签的角点美化矩形框.

3 实现

3.1 函数讲解

在opencv中,我们通常使用cv2.rectangle函数进行矩形框的绘制,该函数的一般形式如下:

cv2.rectangle(image, start_point, end_point, color, thickness)

相应的参数含义如下:

  • image: 输入图像
  • start_point: 矩形框左上点坐标
  • end_point: 矩形框右下点坐标
  • color: 矩形框颜色 默认BGR顺序
  • thickness: 线的粗细,其中 -1 代表填充整个矩形

3.2 读入图像

我们使用上述函数,来画我们的示例图像:

img_name = './pikachu.jpg'
img = cv2.imread(img_name)
box = [ 140, 16,468,390, "pikachu"]
box_color = (255,0,255)
cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), color=box_color, thickness=2)

结果如下:

左侧为我们的原图,右侧为我们画框的效果图.

3.3 标签美化

接下来我们来给矩形框添加标签,我们观察上述画图函数,注意最后一个参数thickness,如果此值等于-1,那么将对矩形框执行填充效果.基于此,我们来写标签美化代码,如下:

def draw_label_type(draw_img,bbox,label_color):
    label = str(bbox[-1])
    labelSize = cv2.getTextSize(label + '0', cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0]
    if bbox[1] - labelSize[1] - 3 < 0:
        cv2.rectangle(draw_img,
                      (bbox[0], bbox[1] + 2),
                      (bbox[0] + labelSize[0], bbox[1] + labelSize[1] + 3),
                      color=label_color,
                      thickness=-1
                      )
        cv2.putText(draw_img, label,
                    (bbox[0], bbox[1] + labelSize + 3),
                    cv2.FONT_HERSHEY_SIMPLEX,
                    0.5,
                    (0, 0, 0),
                    thickness=1
                    )
    else:
        cv2.rectangle(draw_img,
                      (bbox[0], bbox[1] - labelSize[1] - 3),
                      (bbox[0] + labelSize[0], bbox[1] - 3),
                      color=label_color,
                      thickness=-1
                      )
        cv2.putText(draw_img, label,
                    (bbox[0], bbox[1] - 3),
                    cv2.FONT_HERSHEY_SIMPLEX,
                    0.5,
                    (0, 0, 0),
                    thickness=1
                    )

上述代码中,首先计算标签文本的大小,然后据标签文本大小进行矩形填充,最后使用cv2.putText画对应的标签文本.

运行效果如下:

左侧为原图,右侧为添加文本标签后的结果图.

3.4 角点美化

上述添加完标签后,由于标签框和目标矩形框颜色一致,边界处不太容易区分,这里添加对角点美化的代码,代码如下:

def draw_box_corner(draw_img,bbox,length,corner_color):
    # Top Left
    cv2.line(draw_img, (bbox[0], bbox[1]), (bbox[0] + length, bbox[1]), corner_color, thickness=3)
    cv2.line(draw_img, (bbox[0], bbox[1]), (bbox[0], bbox[1] + length), corner_color, thickness=3)
    # Top Right
    cv2.line(draw_img, (bbox[2], bbox[1]), (bbox[2] - length, bbox[1]), corner_color, thickness=3)
    cv2.line(draw_img, (bbox[2], bbox[1]), (bbox[2], bbox[1] + length), corner_color, thickness=3)
    # Bottom Left
    cv2.line(draw_img, (bbox[0], bbox[3]), (bbox[0] + length, bbox[3]), corner_color, thickness=3)
    cv2.line(draw_img, (bbox[0], bbox[3]), (bbox[0], bbox[3] - length), corner_color, thickness=3)
    # Bottom Right
    cv2.line(draw_img, (bbox[2], bbox[3]), (bbox[2] - length, bbox[3]), corner_color, thickness=3)
    cv2.line(draw_img, (bbox[2], bbox[3]), (bbox[2], bbox[3] - length), corner_color, thickness=3)

上述函数参数解释如下:

  • draw_img 输入图像
  • bbox 目标检测框 形式(x1,y1,x2,y2)
  • length 直线长度
  • corner_color 直线颜色

运行结果如下:

左侧为原图,右侧为添加角点美化后的结果图.

3.5 综合效果

综合上述标签美化和角点美化,可以得到二者综合后的效果图如下:

4 透明效果实现

通过cv2.rectangle 函数设置 thickness 我们可以得到填充后的图像,进而利用opencv中的 cv2.add_weight函数可以实现透明效果.
示例如下:

左侧为img , 右侧为填充后的draw_img,那么利用add_weight 进行加权的代码如下:

alpha = 0.8
gamma = 0
out_img = cv2.addWeighted(img,alpha,draw_img,1-alpha,gamma)

运行后的效果图如下:

左侧为 alpha=0.5的效果图,右侧为alpha=0.8的效果图.
和原图放到一起进行对比,如下:

是不是看上去优雅多了…

5 扩展应用

利用上述原理,我们可以方便地将透明效果从矩形框迁移至不规则封闭区域, 样例如下:

左侧为我们输入分割网络的原始图像,右侧为我们分割网络可行驶区域的推理图,我们使用alpha=0.6对上述两幅图进行加权,得到结果如下:

6 总结

本文实现了目标检测矩形框的标签优化以及角点优化,并给出了透明化的具体原理和实际扩展应用,以及详细的代码实现.

您学废了吗?

7 参考

链接一

链接二

到此这篇关于Python如何优雅地可视化目标检测框的文章就介绍到这了,更多相关Python目标检测框内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用Python进行数据可视化的实例代码

    目录 前言 首先搭建环境 实例代码 例子1: 例子2: 例子3: 例子4: 例子5: 例子6: 总结 前言 前面写过一篇用Python制作PPT的博客,感兴趣的可以参考 用Python制作PPT 这篇是关于用Python进行数据可视化的,准备作为一个长贴,随时更新有价值的Python可视化用例,都是网上搜集来的,与君共享,本文所有测试均基于Python3. 首先搭建环境 $pip install pyecharts -U $pip install echarts-themes-pypkg $pi

  • python可视化之颜色映射详解

    本文主要介绍一下在学习可视化过程里遇到的一些情况 比如cmap=plt.cm.Blues的映射 import matplotlib.pyplot as plt from random_walk import RandomWalk # Keep making new walks, as long as the program is active. while True: # Make a random walk. rw = RandomWalk(50_000) rw.fill_walk() # P

  • 学会Python数据可视化必须尝试这7个库

    目录 一.Seaborn 二.Plotly 三.Geoplotlib 四.Gleam 五.ggplot 六.Bokeh 七.Missingo 一.Seaborn Seaborn 建于 matplotlib 库的之上.它有许多内置函数,使用这些函数,只需简单的代码行就可以创建漂亮的绘图.它提供了多种高级的可视化绘图和简单的语法,如方框图.小提琴图.距离图.关节图.成对图.热图等. 安装 ip install seaborn 主要特征: 可用于确定两个变量之间的关系. 在分析单变量或双变量分布时进行

  • 这3个Python实时可视化工具包来帮你了解性能瓶颈

    前言 Python中的日志模块可用于跟踪代码的事件,并可用于确定代码崩溃的原因.有效地使用记录器还可以跟踪代码片段的时间复杂度.日志记录可能很有用,但它技术性太强,需要适当的实现.在本文中,我们将讨论3个这样的开源的Python库,它们可以帮助开发人员在几行代码中可视化程序的执行. 一.Pyheat Pyheat 是一个开源的 Python 库,帮助开发人员获得代码执行的逐行时间分布.Pyheat不是以表格格式显示,而是用热图表示运行每行代码所需的时间. Pyheat 可以使用从 PyPl 安装

  • 浅谈哪个Python库才最适合做数据可视化

    数据可视化是任何探索性数据分析或报告的关键步骤,它可以让我们一眼就能洞察数据集.目前有许多非常好的商业智能工具,比如Tableau.googledatastudio和PowerBI,它们可以让我们轻松地创建图形. 然而,数据分析师或数据科学家还是习惯使用 Python 在 Jupyter notebook 上创建可视化效果.目前最流行的用于数据可视化的 Python 库:Matplotlib.Seaborn.plotlyexpress和Altair.每个可视化库都有自己的特点,没有完美的可视化库

  • python数据可视化plt库实例详解

    先看下jupyter和pycharm环境的差别 左边是jupyter----------------------------------------------------------右边是pycharm 以下都是使用pycharm环境 1.一个窗口画出一个线性方程 import numpy as np import matplotlib.pyplot as plt x = np.linspace(0,1,11)# 从0到1,个数为11的等差数列 print(x) y = 2*x plt.plo

  • Python可视化目标检测框的实现代码

    目录 1 引言 2 举个栗子 3 实现 3.1 函数讲解 3.2 读入图像 3.3 标签美化 3.4 角点美化 3.5 综合效果 4 透明效果实现 5 扩展应用 6 总结 7 参考 1 引言 随着计算机视觉算法工程师的内卷,从事目标检测的小伙伴们越来越多了. 很多时候我们费了九牛二虎之力训练了一版模型,可是可视化出来的效果平淡无奇. 是不是有点太不给力啦,作为计算机视觉工程师,我们是不是应该关注下如何优雅地可视化我们模型地检测结果呢? 2 举个栗子 最常用的可视化目标检测结果的就是我们所说的矩形

  • python目标检测数据增强的代码参数解读及应用

    目录 数据增强做了什么 目标检测中的图像增强 全部代码 数据增强做了什么 数据增强是非常重要的提高目标检测算法鲁棒性的手段,学习一下对身体有好处! 数据增强其实就是让图片变得更加多样.比如说原图是一个电脑 如果不使用数据增强的话这个电脑就只是一个电脑,每次训练的电脑都是这样的样子的,但是我们实际生活中电脑是多样的. 因此我们可以通过改变亮度,图像扭曲等方式使得图像变得更加多种多样,如下图所示,尽管亮度,形态发生了细微改变,但本质上,这些东西都依然是电脑. 改变后的图片放入神经网络进行训练可以提高

  • 利用ImageAI库只需几行python代码实现目标检测

    什么是目标检测 目标检测关注图像中特定的物体目标,需要同时解决解决定位(localization) + 识别(Recognition).相比分类,检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置),因此检测模型的输出是一个列表,列表的每一项使用一个数组给出检出目标的类别和位置(常用矩形检测框的坐标表示). 通俗的说,Object Detection的目的是在目标图中将目标用一个框框出来,并且识别出这个框中的是啥,而且最好的话是能够将图片的所

  • OpenCV+python实现实时目标检测功能

    环境安装 安装Anaconda,官网链接Anaconda 使用conda创建py3.6的虚拟环境,并激活使用 conda create -n py3.6 python=3.6 //创建 conda activate py3.6 //激活 3.安装依赖numpy和imutils //用镜像安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy pip install -i https://pypi.tuna.tsinghua

  • python目标检测SSD算法预测部分源码详解

    目录 学习前言 什么是SSD算法 ssd_vgg_300主体的源码 学习前言 ……学习了很多有关目标检测的概念呀,咕噜咕噜,可是要怎么才能进行预测呢,我看了好久的SSD源码,将其中的预测部分提取了出来,训练部分我还没看懂 什么是SSD算法 SSD是一种非常优秀的one-stage方法,one-stage算法就是目标检测和分类是同时完成的,其主要思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,所以其优势是速度

  • python目标检测yolo2详解及预测代码复现

    目录 前言 实现思路 1.yolo2的预测思路(网络构建思路) 2.先验框的生成 3.利用先验框对网络的输出进行解码 4.进行得分排序与非极大抑制筛选 实现结果 前言 ……最近在学习yolo1.yolo2和yolo3,写这篇博客主要是为了让自己对yolo2的结构有更加深刻的理解,同时要理解清楚先验框的含义. 尽量配合代码观看会更容易理解. 直接下载 实现思路 1.yolo2的预测思路(网络构建思路) YOLOv2使用了一个新的分类网络DarkNet19作为特征提取部分,DarkNet19包含19

  • python目标检测yolo3详解预测及代码复现

    目录 学习前言 实现思路 1.yolo3的预测思路(网络构建思路) 2.利用先验框对网络的输出进行解码 3.进行得分排序与非极大抑制筛选 实现结果 学习前言 对yolo2解析完了之后当然要讲讲yolo3,yolo3与yolo2的差别主要在网络的特征提取部分,实际的解码部分其实差距不大 代码下载 本次教程主要基于github中的项目点击直接下载,该项目相比于yolo3-Keras的项目更容易看懂一些,不过它的许多代码与yolo3-Keras相同. 我保留了预测部分的代码,在实际可以通过执行dete

  • 10 行Python 代码实现 AI 目标检测技术【推荐】

    只需10行Python代码,我们就能实现计算机视觉中目标检测. from imageai.Detection import ObjectDetection import os execution_path = os.getcwd() detector = ObjectDetection() detector.setModelTypeAsRetinaNet() detector.setModelPath( os.path.join(execution_path , "resnet50_coco_b

  • python+opencv+caffe+摄像头做目标检测的实例代码

    首先之前已经成功的使用Python做图像的目标检测,这回因为项目最终是需要用摄像头的, 所以实现摄像头获取图像,并且用Python调用CAFFE接口来实现目标识别 首先是摄像头请选择支持Linux万能驱动兼容V4L2的摄像头, 因为之前用学ARM的时候使用的Smart210,我已经确认我的摄像头是支持的, 我把摄像头插上之後自然就在 /dev 目录下看到多了一个video0的文件, 这个就是摄像头的设备文件了,所以我就没有额外处理驱动的部分 一.检测环境 再来在开始前因为之前按着国嵌的指导手册安

  • Python Opencv实现单目标检测的示例代码

    一 简介 目标检测即为在图像中找到自己感兴趣的部分,将其分割出来进行下一步操作,可避免背景的干扰.以下介绍几种基于opencv的单目标检测算法,算法总体思想先尽量将目标区域的像素值全置为1,背景区域全置为0,然后通过其它方法找到目标的外接矩形并分割,在此选择一张前景和背景相差较大的图片作为示例. 环境:python3.7 opencv4.4.0 二 背景前景分离 1 灰度+二值+形态学 轮廓特征和联通组件 根据图像前景和背景的差异进行二值化,例如有明显颜色差异的转换到HSV色彩空间进行分割. 1

随机推荐