简介

在今天的文章中,我们将通过在OpenCV Python中使用Mask-RCNN来研究实例分割。我们将首先了解什么是实例分割,然后简要地谈一下Mask RCNN算法。最后,我们将解释在像素勇士大创造攻略OpenCV pyt变量名hon中使用Mask-RCNN对图像和视频进行实例分割的实现。

实例分割

教程—在OpenCV Python中使用Mask-RCNN进行实例分割

来源

计算机视觉领域,初学者经常会发现物体检测、语义分割和实例分割之间存在混淆。

对象检测是对象定位计算机视觉的应用和图像分类的组合过程。这意味着,一个物体检测算法,在给定一组标签/类别后,首先给图像分配一个标签/类别以及一个信心分数。同时,该算法还负计算机视觉责寻找物体在所述图像中的位置(例如位置(x,y坐标)、高度、宽度)。

而图像分割算法比物体检测更进一步,它为图像中的每个物体生成像素级的掩码。可以说,它通过用一个单独的颜色掩码来代表一个物体所覆盖的区域。我们可以把它看作是图像中被我们的物体检测器归类为可行的物体的部分或区域的可视化可视化是什么意思

实例分割将图像中的每个物体作为一个单独的实体(它们由不同的颜色表示)。我们可以在上面的插变量值图中变量名看到这一点。

此外,也可以说更深层次的语义分割被称为实例分割,即在语义分割图像中,所有的牛都被赋予 “牛 “的标签,而在实例分割的情况下,牛被进一步细分为1号羊、2号羊等等。

什么是Mask-R变量的定义CNN?

4k视频上的Mask RCNN

Mask RCNN由Facebook研究团队在2017年建立,是一个用于实例分割的深度神经网络架构。(RCNN代表区域卷积神经网络)它是建立在两个最先进的深度学习模型Python上。

1.更快的R-CNN。它是一个物体检测模型,可以返回物体在图像中的位置,以及检测到的物体的置信度分数。

2python怎么读.FCN:它是一个完全卷积网络,只使变量泵用卷积层的模型。

  • 还可以阅读 – 不同类型的物体检测算变量英语法简述

掩膜RCN算法的步骤

教程—在OpenCV Python中使用Mask-RCNN进行实例分割

更快的R-CNN结构

  1. 内置的更快的R-CNN结构使用FCN对输入图像应用卷积过滤器,以学习特征。
  2. 接下来,该模型使用区python123域提议网络(RPN)来传递特征,并生成物体可能存在的潜在区域(以及它们的位置)。
  3. 为了确保每个潜在的物体都被处理,我们将我们的特征通过最大集合层。
  4. 为了输出我们的结果,潜在的物体特征被传递到一个全连接层。它将它们分类为不同的类别,并提供边界框的坐标。

更多细节请见M变量的定义ask RCNN论文。

现在让我们看看在OpenCV Python中使用Mask-RCNN进python编程行实例分割的教程。

python安装教程OpenCV Python中使用M计算机视觉技术的应用ask-RCNN对图像进行实例分可视化大屏

i) 安装程序库

  1. **OpenCV:**开放源代码的计算机视觉库。我们将使用DNN模块,它是专门为运行深度学习模型(内置任何框架)而建立的,可以在OpenCV中运行。像素画你可以像这样用pip安装它。
pip install opencv-python

2.**Numpy。**用于数像素勇士大创造攻略学计算和数据及数据结构操作的Python库。使用下面的命令来安装它。

pip install numpy

ii) 模型权重和配像素冒险世界置文件

你可以从这里计算机视觉好找工作吗下载权重和配置文件

或者你可以通过计算机视觉克隆官方的GitHub仓计算机视觉的应用像素生存者2来访问这些配置文件。Mask-RCNN GitHub(Keras/Tepython可以做什么工作nsorflow计算机视觉经典任务 implementation by matterport)

iii) 导入所需的库

1 import cv2
2 import numpy as np

iv) 定义你的资源的路径

2 path_to_model = 'frozen_inference_graph_coco.pb'
3 path_to_config= 'mask_rcnn_inception_v2_coco_2018_01_28.pbtxt'
4 image_path='img.jpg'
5 colors = np.random.randint(0, 255, (80, 3))

第2-3行:定义模型权重和配置文件的路径。

第4行。定义图像路径(要应用分割算法的图可视化分析像)。

第5行。使用numpy可视化大屏随机模块生成随机颜色。这些颜色将被用来代表我们遮罩中的不同物体。

v) 定义变量和参数

6 model = cv2.dnn.readNetFromTensorflow(path_to_model,path_to_config)
7 img = cv2.imread(image_path)
8 img = cv2.resize(img,(650,550))
9 height, width, _ = img.shape
10 black_image = np.zeros((height, width, 3), np.uint8)
11 black_image[:] = (150, 150, 0)

第6行。使用’dnn’模型中的’readNetFromTensorflow’函数创建一个模型对象。作为参数,我们传递模型的权重和配置文件。变量英语

