u2net网络模型训练自己数据集

单分类
下载项目源码
项目源码

准备数据集
将json转为mask
json_to_dataset.py

import cv2
import json
import numpy as np
import os
import sys
import glob


def func(file):
    with open(file, mode='r', encoding="utf-8") as f:
        configs = json.load(f)
    shapes = configs["shapes"]

    png_class = np.zeros((configs["imageHeight"], configs["imageWidth"], 1), np.uint8)
    png_other = np.zeros((configs["imageHeight"], configs["imageWidth"], 1), np.uint8)

    for shape in shapes:
        label = shape['label']
        if label == 'class':
            cv2.fillPoly(png_class, [np.array(shape["points"], np.int32)], (255))
        else:
            cv2.fillPoly(png_other, [np.array(shape["points"], np.int32)], (255))

    png = png_class - png_other
    return png


if __name__ == "__main__":
    json_dir = "image"

    save_dir = 'image/masks'

    for file in os.listdir(json_dir):
        print('***************', file)
        if file.endswith(".json"):
            # 在这里添加后续步骤
            png = func(os.path.join(json_dir, file))
            print(png.shape)
            save_path = save_dir + '/' + os.path.splitext(file)[0] + ".png"
            cv2.imwrite(save_path, png)
            print('***************', save_path)

创建文件路径

train_data
	|__DUTS
		|__DUTS-TR
			|__im_aug			# mask图
			|__gt_aug			# 原图
		|__DUTS-TE
			|__im_aug			# mask图
			|__gt_aug			# 原图

训练
修改u2net_train.py

# ------- 2. set the directory of training dataset --------

model_name = 'u2net' #'u2netp'											# 选择模型

# 修改为对应的数据集路径
data_dir = os.path.join(os.getcwd(), 'train_data' + os.sep)
tra_image_dir = os.path.join('DUTS', 'DUTS-TR', 'im_aug' + os.sep)
tra_label_dir = os.path.join('DUTS', 'DUTS-TR', 'gt_aug' + os.sep)

image_ext = '.jpg'
label_ext = '.png'

model_dir = os.path.join(os.getcwd(), 'saved_models', model_name + os.sep)

alpha_export.py为转换模型,u2net_test.py模型预测

多分类
准备数据集
将json转为mask,由于是多分类,每一个分类一个rgb值,例如分类1(1,1,1),分类2(2,2,2),分类3(3,3,3);

import cv2
import json
import numpy as np
import os
import sys
import glob


def func(file):
    with open(file, mode='r', encoding="utf-8") as f:
        configs = json.load(f)
    shapes = configs["shapes"]

    class1 = np.zeros((configs["imageHeight"], configs["imageWidth"], 3), np.uint8)
    class2 = np.zeros((configs["imageHeight"], configs["imageWidth"], 3), np.uint8)
    class3 = np.zeros((configs["imageHeight"], configs["imageWidth"], 3), np.uint8)

    for shape in shapes:
        label = shape['label']
        if label == 'class1':
            cv2.fillPoly(class1, [np.array(shape["points"], np.int32)], (1, 1, 1))
        elif label == 'class2':
            cv2.fillPoly(class2, [np.array(shape["points"], np.int32)], (2, 2, 2))
        elif label == 'class3':
            cv2.fillPoly(class3, [np.array(shape["points"], np.int32)], (3, 3, 3))

    return class1 + class2 + class3


if __name__ == "__main__":
    json_dir = "./train_data/labels_json"

    save_dir = './train_data/masks'

    for file in os.listdir(json_dir):
        print('***************', file)
        if file.endswith(".json"):
            # 在这里添加后续步骤
            png = func(os.path.join(json_dir, file))
            print(png.shape)
            save_path = save_dir + '/' + os.path.splitext(file)[0] + ".png"
            cv2.imwrite(save_path, png)
            print('***************', save_path)

数据集文件夹

datasets
	|__train_data
		|__images		# 原图
			|__1.jpg
			|__2.jpg
			|__3.jpg
		|__masks		# mask图
			|__1.png
			|__2.png
			|__3.png
	|__test_data
		|__images
			|__1.jpg
			|__2.jpg
			|__3.jpg
		|__masks
			|__1.png
			|__2.png
			|__3.png
		|__my_results_2
		|__predeict_lables
		|__predict_masks

训练

# ------- 2. set the directory of training process --------
model_name = 'u2net'  # 'u2net'							# 选择模型
model_dir = os.path.join('saved_models', model_name + os.sep)

# 图片的文件类型
image_ext = '.jpg'
label_ext = '.png'

