热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Labelme与FastDeploy相结合,辅助分割标注

1.项目背景大家可能遇到这样的情况(可能只有我遇到)。已经有100个已经标注好的分割数据,也训练好一个模型。但是突然觉得样本数量不够,想增加到500个

1.项目背景

大家可能遇到这样的情况(可能只有我遇到)。已经有100个已经标注好的分割数据,也训练好一个模型。但是突然觉得样本数量不够,想增加到500个。但是如果完全手动标注500个,估计会很累。然后现在你已经训练好了一个模型,能不能利用这个训练好的模型对500个数据进行推理,然后对结果进行精调。但是一般推理结果mask都是一个数组或者图片,不好对其进行标注微调。

现在想到一个方法就是:使用FastDeploy高效推理工具(在cup下推理都好快),加载训练好的模型,得到预测的mask结果,然后转换成json图片,再用labelme进行读取,进行手动微调。把推理这部分代码写入labelme中,增加一些按钮,就有如下的工具。

魔改的Labelme的Github地址:https://github.com/richarddddd198/Labelme-auto-seg

方法使用如下

2.FastDeploy

FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具。提供开箱即用的云边端部署体验, 支持超过150+ Text, Vision, Speech和跨模态模型,并实现端到端的推理性能优化。包括图像分类、物体检测、图像分割、人脸检测、人脸识别、关键点检测、抠图、OCR、NLP、TTS等任务,满足开发者多场景、多硬件、多平台的产业部署需求。

Github仓库地址:https://github.com/PaddlePaddle/FastDeploy

#clone paddleseg套件,训练一个语义分割模型
!git clone https://gitee.com/paddlepaddle/PaddleSeg.git

#安装paddleseg 和fastdeploy
!pip install paddleseg fastdeploy-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html

3.数据

任务类型:语义分割

数据格式:2D jpg

分割目标:头部磁共振的胼胝体,

分割类别:1

样本数量:120张

#解压数据
!unzip -o /home/aistudio/data/data91411/callosum.zip -d /home/aistudio/work

# 生成文件列表文件import os
import numpy as np
DATA_ROOT_DIR = '/home/aistudio/work/callosum'def make_list():img_list = [img for img in os.listdir(os.path.join(DATA_ROOT_DIR, 'origin'))]data_path_list = []for image_id in img_list:image_path = os.path.join(DATA_ROOT_DIR, 'origin',image_id)label_path = os.path.join(DATA_ROOT_DIR, 'mask',image_id.split('.')[0]+'.png')data_path_list.append((image_path, label_path))np.random.seed(5)np.random.shuffle(data_path_list)total_len = len(data_path_list)train_data_len = int(total_len*0.8)train_data = data_path_list[0 : train_data_len]val_data = data_path_list[train_data_len : ]with open(os.path.join(DATA_ROOT_DIR, 'train_list.txt'), "w") as f:for image, label in train_data:f.write(f"{image} {label}\n")with open(os.path.join(DATA_ROOT_DIR, 'val_list.txt'), "w") as f:for image, label in val_data:f.write(f"{image} {label}\n")if __name__ == '__main__':make_list()

4.配置训练文件并开始训练

batch_size: 6
iters: 5000train_dataset:type: Datasetdataset_root: /home/aistudio/train_path: /home/aistudio/work/callosum/train_list.txtnum_classes: 2transforms: - type: RandomHorizontalFlip- type: RandomRotationmax_rotation: 15- type: RandomDistortbrightness_range: 0.2contrast_range: 0.2saturation_range: 0.2- type: Normalize- type: Resizetarget_size: [256, 256]mode: trainval_dataset:type: Datasetdataset_root: /home/aistudio/val_path: /home/aistudio/work/callosum/val_list.txtnum_classes: 2transforms:- type: Resizetarget_size: [256, 256]- type: Normalizemode: valoptimizer:type: sgdmomentum: 0.9weight_decay: 4.0e-5lr_scheduler:type: PolynomialDecaylearning_rate: 0.02end_lr: 0power: 0.9loss:types:- type: CrossEntropyLosscoef: [1]model:type: UNetnum_classes: 2use_deconv: Falsepretrained: Null

#训练
%cd ~/PaddleSeg/
!python train.py --config /home/aistudio/configcallosum.yml --do_eval --use_vdl --save_interval 48 --save_dir output_callosum

/home/aistudio/PaddleSeg

#验证
!python tools/val.py \--config /home/aistudio/configcallosum.yml \--model_path output_callosum/best_model/model.pdparams#5000轮后分割精度如下
"""
2022-12-03 09:44:01 [INFO] [EVAL] #Images: 24 mIoU: 0.9327 Acc: 0.9983 Kappa: 0.9280 Dice: 0.9640
2022-12-03 09:44:01 [INFO] [EVAL] Class IoU:
[0.9983 0.8671]
2022-12-03 09:44:01 [INFO] [EVAL] Class Precision:
[0.9989 0.9462]
2022-12-03 09:44:01 [INFO] [EVAL] Class Recall:
[0.9994 0.9121]
"""

