PaddleSeg中交互式分割EISeg的使用

news2024/11/17 19:37:11

      EISeg(Efficient Interactive Segmentation)是基于飞桨开发的一个高效智能的交互式分割标注软件。它涵盖了通用、人像、遥感、医疗、视频等不同方向的高质量交互式分割模型。另外,将EISeg获取到的标注应用到PaddleSeg提供的其他分割模型进行训练,便可得到定制化场景的高精度模型,打通分割任务从数据标注到模型训练及预测的全流程。

      Windows上安装EISeg:

      1.PaddleSeg在windows上的配置参考:https://blog.csdn.net/fengbingchun/article/details/131344901

      2.在已安装PaddleSeg的基础上进行安装,执行如下命令:

pip install eiseg

      安装完后,在Anaconda Powershell Prompt中输入eiseg即可运行软件,软件界面如下图所示:

      EISeg的使用,打开软件界面后,以人像分隔为例:

      1.从https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.8/EISeg/docs/image.md 下载高精度模型static_hrnet18_ocr64_human.zip,解压缩;
      2.模型参数加载:文件 --> 加载模型参数:选择static_hrnet18_ocr64_human.pdiparams,
      处理OMP Error: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. Hint This means that multiple copies of the OpenMP runtime have been linked into the program.
      解决方法:将Anaconda3/envs/PaddleSeg/Library/bin目录下的libiomp5md.dll重命名或删除
      3.图像加载:文件 --> 打开图像:选择图像; 也可打开图像文件夹:文件 --> 打开文件夹:选择文件夹
      4.添加标签:点击界面"添加标签"按钮,新建标签,标签分为4列,分别对应像素值、说明、颜色和删除。可点击"标注",导出标签列表、也可载入标签列表和清空标签列表。
      5.开始标注:标注首先进入交互式分割模式。鼠标左键代表正点击,表示所选择的前景部分;鼠标右键代表负点击,为用户选定的背景区域。用户可以通过正负点击操作来选择感兴趣的区域,直到满意为止。
      交互完成后使用Space(空格)完成交互标注,此时出现多边形边界,进入多边形标注模式。多边形可以删除,通过backspace键。使用鼠标左键点击锚点可以进行拖动。鼠标左键双击锚点可以删除锚点。双击两点之间的边则可在此边添加一个锚点。
      6.自动保存设置(文件 --> 自动保存):在使用中可以将自动保存设置上,设定好文件夹即可,这样在使用时切换图像会自动将完成标注的图像进行保存。

      标注结果如下图所示:测试图来自于网络,左图为原图,右图为分隔后的结果

      分隔后的结果并没有透明图,生成透明图的代码如下所示:image_generic_operations.py

import os
import sys
import cv2
from inspect import currentframe, getframeinfo
import argparse
import numpy as np

def get_image_list(path, image_suffix):
    image_list = []
    for x in os.listdir(path):
        if x.endswith(image_suffix):
            image_list.append(path+"/"+x)

    return image_list

def get_image_name(image_name):
    pos = image_name.rfind("/")
    image_name = image_name[pos+1:]

    return image_name

def get_image_name2(image_name, image_suffix):
    name = get_image_name(image_name)
    #name = name[:len(image_suffix)-1] # sometimes, the fetched name is incorrect, for example: 10-1.JPG
    pos =name.rfind(".")

    return name[:pos]

def image_segment(image_list, image_suffix, path2, image_suffix2, degrees, dst_width, dst_height, result_path):
    print("image segment ...")
    os.makedirs(result_path, exist_ok=True)

    for name in image_list:
        print(f"\t{name}")
        image_name = get_image_name2(name, image_suffix)
        #print(f"image name:{image_name}"); sys.exit(1)
        name2 = path2 + "/" + image_name + image_suffix2
        print(f"\t{name2}")
        
        bgr = cv2.imread(name, -1)
        h1, w1, c1 = bgr.shape
        mask = cv2.imread(name2, -1)
        h2, w2 = mask.shape
        if c1 != 3:
            raise Exception("Unsupported number of image channels: {}, {}; Error Line: {}".format(c1, c2, getframeinfo(currentframe()).lineno))

        if h1 != h2 or w1 != w2: # rotate
            if h1 != w2 or w1 != h2:
                raise Exception("Inconsistent image size: {},{}:{},{}; Error Line: {}".format(h1, w1, h2, w2, getframeinfo(currentframe()).lineno))

            if degrees == 90:
                rotate_code = cv2.ROTATE_90_CLOCKWISE
            elif degrees == 180:
                rotate_code = cv2.ROTATE_180
            elif degrees == 270:
                rotate_code = cv2.ROTATE_90_COUNTERCLOCKWISE
            else:
                raise Exception("Unsupported rotat degrees: {}, it only supports: clockwise 90, 180, 270; Error Line: {}".format(degrees, getframeinfo(currentframe()).lineno))
            bgr = cv2.rotate(bgr, rotateCode=rotate_code)

        bgra = cv2.cvtColor(bgr, cv2.COLOR_BGR2BGRA)

        if dst_width != 0 or dst_height != 0: # resize
            if h1 > dst_height and w1 > dst_width:
                interpolation = cv2.INTER_AREA
            else:
                interpolation = cv2.INTER_CUBIC

            bgra = cv2.resize(bgra, (dst_width, dst_height), interpolation=interpolation)
            mask = cv2.resize(mask, (dst_width, dst_height), interpolation=interpolation)

        #h3, w3, c3 = bgra.shape
        #result = np.zeros((h3, w3, c3), dtype="uint8")
        result = cv2.bitwise_and(bgra, bgra, mask=mask)
        cv2.imwrite(result_path+"/"+image_name+".png", result)

