7 MMSegmentation 代码教学

news2024/9/28 11:24:58

本文是openmmlab AI实战营的第七次课程的笔记,以下是我比较关注的部分。

本次课程的主要内容是 mmsegmentation的代码教学实战,我会稍微详细记载。

环境安装

云在线平台 :Featurize

推荐代码运行环境:GPU RTX3060 ,CUDA 11.2

安装pytorch

!pip3 install install torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio==0.10.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html

用mim 安装mmcv

pip install -U openmim
mim install  mmengine
mim install 'mmcv==2.0.0rc3'

安装其它工具包

!pip install opencv-python pillow matplotlib seaborn tqdm 'mmdet>=3.0.0rc1' -i https://pypi.tuna.tsinghua.edu.cn/simple

下载 MMSegmentation

# 删掉原有的 mmtracking 文件夹(如有)
!rm -rf mmsegmentation
# 从 github 上下载最新的 mmsegmentation 源代码
!git clone https://github.com/open-mmlab/mmsegmentation.git -b dev-1.x

安装 MMSegmentation

!pip install -v -e .

下载预训练模型权重文件和视频素材

import os
# 创建 checkpoint 文件夹,用于存放预训练模型权重文件
os.mkdir('checkpoint')
# 创建 outputs 文件夹,用于存放预测结果
os.mkdir('outputs')
# 创建 data 文件夹,用于存放图片和视频素材
os.mkdir('data')

下载预训练模型权重

Model Zoo:https://github.com/open-mmlab/mmsegmentation/blob/master/docs/en/model_zoo.md

# 从 Model Zoo 获取 PSPNet 预训练模型,下载并保存在 checkpoint 文件夹中
!wget https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-296659

下载素材

如果报错Unable to establish SSL connection.,重新运行代码块即可。

# 伦敦街景图片
!wget https://zihao-openmmlab.obs.cn-east-3.myhuaweicloud.com/20220713-mmdetection/images/street_uk.jpeg -P data

# 上海驾车街景视频,视频来源:https://www.youtube.com/watch?v=ll8TgCZ0plk
!wget https://zihao-download.obs.cn-east-3.myhuaweicloud.com/detectron2/traffic.mp4 -P data

# 街拍视频,2022年3月30日
!wget https://zihao-openmmlab.obs.cn-east-3.myhuaweicloud.com/20220713-mmdetection/images/street_20220330_174028.mp4 -P data

检查安装成功

# 检查 Pytorch
import torch,torchvision
print('Pytorch 版本',torch.__version__)
print('CUDA 是否可用',torch.cuda.is_available())

Pytorch 版本 1.10.1+cu113

CUDA 是否可用 True

# 检查 mmcv
import mmcv from mmcv.opsimportget_compiling_cuda_version,get_compiler_version
print('MMCV版本',mmcv.__version__)
print('CUDA版本',get_compiling_cuda_version())
print('编译器版本',get_compiler_version())

MMCV版本 2.0.0rc3

CUDA版本 11.3

编译器版本 GCC 9.3

# 检查 mmsegmentation
import mmseg from mmseg.utilsimportregister_all_modules
from mmseg.apis import inference_model,init_model
print('mmsegmentation版本',mmseg.__version__)

mmsegmentation版本 1.0.0rc4

图像分割

import os 
os.chdir('mmsegmentation')

载入测试图像

from PIL import Image
# Image.open('data/street_uk.jpeg')

图像预测-命令行

PSPNet语义分割算法

!python demo/image_demo.py \data/street_uk.jpeg \
        configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py \
        https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth \
        --out-fileoutputs/B1_uk_pspnet.jpg \
        --devicecuda:0 \
        --opacity0.5
Image.open('outputs/B1_uk_pspnet.jpg')

视频分割

进入 mmsegmentation 主目录

import os
os.chdir('mmsegmentation')

视频预测-命令行

!python demo/video_demo.py \data/traffic.mp4 \
        configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py \
        https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth \
        --devicecuda:0 \
        --output-fileoutputs/B3_video.mp4 \
        --opacity0.5

在自己的数据集上训练语义分割模型

进入 mmsegmentation 主目录

import os
os.chdir('mmsegmentation')

导入工具包

import numpy as np
from PIL import Image

import os.path as osp
from tqdm import tqdm

import mmcv
import mmengine
import matplotlib.pyplot as plt
%matplotlib inline

数据集下载和预处理

Standord Background 数据集主页:http://dags.stanford.edu/projects/scenedataset.html

该数据集包含 715 张由 LabelMe, MSRC, PASCAL VOC 和 Geometric Context 四个开源数据集中挑选出来的图片。

主要为室外场景,图像尺寸为320x240。

共 8 个类别:

  • 天空 sky

  • 树 tree

  • 道路 road

  • 草 grass

  • 水 water

  • 建筑物 building

  • 山 mountain

  • 前景物体

  • 原版数据集下载及预处理(略)

# 数据集图片和标注路径
data_root = 'iccv09Data'
img_dir = 'images'
ann_dir = 'labels'