#导出模型,好让FastDeploy加载推理
#--input_shape 的 256 256 就是训练是图片出入模型的尺寸。
!python tools/export.py --config /home/aistudio/configcallosum.yml \--model_path output_callosum/best_model/model.pdparams \--save_dir output_callosum/inference_model_callosum \--input_shape 1 3 256 256

W1203 09:45:02.714906 6309 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W1203 09:45:02.719321 6309 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
2022-12-03 09:45:04 [INFO] Loaded trained params of model successfully.
2022-12-03 09:45:06 [INFO] The inference model is saved in output_callosum/inference_model_callosum

5.使用fastdeploy加载模型推理

1.先用vision.segmentation.PaddleSegModel加载刚才Paddleseg导出训练好的模型

2.使用model.predict进行推理。

3.result.label_map得到对应的预测值,reshape与输入图片尺寸一致即可得到预测的mask

import numpy as np
import cv2
import fastdeploy.vision as vision
import matplotlib.pyplot as plt
model = vision.segmentation.PaddleSegModel('/home/aistudio/PaddleSeg/output_callosum/inference_model_callosum/model.pdmodel','/home/aistudio/PaddleSeg/output_callosum/inference_model_callosum/model.pdiparams','/home/aistudio/PaddleSeg/output_callosum/inference_model_callosum/deploy.yaml')im = cv2.imread("/home/aistudio/work/callosum/origin/176.jpg")
result = model.predict(im.copy())
mask = np.array(result.label_map).reshape(256,256).astype(np.uint8)
plt.imshow(mask,'gray')
plt.show()

[INFO] fastdeploy/vision/common/processors/transform.cc(93)::FuseNormalizeHWC2CHW Normalize and HWC2CHW are fused to NormalizeAndPermute in preprocessing pipeline.
[INFO] fastdeploy/vision/common/processors/transform.cc(159)::FuseNormalizeColorConvert BGR2RGB and NormalizeAndPermute are fused to NormalizeAndPermute with swap_rb=1
[INFO] fastdeploy/backends/openvino/ov_backend.cc(199)::InitFromPaddle Compile OpenVINO model on device_name:CPU.
[INFO] fastdeploy/runtime.cc(532)::Init Runtime initialized with Backend::OPENVINO in Device::CPU.

ce::CPU.

在这里插入图片描述

6.把mask图转换成json文件

对预测的mask 转换成labelme格式的json文件,让labelme可以识别。

下图是labelme读取重新生成的json文件。