# train阶段
# 数据集路径
data_dir = os.path.join("datasets/train_data" + os.sep)
# 原始图片路径
tra_image_dir = os.path.join('images' + os.sep)
# 图片的标签路径
tra_label_dir = os.path.join('masks' + os.sep)

# val阶段
# 数据集类别
num_classes = 4			# 背景+类别数
name_classes = ["background", "class1", "class2","class3"]
# 原始图片路径
images_path = "datasets/test_data/images/"
# 图片的标签路径
gt_dir = "datasets/test_data/masks/"
# 存放推理结果图片的路径
pred_dir = "datasets/test_data/predict_masks/"
predict_label = "datasets/test_data/predict_labels/"
# 存放 miou 计算结果的 图片
miou_out_path = "miou_out_tab"
# 预训练权重
seg_pretrain_u2netp_path = 'saved_models/pretrain_model/segm_u2net.pth'
if not os.path.exists(model_dir):
    os.makedirs(model_dir)

epoch_num = 100
batch_size = 2
train_num = 0
val_num = 0

执行u2net_train.py,开始训练

预测

if __name__ == "__main__":
    #   miou_mode用于指定该文件运行时计算的内容
    #   miou_mode为0代表整个miou计算流程,包括获得预测结果、计算miou。
    #   miou_mode为1代表仅仅获得预测结果。
    #   miou_mode为2代表仅仅计算miou。
    #   分类个数+1、如2+1
    # num_classes = 3
    # name_classes = ["background", "green", "red"]
    num_classes = 4
    name_classes =["background", "class1", "class2","class3"]

    # 原始图片路径
    images_path = "datasets_ButtonCell/test_data/images/"
    # 图片的标签路径
    gt_dir = "datasets_ButtonCell/test_data/masks/"
    # 存放推理结果图片的路径
    pred_dir = "datasets_ButtonCell/test_data/predict_masks/"
    predict_label = "datasets_ButtonCell/test_data/predict_labels/"
    # 存放 miou 计算结果的 图片
    miou_out_path = "miou_out"
    # 模型路径
    model_dir = './saved_models/u2netp/u2netp.pth'
    eval_print_miou(num_classes, name_classes, images_path, gt_dir, pred_dir, predict_label, miou_out_path, model_dir)

执行u2net_val.py,开始训练

torch2onnx.py进行模型转换

引用\[1\]:本课程使用keras版本的U-Net,在Ubuntu系统上用Jupyter Notebook做项目演示。 包括:数据集标注、数据集格式转换和Mask图像生成、编写U-Net程序文件、训练自己的数据集、测试训练出的网络模型、性能评估。 引用\[2\]:内容简介 U2Net算法介绍本博客训练效果截图展示本博客代码框架介绍数据集数据集准备自定义datasetu2netu2netp网络结构定义训练代码模型推理代码总结以及博客代码的Github地址 U2Net算法介绍 引用\[3\]:总结以及博客代码的Github地址 一篇博客写完总归还是要来点总结才完美的! 本篇博客实现的是最基础的训练过程和训练代码,所以你有很多的发挥空间;例如:尝试使用不同的loss函数(dice loss、bce dice loss、iou loss等等)添加数据增强操作(建议使用albumentation库,torchversion也行)使用不同的调参策略训练模型(不同的学习率衰减策略、多阶段训练等等)尝试使用不同的优化器训练模型等等。。。。。等你上述尝试都做过了,你可尝试使用不同的网络,src文件夹内不断丰富不同网络结构优化一下代码的编写,封装一下之类的,哈哈。。总是很多实验可以做,可学习的东西也很多。。最后,希望本篇博客能够给你带来帮助~互相学习~文章代码有不知之处多多包涵! 本博客代码Github地址: https://github.com/YingXiuHe/u2net-pytorch.git/。 回答: 根据引用\[1\]和引用\[2\]的内容,要训练自己的数据集,你可以按照以下步骤进行操作。首先,准备好你的数据集,并进行标注。然后,将数据集转换为适合U-Net模型的格式,并生成Mask图像。接下来,编写U-Net程序文件,包括定义网络结构和训练代码。在训练过程中,你可以尝试不同的loss函数、数据增强操作、调参策略和优化器等。最后,测试训练出的网络模型,并进行性能评估。你可以参考引用\[1\]中提供的代码框架和引用\[3\]中的Github地址,来获取更详细的训练代码和示例。希望这些信息对你有帮助! #### 引用[.reference_title] - *1* [U-Net图像语义分割实战:训练自己的数据集](https://blog.csdn.net/bjcc81227/article/details/100951070)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [U2NetU2NetP分割模型训练---自定义dataset、训练代码训练自己的数据集](https://blog.csdn.net/weixin_38106878/article/details/124307952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值