第7-9行。将查询图可视化音乐软件像加载到内存中,调整其大小(第8行)并计算其高度和宽度(第9行)。

第10-11行:创建一个空图像(numpy zeros数组,与我们的变量名的命名规则查询图像大小相同),用来存储我们的掩码。将其背景颜色设置为你喜欢的颜色(第11行)。

vi) 预处理和检测对象

12 blob = cv2.dnn.blobFromImage(img, swapRB=True)
13 model.setInput(blob)
14 boxes, masks = model.forward(["detection_out_final", "detection_masks"])
15 no_of_objects = boxes.shape[2]

第12-13行。使用 “blobFromImage “函变量名的命名规则数对图像进行预处理,使其成python基础教程为模型可可视化是什么意思以接受的输入python是什么意思。我们还交换python可以做什么工作了红色和蓝色过滤器,因为tensorflow接受 “RGB “格python编程式,而OpenCV接受 “BGR”。接下来,变量之间的关系使用’setInput’函数来准备模型,以便通过它传播像素射击我们的查询图像。

第1python基础教程4行:在这里我们定义我们的输出参数。forward “函数接受一个数组作为输入,该数组定义了我们将从中提取输出的层。boxes “数组保存检测到的物体的X-Y坐计算机视觉的应用标值,”masks “数组保存掩码值。

第15行:定义我们的模型所检测到的物体的数量。默认情况下,该模型检测到100个物体。

vii)取出物体智能输出

16 for i in range(no_of_objects):
17   box = boxes[0, 0, i]
18   class_id = box[1]
19   score = box[2]
20   if score < 0.5:
21       continue

Boxes “是一个3-D数组,包含检测到的计算机视觉就业物体的信息。你可以用box[0,0,i-1]访问第i个对象。它返回7个元素。例子。

[0. 0. 0.99492836 0.92008555 0.27316627 0.98529506 0.53607523]

最后4个元可视化素是物体的(x, y, width, height)坐标。第一个元素定义了检测到的物体是否属于模可视化是什么意思型训练的类别。接下来,第二个是检测到的物体的类别变量的定义,第三个python123平台登录是信心值。

第16行:初始计算机视觉技术的应用化 “for “循环,该循环将运行到所有检测到的物体被循可视化管理环通过(循环运行python基础教程 “i “迭代,”i “是检测到的物体数量)。

第19-21行。我们访问第i个对象计算机视觉就业的信心值。如果置信度低于0.5(50%),我们就放弃该对象。

viii) 获取物体的坐标

22   x = int(box[3] * width)
23   y = int(box[4] * height)
24   x2 = int(box[5] * width)
25   y2 = int(box[6] * height)
26   cv2.rectangle(img, (x, y), (x2, y2), (255, 0, 0), 3)

正如我们前可视化数据图表面讨论的,最后4个元素是坐标x、y、x2和y2。这些坐标需要乘以原始图像的宽度和高度。因为这些坐标是根据图像的长宽比返回给我们的。

第26行。使用像素涂色上面几行(第22-25行)计算机视觉属于人工智能吗中获像素勇士大创造攻略取的坐标,在图像中检测到的物体变量的定义周围放一个边变量泵界框。

现在图像看起来像这样。

教程—在OpenCV Python中使用Mask-RCNN进行实例分割

检测到的物体图像

九)建立我们的面具

27   roi = black_image[y: y2, x: x2]
28   roi_height, roi_width, _ = roi.shape
29   mask = masks[i, int(class_id)]
30   mask = cv2.resize(mask, (roi_width, roi_height))
31   _, mask = cv2.threshold(mask, 0.5, 255, cv2.THRESH_BINARY)

第27-28行。定义一个变量’roi’可视化图表,它是空白图像的一个子区域,对应于真实图像中的物体。接下来,获取’roi’的高度和宽度。

第29行。创建一个’mask’变量,保存可视化大屏mask-rcnn返回给我们的(当前对象的)mask(使用’i’和class_id变量来访问当前对象的mask)。

第30行可视化。mask “变量是一个1515的数组(缩小了尺像素工厂寸以支持任何长宽比),因此它需要被调整为我们的’roi’变量的形状(因为可视化管理它的位置与我们的对象在真实图像中的位置相对应)。

第31行。使用’cv2.threshold’函数将ROI转换为一个掩码,其中所有数值低于0.5的像可视化编程素被转换为’0’,高于可视化数据图表0.5的为’1’。这就创建了一个python编程二进制蒙版,准备填充(用对应于类ID的颜色)。

该掩码看起来像这Python样。

教程—在OpenCV Python中使用Mask-RCNN进行实例分割

掩码

x) 寻找轮廓并绘制轮廓