import base64
import os
import json# 图片转换成base64
def image_to_base64(path):with open(path, &#39;rb&#39;) as img:b64encode &#61; base64.b64encode(img.read())s &#61; b64encode.decode()b64_encode &#61; &#39;data:image/jpeg;base64,%s&#39; % sreturn b64_encodedef get_points(contour,isRemoveSamlleTarget&#61;True):"""对轮廓点做适当的处理&#xff0c;例如点太小的目标去掉&#xff0c;或者点太多的&#xff0c;间隔取点"""num &#61; len(contour[:, 0, 0]) if isRemoveSamlleTarget:if num < 10: #可以适当去除小目标return contour[:, 0], 0if num > 200: #点太多&#xff0c;可以适当减少点hundred &#61; num // 30 # 步长tem &#61; contour[:, 0][::hundred]return tem, 1else:return contour[:, 0], 1def generate_json(name, h, w, shapes,imageData):#按格式要求生成字典&#xff0c;再换成jsondict &#61; {}dict["version"] &#61; "5.1.0"dict["flags"] &#61; {}dict["shapes"] &#61; shapesdict["imagePath"] &#61; namedict["imageData"] &#61; imageDatadict["imageHeight"] &#61; hdict["imageWidth"] &#61; wreturn json.dumps(dict, ensure_ascii&#61;False,indent&#61;4)def generateJosn(img_path,mask,label_name):"""对mask找到轮廓&#xff0c;生成坐标点"""img_base &#61; os.path.basename(img_path)shapeslist &#61; list()h, w &#61; mask.shapefor label in label_name.keys():temp &#61; mask.copy()temp[temp &#61;&#61; label] &#61; 255temp[temp!&#61; 255] &#61; 0ret, binary &#61; cv2.threshold(temp, 0, 255, cv2.THRESH_BINARY ) binary &#61; np.uint8(binary)contours, heriachy &#61; cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)for contour in contours:shapesdict &#61; {"label":&#39;&#39;, "points":&#39;&#39;, "group_id":"null", "shape_type":"polygon", "flags":{}}points, flag &#61; get_points(contour)points &#61; points.tolist()if flag &#61;&#61;1:shapesdict[&#39;label&#39;] &#61; label_name[label]shapesdict[&#39;points&#39;] &#61; pointsshapeslist.append(shapesdict)imageData &#61; image_to_base64(img_path).split(&#39;,&#39;)[1]json_content &#61; generate_json(img_base,h,w,shapeslist,imageData)return json_contentim_path&#61;"/home/aistudio/work/callosum/origin/176.jpg"
label_name &#61; {1:"callosum"}#这里需要手动新建标签&#xff0c;让labelme知道对应的类别的标签名
save_jons_path &#61; os.path.join(&#39;/home/aistudio/&#39;,os.path.basename(im_path).split(&#39;.&#39;)[0]&#43;&#39;.json&#39;)
with open(save_jons_path,&#39;w&#39;,encoding&#61;&#39;utf8&#39;) as f:json_content &#61; generateJosn(im_path,mask,label_name)f.write(json_content)

此文章为搬运
原项目链接


推荐阅读
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • 本文深入探讨了数据库性能优化与管理策略,通过实例分析和理论研究,详细阐述了如何有效提升数据库系统的响应速度和处理能力。文章首先介绍了数据库性能优化的基本原则和常用技术,包括索引优化、查询优化和存储管理等。接着,结合实际应用场景,讨论了如何利用容器化技术(如Docker)来部署和管理数据库,以提高系统的可扩展性和稳定性。最后,文章还提供了具体的配置示例和最佳实践,帮助读者在实际工作中更好地应用这些策略。 ... [详细]
  • 精通jQuery:深入解析事件处理机制与应用技巧
    本文详细探讨了jQuery的事件处理机制及其应用技巧,通过具体的代码示例,逐一解析了每个jQuery代码片段与其对应的HTML结构。文章以标记为基准,CSS作为通用样式,确保每段代码都能独立运行。HTML和CSS代码统一放置在文章末尾,方便读者参考和实践。 ... [详细]
  • 01基本环境win10vs2015Gitpython3.5.3cmake-gui(3.7.2)caffe2github地址:https:github.com ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • 通过优化模板消息机制,本研究提出了一种高效的信息化推送方案。该方案利用获取的访问令牌(access token)和指定的模板ID,实现了精准且快速的信息推送,显著提升了用户体验和信息传递效率。具体实现中,通过调用相关API接口,确保了消息的准确性和及时性,为用户提供更加便捷的服务。 ... [详细]
  • 本文深入探讨了 iOS 开发中 `int`、`NSInteger`、`NSUInteger` 和 `NSNumber` 的应用与区别。首先,我们将详细介绍 `NSNumber` 类型,该类用于封装基本数据类型,如整数、浮点数等,使其能够在 Objective-C 的集合类中使用。通过分析这些类型的特性和应用场景,帮助开发者更好地理解和选择合适的数据类型,提高代码的健壮性和可维护性。苹果官方文档提供了更多详细信息,可供进一步参考。 ... [详细]
  • jQuery Flot 数据可视化插件:高效绘制图表的专业工具
    jQuery Flot 是一款高效的数据可视化插件,专为绘制各种图表而设计。该工具支持丰富的图表类型和自定义选项,适用于多种应用场景。用户可以通过其官方网站获取示例代码和下载资源,以便快速上手和使用。 ... [详细]
  • [TyvjP1050] 动态规划求解最长公共子序列问题
    在解决最长公共子序列问题时,动态规划是一种高效的方法。具体而言,我们使用二维数组 `dp[i][j]` 来表示第一个字符串匹配到第 `i` 位,第二个字符串匹配到第 `j` 位时的最长公共子序列长度。状态转移方程为:当两个字符相等时,`dp[i][j] = dp[i-1][j-1] + 1`;否则,`dp[i][j] = max(dp[i-1][j], dp[i][j-1])`。通过这种方法,我们可以有效地计算出两个字符串的最长公共子序列。 ... [详细]
  • 本文深入探讨了原型模式在软件设计中的应用与实现。原型模式通过使用已有的实例作为原型来创建新对象,而不是直接通过类实例化。这种方式不仅简化了对象的创建过程,还提高了系统的灵活性和效率。具体来说,原型模式涉及一个支持克隆功能的接口或基类,子类通过实现该接口来提供具体的克隆方法,从而实现对象的快速复制。此外,文章还详细分析了原型模式的优缺点及其在实际项目中的应用场景,为开发者提供了实用的指导和建议。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • 在探讨 AS3 中的数据深度复制技术时,本文详细介绍了实现数据深度克隆的有效方法。通过对比多种方案,最终确定了一种高效且可靠的实现方式,所有代码均来源于公开资源,确保了方法的实用性和可操作性。 ... [详细]
  • Django框架进阶教程:掌握Ajax请求的基础知识与应用技巧
    本教程深入探讨了Django框架中Ajax请求的核心概念与实用技巧,帮助开发者掌握异步数据交互的方法,提升Web应用的响应速度和用户体验。通过实例解析,详细介绍了如何在Django项目中高效实现Ajax请求,涵盖从基础配置到复杂场景的应用。 ... [详细]
author-avatar
高桥惜员_136
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有