def parse_args():
    parser = argparse.ArgumentParser(description="image generic operations", add_help=True)

    parser.add_argument("--image_src_path", required=True, type=str, help="the path of the image to be operated, for example: ../../test_images")
    parser.add_argument("--image_src_path2", default="", type=str, help="the path of the image to be operated, for example: ../../test_images")
    parser.add_argument("--operation", required=True, type=str, choices=["rotate", "resize", "segment", "border"], help="specifies the operation to take on the image")
    parser.add_argument("--image_dst_path", required=True, type=str, help="the path where the resulting image is saved, for example: ../../test_images/result")

    parser.add_argument("--degrees", default=90, type=int, choices=[90, 180, 270], help="the degrees by which the image is rotated clockwise")

    parser.add_argument("--width", default=0, type=int, help="the width of the image after scaling")
    parser.add_argument("--height", default=0, type=int, help="the height of the image after scaling")

    parser.add_argument("--image_suffix", default=".png", type=str, help="the suffix of the processed image")
    parser.add_argument("--image_suffix2", default=".png", type=str, help="the suffix of the processed image")

    parser.add_argument("--value", default="", type=str, help="pixel value, order: b g r a, the length can be 1 2 3 4, for example: 128 128 255 255")
    
    args = parser.parse_args()
    return args

if __name__ == "__main__":
    args = parse_args()
    if args.value != "":
        value = []
        for v in args.value.split():
            value.append(int(v))

    image_list = get_image_list(args.image_src_path, args.image_suffix)
    if len(image_list) == 0:
        print(f"Warning: no image, directory: {args.image_src_path}")
        sys.exit(1)

    if args.operation == "segment":
        image_segment(image_list, args.image_suffix, args.image_src_path2, args.image_suffix2, args.degrees, args.width, args.height, args.image_dst_path)

    print("test finish")

      GitHub:https://github.com/fengbingchun/OpenCV_Test

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

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

相关文章

stm32-iic 时序驱动

数据发送 #include "IIC.h" #include "delay.h"void IIC_Init(void){GPIO_InitTypeDef GPIO_InitStruct;//使能GPIPFRCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//初始GPIGB8 GPIGB9 GPIO_InitStruct.GPIO_Pin GPIO_Pin_8 | GPIO_Pin_9; …

4.28 白噪声功率谱密度的估计

前一节有下面结论: 什么仿真的白噪声波形是均匀的,均匀的特点是相关函数在0时刻是相关的(自己和自己相关的)0以外时刻都互相不相关

PLC 网关设备如何进行数据采集?

引言: 在现代工业领域,PLC(可编程逻辑控制器)被广泛应用于自动化控制系统。为了实现高效的数据收集和分析,工业边缘网关扮演着重要角色。本文将探讨PLC网关设备如何进行数据采集,并介绍一款优秀的工业边缘网…

JVM-jvisualvm性能监控可视化工具使用与eden-s0-s1分配分析(三)

目录 第一步:安装jvisualvm 第二步:安装VisualvmGc插件 方式一:jvisualvm工具直接下载安装 方式二:去官网下载导入安装 总结 第三步:idea安装VisualvM Launcher插件 第四步:演示young中eden、s0、s1垃…

浅谈小程序开发 [2018年]

一、问题背景 随着App市场趋近于饱和,大部分用户已经养成了使用习惯,加上开发和推广新的App的成本高,使得开发新的App很难在市场上生存。在此背景下,小程序应运而生,2016年,张小龙的微信团队首次推出了微信…

