详解在OpenCV中实现的图像标注技术
作者:今天你吸猫了么 发布时间:2023-12-01 11:54:34
图像标注在计算机视觉中很重要,计算机视觉是一种技术,它允许计算机从数字图像或视频中获得高水平的理解力,并以人类的方式观察和解释视觉信息。注释,通常被称为图片标签,是大多数计算机视觉模型发展中的一个关键阶段。本文将重点讨论在OpenCV的帮助下创建这些注释。以下是将要涉及的主题。
目录
图像注解
对图像注释的需求
图像注解的类型
用OpenCV实现图像注解
机器学习模型的表现越好,你的注释的质量就越高。让我们了解一下图像注释。
图像注解
在一个特定的数据集中对图像进行分类以训练机器学习模型的过程被称为图像注释。当人工注释完成后,被标记的图片由机器学习或深度学习模型处理,以重复注释,不需要人工干预。
因此,图片注释被利用来表明你的系统需要识别的方面。监督学习是在给定标记数据的情况下训练一个ML模型的过程。
图片注解建立了模型试图复制的标准,因此标签中的任何错误也会被重复。因此,正确的图片注释为训练神经网络奠定了基础,使注释成为计算机视觉中最关键的工作之一。
图片注释可以手工完成,也可以在自动注释工具的帮助下完成。自动注释技术通常是预先训练好的算法,可以准确地对照片进行标注。他们的注释是复杂的注释工作所需要的,如构建片段掩码,这需要时间来生成。
你是否在寻找数据科学中使用的Python库的完整库。 查看这里.
对图片注释的需求
对图片进行标注是功能数据集所需要的,因为它能让训练模型了解到图片的相关方面(类别),然后它可以用来在新鲜的、从未见过的图片中识别这些类别。
图像注释产生了训练数据,有监督的人工智能模型可以从中学习。注释图像的方式预测了人工智能在查看和学习图像后的行为方式。因此,在训练中经常描述糟糕的注释,导致模型做出糟糕的预测。
在应对独特的挑战和在新领域使用人工智能时,注释数据是非常重要的。对于像图像分类和分割这样的典型任务,经常有预训练的模型,它们可以通过使用转移学习以最小的输入量定制到特定的用例。
另一方面,从头开始训练一个全面的模型,经常需要大量的注释数据,分为训练集、验证集和测试集,这很难产生,也很费时。无监督算法,不需要注释数据,可以直接在原始数据上训练。
图像注解的类型
有三种盛行的图片注释方法,你为你的用例选择的方法将由项目的复杂性决定。每种使用的高质量图片数据越多,人工智能的预测就越准确。
分类法
分类是最简单、最快速的图片注释方法,因为它只需为一张图片分配一个标签。例如,你可以希望对一组杂货店货架的照片进行分类,以确定哪些照片含有苏打水,哪些不含有。
这种方法非常适合捕捉抽象信息,比如上面的例子,或者一天中的时间,如果图片中有汽车,或者从一开始就过滤掉不符合标准的照片。虽然分类法在提供单一的、高层次的标签方面是最快的,但它也是我们强调的三个类别中最模糊的,因为它不能确定物品在图像中的位置。
物体检测
注释者使用对象检测给图片中的特定事物贴上标签。因此,如果一张图片被标记为有冰激凌,这就更进一步说明了冰激凌在图片中的位置,或者如果特别是搜索可可冰激凌的位置。物体检测可以通过各种方法来完成,包括。
边界框。注释者使用矩形和正方形来定义目标物体在二维中的位置。这是最经常使用的图片注释方法之一。立方体,也被称为三维边界框,被注释者用来指定目标对象的位置和深度。
多边形分割。注释者采用复杂的多边形来指定不对称的目标项目的位置,而这些目标项目并不简单地适合在一个盒子里。
线条。注释器检测图片中的基本边界线和曲线,用线条和样条来区分部分。例如,注释器可以为自驾车图片注释项目命名高速公路上的众多车道。
这种方法仍然不是最精确的,因为物体检测允许在使用方框或线条时出现重叠。它所提供的是项目的大致位置,同时仍然是一个相当快速的注释程序。
语义分割
语义分割克服了物体识别中的重叠问题,保证了图像的每个组成部分只属于一个类别。这种方法通常在像素层面上进行,需要注释者为每个像素分配类别(如行人、汽车或标志)。这有助于教导人工智能模型如何检测和分类某些项目,即使它们被遮挡。例如,如果一个购物车遮住了图像的一部分,可以用语义分割来定义可可冰淇淋的样子,直到像素级别,让模型知道它实际上仍然是可可冰淇淋。
用OpenCV实现图像注解
在这篇文章中,我们将使用边界框和颜色分割方法进行图像注释。
在边界框中,方法将是在物体周围手动绘制不同的边界形状,并在其中添加一些文字。
在颜色分割中,我们将使用KNN算法来分割查询图像中物体的颜色。颜色将根据 "K "值被分割,"K "是最近的邻居的数量,图像上被分割的部分可以被视为注释的部分。
包围盒方法
导入必要的库
import cv2
import numpy as np
import matplotlib.pyplot as plt
读取查询图像
input_img=cv2.imread('annotation_image.jpg',cv2.IMREAD_COLOR)
查询图像
在本文中,我们使用的是彩色图像,所以我们需要使用 "cv2.IMREAD_COLOR"。因为它指示加载一个彩色图片。任何图片的透明度都会被忽略。这是默认设置。我们也可以为这个标志传递整数值1。
在对象上画一条线
image_line=input_img.copy()
cv2.line(image_line, (900,150), (1100,150), (0,255,255), thickness=5,lineType=cv2.LINE_AA)
plt.figure(figsize=(10,10))
plt.imshow(image_line[:,:,::-1])
plt.show()
cv2.line需要输入直线的起点和终点的坐标,以及直线的厚度、透明度和颜色。
印度分析杂志
在物体周围画一个圆
image_circle=input_img.copy()
cv2.circle(image_circle, (1030,340),200, (0,255,255), thickness=5,lineType=cv2.LINE_AA)
plt.figure(figsize=(10,10))
plt.imshow(image_circle[:,:,::-1])
plt.show()
cv2.circle'接收半径和圆的坐标作为输入。其余部分与前面讨论的直线函数相同。
印度分析》杂志
在物体周围画一个矩形
image_rect=input_img.copy()
cv2.rectangle(image_rect, (900,150),(1100,530), (0,0,255), thickness=5,lineType=cv2.LINE_AA)
plt.figure(figsize=(10,10))
plt.imshow(image_rect[:,:,::-1])
plt.show()
它需要左上角的坐标和右下角的坐标来绘制矩形。
印度分析》杂志
KNN方法进行分割
导入必要的库
import cv2
import numpy as np
import matplotlib.pyplot as plt
读取和预处理
img = cv2.cvtColor(input_img,cv2.COLOR_BGR2RGB)
image_reshape = img.reshape((-1,3))
image_2d = np.float32(image_reshape)
改变颜色的顺序,因为在OpenCV中,图像的颜色是以蓝、绿、红(BGR)来读取的。要求是红、绿、蓝(RGB)。
应用KNN
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 1.0)
K = 4
attempts=10
ret,label,center=cv2.kmeans(twoDimage,K,None,criteria,attempts,cv2.KMEANS_PP_CENTERS)
center = np.uint8(center)
res = center[label.flatten()]
result_image = res.reshape((img.shape))
由于图像是一个高分辨率的图像,所以有很多数据点需要处理,如果迭代次数多,就会耗费时间。我们将迭代次数限制为100次,并且将ε值设置为最高值。k近邻被设置为4,尝试次数为10。
plt.figure(figsize=(10,10))
plt.imshow(result_image[:,:,::-1])
plt.show()
印度分析杂志
该算法对颜色进行了很好的分割。可以看到蓝色、白色、灰色和棕色被分开。人们可以对图像进行屏蔽,并进一步调整算法。
结论
处理数据最耗时的方面之一是数据收集和注释。然而,它是训练算法的基础,必须在可行的情况下以最大的精度执行。适当的注释经常会在后期创建模型的过程中节省大量的时间。通过这篇文章,我们已经了解了不同类型的注释和它们的实现。
参考文献
上述代码的链接
阅读更多关于注释的信息
The postImage annotation techniques with implementation in OpenCVappeared first onAnalytics India Magazine.
来源:https://juejin.cn/post/7107126801339514888


