带你利用mask R-CNN进行实例分割的目标检测

【实践】MaskRCNN——01.环境配置(基于Anaconda) 一.Anaconda安装 这里不再详述,详见:Ubuntu下安装Anaconda 二.查看环境要求 README; requirements 三.Anaconda下创建MaskRCNN环境 1.创建名为MaskRCNN,python版本为3.6的环境: conda create -n MaskRCNN python=3.6 ... 阅读详情

今天,带大家了解一种目标检测,语义分割,什么是语义分割呢,这里我简单地说明一下,语义分割是目标检测,一般我们看到的目标检测用一个矩形的方框给围起来,而语义分割就是能在目标下将其轮廓给勾画起来,我们可以对比一下:

如下图,这张就是一般的目标检测。

如下图,这个就是语义分割,将一张图轮廓都标注好的:

那么我将手把手带你走进这个项目的实战中,我将以带大家安装环境,测试图片,标注训练集以及训练代码为目的,在之后我会不断地更新这篇博客,最终我希望能带大家做一个能实时的语义分割的图像检测。那么现在我们就开始吧:

注意:该篇博客暂时没有更新训练与实时检测的部分,不过博主后期一定会研究出来此篇代码,然后和大家一起分享成果。

这个项目的源码在GitHub上,大家可以前往下载

论文地址:https://arxiv.org/abs/1703.06870

源码地址: GitHub - matterport/Mask_RCNN: Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow


1.环境安装


首先就是环境,大家需要去下载anaconda的安装包,如果你安装过了那么请跳过这段,如果没有安装的具体安装方法见我的上篇博客:使用Google object_detection API与opencv实现简单的动态目标实时检测-优快云博客

这个项目基于tensorflow和keras,还有pycocotools等主要包,建议是安装tensorflow-gpu版本,当然CPU也是可以的,只是训练部分时可能会很卡。tensorflow的安装方式这里我不再做介绍,下面是如何安装keras,我们用pip命令:

pip install keras

等待安装完成后,我们还需要对一个叫做pycocotools的包进行安装,如果是windows环境则无法直接pip install pycocotools,因为这个包本来就不支持Windows的,我们采取在命令行输入以下命令的方式在Windows上安装:

 pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

这时候基本的环境应该已经安装完成,如果显示还有包没有安装请使用pip命令安装。


2.代码测试


我们下载好这个项目的源码后(源码地址是GitHub - matterport/Mask_RCNN: Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow),我们打开这个文件夹,进入samples,会发现一个叫demo.ipynb的文件,我们在cmd里定位到这个文件的位置,然后输入:

jupyter notebook

我们就进入到了这个页面,就可以开始代码测试环境了。

我们先看第一段代码:_

这里看红字部分,mask_rcnn_coco.h5,这个是训练保存的文件,比如我们在tensorflow的api里是.pb文件。

这个文件会自动下载,但是很慢,而且可能不成功,因此我直接把这个文件上传到百度网盘里,大家从网盘下载。链接永久有效。

网盘链接:mask_rcnn_coco.h5_免费高速下载|百度网盘-分享无限制

下载好后我们放在文件夹的根目录,就是和samples文件夹一个目录。

接着,我们开始测试吧,现在可以直接跑到尾,然后看输出的图片,最后一段是随机读取图片的,但是大家可以改变变量image,让他读固定的图片

这个是随机的图片。

如果大家想读取固定的图片,把最后一段代码修改,比如我下载了一张图片,我命名为test.jpg放在images文件夹下,然后我只需要把image变量后面代码修改,如果大家想读取固定图片直接重属名,放在images文件夹下,然后把我下面写的代码的test.jpg改成相应的名字就行了,代码如下:

# Load a random image from the images folder
file_names = next(os.walk(IMAGE_DIR))[2]
image = skimage.io.imread(os.path.join(IMAGE_DIR,'test.jpg'))

# Run detection
results = model.detect([image], verbose=1)

# Visualize results
r = results[0]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], 
                            class_names, r['scores'])

