Windows Yolact实例分割全流程

前言:

        此博客包含源码的配置过程及训练自己模型的过程 本人是在AnaConda 和PyThon进行,网上有很多关于AnaConda 和PyThon的安装方法,这里就不细讲,自己可以上网查阅其他方法。

环境配置过程:

第一步:下载源码

        Yolact源码地址

第二步:配置环境

        下载源码后,首先查看作者的README.md文件,查看作者的环境配置并在本地进行环境的配置。

首先创建一个新的虚拟环境(因为使用的torch不同,最好每一次跑别人代码时,新建环境)
本人实在AnaConda中进行操作

1、在终端输入 conda env list 查看已有环境防止环境 重名

2、创建新的环境 输入 conda create -n 环境名称 python=x.x   (x.x  版本信息我的版本是3.7)

 这里我只截取了部分信息,如果返回   Proceed ([y]/n)?  输入y进行创建。

创建完成后会显示

 3、进入新建环境输入 activate 环境名称 (如上图,红框部分,有的人不需要加  conda)

 查看base是否变为自己新环境的名称 如果改变则切换成功

4、安装源码所需依赖项(有两种方式,我使用的是第二种通过pip进行配置)

在新建的环境下输入(因为已经配置过一遍了,就不再进行安装了):

pip install cython
pip install opencv-python pillow pycocotools matplotlib 

下载torch(最低版本好像是1.0.1有点忘了):

torch官方下载 根据自己电脑的配置进行torch版本的选型