猜你喜欢
- 代码如下:<% Rem xml缓存类 '----------------------------
- Python怎么生成一个迭代器,对于需要处理大型数据来说,迭代器是必不可少的,这样可节省大量内存空间,更加合理操作数据。首先我们打开编辑器,
- 本文实例讲述了Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法。分享给大家供大家参考,具体如下:做个笔记(pytho
- Ajax 是异步的JavaScript和XML的简称,是一种更新页面某部分的机制。它赋予了你从服务器获取数据后,更新页面某部分的权力,从而避
- 今天开始学习Python时发现Pycharm竟然过期了需要重新注册,穷苦学生没钱只能再找找百度了浪费了半天时间终于找到一个可以使用的了,支持
- 背景有一个项目,今年12月份开始重构,项目涉及到了socket。但是socket用的是以前一个开发人员封装的包(这个一直被当前的成员吐槽为什
- 目录1. 序列2. 列表2.1 列表的特性2.1.1 列表的连接操作符和重复操作符2.1.3 列表的索引2.1.4 列表的切片2.1.5 列
- 前言Pycharm学习过程中,每次在一个Pycharm窗口建立一个新的文件夹,都需要重新配置anaconda环境。由于本人是初学者,所以写一
- 接着上一篇,统一思想,遵循标准。如何遵循标准,其实标准有很多,结构标准,表现标准,行为标准。选择标准规范,就优先选择W3C推荐的标准。结构标
- 简介vue.js是由华人尤雨溪开发的一套MVVM框架。vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系
- 想要查看每次训练模型后的 loss 值变化需要如下操作loss_value= [ ]self.history = model.fit(sta
- 一、Python 切片的一些用法alist = [3,4,5,6,7,9,11,13,15,17]print(alist[::]) # 返回
- 本文实例为大家分享了python实现双色球随机选号的具体代码,供大家参考,具体内容如下双色球随机选号实现代码from random impo
- 通过启用php.ini配置文件中的相关选项,就可以将大部分想利用SQL注入漏洞的骇客拒绝于门外。 开启magic_quote_gpc=on之
- 安装完 Oracle11g 之后,想打开自带的 SQL Plus 来学习,然后按照提示用 sys 用户来连接数据库,可输了好几次都提示一个错
- 能坚持全部做完的都是高手直入主题建库建表插入数据代码直接按顺序复制就可以-- 建库CREATE DATABASE `emp`;-- 打开库U
- 1. 案例【三酷猫列表记账】操作需求:(1)用列表对象记录三酷猫每天钓鱼的种类和数量(2)统计三酷猫所钓水产品的总数量和预计收获金额(3)打
- 在CSS中我们会经常要用到“清除浮动”Clear,比较典型的就是clear:both;CSS手册上是这样说明的:该属性的值指出了不允许有浮动
- 为了处理根据Web标准创作的网页和根据盛行于20世纪90年代末的旧时实践创作的网页,当代的Web浏览器实现了各种不同的引擎模式。本文说明了那
- 王者荣耀的火爆就不用说了,但是一局中总会有那么几个挂机的,总能看到有些人在骂人,我们发现,当你输入一些常见的辱骂性词汇时,系统会自动将该词变