测试图片:

那么测试到这里就结束了,接下来带大家标注训练集并转换格式。


3.训练集的制作


接下来我将带大家一起标注训练集,首先我们需要一个标注工具,这个工具有很多,这里我用Labelme这个标注工具带大家来标注。首先我们用命令行安装这个工具:

pip install labelme

接着,我们启动它,启动很简单,直接在命令行输入labelme即可:

lableme

我们把收集好的图片放在一个文件夹里,然后打开软件界面后,我们点击Open Dir,打开你放置图片的目录即可。

标注的话我们点击这里:

然后就一个点一个点标注,把你想标注的物体轮廓标注出来,最后连在一起,然后给它做好标签,那么我们就保存完成。得到的文件是.json文件,我们需要对其转化:

我们打开你的anconda的目录,在Lib\site-packages\labelme\cli\json_to_dataset.py这个文件,如果找不到不要紧,直接给出这个文件的代码:

import argparse
import base64
import json
import os
import os.path as osp
import warnings

import PIL.Image
import yaml

from labelme import utils


def main():
    warnings.warn("This script is aimed to demonstrate how to convert the\n"
                  "JSON file to a single image dataset, and not to handle\n"
                  "multiple JSON files to generate a real-use dataset.")

    parser = argparse.ArgumentParser()
    parser.add_argument('json_file')
    parser.add_argument('-o', '--out', default=None)
    args = parser.parse_args()

    json_file = args.json_file

    if args.out is None:
        out_dir = osp.basename(json_file).replace('.', '_')
        out_dir = osp.join(osp.dirname(json_file), out_dir)
    else:
        out_dir = args.out
    if not osp.exists(out_dir):
        os.mkdir(out_dir)

    data = json.load(open(json_file))

    if data['imageData']:
        imageData = data['imageData']
    else:
        imagePath = os.path.join(os.path.dirname(json_file), data['imagePath'])
        with open(imagePath, 'rb') as f:
            imageData = f.read()
            imageData = base64.b64encode(imageData).decode('utf-8')
    img = utils.img_b64_to_arr(imageData)

    label_name_to_value = {'_background_': 0}
    for shape in sorted(data['shapes'], key=lambda x: x['label']):
        label_name = shape['label']
        if label_name in label_name_to_value:
            label_value = label_name_to_value[label_name]
        else:
            label_value = len(label_name_to_value)
            label_name_to_value[label_name] = label_value
    lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)

    label_names = [None] * (max(label_name_to_value.values()) + 1)
    for name, value in label_name_to_value.items():
        label_names[value] = name
    lbl_viz = utils.draw_label(lbl, img, label_names)

    PIL.Image.fromarray(img).save(osp.join(out_dir, 'img.png'))
    utils.lblsave(osp.join(out_dir, 'label.png'), lbl)
    PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, 'label_viz.png'))

    with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
        for lbl_name in label_names:
            f.write(lbl_name + '\n')

    warnings.warn('info.yaml is being replaced by label_names.txt')
    info = dict(label_names=label_names)
    with open(osp.join(out_dir, 'info.yaml'), 'w') as f:
        yaml.safe_dump(info, f, default_flow_style=False)

    print('Saved to: %s' % out_dir)


if __name__ == '__main__':
    main()

使用方法是在命令行中输入如下:

python json_to_dataset.py -w path/to/your/json

这个路径一定是要精确到.json文件,但是大家会发现,我们有那么多的训练集,如果这么做,一个个转换会很不方便,个大家提供一个批处理的代码。

首先,在大家的图片文件夹里,图片和.josn文件如果是混在一起的,可以在这里创建一个记事本,把后缀名改成.bat然后编辑这个文件如下:

md json
copy *.json json

然后双击运行,你也可以在命令行cmd里输入以下命令,效果是一样的。首先创建一个叫json的文件夹,然后把这里面所以的.json文件复制到这个文件夹里。

然后给出下一个代码,处理全部的.json文件:

