mmdetection的生物图像实例分割三:自定义数据集的测试与分析

mmdetection的生物图像实例分割全流程记录

第三章 自定义数据集的测试、重建与分析


文章目录

  • mmdetection的生物图像实例分割全流程记录
  • 前言
  • 一、测试集的推理
    • 1.模型测试
    • 2.测试数据解析
  • 二、测试结果的数据整合
  • 三、生物结构的重建效果


前言

mmdetection是一个比较容易入门且上手的深度学习检测框架,其官网为https://github.com/open-mmlab/mmdetection,相关文档https://mmdetection.readthedocs.io/zh-cn/latest/overview.html。

版本为mmdetection 3.3.0.这里可供借鉴。
在这里插入图片描述

一、测试集的推理

1.模型测试

找到文件位置:tools/test.py,复制为tools/test_ac3ac4.py,并进行如下更改:

# Copyright (c) OpenMMLab. All rights reserved.
import argparse
import os
import os.path as osp
import warnings
from copy import deepcopyfrom mmengine import ConfigDict
from mmengine.config import Config, DictAction
from mmengine.runner import Runnerfrom mmdet.engine.hooks.utils import trigger_visualization_hook
from mmdet.evaluation import DumpDetResults
from mmdet.registry import RUNNERS
from mmdet.utils import setup_cache_size_limit_of_dynamo# TODO: support fuse_conv_bn and format_only
def parse_args():parser = argparse.ArgumentParser(description='MMDet test (and eval) a model')# parser.add_argument('config', help='test config file path')# parser.add_argument('checkpoint', help='checkpoint file')parser.add_argument('--config', default='Path/to/your/mmdetection/mmdet/configs/mask_rcnn/mask_rcnn_r50_fpn_2x_ac3ac4.py', help='test config file path')parser.add_argument('--checkpoint', default='Path/to/your/DataLog/AC3AC4/MRCNN/epoch_best.pth', help='checkpoint file')parser.add_argument('--work-dir', default='Path/to/your/DataLog/AC3AC4/MRCNNOUT/',help='the directory to save the file containing evaluation metrics')parser.add_argument('--out',type=str, default='Path/to/your/DataLog/AC3AC4/MRCNNOUT/predictions.pkl',help='dump predictions to a pickle file for offline evaluation')# parser.add_argument(#     '--show', action='store_true', help='show prediction results')parser.add_argument('--show', default=True, help='show prediction results')parser.add_argument('--show-dir',default='Path/to/your/DataLog/AC3AC4/MRCNNOUT/show_dir/', help='directory where painted images will be saved. ''If specified, it will be automatically saved ''to the work_dir/timestamp/show_dir')parser.add_argument('--wait-time', type=float, default=2, help='the interval of show (s)')parser.add_argument('--cfg-options',nargs='+',action=DictAction,help='override some settings in the used config, the key-value pair ''in xxx=yyy format will be merged into config file. If the value to ''be overwritten is a list, it should be like key="[a,b]" or key=a,b ''It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ''Note that the quotation marks are necessary and that no white space ''is allowed.')parser.add_argument('--launcher',choices=['none', 'pytorch', 'slurm', 'mpi'],default='none',help='job launcher')parser.add_argument('--tta', action='store_true')# When using PyTorch version >= 2.0.0, the `torch.distributed.launch`# will pass the `--local-rank` parameter to `tools/train.py` instead# of `--local_rank`.parser.add_argument('--local_rank', '--local-rank', type=int, default=0)args = parser.parse_args()if 'LOCAL_RANK' not in os.environ:os.environ['LOCAL_RANK'] = str(args.local_rank)return argsdef main():args = parse_args()# Reduce the number of repeated compilations and improve# testing speed.setup_cache_size_limit_of_dynamo()# load configcfg = Config.fromfile(args.config)cfg.launcher = args.launcherif args.cfg_options is not None:cfg.merge_from_dict(args.cfg_options)# work_dir is determined in this priority: CLI > segment in file > filenameif args.work_dir is not None:# update configs according to CLI args if args.work_dir is not Nonecfg.work_dir = args.work_direlif cfg.get('work_dir', None) is None:# use config filename as default work_dir if cfg.work_dir is Nonecfg.work_dir = osp.join('./work_dirs',osp.splitext(osp.basename(args.config))[0])cfg.load_from = args.checkpointif args.show or args.show_dir:cfg = trigger_visualization_hook(cfg, args)if args.tta:if 'tta_model' not in cfg:warnings.warn('Cannot find ``tta_model`` in config, ''we will set it as default.')cfg.tta_model = dict(type='DetTTAModel',tta_cfg=dict(nms=dict(type='nms', iou_threshold=0.5), max_per_img=100))if 'tta_pipeline' not in cfg:warnings.warn('Cannot find ``tta_pipeline`` in config, ''we will set it as default.')test_data_cfg = cfg.test_dataloader.datasetwhile 'dataset' in test_data_cfg:test_data_cfg = test_data_cfg['dataset']cfg.tta_pipeline = deepcopy(test_data_cfg.pipeline)flip_tta = dict(type='TestTimeAug',transforms=[[dict(type='RandomFlip', prob=1.),dict(type='RandomFlip', prob=0.)],[dict(type='PackDetInputs',meta_keys=('img_id', 'img_path', 'ori_shape','img_shape', 'scale_factor', 'flip','flip_direction'))],])cfg.tta_pipeline[-1] = flip_ttacfg.model = ConfigDict(**cfg.tta_model, module=cfg.model)cfg.test_dataloader.dataset.pipeline = cfg.tta_pipeline# build the runner from configif 'runner_type' not in cfg:# build the default runnerrunner = Runner.from_cfg(cfg)else:# build customized runner from the registry# if 'runner_type' is set in the cfgrunner = RUNNERS.build(cfg)# add `DumpResults` dummy metricif args.out is not None:assert args.out.endswith(('.pkl', '.pickle')), \'The dump file must be a pkl file.'runner.test_evaluator.metrics.append(DumpDetResults(out_file_path=args.out))# start testingrunner.test()if __name__ == '__main__':main()

