使用传统图像处理获取单目标mask的bbox

Mask原图

该图像存在噪声,白色背景为255,灰色为128,黑色部分为0

mask原图

实现效果

去燥 + bbox

最终效果

Code

依赖库

pip install scikit-image opencv-python numpy

核心代码

import numpy as np
import cv2
import PIL.Image as Image
from skimage import measure, morphology

# 载入原图
img = cv2.imread('0001.png')
cv2.imshow('origin', img)
cv2.waitKey(5000)
cv2.destroyAllWindows()
# 将非背景部分转为黑色,此时图像只剩下255和0两种数值
img[img != 255] = 0
# 将rgb图转灰度图
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 连接性检测,num为当前图像有多少个不连接目标
labels, num = measure.label(img, background=255, return_num=True, connectivity=2)
# 将数值调整为0和1,对应false和true
img[img == 0] = 1
img[img == 255] = 0
bool_area = np.array(img, bool)
# 移除小目标,最小目标尺寸为2 piexl
bool_area = morphology.remove_small_objects(bool_area, min_size=2)
# 获取为true的像素索引
area = np.array(np.where(bool_area == True))
# 根据x和y的最值画出bbox
ori = cv2.rectangle(cv2.imread('0001.png'), (np.min(area[1]), np.min(area[0])), (np.max(area[1]), np.max(area[0])), (255, 0, 0), 1, 4)
cv2.imshow('pred', ori)
cv2.waitKey(5000)
cv2.destroyAllWindows()

多目标思路

  1. 先用skimage.morphology.remove_small_objects函数去掉噪声(小目标)。
  2. 再使用连接性检测skimage.measure.label函数返回的ndarray进行统计,该函数返回的不同目标的像素会带有不同的编号。
### Mask R-CNN 网络架构详解 Mask R-CNN 是一种用于目标实例分割的强大框架,其设计基于 Faster R-CNN 并进行了改进。该网络不仅能够精确定位图像中的物体位置,还能为每个检测到的对象生成高精度的像素级掩码。 #### 主要组成部分 1. **骨干网络(Backbone Network)** 骨干网络通常采用预训练的卷积神经网络(CNN),如 ResNet 或者更深层次的变体 ResNeXt。这些网络负责提取输入图片的特征图[^3]。 2. **区域提议网络(Region Proposal Network, RPN)** 继承自 Faster R-CNN 的这一部分用来生成候选区域(RoIs)。它会扫描整个图像并提出可能包含感兴趣对象的位置和大小建议框[^1]。 3. **兴趣区对齐层(ROI Align Layer)** 这是对传统 ROI Pooling 层的重要改进之处。传统的 ROI Pooling 方法可能导致空间量化误差;而 ROI Align 使用双线性插值法来精确映射 RoI 到特征图上的浮点坐标,从而减少了这种误差的影响,提高了最终输出的质量。 4. **分类与回归头(Classification and Regression Head)** 对于每一个由 RPN 提出的兴趣区域,此头部执行两个任务:一是判断区域内是否存在特定类别的对象及其置信度得分;二是调整初始边界框参数以更好地匹配真实情况下的对象轮廓。 5. **掩码预测分支(Mask Prediction Branch)** 新增的关键组件之一就是这个专门针对每种类别创建二进制掩码的任务处理元。对于给定的一个 RoI 和类别标签,通过全卷积网络(Fully Convolutional Networks, FCNs)预测一个固定尺寸 \(m \times m\) 的二值化掩码矩阵,表示对应类别下前景像素的概率分布[^4]。 ```python import torch.nn as nn class MaskRCNN(nn.Module): def __init__(self, backbone, rpn, roi_heads, mask_head): super(MaskRCNN, self).__init__() self.backbone = backbone # Backbone network like ResNet or ResNeXt self.rpn = rpn # Region Proposal Network self.roi_align = ROIAAlign() # Improved from ROI Pooling to handle floating point coordinates better self.classifier = ClassifierHead() self.bbox_regressor = BBoxRegressorHead() self.mask_predictor = MaskPredictor(mask_size=28) def forward(self, images, targets=None): features = self.backbone(images) proposals = self.rpn(features) rois = select_proposals(proposals) aligned_features = self.roi_align(rois, features) class_logits, box_regression = self.classifier(aligned_features), \ self.bbox_regressor(aligned_features) masks = self.mask_predictor(aligned_features) return { "class": class_logits, "boxes": box_regression, "masks": masks } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex-Leung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值