import argparse
import json
import os
import os.path as osp
import base64
import warnings
 
import PIL.Image
import yaml
 
from labelme import utils
 
import cv2
import numpy as np
from skimage import img_as_ubyte
 
# from sys import argv
 
def main():
    warnings.warn("This script is aimed to demonstrate how to convert the\n"
                  "JSON file to a single image dataset, and not to handle\n"
                  "multiple JSON files to generate a real-use dataset.")
 
    parser = argparse.ArgumentParser()
    parser.add_argument('json_file')
    parser.add_argument('-o', '--out', default=None)
    args = parser.parse_args()
 
    json_file = args.json_file
 
    #freedom
    list_path = os.listdir(json_file)
    print('freedom =', json_file)
    for i in range(0,len(list_path)):
        path = os.path.join(json_file,list_path[i])
        if os.path.isfile(path):
 
            data = json.load(open(path))
            img = utils.img_b64_to_arr(data['imageData'])
            lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])
 
            captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
 
            lbl_viz = utils.draw_label(lbl, img, captions)
            out_dir = osp.basename(path).replace('.', '_')
            save_file_name = out_dir
            out_dir = osp.join(osp.dirname(path), out_dir)
 
            if not osp.exists(json_file + '\\' + 'labelme_json'):
                os.mkdir(json_file + '\\' + 'labelme_json')
            labelme_json = json_file + '\\' + 'labelme_json'
 
            out_dir1 = labelme_json + '\\' + save_file_name
            if not osp.exists(out_dir1):
                os.mkdir(out_dir1)
 
            PIL.Image.fromarray(img).save(out_dir1+'\\'+save_file_name+'_img.png')
            PIL.Image.fromarray(lbl).save(out_dir1+'\\'+save_file_name+'_label.png')
                
            PIL.Image.fromarray(lbl_viz).save(out_dir1+'\\'+save_file_name+
            '_label_viz.png')
 
            if not osp.exists(json_file + '\\' + 'mask_png'):
                os.mkdir(json_file + '\\' + 'mask_png')
            mask_save2png_path = json_file + '\\' + 'mask_png'
            ################################
            #mask_pic = cv2.imread(out_dir1+'\\'+save_file_name+'_label.png',)
            #print('pic1_deep:',mask_pic.dtype)
 
            mask_dst = img_as_ubyte(lbl)  #mask_pic
            print('pic2_deep:',mask_dst.dtype)
            cv2.imwrite(mask_save2png_path+'\\'+save_file_name+'_label.png',mask_dst)
            ##################################
 
            with open(osp.join(out_dir1, 'label_names.txt'), 'w') as f:
                for lbl_name in lbl_names:
                    f.write(lbl_name + '\n')
 
            warnings.warn('info.yaml is being replaced by label_names.txt')
            info = dict(label_names=lbl_names)
            with open(osp.join(out_dir1, 'info.yaml'), 'w') as f:
                yaml.safe_dump(info, f, default_flow_style=False)
 
            print('Saved to: %s' % out_dir1)
 
if __name__ == '__main__':
    #base64path = argv[1]
    main()

给这个代码命名,比如还是json_to_dataset,那么我们在cmd里这样运行:

python json_to_dataset.py path/to/your/json

路径直接输入.json文件所在的文件夹,然后就会一次处理完全部的.json文件的转化。我们需要的是yaml和一个.png作为其训练集的,那么我们现在的训练集制作就制作好了,下一步就是测试了。

Mask R-CNN讲解 Mask R-CNN最全讲解 阅读详情

相关推荐

Mask R-CNN

论文链接:https://arxiv.org/abs/1703.06870 一、简介 Mask R-CNN是He Kaiming大神2017年的力作,其在进行目标检测的同时进行实例分割,取得了出色的效果,其在没有任何trick的情况下,取得了COCO 2016比赛的冠军。其网络的设计也比较简单,在Faster R-CNN基础上,在原本的两个分支上(分类+坐标回归)增加了一个分支进行语义分割,如下图...

