简介
本篇博客介绍了一个使用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的图,贼丑