Windows搭建MaskRCNN环境

news2025/1/9 15:41:44

环境:python3.6

1. 在miniconda上创建虚拟环境

miniconda下载地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda

# 创建环境
conda create -n maskrcnn python=3.6
# 激活 maskrcnn 环境,后续操作都在这个环境下进行
conda activate maskrcnn 

2. 升级pip

python -m ensurepip
python -m pip install --upgrade pip

3. 下载Mask_RCNN代码

对于MaskRCNN2.1版本直接下载并将权重文件mask_rcnn_coco.h5放在代码的根目录下即可,对于2.0版本需要在powershell中找到文件根目录输入下面命令进行安装,区别在于有没有setup.py文件

源码地址:https://github.com/matterport/Mask_RCNN/releases
进入项目根目录:

python setup.py install

在这里插入图片描述
mask_rcnn_coco.h5模型放在项目根目录下
在这里插入图片描述

4. 安装插件库

在maskRCNN2.0里面有一个requirements.txt文件,可以直接按照这个安装

pip install -r requirements.txt # 大概率会失败

若安装报错,按照如下版本手动安装

pip install numpy==1.17.0
pip install scipy==1.2.1
pip install Pillow==8.4.0
pip install cython==0.29.28
pip install matplotlib==3.3.4
pip install scikit-image==0.17.2
pip install keras==2.1.6
pip install opencv-python==4.3.0.38
pip install h5py==2.10.0
pip install imgaug==0.4.0
pip install ipython==7.16.3

5. 安装pycocotools

# windows环境
pip install pycocotools-windows

6. 测试COCO数据集

在根目录下创建mode_coco.py

'''
Author: qingqingdan 1306047688@qq.com
Date: 2024-11-22 17:48:33
LastEditTime: 2024-11-29 15:32:37
Description: 用coco模型去预测图片
'''
import os
import sys
import cv2
import numpy as np
import matplotlib.pyplot as plt
import colorsys
from skimage.measure import find_contours

from PIL import Image

# 将 Mask R-CNN 模块路径添加到系统路径
ROOT_DIR = os.path.abspath("./")  # 替换为 Mask R-CNN 文件夹路径
sys.path.append(ROOT_DIR)

from mrcnn.config import Config
from mrcnn import model as modellib
from mrcnn import visualize
from mrcnn.model import log

# 加载 COCO 类别信息
from mrcnn.config import Config
from mrcnn.utils import Dataset

# COCO 类别
COCO_CLASS_NAMES = [
    'BG', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
    'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign',
    'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
    'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag',
    'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite',
    'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket',
    'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana',
    'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
    'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table',
    'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
    'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock',
    'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush'
]

# 设置模型路径
MODEL_PATH = "mask_rcnn_coco.h5"  # 替换为实际模型路径

INPUT_DIR = "./images/"   # 输入图片目录
OUTPUT_DIR = "./output_results/"  # 输出结果目录
os.makedirs(OUTPUT_DIR, exist_ok=True)



def apply_mask(image, mask, color, alpha=0.5):
    """
    打上mask图标
    """
    for c in range(3):
        image[:, :, c] = np.where(mask == 1,
                                  image[:, :, c] *
                                  (1 - alpha) + alpha * color[c] * 255,
                                  image[:, :, c])
    return image



def random_colors(N, bright=True):
    """
    生成随机颜色
    """
    brightness = 1.0 if bright else 0.7
    hsv = [(i / N, 1, brightness) for i in range(N)]
    colors = list(map(lambda c: colorsys.hsv_to_rgb(*c), hsv))
    return colors