若使用指定GPU,可以在命令行执行:

CUDA_VISIBLE_DEVICES=0 Path/to/your/envs/mmlab3/bin/python Path/to/your/mmdetection/tools/train_cremi.py

在这里插入图片描述

可以看到,在DataLog/AC3AC4/MRCNNOUT/show_dir/路径下已经出现测试的结果,左边是真值,右边是测试结果:
在这里插入图片描述

2.测试数据解析

对于已经推理出来的数据,我们可能不仅仅是作为可视化,还想将其还原为体积数据,进行后续的处理分析。打开我们存放的pkl文件,可以看到:

在这里插入图片描述
其中保存的data为list格式,长度是我们所的测试的图像数量,对于从标注到真实的mask还原的函数,官方给的数据在mmdet/visualization/local_visualizer.py这里。我们根据我们数据的命名方式,将pkl数据重新还原为体积数据:

其实在mmdet/evaluation/metrics/coco_metric.py路径下,我们可以看到官网中已经给出了Mask信息,并将其编码为RLE格式:

            # encode mask to RLEif 'masks' in pred:result['masks'] = encode_mask_results(pred['masks'].detach().cpu().numpy()) if isinstance(pred['masks'], torch.Tensor) else pred['masks']

我们同样调用pycocotools.mask进行解码,代码如下:


import os
from os.path import join
import pickle
from tqdm import tqdm
from skimage import io
import numpy as np
import pycocotools.mask as mask_utildef pkl2stack(pkl_path, save_path, y_range = [[0, 1024]],x_range = [[0, 1024]],score_thre = 0.6):os.makedirs(save_path, exist_ok=True)with open(pkl_path, 'rb') as file:data = pickle.load(file)for single_item in tqdm(data):img_path = single_item['img_path']img_name = img_path.split('/')[-1].split('.')[0]stack_name, z_name, y_name, x_name = img_name.split('_')save_img_name = z_name + '.tif'save_sub_path = join(save_path, stack_name)os.makedirs(save_sub_path, exist_ok=True)if os.path.isfile(join(save_sub_path, save_img_name)):save_array = io.imread(join(save_sub_path, save_img_name))else:save_array = np.zeros(shape=(y_range[-1][-1], x_range[-1][-1]), dtype=np.uint8)pred_scores = single_item['pred_instances']['scores'].numpy()pred_masks = mask_util.decode(single_item['pred_instances']['masks'])for scores_index in range(pred_scores.shape[0]):item_score = pred_scores[scores_index]if item_score > score_thre:save_array[y_range[int(y_name)][0]:y_range[int(y_name)][1], x_range[int(x_name)][0]:x_range[int(x_name)][1]] += pred_masks[:, :, scores_index]save_array[save_array>0] = 1io.imsave(join(save_sub_path, save_img_name), save_array)if __name__ == '__main__':pkl2stack(pkl_path="Path/to/your/DataLog/AC3AC4/MRCNNOUT/predictions.pkl", save_path='Path/to/your/DataPred/MRCNN/AC3AC4/')