小菜鸟的AI之路 2万+

目标分割:Mask RCNN

日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 6.6 Mask RCNN 学习目标 目标 说明Mask RCNN的结构特点 掌握Mask RCNN的RoIAlign方法 掌握Mask RCNN的mask原理 了解Mask RCNN的主网络结构 了解Mask RCNN训练实...

あずにゃん梓喵的博客 1万+

Mask R-CNN完整翻译

最近因为在做毕业设计,需要翻译Mask R-CNN这篇文章,估记录于此。水平有限,若有建议,欢迎提出。 部分参考自:https://alvinzhu.xyz/2017/10/07/mask-r-cnn/#fn:18 正文: 摘要 我们提出了一个概念上简单、灵活以及通用的目标实例分割框架。我们的方法有效地检测图像中的目标,同时为每一个实例生成高质量的分割掩模。这种叫Mask ...

myGFZ的博客 1万+

mask rcnn实现教程

一,首先去github上下载mask-rcnn源码,这里提供一个百度网盘地址 链接:https://pan.baidu.com/s/1htJYyNy 密码:0r2b 含可运行DEMO更新链接:https://pan.baidu.com/s/1HBPtIPz0xpZsCprl7rc6hw密码:bvm5 二,下载对应的mask_rcnn_coco.h5模型,这里给出百度网盘下载地址 链接:h......

wjd1994的博客 3万+

Mask R-CNN(RoIAlign)论文阅读笔记

文章目录Mask R-CNN论文阅读笔记2017Abstract1. Introduction2. Related Work3. Mask R-CNN3.1 Implementation Details4. Experiments: Instance Segmentation4.1 Main Results4.2 Ablation Experiments4.3 Bounding Box Detection Results4.4 Timing5. Mask R-CNN for Human Pose Est

weixin_43422466的博客 1602

Mask R-CNN小结

Mask R-CNN 小结 连盛 2017.3.26 IMT Lab in XMU Author:Kaiming He, Georgia Gkioxari, Piotr Dollar, Ross Girshick From Facebook AI Research (FAIR) 2017.3 published & reviewed Introduct

lancerlian的专栏 1万+

睿智的目标检测19——Keras搭建Mask R-CNN实例分割平台

睿智的目标检测19——Keras搭建Mask R-CNN实例分割平台学习前言什么是Mask R-CNN源码下载Mask R-CNN实现思路一、预测部分1、主干网络介绍2、特征金字塔FPN的构建3、获得Proposal建议框4、Proposal建议框的解码5、对Proposal建议框加以利用(Roi Align)6、预测框的解码7、mask语义分割信息的获取二、训练部分1、建议框网络的训练2、Roi...

Bubbliiiing的学习小课堂 5万+

mask_rcnn_coco.h5

使用mask-rcnn进行人体实例分割和关键点检测的官方模型mask_rcnn_coco.h5,为了提高下载速度,因此在csdn上进行了上传,有需要的可以进行下载

Mask RCNN笔记

mask rcnn简介mask rcnn是何凯明基于以往的faster rcnn架构提出的新的卷积网络,一举完成了object instance segmentation. 该方法在有效地目标的同时完成了高质量的语义分割。 文章的主要思路就是把原有的Faster-RCNN进行扩展,添加一个分支使用现有的检测对目标进行并行预测。同时,这个网络结构比较容易实现和训练,速度5fps也算比较快点,可以很方便

生如蚁,美如神 6万+

使用PackStack工具自动化部署OpenStack

搭建 OpenStack 环境,每个组件的安装和配置都需要熟悉其特定的依赖关系、参数设置等,对于初学者来说容易出错。PackStack 工具通过集成一系列脚本和配置文件,便于快速搭建OpenStack练习环境。CPU:支持 Intel VT - x 或 AMD - V 硬件虚拟化技术,并且要在 BIOS 里开启此功能。内存:16GB以上存储:200GB以上可用空间(2)VMware WorkStation16.0以上版本(3)远程连接工具(如Xshell、MobaXterm)