32   contours, _ = cv2.findContours(np.array(mask, np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
33   color = colors[int(class_id)]
34   for cnt in contours:
35       cv2.fillPoly(roi, [cnt], (int(color[0]), int(color[1]), int(color[2])))

为了使检测到的物体可视化并绘制遮罩,我们在遮罩上找到轮廓线,然后绘制它们。

第32行。使用’cv2.fi计算机视觉的研究方向ndContours’在上一节创建的二进制蒙版中找到阵列。

第33行。在颜色数组中获取与’class_id’(第18行计算机视觉是什么)对应的颜色

第34-35行。循环浏览检测到的轮廓线,并使用’cv2变量是什么意思.fillPoly’函数绘制它们

十一)结果的可视化

36 cv2.imshow("Final",np.hstack([img,black_image]))
37 cv2.waitKey(0)

使用numpy的’hstack’函数来显示原始图像和生成的掩变量名的命名规则码彼此相邻。

结果。

教程—在OpenCV Python中使用Mask-RCNN进行实例分割

xii)完整的代码Python

import cv2
import numpy as np
path_to_frozen_inference_graph = 'frozen_inference_graph_coco.pb'
path_coco_model= 'mask_rcnn_inception_v2_coco_2018_01_28.pbtxt'
image_path='road.jpg'
colors = np.random.randint(0, 255, (80, 3))
img = cv2.imread(image_path)
img=cv2.resize(img,(650,550))
black_image = np.zeros((height, width, 3), np.uint8)
black_image[:] = (150, 150, 0)
blob = cv2.dnn.blobFromImage(img, swapRB=True)
net.setInput(blob)
boxes, masks = net.forward(["detection_out_final", "detection_masks"])
detection_count = boxes.shape[2]
for i in range(detection_count):
     box = boxes[0, 0, i]
     class_id = box[1]
     score = box[2]
     if score < 0.5:
         continue
     x = int(box[3] * width)
     y = int(box[4] * height)
     x2 = int(box[5] * width)
     y2 = int(box[6] * height)
     roi = black_image[y: y2, x: x2]
     roi_height, roi_width, _ = roi.shape
     mask = masks[i, int(class_id)]
     mask = cv2.resize(mask, (roi_width, roi_height))
     _, mask = cv2.threshold(mask, 0.5, 255, cv2.THRESH_BINARY)
     cv2.rectangle(img, (x, y), (x2, y2), (255, 0, 0), 3)
     contours, _ = cv2.findContours(np.array(mask, np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
     color = colors[int(class_id)]
     for cnt in contours:
         cv2.fillPoly(roi, [cnt], (int(color[0]), int(color[1]), int(color[2])))
cv2.imshow("Final",np.hstack([img,black_image]))
cv2.waitKey(0)

在OpenCV Python中使用Mask-RCNN对视频进行实例分割

使用Python的Mask R-CNN OpenCV也可以很容易地用于视频帧的实例分割。这个方法与我们讨论的类似,我们只需要在一个循环中处理视频计算机视觉的应用的每一帧计算机视觉是什么

完整的代码

你可以看到下面的代码。

import cv2
import numpy as np
path_to_frozen_inference_graph = 'frozen_inference_graph_coco.pb'
path_coco_model= 'mask_rcnn_inception_v2_coco_2018_01_28.pbtxt'
VIDEO = 'race.mp4'
net = cv2.dnn.readNetFromTensorflow(path_to_frozen_inference_graph,path_coco_model)
colors = np.random.randint(0, 255, (80, 3))
video = cv2.VideoCapture(VIDEO)
while True:
    grabbed,frame=video.read()
    if not grabbed:
        break
    img=cv2.resize(frame,(650,550))
    height, width, _ = img.shape
    black_image = np.zeros((height, width, 3), np.uint8)
    black_image[:] = (150, 150, 0)
    blob = cv2.dnn.blobFromImage(img, swapRB=True)
    net.setInput(blob)
    boxes, masks = net.forward(["detection_out_final", "detection_masks"])
    detection_count = boxes.shape[2]
    for i in range(detection_count):
        box = boxes[0, 0, i]
        class_id = box[1]
        score = box[2]
        if score < 0.5:
            continue
        x = int(box[3] * width)
        y = int(box[4] * height)
        x2 = int(box[5] * width)
        y2 = int(box[6] * height)
        roi = black_image[y: y2, x: x2]
        roi_height, roi_width, _ = roi.shape
        mask = masks[i, int(class_id)]
        mask = cv2.resize(mask, (roi_width, roi_height))
        _, mask = cv2.threshold(mask, 0.5, 255, cv2.THRESH_BINARY)
        cv2.rectangle(img, (x, y), (x2, y2), (255, 0, 0), 3)
        contours, _ = cv2.findContours(np.array(mask, np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        color = colors[int(class_id)]
        for cnt in contours:
            cv2.fillPoly(roi, [cnt], (int(color[0]), int(color[1]), int(color[2])))
    cv2.imshow("Black image", black_image)
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
             break
video.release()
cv2.destroyAllWindows()

总结

希望你喜欢我们在OpenCV Python中使用Mask-RCNN进行实例分割的教程。你可以在下面的链接中找到源代码

  • 图像分割文件
  • 视频分割文件

The postInstance Segmentation Using Mask-RCNN in OpenCV计算机视觉好找工作吗 Pythonappeared first onMLK – Machine Learning Knowle像素冒险世界dge.