# 绘制结果
def display_instances(image, boxes, masks, class_ids, class_names, scores=None, 
                      filename="", title="",
                      figsize=(16, 16),
                      show_mask=True, show_bbox=True,
                      colors=None, captions=None):
    # instance的数量
    N = boxes.shape[0]
    if not N:
        print("\n*** No instances to display *** \n")
    else:
        assert boxes.shape[0] == masks.shape[-1] == class_ids.shape[0]
    colors = colors or random_colors(N)
 
    # 当masked_image为原图时是在原图上绘制
    # 如果不想在原图上绘制,可以把masked_image设置成等大小的全0矩阵
    masked_image = np.array(image, np.uint8)
    for i in range(N):
        color = colors[i]
 
        # 该部分用于显示bbox
        if not np.any(boxes[i]):
            continue
        y1, x1, y2, x2 = boxes[i]

        # 绘制方形边界框
        if show_bbox:
            # 打印边界框坐标
            # print(f"Box {i + 1}: (x1, y1, x2, y2) = ({x1}, {y1}, {x2}, {y2})")
            cropped_image_rgb = image[y1:y2, x1:x2]
            image_bgr = cv2.cvtColor(cropped_image_rgb, cv2.COLOR_RGB2BGR)
            
            # cv2.rectangle(masked_image, (x1, y1), (x2, y2), (color[0] * 255, color[1] * 255, color[2] * 255), 2)
 
        # 该部分用于显示文字与置信度
        if not captions:
            class_id = class_ids[i]
            score = scores[i] if scores is not None else None
            label = class_names[class_id]
            caption = "{} {:.3f}".format(label, score) if score else label

            print("{} {:.3f}".format(label, score))
        else:
            caption = captions[i]
        
        # 绘制文字(类别、分数)
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(masked_image, caption, (x1, y1 + 8), font, 0.5, (255, 255, 255), 1)
 
        # 绘制语义分割(遮挡物体面积部分)
        mask = masks[:, :, i]
        if show_mask:
            masked_image = apply_mask(masked_image, mask, color)
 
        # 画出语义分割的范围
        padded_mask = np.zeros(
            (mask.shape[0] + 2, mask.shape[1] + 2), dtype=np.uint8)
        padded_mask[1:-1, 1:-1] = mask
        contours = find_contours(padded_mask, 0.5)

        # 绘制边缘轮廓
        for verts in contours:
            verts = np.fliplr(verts) - 1
            cv2.polylines(masked_image, [np.array([verts], np.int)], 1,
                          (color[0] * 255, color[1] * 255, color[2] * 255), 1)


    # 将绘制好的图片保存在制定文件夹中
    save_path = os.path.join(OUTPUT_DIR, filename)
    cv2.imwrite(save_path, masked_image)

    img = Image.fromarray(np.uint8(masked_image))
    return img




class InferenceConfig(Config):
    NAME = "coco"
    NUM_CLASSES = 1 + 80  # COCO 数据集的 80 个类别
    GPU_COUNT = 1
    IMAGES_PER_GPU = 1

# 加载配置
config = InferenceConfig()
config.display()

# 加载模型
model = modellib.MaskRCNN(mode="inference", config=config, model_dir=ROOT_DIR)
# 加载权重
model.load_weights(MODEL_PATH, by_name=True)






########################## 单图片预测 ##########################
# # 加载图像预测
# # 加载图片
# image_path = "./images/1045023827_4ec3e8ba5c_z.jpg"  # 替换为图片路径
# image = cv2.imread(image_path)
# image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# # 预测
# results = model.detect([image], verbose=1)
# r = results[0]

# # 可视化结果
# visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'],
#                             COCO_CLASS_NAMES, r['scores'])


# # 提取信息
# rois = r['rois']           # 边界框
# class_ids = r['class_ids'] # 类别 ID
# scores = r['scores']       # 置信分数
# masks = r['masks']         # 掩码

# # 打印结果
# for i, box in enumerate(rois):
#     y1, x1, y2, x2 = box
#     class_id = class_ids[i]
#     score = scores[i]
#     label = COCO_CLASS_NAMES[class_id]
#     print(f"Object {i+1}: {label} (Score: {score:.2f}), Box: {x1, y1, x2, y2}")



########################## 多张图片预测 ##########################