将命令复制到终端进行下载(torch有点大可能会下载失败,多试几次

完成后输入pip list 进行查看是否安装成功(我是在python进行查看  Anaconda输入同样命令也可以查看)

 以上在本环境安装的所有东西(配置阶段)

第三步:下载源码所需的权重文件

下载完成后放入到源码中weights文件(没有就创建weights文件夹并放入)

第四步:测试图片    打开README.md文件找到images

在终端输入命令进行测试(三种不同测试方式  图片)

 我的效果:

 第五步:测试视频    打开README.md文件找到Video

 这里我就不放演示效果了

训练自己的模型:

第一步:安装labelme标注工具

labelme工具也需要新建一个环境,上面已经写过环境创建的详细过程了这里就不写了(环境创建过程中第二部 前3小步   这里我的python版本是3.6)

创建新环境后安装labelme所需的依赖项:

在终端输入 pip install pyqt5  进行安装

 出现下面红框内容则安装成功

在输入 pip install labelme 进行labelme的安装

 出现上面内容则安装成功。

安装完成后直接在终端输入labelme就可以打开了

 出现页面则打开成功。

第二步:因为此源码是在COCO数据集的基础上进行训练,但是labelme保存的却是json文件格式,还需要将json文件转换为COCO格式

获取源码 json转coco   ,获取源码后需要安装 sklearn 直接 pip install sklearn 进行安装(安装在新建的labelme环境下)

import os
import json
import numpy as np
import glob
import shutil
from sklearn.model_selection import train_test_split
np.random.seed(41)

#0为背景, 修改为自己的类别信息    多一个类别(背景)
classname_to_id = {"1": 1,"2":2}

class Lableme2CoCo:

    def __init__(self):
        self.images = []
        self.annotations = []
        self.categories = []
        self.img_id = 0
        self.ann_id = 0

    def save_coco_json(self, instance, save_path):
        json.dump(instance, open(save_path, 'w', encoding='utf-8'), ensure_ascii=False, indent=1)  # indent=2 更加美观显示

    # 由json文件构建COCO
    def to_coco(self, json_path_list):
        self._init_categories()
        for json_path in json_path_list:
            obj = self.read_jsonfile(json_path)
            self.images.append(self._image(obj, json_path))
            shapes = obj['shapes']
            for shape in shapes:
                annotation = self._annotation(shape)
                self.annotations.append(annotation)
                self.ann_id += 1
            self.img_id += 1
        instance = {}
        instance['info'] = 'spytensor created'
        instance['license'] = ['license']
        instance['images'] = self.images
        instance['annotations'] = self.annotations
        instance['categories'] = self.categories
        return instance

    # 构建类别
    def _init_categories(self):
        for k, v in classname_to_id.items():
            category = {}
            category['id'] = v
            category['name'] = k
            self.categories.append(category)

    # 构建COCO的image字段
    def _image(self, obj, path):
        image = {}
        from labelme import utils
        img_x = utils.img_b64_to_arr(obj['imageData'])
        h, w = img_x.shape
        image['height'] = h
        image['width'] = w
        image['id'] = self.img_id
        image['file_name'] = os.path.basename(path).replace(".json", ".jpg")
        return image

    # 构建COCO的annotation字段
    def _annotation(self, shape):
        label = shape['label']
        points = shape['points']
        annotation = {}
        annotation['id'] = self.ann_id
        annotation['image_id'] = self.img_id
        annotation['category_id'] = int(classname_to_id[label])
        annotation['segmentation'] = [np.asarray(points).flatten().tolist()]
        annotation['bbox'] = self._get_box(points)
        annotation['iscrowd'] = 0
        annotation['area'] = 1.0
        return annotation

    # 读取json文件,返回一个json对象
    def read_jsonfile(self, path):
        with open(path, "r", encoding='utf-8') as f:
            return json.load(f)

    # COCO的格式: [x1,y1,w,h] 对应COCO的bbox格式
    def _get_box(self, points):
        min_x = min_y = np.inf
        max_x = max_y = 0
        for x, y in points:
            min_x = min(min_x, x)
            min_y = min(min_y, y)
            max_x = max(max_x, x)
            max_y = max(max_y, y)
        return [min_x, min_y, max_x - min_x, max_y - min_y]


if __name__ == '__main__':

    # json文件的名称是自己定义的  图片文件夹名称本源码 是jpg   你可以自己做一下修改

    #路径就按我的方式来改,
    #之前路径 COCO/json/*.json  路径一直报错 COCO/json\\27.json
    #设置为/*.json  输出结果显示 \\27.json  咱也不知道为啥 
    #后来又试了一下又好了,就挺莫名其妙的 
    labelme_path = r"COCO\json\\*.json"   # 此处根据你的数据集地址来修改
    saved_coco_path = r"COCO\\"  #保存地址

    # 创建文件
    if not os.path.exists("%scoco/annotations/"%saved_coco_path):
        os.makedirs("%scoco/annotations/"%saved_coco_path)
    if not os.path.exists("%scoco/images/train2017/"%saved_coco_path):
        os.makedirs("%scoco/images/train2017"%saved_coco_path)
    if not os.path.exists("%scoco/images/val2017/"%saved_coco_path):
        os.makedirs("%scoco/images/val2017"%saved_coco_path)
    # 获取images目录下所有的joson文件列表
    json_list_path = glob.glob(labelme_path)
    print("json_list_path:",json_list_path)
    # 数据划分,这里没有区分val2017和tran2017目录,所有图片都放在images目录下
    train_path, val_path = train_test_split(json_list_path, test_size=0.12)
    # print("train_n:", len(train_path), 'val_n:', len(val_path))

    # 把训练集转化为COCO的json格式
    l2c_train = Lableme2CoCo()
    train_instance = l2c_train.to_coco(train_path)
    l2c_train.save_coco_json(train_instance, '%scoco/annotations/instances_train2017.json'%saved_coco_path)

    for file in train_path:
        # print("file_1:", file)
        # print("saved_coco_path_train:", saved_coco_path)
        shutil.copy(file.replace("json","jpg"),"%scoco/images/train2017/"%saved_coco_path)

    for file in val_path:
        # print("file_2:", file)
        # print("saved_coco_path_val:", saved_coco_path)
        shutil.copy(file.replace("json","jpg"),"%scoco/images/val2017/"%saved_coco_path)

    # 把验证集转化为COCO的json格式
    l2c_val = Lableme2CoCo()
    val_instance = l2c_val.to_coco(val_path)
    l2c_val.save_coco_json(val_instance, '%scoco/annotations/instances_val2017.json'%saved_coco_path)

运行结束后,会生成一个coco文件夹,里面包含图片和json文件,将保存的coco文件夹放入到Yolact源码中data文件夹下

第三步:修改源码中的配置训练自己的模型

打开 data 文件夹下的 config.py 文件 

修改类别信息  COCO_CLASSES和COCOCABEL_MAP

 修改数据集地址dataset_base

修改网络的配置信息 coco_base_config   (一共有两个按先后顺序来)

第一个:

第二个就是调用第一个,这个里面的max_iter才是控制次数:

第四步:添加所需的.pth文件

有的人下载可能会出现问题,我就提前下载好了,直接点击链接可以进行下载

权重网盘链接: 提取码:1yez

下载完成后将下载的权重放入到 weights文件中(没有就创建) 

第五步:进行训练

输入以下命令进行训练():

python train.py --config=yolact_base_config   

可能会出现的报错(这里我就直接写报错信息了和解决方法了):
     

  1、这是因为自己电脑的gpu设备不足造成的

          

       解决:打开train.py文件 找到num_workers 将default修改为自己使用gpu的数量

 2、期望一个“cuda”设备类型的发电机,但发现“cpu”  

 这里我在网上看到很多方法,有效的我只知道一个

 将我们分配数据集时shuffle=True参数修改为 shuffle=False 这样就解决了

3、cuda内存不足,这个问题很好解决,在train.py文件找到

解决方法 改一下每批次图片数量就可以了(刚开始忘了,搞着东西搞了3个小时.......):
 

建议使用这条命令进行训练:

python train.py --config=yolact_darknet53_config --batch_size=4 --cuda=True
 

效果展示(每进行2批次进行一次计算,根据次数进行修改我没仔细看,自己可以尝试修改一下):

第六步:修改其它网络结构进行训练:

1、打开data目录下的config文件 找到黄框位置:

 yolact_base_config 就是我们刚刚所选的配置,backbon就是我们选择的网络结构 ,默认是resnet101_backbone 

举个栗子:下面还有其他的 yolact_base_config   如 yolact_darknet53_config

找到 resnet50_backbone 

 里面包含详细信息,如path 所需的.pth文件  这样就知道所需的.pth文件了并把文件放入到weights文件夹中 

至于其他网络结构的模型就不要问我了没我也不知道在哪里..................

参考:

Yolact训练自己的数据集_Make AI,Not War-CSDN博客

实例分割标注软件labelme的安装_木子爱学习的博客-CSDN博客_实例分割标注

YOLACT是一种基于Mask RCNN的实例分割模型,用于对图像中的不同物体进行分割和识别。在实际应用中,对于特定的任务,训练提供专门的数据集可以提高模型精度。因此,训练YOLACT实例分割模型自己的数据十分重要。 首先,需要收集并整理自己的数据集。数据集中需要包括原始图像、标注文件以及训练集和验证集文件夹。标注文件用于定义每个对象的边界框和类别。建议使用标准格式,如COCO等。 接下来,需要安装YOLACT模型,可以使用pytorch框架进行安装,并下载相应的预训练模型和数据集。其次,需要根据自己的需求进行训练数据集和验证数据集的划分,通常训练集和验证集的比例是7:3。 在训练模型之前,需要设置好超参数和模型的配置,例如学习率、损失函数和训练轮次等。可以通过修改训练配置文件来实现。 然后,利用命令行命令开始训练模型,对于自己的数据集,需要指定数据集路径,同时设置模型权重保存路径和日志保存路径等。 训练完成后,可以进行模型测试。可以使用训练好的模型来对新的图像进行实例分割,并可以将结果进行可视化展示。在测试结果过程中,可以根据需要微调模型参数,以达到更好的性能。 总之,训练YOLACT实例分割模型自己的数据需要一系列步骤和技术,需要合理安排和执行,以获得更好的实例分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值