此博客包含源码的配置过程及训练自己模型的过程 本人是在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博客_实例分割标注
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)