for img_name in os.listdir(INPUT_DIR):
    if img_name.endswith(".jpg") or img_name.endswith(".png"):
        img_path = os.path.join(INPUT_DIR, img_name)
        image = cv2.imread(img_path)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

        # 预测
        results = model.detect([image], verbose=0)
        r = results[0]

        print('FileNmame: ', img_name)

        # 可视化并保存结果
        output_path = os.path.join(OUTPUT_DIR, img_name)
        display_instances(image, r['rois'], r['masks'], r['class_ids'],
                                    COCO_CLASS_NAMES, r['scores'], img_name )

执行脚本

python mode_coco.py

在这里插入图片描述
预测结果保存在output_results中
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2250479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM PPT Translator

LLM PPT Translator 引言Github 地址UI PreviewTranslated Result Samples 引言 周末开发了1个PowerPoint文档翻译工具,上传PowerPoint文档,指定想翻译的目标语言,通过LLM的能力将文档翻译成目标语言的文档。 Github 地址 https://github.…

新质驱动·科东软件受邀出席2024智能网联+低空经济暨第二届湾区汽车T9+N闭门会议

为推进广东省加快发展新质生产力,贯彻落实“百县千镇万村高质量发展工程”,推动韶关市新丰县智能网联新能源汽车、低空经济与数字技术的创新与发展,充分发挥湾区汽车产业链头部企业的带动作用。韶关市指导、珠三角湾区智能网联新能源汽车产业…

Zookeeper选举算法与提案处理概览

共识算法(Consensus Algorithm) 共识算法即在分布式系统中节点达成共识的算法,提高系统在分布式环境下的容错性。 依据系统对故障组件的容错能力可分为: 崩溃容错协议(Crash Fault Tolerant, CFT) : 无恶意行为,如进程崩溃,只要…

实例讲解MATLAB绘图坐标轴标签旋转

在进行绘图时需要在图片上添加上做标轴的标签,但是当数据量比较多时,例如一天24小时的数据,这时把每个小时显示在左边轴的标签上,文字内容放不下,因此需要将坐标轴标签旋转一定的角度,这样可以更好在图形上…

flutter项目AndroidiOS自动打包脚本

从业数年余,开发出身,经数载努力位项目经理,因环境欠佳,终失业.失业达七月有余,几经周转,现又从开发,既回原点亦从始.并非与诸位抢食,仅为糊口,望海涵!因从头开始,所经之处皆为新奇,遂处处留痕以备日后之需. 自动打包脚本原文地址:https://zhuanlan.zhihu.com/p/481472311 转…

免费实用在线AI工具集合 - 加菲工具

免费在线工具-加菲工具 https://orcc.online/ sql格式化 https://orcc.online/tools/sql 时间戳转换 https://orcc.online/tools/timestamp Base64 编码解码 https://orcc.online/tools/base64 URL 编码解码 https://orcc.online/tools/url Hash(MD5/SHA1/SHA256…) 计算 h…

Scala学习记录,统计成绩

统计成绩练习 1.计算每个同学的总分和平均分 2.统计每个科目的平均分 3.列出总分前三名和单科前三名,并保存结果到文件中 解题思路如下: 1.读入txt文件,按行读入 2.处理数据 (1)计算每个同学的总分平均分 import s…

第六届机器人、智能控制与人工智能国际(RICAI 2024)

会议信息 会议时间与地点:2024年12月6-8日,中国南京 会议官网:www.ic-ricai.org (点击了解大会参会等详细内容) 会议简介 第六届机器人、智能控制与人工智能国际学术会议(RICAI 2024)将于20…

分布式协同 - 分布式锁一二事儿

文章目录 导图Pre概述概述1. 分布式互斥和临界资源的协调2. 分布式锁的基本原理3. 分布式锁的实现方式a. 基于数据库实现的分布式锁b. 基于Redis实现的分布式锁c. 基于Zookeeper实现的分布式锁 4. 高并发场景下的分布式锁优化a. 分段锁(Sharded Locks)b.…

Stripe测试

通过官方提供的Stripe-cli工具进行测试。 1. 下载Stripe-cli 下载链接:Release v1.17.1 stripe/stripe-cli GitHub 2. 获取密钥 进入到stripe控制台测试模式 查看API密钥 3. 测试 指定您的API 私钥 stripe login --api-key sk_test_51ISwaXTwNwO1Rvw32DNG10…

