前言:
此博客包含源码的配置过程及训练自己模型的过程 本人是在AnaConda 和PyThon进行,网上有很多关于AnaConda 和PyThon的安装方法,这里就不细讲,自己可以上网查阅其他方法。
环境配置过程:
第一步:下载源码
第二步:配置环境
下载源码后,首先查看作者的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文件夹中
至于其他网络结构的模型就不要问我了没我也不知道在哪里..................
参考: