图像分割模型GUI应用:基于Tkinter和MMseg实现

news2024/11/29 0:49:27

简介

本篇博客介绍了一个使用Python的Tkinter库和MMseg图像分割库创建的图像分割模型GUI应用。该应用允许用户加载图像文件夹,浏览加载的图像,并对选定的图像执行分割推断,展示分割结果。这个应用演示了如何使用图形界面与深度学习模型结合,以交互式的方式进行图像分割任务。

背景介绍

介绍图像分割任务的概念和应用领域,强调图像分割在计算机视觉中的重要性。

GUI应用概述

说明使用Python的Tkinter库创建的图像分割GUI应用的目的和功能。

依赖库

列出应用所使用的关键依赖库,包括Tkinter、PIL、MMseg等,解释每个库的作用。

应用功能解释

详细解释应用界面的各个按钮和部件的功能,如"Load Folder"按钮用于加载图像文件夹,"Next Image"按钮切换浏览图像,"Perform Inference"按钮执行图像分割推断等。

模型初始化和推断

介绍应用中使用的图像分割模型的初始化过程,包括配置文件路径、模型权重文件路径和设备选择。
解释如何使用MMseg库进行图像分割推断,包括加载图像、执行推断和获取分割结果。

图像展示与分割结果

解释如何在应用界面中展示加载的原始图像,并在执行分割推断后展示分割结果。

应用展示与操作流程

通过步骤示例,展示应用的操作流程,从加载图像文件夹到执行图像分割推断,并查看分割结果的演示。

代码解析

对主要代码片段进行解析,解释关键函数和方法的作用,帮助读者理解代码实现细节。

效果展示

展示应用的运行截图,包括加载图像、执行推断和查看分割结果的界面。

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import os
from mmseg.apis import inference_segmentor, init_segmentor
import mmcv

# Initialize the model
#配置文件路径
config_file = 'XXXX'
#pth模型路径
checkpoint_file = 'XXXXX'
#有gpu就device='cuda:0'、没gpu就device='cpu'
model = init_segmentor(config_file, checkpoint_file, device='cuda:0')

class ImageInferenceApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Image Inference GUI")
        self.root.geometry("800x600")

        self.image_paths = []
        self.current_image_idx = 0
        self.result_image = None

        self.load_button = tk.Button(root, text="Load Folder", command=self.load_folder)
        self.load_button.pack(side="top", padx=10, pady=10)

        self.next_button = tk.Button(root, text="Next Image", command=self.next_image)
        self.next_button.pack(side="top", padx=10, pady=10)

        self.perform_inference_button = tk.Button(root, text="Perform Inference", command=self.perform_inference)
        self.perform_inference_button.pack(side="top", padx=10, pady=10)


        self.center_frame = tk.Frame(root)
        self.center_frame.pack(side="top", pady=20)

        self.image_label = tk.Label(self.center_frame)
        self.image_label.pack(side="left")

        self.result_label = tk.Label(self.center_frame)
        self.result_label.pack(side="right")

    def load_folder(self):
        folder_path = filedialog.askdirectory()
        if folder_path:
            self.image_paths = [os.path.join(folder_path, filename) for filename in os.listdir(folder_path)]
            self.current_image_idx = 0
            self.load_current_image()

    def next_image(self):
        if self.image_paths:
            self.current_image_idx = (self.current_image_idx + 1) % len(self.image_paths)
            self.load_current_image()

    def load_current_image(self):
        if self.image_paths:
            image_path = self.image_paths[self.current_image_idx]
            image = Image.open(image_path)
            #image = image.resize((512, 512))  # 调整图像尺寸为 512x512
            self.display_image(image)
            self.result_image = None
            self.result_label.configure(image=None)

    def display_image(self, image):
        tk_image = ImageTk.PhotoImage(image)
        self.image_label.configure(image=tk_image)
        self.image_label.image = tk_image

    def perform_inference(self):
        if self.image_paths:
            image_path = self.image_paths[self.current_image_idx]
            img = mmcv.imread(image_path)
            result = inference_segmentor(model, img)
            result_image = model.show_result(image_path, result, out_file=None, opacity=0.5)
            self.result_image = Image.fromarray(result_image)
            tk_result_image = ImageTk.PhotoImage(self.result_image)
            self.result_label.configure(image=tk_result_image)
            self.result_label.image = tk_result_image

if __name__ == "__main__":
    root = tk.Tk()
    app = ImageInferenceApp(root)
    root.mainloop()

在这里插入图片描述
放张GUI的图,贼丑

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

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

相关文章

PageObject三层架构模式实现之数据驱动

接上一篇PageObject三层架构模式实现,发现我们的用户名和密码都是在代码中写死的,如果要测试不同用户名和密码的登录,那么每执行一次就要修改一次代码。这样效果非常不好。 因此本篇文章介绍如何实现数据驱动并且记录下每次操作的日志。 在…

SpringBoot - Google EventBus、AsyncEventBus