Laravel8.5+微信小程序实现京东商城秒杀方案

一、商品秒杀涉及的知识点 鉴权策略封装掊口访问频次限制小程序设计页面防抖接口调用订单创建事务使用超卖防御 二、订单库存系统方案(3种) 下单减库存 优点是库存和订单的强一致性,商品不会卖超,但是可能导致恶意下单&#xff…

基于单片机设计了居家智能音箱系统(论文+源码)

1系统方案设计 通过需求分析本课题基于单片机的居家智能音箱系统的系统架构如图2.1所示。整个系统采用STM32F103作为控制器,结合LU-ASR01语音识别模块、ESP8266 wifi通信模块、OLED液晶、按键、音乐播放模块、LED灯等构成整个系统。用户可以通过按键、手机APP、语音…

Rook入门:打造云原生Ceph存储的全面学习路径(下)

文章目录 六.Rook部署云原生CephFS文件系统6.1 部署cephfs storageclass6.2 创建容器所需cephfs文件系统6.3创建容器pod使用rook-cephfs提供pvc6.4 查看pod是否使用rook-cephfs 七.Ceph Dashboard界面7.1 启用dashboard开关7.2 ceph-dashboard配置外部访问7.3 Dashboard web ad…

【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数

1. UDF函数(用户自定义函数) 一般指的是用户自己定义的单行函数。一进一出,函数接受的是一行中的一个或者多个字段值,返回一个值。比如MySQL中的,日期相关的dateDiff函数,字符串相关的substring函数。 先…

vue3 点击按钮,增加和减少input框

需求&#xff1a;手机号的input框默认一个&#xff0c;点击加号&#xff0c;可以增加和减少。 <template><el-form :model"editUserForm" label-width"80px" hide-required-asterisk ref"editUserFormRef"><!-- 手机 --><…

TongRDS分布式内存数据缓存中间件

命令 优势 支持高达10亿级的数据缓冲&#xff0c;内存优化管理&#xff0c;避免GC性能劣化。 高并发系统设计&#xff0c;可充分利用多CPU资源实现并行处理。 数据采用key-value多索引方式存储&#xff0c;字段类型和长度可配置。 支持多台服务并行运行&#xff0c;服务之间可互…

CSP/信奥赛C++语法基础刷题训练(33):洛谷P1055:[NOIP2008 普及组] ISBN 号码

CSP/信奥赛C语法基础刷题训练&#xff08;33&#xff09;&#xff1a;洛谷P1055&#xff1a;[NOIP2008 普及组] ISBN 号码 题目描述 每一本正式出版的图书都有一个 ISBN 号码与之对应&#xff0c;ISBN 码包括 9 9 9 位数字、 1 1 1 位识别码和 3 3 3 位分隔符&#xff0c;其…

算法盒子模型转换步骤+操作命令记录

0、模型转换步骤情 第一步、pt模型转onnx 1) 将要转换的pt模型文件上传到192.168.33.79的 /home/sophonsdk_edge_v1.7_official_release/下 2) 进入docker环境&#xff1a; docker exec -it myname /bin/bash 3) 在workspace目录运行: python3 /usr/local/lib/python3…

重复请求取消(不发请求)

重复请求取消&#xff08;不发请求&#xff09; axios 有自带的取消请求方式&#xff0c; 但是 在请求已发出时&#xff0c;取消只是状态取消&#xff0c; 其实请求已经发出&#xff0c;消耗了服务器资源&#xff08;方式1&#xff09;。本文探究的是 在调用请求A时&#xff0c…

谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的

最近不知怎么的&#xff0c;Chrome突然间打开百度很慢&#xff0c;甚至打不开。不光我一个人遇到这问题&#xff0c;我同事也遇到这个问题。开发中难免遇到问题&#xff0c;需要百度&#xff0c;现在是百度不了。 作为一名开发人员&#xff0c;习惯了使用Chrome进行开发&#…