可以看到相关的路径下已经为每一个体积数据创建了一个文件夹,并将每一个2D结果进行了保存。

在这里插入图片描述
这里可以发现它和真值的结果差异是十分大的。这是由于我们目前的demo仅仅训练了20个epoch,模型可能并未收敛,这里只展示基本流程。同时我们并没有对其中的3D信息,实例信息进行关联。下一节将会简要介绍简单的细胞器重建方法。

二、测试结果的数据整合

2D实例分割模型仅仅是得到了2D层面的结果,但是我们还需要将其整合为3D体积数据,最简单的方式是直接通过连通域进行实例化。然而这样的方法往往会出现大量的假阴和假阳结果。实例化的方法在众多的电镜数据集中都有涉及,包括突触、线粒体等。这里使用最简单的形态学后处理方法进行实现。

未完待续…

三、生物结构的重建效果

未完待续…

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

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

相关文章

【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法

文章目录 前言 背景介绍 初始代码 优化代码 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 背景介绍 在一个嵌入式软件开发项目中,需要设计一个ECU节点的CAN网路数据发送,需求是在500k的通信波特率上&a…

机器人舵机:关键要素解析与选择指南

在机器人技术日新月异的今天,舵机作为机器人的核心部件之一,扮演着至关重要的角色。它的性能直接关系到机器人的运动控制、稳定性以及精度等方面。那么,在选择和使用机器人舵机时,我们需要关注哪些关键要素呢?本文将为…

使用Vue.js将form表单传递到后端

一.form表单 <form submit.prevent"submitForm"></form> form表单像这样写出来&#xff0c;然后把需要用户填写的内容写在form表单内。 二.表单内数据绑定 <div class"input-container"><div style"margin-left: 9px;"&…

WALT算法简介

WALT(Windows-Assist Load Tracing)算法是由Qcom开发&#xff0c; 通过把时间划分为窗口&#xff0c;对 task运行时间和CPU负载进行跟踪计算的方法。为任务调度、迁移、负载均衡及CPU调频 提供输入。 WALT相对PELT算法&#xff0c;更能及时反映负载变化&#xff0c; 更适用于…

String类知识

目录 一、String存在意义 二、字符串为何不可变 三、String类常用方法 1、字符串构造 2、String对象的比较 3、字符串查找 4、转化 &#xff08;1&#xff09;数值和字符转化 &#xff08;2&#xff09;大小写转换 &#xff08;3&#xff09;字符串转数组 &#xff08;4&…

系统架构设计师【补充知识】: 应用数学 (核心总结)

24.1 图论之最小生成树 (1)定义: 在连通的带权图的所有生成树中&#xff0c;权值和最小的那棵生成树(包含图中所有顶点的树)&#xff0c;称作最小生成树。 (2)针对问题: 带权图的最短路径问题。 (3)最小生成树的解法有普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法&#xff0c;我…

重复文件怎么查找并清理,试试这5个文件去重方法(新)

重复文件怎么查找并清理&#xff1f;日常工作中&#xff0c;我们使用电脑的时间长了&#xff0c;都会累积大量好的文件&#xff0c;这其中难免会出现重复文件。这些重复文件不仅占用了电脑磁盘空间&#xff0c;还会降低电脑性能。因此&#xff0c;我们必须定期对重复文件查找出…

fastapi学习前置知识点

前置知识点 FastApi&#xff1a;一个用于构建API的现代、快速&#xff08;高性能&#xff09;的web框架。 FastApi是建立在Pydantic和Starlette基础上&#xff0c;Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库。Starlette是一种轻量级的ASGI框架/工具包…

GIF录屏工具Gif123 v3.3.0单文件