vmware虚拟机无法启动修复

虚拟机场景报错:Entering emergency mode. Exit the shell to continue. #输入journalctl journalctl #如果出现以下描述: failed to mount /sysroot. Dependency failed for Initrd root File System. Dependency failed for Reload configuration fro…

信息服务上线渗透检测网络安全检查报告和解决方案4(网站风险等级评定标准、漏洞危害分级标准、漏洞安全建议)

系列文章目录 信息服务上线渗透检测网络安全检查报告和解决方案3(系统漏洞扫描、相对路径覆盖RPO漏洞、nginx漏洞修复)信息服务上线渗透检测网络安全检查报告和解决方案2(安装文件信息泄漏、管理路径泄漏、XSS漏洞、弱口令、逻辑漏洞、终极上传漏洞升级)信息服务上线渗透检测网…

CCF-CSP真题《202303-2 垦田计划》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号:202303-2试题名称:垦田计划时间限制:1.0s内存限制:512.0MB问题描述: 问题描述 顿顿总共选中了 n 块区域准备开垦田地&#xf…

交换机是否会梦见机器学习?面向网络内分类

交换机是否会梦见机器学习?面向网络内分类 摘要 机器学习目前正在推动技术和社会革命。虽然可编程交换机已被证明对网络内计算非常有用,但是在可编程交换机内进行机器学习迄今为止取得了很少的成功。不利用网络设备进行机器学习会付出高昂的代价&#…

华为OD机试真题 JavaScript 实现【寻找峰值】【牛客练习题】

一、题目描述 给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于; 2.假设 nums[-1] n…

【容器起不来~tomcat】

记录一次线上容器~tomcat起不来的场景: **部门由于资金有限,只能用tomcat去部署,话不多说直接贴图: Docker 镜像 Tomcat 启动失败– 查看线上日志,日志报错了,报错内容如下: 1,Error response from daemon: driver failed programming external connectivityon endpoint jen…

Safari开发者工具

Safari开发者工具 1 开发者功能2 开发者功能可以干什么2.1 捕获模拟器的请求 1 开发者功能 Safari->首选项->高级->开启“在菜单栏中显示‘开发’菜单” 2 开发者功能可以干什么 2.1 捕获模拟器的请求 当我们向查看模拟器上一个完整的网络请求时,往往…

libevent实践06:监听TCP服务器

简介 函数evconnlistener_new_bind struct evconnlistener * evconnlistener_new_bind(struct event_base *base, evconnlistener_cb cb,void *ptr, unsigned flags, int backlog, const struct sockaddr *sa,int socklen) 参数解析: base:事件集合 ev…

Python 字符串的使用

字符串使用 1. 字符串的定义方式 双引号或者单引号括起来的数据,就是字符串。使用三引号括起来也是字符串,并支持换行。 例: # 使用反斜线 对单引号进行转义 name1 i\ Tom name2 "Rose" name3 Tom name4 ""&qu…

8-什么是数组重塑?【视频版】

目录 问题视频解答 问题 视频解答 点击观看: 8-什么是数组重塑?

[mmcv系列] pip安装mmcv记录

文章目录 1.查看torch和cuda版本1.安装1.1从预编译包安装1.2 源码编译安装 2.校验报错:from mmcv import Config 可以直接 参考教程: 找到pip安装,选择自己的cuda和torch版本,复制指令到终端安装即可: 1.查看torch和c…

归并排序的具体实现过程

作者主页:paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《算法详解》专栏,本专栏是针对于大学生,编程小白精心…

TCP三握四挥

TCP三握四挥 TCP最关键的三个步骤:建立连接、数据传输、释放连接,这里的三次握手实现的是服务端和客户端建立连接;四次挥手实现的是服务端和客户端释放连接。 三次握手: 建立数据连接 TCP连接需要三次握手的原因: 三次…

静力触探数据智能预处理(1)

静力触探数据智能预处理(1) 前言 数据处理方式已由手工1.0、计算机辅助2.0到人工智能3.0的趋势发展。现场采集的静力触探数据存在大量的异常数据,需要后期处理;但是目前还未见一个静力触探数据预处理的软件,数据预处…

BN、LN、IN、GN的自我理解

目录 一、Batch Normal 二、Layer Normal 三、Instance Normal 四、Group Normal 五、参考 参考了这两三篇博客,终于理解了这几个概念。 一、Batch Normal Batch Normal,举例来说:输入一个batch size,这个batch size中有2个…