2301_80440447的博客 4093

2025年12月11日 Coherent收发器下沉到数据中心:调研

技术可行性已基本具备。随着3nm DSP技术的成熟和Coherent-Lite等低功耗方案的推出,Coherent技术与IMDD的功耗差距在800G及以上速率节点快速缩小。特别是在1.6T及更高速率,两种技术的功耗开始趋于收敛。同时,通过系统级优化,如将DSP功能从可插拔模块转移到ASIC芯片,可实现30%以上的功耗降低。在成本方面,硅光技术的进步使得单通道硅光引擎BOM成本降至18美元,较2020年下降62%,逼近InP方案的经济临界点。光学系统机会丰富多样。

weixin_51184047的博客 1167

Mask R-CNN是在Faster RCNN检测到的预测框的基础上,把每个预测框内的目标进行语义分割,这样结果既有目标框,又有每个实例的语义分割结果,因此得到的就是实例分割。

Mask R-CNN 确实是在 Faster R-CNN 的基础上进行了扩展,通过在每个检测到的目标区域(RoI)上增加一个语义分割分支,从而实现了实例分割。问题描述:Mask R-CNN是在Faster RCNN检测到的预测框的基础上,把每个预测框内的目标进行语义分割,这样结果既有目标框,又有每个实例的语义分割结果,因此得到的就是实例分割。Mask R-CNN 使用了特征金字塔网络,它在底层网络(例如 ResNet)的基础上构建了一个多尺度的特征金字塔,以提供更丰富的特征表示,有助于处理不同大小的目标。

weixin_43501408的博客 782

物料主数据管理难在哪?基于AI算法的数据清洗工具了解一下

企企通打造的一套以AI模型和算法为核心的产品及服务,可针对各类企业的不同主数据痛点难点,提供多种解决方案,能够快速完成物料主数据清洗、识别、匹配、梳理,满足一物一码、分类梳理、一品多商、多维度比价、精准寻源选品、建立标准物料库、供应商及客户主数据清洗等业务场景需求。随着AI技术的快速发展,智能算法在数据清洗领域的应用越来越广泛,越来越多的数据清洗工作已经开始交由智能算法完成,通过自动化的方式处理大量数据,识别和纠正错误,填补缺失值,检测异常值,以及执行其他数据预处理任务,并提高效率并减少人为错误。

QQT_qqt的博客 1364

实例分割(一):Mask R-CNN论文阅读与代码实战

论文 https://arxiv.org/pdf/1703.06870.pdf 代码 <> 文章目录1. 原文阅读1.1 摘要1.2 简介1.2 相关工作1.3 Mask R-CNN3. 代码理解参考 1. 原文阅读 1.1 摘要 本文提出了一个简单、灵活以及通用的目标实例分割框架,能够有效地检测图像中的目标,同时为每一个实例生成高质量的分割掩模。 Mask R-CNN在Faster R-CNN边框识别分支基础上添加了一个并行的、用于预测目标掩模的分支。 Mask R-CN...

Nick Blog 993

如何使用JMeter进行大模型的压力测试?