软件介绍 GIF的优势是小、轻、快&#xff0c;适合时间短、画面小、需要嵌入其他页面&#xff0c;打开就自动循环播放的动画。Gif123可录制合成鼠标轨迹,可调整鼠标指针大小,可在设置中打开鼠标指针高亮光圈功能,高亮光圈可跟随鼠标移动以指示鼠标位置。软件极其简单&#xff0…

流水线建构apk、abb实战(二)

gradlew 命令生成apk、aab包 其实构建应用程序包就几个命令&#xff1a; ### 生成AAB&#xff1a; gradlew bundleRelease #输出到[project]/build/outputs/bundle/release/下 gradlew bundleDebug### 生成APK&#xff1a; gradlew assembleRelease gradlew assembleDebug###…

菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

1.加密流程 工具名称requestsresponseAntSwordbase64等方式明文冰蝎2.0开启Openssl扩展-动态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64冰蝎3.0开启Openssl扩展-静态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64哥斯拉php的为base64异或base64异…

游戏《酒店业领袖》

为快餐连锁店麦当劳&#xff0c;我们创建了一款名为“好客领袖”的游戏。麦当劳的员工可以在网站上注册&#xff0c;并测试自己是否扮演酒店领导的角色&#xff0c;在餐厅可能出现的各种情况下快速做出决定。奖品等待着那些在比赛中表现最好的人。 对于该项目&#xff0c;我们&…

【Meetup】探索Apache SeaTunnel的二次开发与实战案例

在数据科技快速演进的今天&#xff0c;业务场景的复杂化和数据量的激增&#xff0c;推动了大数据技术的迅速发展&#xff0c;在众多开源大数据处理工具中&#xff0c;Apache SeaTunnel以其强大的数据集成能力&#xff0c;成为众多企业的首选。 但随着应用深入&#xff0c;企业面…

【三更新】多分式标注 脚本工具

这篇是 多分式标注 脚本工具的第三次更新文章。 原文章及历次更新请点击链接 【ArcGIS 脚本工具】生成多分式标注 【更新】多分式标注 脚本工具 【再更新】多分式标注&#xff08;船新版本&#xff09; 更新内容 1、组合字段标注 分子、分母、前分、后分&#xff0c;四个…

流水线建构apk、abb实战(一)

在构建机上需要下载的工具 流水线中的构建机无法使用Android Studio中自带的sdk工具下载&#xff0c;所以得下载commandlinetools命令行工具&#xff0c;下载后使用随附的 sdkmanager 下载其他 SDK 软件&#xff0c;解压后按照/cmdline-tools/latest/bin/sdkmanager目录结构整…

Camtasia Studio2024破解汉化版crack安装包下载地址

在当今数字化时代&#xff0c;视频内容已成为传播信息和吸引观众的重要方式。无论是企业宣传、在线教育还是个人创作&#xff0c;一款功能强大的视频编辑软件都是必不可少的工具。而Camtasia Studio2024作为业界领先的视频编辑软件&#xff0c;其永久免费版及最新版本的功能更是…

28 - 只出现一次的最大数字(高频 SQL 50 题基础版)

28 - 只出现一次的最大数字 select (selectnumfromMyNumbers group bynum havingcount(num)1order by num desc limit 1) as num;

二叉树的先序创建、复制、深度及结点个数

文章目录 前言一、二叉树的先序创建二、二叉树的复制三、二叉树的深度四、二叉树的结点个数总结 前言 T_T此专栏用于记录数据结构及算法的&#xff08;痛苦&#xff09;学习历程&#xff0c;便于日后复习&#xff08;这种事情不要啊&#xff09;。所用教材为《数据结构 C语言版…

体育器材管理系统(Java+MySQL)

技术栈 Java语言&#xff1a;作为主要编程语言&#xff0c;用于编写应用逻辑和界面交互。MySQL数据库&#xff1a;用于存储和管理体育器材的相关数据。Swing窗口视图&#xff1a;用于创建图形用户界面&#xff0c;使用户能够通过窗口进行操作&#xff08;GBK编码&#xff09;。…

线性模型-分类

一、线性判别分析LDA 线性判别分析是一种经典的线性学习方法&#xff0c;在二分类问题上最早是Fisher提出的&#xff0c;亦称为Fisher判别分析。 Fisher判别分析是一种用于降维和分类的统计方法&#xff0c;旨在找到可以最好区分不同类别的特征。它基于类内方差和类间方差的比…