介绍 EventBus 顾名思义,事件总线,是一个轻量级的发布/订阅模式的应用模式,最初设计及应用源与 google guava 库。 相比于各种 MQ 中间件更加简洁、轻量,它可以在单体非分布式的小型应用模块内部使用(即同一个JVM范围…

数字孪生智慧工厂:电缆厂 3D 可视化管控系统

近年来,我国各类器材制造业已经开始向数字化生产转型,使得生产流程变得更加精准高效。通过应用智能设备、物联网和大数据分析等技术,企业可以更好地监控生产线上的运行和质量情况,及时发现和解决问题,从而提高生产效率…

Vlan和Trunk

文章目录 一、VLAN的定义与背景1. 传统以太网的问题(广播域)2. 用VLAN隔离广播域3. VLAN的优点与应用 二、VLAN的转发过程举例三、802.1Q标签:帧格式与作用四、VLAN工作原理交换机端口类型AccessTrunkHybrid PVID(Port VLAN ID&am…

十三、享元模式

一、什么是享元模式 享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。 享元(F…

C语言拷贝一个文件。

今天学习了如何用c语言拷贝一个文件&#xff0c;一个字符一个字符的拷贝一个文件&#xff0c;特此记录一下。 #include<stdio.h>int main() {FILE * pfr fopen("1.txt", "r"); //打开文件1.txt 用读的模式if (pfr NULL){return 1;}FILE* pfw fo…

1.RTKLIB环境配置和调试

1.源码下载 下载链接&#xff1a;rtklib 注&#xff1a;2.4.2 p13为稳定版本&#xff08;标识p代表稳定版本&#xff09;&#xff0c;2.4.3 b34为最新实验版本&#xff08;标识b&#xff09;。点击2.4.3 b34 的Source Programs and Data 链接下载源码。 2.环境配置 **集成…

Linux系统文件权限修改:permission denied

最近遇到文件夹权限的问题 通过命令发现www缺少写和执行的权限 然后赋予所有权限 下面是一些详解&#xff1a; 要赋予文件或目录写入权限&#xff0c;可以使用 chmod 命令。 命令的基本语法是&#xff1a; chmod <permissions> <file or directory>其中 <…

【测试】笔试01

文章目录 1. 按照瀑布模型的阶段划分&#xff0c;软件测试可以分为单元测试&#xff0c;集成测试&#xff0c;系统测试。请问以下哪项测试不属于系统测试的内容&#xff08; &#xff09;2. 测试设计员的职责有哪些&#xff1f;3. 针对程序段&#xff1a;IF&#xff08;A||B||C…

xsschallenge靶场练习1-13关

文章目录 第一关第二关第三关第四关第五关第六关第七关第八关第九关第十关第十一关第十二关第十三关 第一关 观察页面 http://192.168.80.139/xsschallenge/level1.php?nametest尝试在name后面输入最近基本的xss语法 <script>alert(1)</script>第二关 查看页面源…

Java【手撕滑动窗口】LeetCode 3. “无重复字符的最长子串“, 图文详解思路分析 + 代码

文章目录 前言一、长度最小子数组1, 题目2, 思路分析3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 &#x1f4d7; Java数据结构: 顺序表, 链…

(二十)大数据实战——Flume数据采集的基本案例实战

前言 本节内容我们主要介绍几个Flume数据采集的基本案例&#xff0c;包括监控端口数据、实时监控单个追加文件、实时监控目录下多个新文件、实时监控目录下的多个追加文件等案例。完成flume数据监控的基本使用。 正文 监控端口数据 ①需求说明 - 使用 Flume 监听一个端口&am…

Unity碰撞检测

Unity碰撞检测 前言准备材料代码使用OnCollisionEnter()进行碰撞Collider状态代码 使用OnTriggerEnter()进行碰撞Collider状态代码 区别代码OnCollisionEnter()OnTriggerEnter() 碰撞显示效果OnCollisionEnter()OnTriggerEnter() 提示结语 前言 碰撞检测可以说时学习Unity中最…

时间复杂度和空间复杂度的最小单位是什么

C数据结构与算法 目录 时间复杂度&#xff1a;CPU读写一次内存算作时间复杂度的最小单位。 读内存的场景&#xff1a;获取变量的值。 例如&#xff1a; if(x < 1000) 写内存的场景&#xff1a;给变量赋值。 例如&#xff1a;x 1000 空间复杂度&#xff1a;内存占用一…

VueX 与Pinia 一篇搞懂

VueX 简介 Vue官方&#xff1a;状态管理工具 状态管理是什么 需要在多个组件中共享的状态、且是响应式的、一个变&#xff0c;全都改变。 例如一些全局要用的的状态信息&#xff1a;用户登录状态、用户名称、地理位置信息、购物车中商品、等等 这时候我们就需要这么一个工…

启莱OA treelist.aspx SQL注入

子曰&#xff1a;“为政以德&#xff0c;譬如北辰&#xff0c;居其所&#xff0c;而众星共之。” 漏洞复现 访问漏洞url&#xff1a; 使用SQLmap对参数 user 进行注入 漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感…

Java“牵手”1688淘口令转换API接口数据,1688API接口申请指南

1688平台商品淘口令接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取1688商品的标题、价格、库存、商品快递费用&#xff0c;宝贝ID&#xff0c;发货地&#xff0c;区域ID&#xff0c;快递费用&#xff0c;月销量、总销量、库存、详情描…

juicefs源码format命令阅读

之前博文中介绍过在windows下安装GO和vscode windows下安装go环境 和vscode中go扩展调试 1、获取源码 git clone https://github.com/juicedata/juicefs.git 首先观察代码架构 上图是我已经编译过得代码&#xff0c;可能和刚git下来的有些出入。 2、编译 我是在windows上进…

C++学习笔记总结练习:运算符重载两种方式

运算符重载的两种方式 1 基本概念 基础 运算符时具有特殊名字的函数&#xff1a;由关键字operator和气候定义的运算符共同组成。 可以被重载的运算符 方式 将运算符重载为类的成员函数。重载运算符函数&#xff0c;并声明为类的友元。 规则 重载后的运算符必须至少有一个…

可控硅调功电路原理

在常见的马达调速以及需要调整负载功率的场合&#xff0c;经常会用到可控硅调功电路&#xff0c;下图是常见的应用电路。 调功电路主要由阻容移相电路和可控硅触发电路构成&#xff0c;工作过程如下&#xff0c;当交流电的正半周时&#xff0c;交流电通过R5,可调电阻R3给电容C1…