Windows Yolact实例分割全流程

Windows Yolact实例分割全流程,第1张

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.json
    #设置为/*.json  输出结果显示 .json  咱也不知道为啥 
    #后来又试了一下又好了,就挺莫名其妙的 
    labelme_path = r"COCOjson\*.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博客_实例分割标注

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5071368.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存