# 类别和对应的颜色
classes = ('sky', 'tree', 'road', 'grass', 'water', 'bldg', 'mntn', 'fg obj')
palette = [[128, 128, 128], [129, 127, 38], [120, 69, 125], [53, 125, 34], 
           [0, 11, 123], [118, 20, 12], [122, 81, 25], [241, 134, 51]]
  • 直接下载子豪兄预处理好的数据集

!wget https://zihao-openmmlab.obs.cn-east-3.myhuaweicloud.com/20230130-mmseg/dataset/iccv09Data.zip
# 解压
!unzip iccv09Data.zip >> /dev/null
# 删除压缩包
!rm -rf iccv09Data.zip

查看数据集中的图片

Image.open('iccv09Data/images/6000124.jpg')

查看 语义分割标注 Segmentation Map

Image.open('iccv09Data/labels/6000124.png')

In [12]:

import matplotlib.patches as mpatches
img = Image.open('iccv09Data/labels/6000124.png')
plt.figure(figsize=(8, 6))
im = plt.imshow(np.array(img.convert('RGB')))

# 图例小块
patches = [mpatches.Patch(color=np.array(palette[i])/255., label=classes[i]) for i in range(8)]
# 图例
plt.legend(handles=patches, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., fontsize='large')
plt.show()

修改数据集类

After downloading the data, we need to implement load_annotations function in the new dataset class StanfordBackgroundDataset.

from mmseg.registry import DATASETS
from mmseg.datasets import BaseSegDataset

@DATASETS.register_module()
class StanfordBackgroundDataset(BaseSegDataset):
  METAINFO = dict(classes = classes, palette = palette)
  def __init__(self, **kwargs):
    super().__init__(img_suffix='.jpg', seg_map_suffix='.png', **kwargs)

文档:https://github.com/open-mmlab/mmsegmentation/blob/master/docs/en/tutorials/customize_datasets.md#customize-datasets-by-reorganizing-data

修改config配置文件

# 下载 config 文件 和 预训练模型checkpoint权重文件
!mim download mmsegmentation --config pspnet_r50-d8_4xb2-40k_cityscapes-512x1024 --dest .

processing pspnet_r50-d8_4xb2-40k_cityscapes-512x1024...

# modify num classes of the model in decode/auxiliary head
cfg.model.decode_head.num_classes = 8
cfg.model.auxiliary_head.num_classes = 8
# 修改数据集的 type 和 root

查看完整config配置文件

print(cfg.pretty_text)

准备训练

from mmengine.runner import Runner
from mmseg.utils import register_all_modules

# register all modules in mmseg into the registries
# do not init the default scope here because it will be init in the runner
register_all_modules(init_default_scope=False)
runner = Runner.from_cfg(cfg)

开始训练

如果遇到报错CUDA out of memeory,重启实例或使用显存更高的实例即可。

runner.train()

使用训练得到的模型预测图像

from mmseg.apis import init_model,inference_model,show_result_pyplot
# 初始化模型
checkpoint_path='./work_dirs/tutorial/iter_800.pth'
model=init_model(cfg,checkpoint_path,'cuda:0')

Loads checkpoint by local backend from path: ./work_dirs/tutorial/iter_800.pth

# 载入测试图像
img=mmcv.imread('iccv09Data/images/6000124.jpg')
# img = mmcv.imread('iccv09Data/images/6000295.jpg')
# 预测
result=inference_model(model,img)
# 可视化预测结果
visualization = show_result_pyplot(model, img, result, opacity=0.8, title='MMSeg', out_file='outputs/C.jpg')
plt.imshow(mmcv.bgr2rgb(visualization))
plt.show()

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

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

相关文章

[SSD固态硬盘技术 0] SSD的结构和原理导论