使用JMeter进行大模型的压力测试,核心是通过模拟高并发请求,测试大模型在极限负载下的性能表现(如响应时间、吞吐量、错误率、资源瓶颈等)。通过以上步骤,可系统性评估大模型在高压下的性能极限,为优化模型(如量化、蒸馏)、扩容硬件(增加GPU)或调整接口限流策略提供数据依据。)、请求方式(POST)、认证方式(API Key放在Header)、请求参数(作用:避免瞬间高压压垮系统,更精准找到瓶颈点。等)、响应格式(同步/流式)。需获取:API地址(如。通过CSV文件引入不同。

alankuo的专栏 787

别再死记硬背了!用LabVIEW串口通信的3个真实项目案例,手把手教你从调试到部署

本文通过3个真实项目案例,详细讲解LabVIEW串口通信从调试到部署的全过程。涵盖Arduino温湿度监控、西门子PLC Modbus通信以及高可靠性通信框架设计,提供实用技巧和常见问题解决方案,帮助工程师快速掌握LabVIEW串口通信的实战应用。

weixin_30485379的博客 522

MMDetection学习系列(5)——Mask R-CNN深度探索与实战指南

与传统的目标检测不同,Mask R-CNN在最后的全连接层之后增加了一个额外的卷积层,用来为每个检测到的物体生成一个像素级的掩码。与传统的目标检测任务不同,目标检测只需要框定物体的位置并分类,而实例分割要求对图像中每个物体的轮廓进行精准的分割,即每个物体的像素都要被标识出来,甚至可以区分出同一类物体的不同实例。为了更好地理解Mask R-CNN网络架构,最好从R-CNN来理解,Mask R-CNN 的架构与Faster R-CNN非常接近,可以通过以下的简单介绍以及架构图详细了解一下它们之间的关联性。

Coovally_AI的博客 1375

新版MQL语言程序设计:用vscode编写编译调试mt4和mt5程序

使用VScode搭建MT4与MT5开发环境,实现编辑编译调试统一。

超哥量化的博客 6871

Mask R-CNN论文综述

Mask R-CNN论文综述 摘要:提出了一个简单、灵活、通用的目标实例分割框架Mask R-CNN。这个框架可同时做目标检测、实例分割。实例分割的实现就是在faster r-cnn的基础上加了一个可以预测目标掩膜(mask)的分支。只比Faster r-cnn慢一点,5fps。很容易拓展到其他任务如:关键点检测。18年在coco的目标检测、实例分割、人体关键点检测都取得了最优成绩。 1、 引言 ...

qq_42575422的博客 2515

23、电器元件符号及封装大全(2025版本)

总计28类电器元件符号和封装。

XU157303764的博客 2648

大厂面经:京东大数据面试题及参考答案(3万字长文)

Kafka是一个开源的分布式流处理平台,由 LinkedIn 开发并在 2011 年贡献给 Apache 软件基金会。高吞吐量:能够处理大量的数据流,适合实时数据管道。持久性:数据存储在磁盘上,确保数据不丢失。容错性:通过数据复制提供高可用性。扩展性:支持水平扩展,易于增加更多节点。Kafka 的核心概念Topic:逻辑上的数据流,可以理解为主题。Producer:生产数据的应用程序。Consumer:消费数据的应用程序。Broker:Kafka 集群中的服务器节点。Partition。

大模型大数据攻城狮的专栏 862

Mask R-CNN阅读总结

Mask R-CNN论文阅读笔记 物体检测,语义分割,实例分割三者之间的区别 物体检测(object detection)的目标是确定每个物体的类别,并用bounding box标记出每个物体的位置。 语义分割(semantic segmentation)的目标是像素级别的确定每个物体的分类及位置,但不区分同一类别的不同个体。 实例分割(instance segmentation)的目标是在语义分...

weixin_44285710的博客 448

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

实例分割模型Mask R-CNN详解:从R-CNN,Fast R-CNN,Faster R-CNN再到Mask R-CNN

Mask R-CNN是ICCV 2017的best paper,彰显了机器学习计算机视觉领域在2017年的最新成果。在机器学习2017年的最新发展中,单任务的网络结构已经逐渐不再引人瞩目,取而代之的是集成,复杂,一石多鸟的多任务网络模型。Mask R-CNN就是典型的代表。本篇大作的一作是何凯明,在该篇论文发表的时候,何凯明已经去了FaceBook。我们先来看一下,Mask R-CNN取得了何等的成果。 在实例分割Mask R-CNN框架中,还是主要完成了三件事情: 目标检测,直接在结果图上绘制了目标框

理想三旬 814

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 使用Google object_detection API与opencv实现简单的动态目标实时检测
下一篇: Cyclegan生成式对抗网络,使用tensorflow快速实战
CExploer
博客等级 码龄8年 147粉丝 24原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值