版权声明: 本文禁止转载机械硬盘的存储系统由于内部结构,其IO访问性能无法进一步提高,CPU与存储器之间的性能差距逐渐扩大。以Nand Flash为存储介质的固态硬盘技术的发展,性能瓶颈得到缓解。1. 什么是SSD固态硬盘(Solid State Drives&#xf…

Python爱心代码

前言 Python漂浮爱心,具体源码见:Python动态爱心代码_爱心代码-Python文档类资源-CSDN下载 爱心类 class Heart(): #每个爱心(爱心类) def __init__(self): self.r ra.randint(10,15) #爱心的半径 …

[LeetCode 1138]字母板上的路径

题目描述 题目链接:[LeetCode 1138]字母板上的路径 我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所…

图形编辑器:绘制图形需要用到的填充算法

大家好,我是前端西瓜哥。今天我们来谈谈图形编辑器中,简单说说图形编辑实现图形工具,需要用到的填充算法。 图形的特点是宽高是固定的,在图形编辑器绘制图片有两种方案。 一种是将 宽高比锁死,不允许改变&#xff0c…

SpringCloud和微服务介绍

SpringCloud介绍 SpringCloud是在SpringBoot的基础上构建的,用于简化分布式系统构建的工具集。 该工具集为微服务架构中所涉及的配置管理,服务发现,智能路由,断路器,微代理和控制总线等操作提供了一种简单的开发方式。 SpringCloud中包含了多个子项目: Spring …

Properties类读配置文件、修改配置文件

Properties类简介(1)Properties类是专门用于读写配置文件的集合类(2)配置文件的后缀名为.properties,内容格式为:# 可以用“#”作为注释 键值 键值**注意:**键值对不需要有空格,值不需要用引号一起来。默认类型是String。键、值不可以是null(3)Properties类的方法可查找api文档…

Java编程介绍以及学习路线

1.Java的起源 Java源自Sun公司的一个叫Green的项目,其原先的目的是为家用电子消费产品开发一个分布式代码系统,这样就可以将通信和控制信息发给电冰箱、电视机、烤面包机等家用电器,对它们进行控制和信息交流。最初Green项目的工程师们准备采…

数据挖掘,计算机网络、操作系统刷题笔记48

数据挖掘,计算机网络、操作系统刷题笔记48 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,orac…

2.11sql的增删查改

一.CURD(增删查改1.c新增insert往表里添加数据注意事项1.2.3.4.5.如果是蓝丁文的2.R1.全列查找这一步很危险2.指定列查找3.带表达式的查找4.别名5.查找结果去重:DISTINCT6 排序:ORDER BY7 条件查询:WHERE1.比较运算符WHERE条件可以使用表达式&#xff0c…

如何生成毕业论文的目录和创建模板

有粉丝同学最近在写毕业论文,其中比较让人恼火的是毕业论文的目录,折腾了几遍没弄好,想让我写个简单地教程,那就来吧。主要分为三步:第一步是从模板里面提取标题的样式,第二步是对自己的论文使用设置好的标…

DaVinci:调色版本

调色版本 Grade Version记录着片段的全部调色信息。将一种调色风格或效果,保存为一个调色版本,从而可在多个调色版本之间查看、比较、挑选或者渲染输出。调色版本类型本地版本Local Versions在没有创建新的调色版本之前,片段的调色信息默认记…

MySQl单表查询

表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 varchar…

1dB压缩点和三阶交调点、相位差与延时

1dB压缩点与三阶交调点 要知道放大器是一个非线性系统,传输函数基本用泰勒级数表示 如果输入信号幅度很小,那么上式中2次及以上的项就可以忽略而成为小信号的情况。在许多情况下我们可以忽略3次以上的项。 如果输入一个正弦信号 1、可以看到一个单频率…

webpack-dev-server 的 host 配置 0.0.0.0

webpack-devserver 的 host 配置 0.0.0.0配置成0.0.0.0有什么意义为什么会有以上现象什么是webpack-dev-server什么是0.0.0.0什么是127.0.0.1什么是localhost配置成0.0.0.0有什么意义 假如某个vue项目的webpack配置如下: 在这module.exports {dev: {...//其余的配…

ubuntu部署quark-5

下载源代码 解压zip sudo apt-get install unzip unzip xxxxx.zip安装所需要的包 sudo apt install python2 # 查看是否配置了默认的python sudo update-alternatives --list python若没有设置,会显示: # update-alternatives: error: no alterna…

多行文本在块元素中垂直居中

单行文本垂直居中对齐 在块元素中&#xff0c;让单行文本居中&#xff0c;可以使用line-height等于块元素的高&#xff0c;即可让该单行文本垂直居中对齐。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><me…

Java:SpringMVC的使用(1)

目录第一章、SpringMVC基本了解1.1 概述1.2 SpringMVC处理请求原理简图第二章、SpringMVC搭建框架1、搭建SpringMVC框架1.1 创建工程【web工程】1.2 导入jar包1.3 编写配置文件(1) web.xml注册DispatcherServlet(2) springmvc.xml(3) index.html1.4 编写请求处理器【Controller…

Android 进阶——Framework核心 之Binder Java成员类详解(三)

文章大纲引言一、Binder Java家族核心成员关系图二、Binder Java家族核心成员源码概述1、android.os.IBinder1.1、boolean transact(int code, Parcel data, Parcel reply, int flags) send a call to an IBinder object1.2、String getInterfaceDescriptor()1.3、boolean ping…

【宝塔部署SpringBoot前后端不分离项目】含域名访问部署、数据库、反向代理、Nginx等配置

一定要弄懂项目部署的方方面面。当服务器上部署的项目过多时&#xff0c;端口号什么时候该放行、什么时候才会发生冲突&#xff1f;多个项目使用redis怎么防止覆盖&#xff1f;Nginx的配置会不会产生站点冲突&#xff1f;二级域名如何合理配置&#xff1f;空闲的时候要自己用服…

【生成式AI】谁拥有生成式 AI 平台?

文章目录市场的价值将增长点技术栈&#xff1a;基础架构、模型和应用程序生成式 AI 应用程序留存率和差异化方面举步维艰生成式 AI 应用程序公司面临的一些问题模型提供商尚未达到大规模商业规模基础设施供应商是目前的最大赢家系统性的护城河技术栈早期阶段出现在生成人工智能…