使用mmyolo检测工具箱,完成yolo系列算法的训练,包括环境的搭建及yolo系列算法的配置文件等。

mmyolo官方地址:https://github.com/open-mmlab/mmdeploy

相关文档:​​​​​​​ https://github.com/open-mmlab/mmdeploy/blob/dev-1.x/docs/zh_cn/get_started.md

一、环境搭建

1.创建虚拟环境

conda create --name mmyolo python=3.8 -y

激活虚拟环境:

conda activate mmyolo

2.安装pytorch、torchvision

根据自己的配置安装相应版本

pip install torch==1.7.1+cu101 torchvision==0.8.2+cu101 -f https://download.pytorch.org/whl/torch_stable.html

或手动下载,地址:https://download.pytorch.org/whl/torch_stable.html

3.下载I MMEngine 、 MMCV和MMDET3.x

pip install -U openmim
mim install mmengine
mim install 'mmcv>=2.0.0rc1'
mim install "mmdet>=3.0.0rc5,<3.1.0"4.下载mmyolo并编译
git clone https://github.com/open-mmlab/mmyolo.git
cd mmyolo
# Install albumentations
pip install -r requirements/albu.txt
# Install MMYOLO
mim install -v -e .

二、训练yolo系列算法(以yolo6和yolox为例)

yolo5~yolo8训练的config大致相同,yolox略有不同

1.构造数据集

使用coco格式数据集进行训练,使用labelme标注,然后使用如下代码进行转换:

# -*- coding:utf-8 -*-
# !/usr/bin/env pythonimport argparse
import json
import matplotlib.pyplot as plt
import skimage.io as io
import cv2
from labelme import utils
import numpy as np
import glob
import PIL.Imageclass MyEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, np.integer):return int(obj)elif isinstance(obj, np.floating):return float(obj)elif isinstance(obj, np.ndarray):return obj.tolist()else:return super(MyEncoder, self).default(obj)class labelme2coco(object):def __init__(self, labelme_json=[], save_json_path='./tran.json'):''':param labelme_json: 所有labelme的json文件路径组成的列表:param save_json_path: json保存位置'''self.labelme_json = labelme_jsonself.save_json_path = save_json_pathself.images = []self.categories = []self.annotations = []# self.data_coco = {}self.label = []self.annID = 1self.height = 0self.width = 0self.save_json()def data_transfer(self):for num, json_file in enumerate(self.labelme_json):with open(json_file, 'r') as fp:data = json.load(fp) # 加载json文件self.images.append(self.image(data, num))for shapes in data['shapes']:label = shapes['label']if label not in self.label:self.categories.append(self.categorie(label))self.label.append(label)points = shapes['points']#这里的point是用rectangle标注得到的,只有两个点,需要转成四个点#points.append([points[0][0],points[1][1]])#points.append([points[1][0],points[0][1]])self.annotations.append(self.annotation(points, label, num))self.annID += 1def image(self, data, num):image = {}img = utils.img_b64_to_arr(data['imageData']) # 解析原图片数据# img=io.imread(data['imagePath']) # 通过图片路径打开图片# img = cv2.imread(data['imagePath'], 0)height, width = img.shape[:2]img = Noneimage['height'] = heightimage['width'] = widthimage['id'] = num + 1#image['file_name'] = data['imagePath'].split('/')[-1]image['file_name'] = data['imagePath'][3:14]self.height = heightself.width = widthreturn imagedef categorie(self, label):categorie = {}categorie['supercategory'] = 'Cancer'categorie['id'] = len(self.label) + 1 # 0 默认为背景categorie['name'] = labelreturn categoriedef annotation(self, points, label, num):annotation = {}annotation['segmentation'] = [list(np.asarray(points).flatten())]annotation['iscrowd'] = 0annotation['image_id'] = num + 1# annotation['bbox'] = str(self.getbbox(points)) # 使用list保存json文件时报错(不知道为什么)# list(map(int,a[1:-1].split(','))) a=annotation['bbox'] 使用该方式转成listannotation['bbox'] = list(map(float, self.getbbox(points)))annotation['area'] = annotation['bbox'][2] * annotation['bbox'][3]# annotation['category_id'] = self.getcatid(label)annotation['category_id'] = self.getcatid(label)#注意,源代码默认为1annotation['id'] = self.annIDreturn annotationdef getcatid(self, label):for categorie in self.categories:if label == categorie['name']:return categorie['id']return 1def getbbox(self, points):# img = np.zeros([self.height,self.width],np.uint8)# cv2.polylines(img, [np.asarray(points)], True, 1, lineType=cv2.LINE_AA) # 画边界线# cv2.fillPoly(img, [np.asarray(points)], 1) # 画多边形 内部像素值为1polygons = pointsmask = self.polygons_to_mask([self.height, self.width], polygons)return self.mask2box(mask)def mask2box(self, mask):'''从mask反算出其边框mask:[h,w] 0、1组成的图片1对应对象,只需计算1对应的行列号(左上角行列号,右下角行列号,就可以算出其边框)'''index = np.argwhere(mask == 1)rows = index[:, 0]clos = index[:, 1]# 解析左上角行列号left_top_r = np.min(rows) # yleft_top_c = np.min(clos) # x# 解析右下角行列号right_bottom_r = np.max(rows)right_bottom_c = np.max(clos)return [left_top_c, left_top_r, right_bottom_c - left_top_c,right_bottom_r - left_top_r] # [x1,y1,w,h] 对应COCO的bbox格式def polygons_to_mask(self, img_shape, polygons):mask = np.zeros(img_shape, dtype=np.uint8)mask = PIL.Image.fromarray(mask)xy = list(map(tuple, polygons))PIL.ImageDraw.Draw(mask).polygon(xy=xy, outline=1, fill=1)mask = np.array(mask, dtype=bool)return maskdef data2coco(self):data_coco = {}data_coco['images'] = self.imagesdata_coco['categories'] = self.categoriesdata_coco['annotations'] = self.annotationsreturn data_cocodef save_json(self):self.data_transfer()self.data_coco = self.data2coco()# 保存json文件json.dump(self.data_coco, open(self.save_json_path, 'w'), indent=4, cls=MyEncoder)
labelme_json = glob.glob('./Annotations/*.json')
labelme2coco(labelme_json, './json/test.json')

或参考:https://github.com/open-mmlab/mmyolo/blob/main/docs/en/user_guides/custom_dataset.md

2.写yolov6、yolox的配置文件

新建一个名为 yolov6.py 的配置文件

新建位置自定,本人为:configs/custome/yolov6.py:

_base_ = '/home/work/mmyolo-dev/configs/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py'
max_epochs = 100
data_root = '/home/work/YOLO_presearch/20230130/' #coco数据地址
work_dir = './work_dirs/yolov6' #保存模型路径
#load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035-932e1d91.pth'#根据需要注释
train_batch_size_per_gpu = 4
train_num_workers = 4  # train_num_workers = nGPU x 4
save_epoch_intervals = 2
# base_lr_default * (your_bs / default_bs)
base_lr = 0.01 / 4
class_name = ('tou','chaxiao','ding','zd','noding')
num_classes = len(class_name)
metainfo = dict(classes=class_name, palette=[(220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230), (106, 0, 228)])
train_cfg = dict(max_epochs=max_epochs,val_begin=20,val_interval=save_epoch_intervals,dynamic_intervals=[(max_epochs - _base_.num_last_epochs, 1)])
model = dict(bbox_head=dict(head_module=dict(num_classes=num_classes)),train_cfg=dict(initial_assigner=dict(num_classes=num_classes),assigner=dict(num_classes=num_classes)))
train_dataloader = dict(batch_size=train_batch_size_per_gpu,num_workers=train_num_workers,dataset=dict(_delete_=True,type='RepeatDataset',times=1,dataset=dict(type=_base_.dataset_type,data_root=data_root,metainfo=metainfo,ann_file='annotations/train.json',data_prefix=dict(img='images/'),filter_cfg=dict(filter_empty_gt=False, min_size=32),pipeline=_base_.train_pipeline)))
val_dataloader = dict(dataset=dict(metainfo=metainfo,data_root=data_root,ann_file='annotations/val.json',data_prefix=dict(img='images/')))ann_file='annotations/val.json',data_prefix=dict(img='images/')))
test_dataloader = val_dataloader
val_evaluator = dict(ann_file=data_root + 'annotations/val.json')
test_evaluator = val_evaluator
optim_wrapper = dict(optimizer=dict(lr=base_lr))
default_hooks = dict(checkpoint=dict(type='CheckpointHook',interval=save_epoch_intervals,max_keep_ckpts=5,save_best='auto'),param_scheduler=dict(max_epochs=max_epochs),logger=dict(type='LoggerHook', interval=10))
custom_hooks = [dict(type='EMAHook',ema_type='ExpMomentumEMA',momentum=0.0001,update_buffers=True,strict_load=False,priority=49),dict(type='mmdet.PipelineSwitchHook',switch_epoch=max_epochs - _base_.num_last_epochs,switch_pipeline=_base_.train_pipeline_stage2)
]

新建一个名为 yolox.py 的配置文件

新建位置自定,本人为:configs/custome/yolox.py:

_base_ = '/home/work/mmyolo-dev/configs/yolox/yolox_m_fast_8xb8-300e_coco.py'
max_epochs = 100  # 训练的最大 epoch
data_root = '/home/work/YOLO_presearch/20230130/'  # 数据集目录的绝对路径
work_dir = './work_dirs/yolox'
train_batch_size_per_gpu = 2
train_num_workers = 2
save_epoch_intervals = 2
base_lr = 0.01 / 4
anchors = [ [(68, 69), (154, 91), (143, 162)],  # P3/8[(242, 160), (189, 287), (391, 207)],  # P4/16[(353, 337), (539, 341), (443, 432)]  # P5/32]
class_name = ('tou','huan','chaxiao','ding','zd')
num_classes = len(class_name)
metainfo = dict(classes=class_name,palette=[(220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230), (106, 0, 228)]
)

3、运行

mmyolo训练yolov5~ppyoloe相关推荐

  1. 在自定义的数据集上训练YOLOv5详细教程分享

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 YOLO系列的目标检测模型随着YOLOv5的引入变得越来越强大了. ...

  2. 目标检测第8步:如何在Windows10系统下,训练YOLOv5 5.0自定义数据集?(本地)

    请先看这篇文章:                        本博打开方式!!!请详读!!!请详读!!!请详读!!!_Cat-CSDN博客 很多刚入门的粉丝私信我说,他们的电脑配置很好,想在本地训练 ...

  3. 使用visDrone数据集训练yolov5检测器

    yolov5目标检测具备一定的小目标检测能力,但由于参与训练的coco数据集缺少小目标素材,故检测小目标有局限.本文利用无人机采集的小目标数据集,对yolov5权重文件进行再训练,提高小目标检测能力. ...

  4. AI 图片截取、ffmpeg使用及安装, anaconda环境,图片标注(labelme),模型训练(yolov5),CUDA+Pytorch安装及版本相关问题

    AI 图片截取(ffmpeg), anaconda环境,图片标注(labelme),模型训练(yolov5),CUDA+Pytorch安装及版本相关问题 一.截取有效图片 录制RTSP视频脚本 #!/ ...

  5. coco128训练YOLOv5

    提示:coco128数据集.yolov5s.colab 用coco128训练YOLOv5 一.下载三个文件 1.YOLOv5-master 2.coco128数据集 3.权重文件 二.使用colab ...

  6. 租用服务器,以及部署在pycharm专业版上的pytorch环境训练yolov5模型教程服务器环境安装库文件:

    租用服务器,以及部署在pycharm专业版上的pytorch环境训练yolov5模型教程服务器环境安装库文件: 一.租用服务器选择环境: 1. 租用服务器网站 2. 选择1.8的pytorch环境,点 ...

  7. 如何在自定义的数据集上训练YOLOv5

    YOLO系列的目标检测模型随着YOLOv5的引入变得越来越强大了.在这篇文章中,我们将介绍如何训练YOLOv5为你识别自己定制的对象. 本文我们使用公共血细胞检测数据集,你可以自己导出,也可以在自己自 ...

  8. CityScapes数据集转voc数据格式训练yolov5(含下载链接)

    CityScapes数据集转voc数据格式训练yolov5(含下载链接) 1.CityScapes数据集数据格式: 2.数据处理 3.CityScapes数据集转VOC格式转换代码 CityScape ...

  9. 【目标检测实验系列】AutoDL线上GPU服务器租用流程以及如何用Pycharm软件远程连接服务器进行模型训练 (以Pycharm远程训练Yolov5项目为例子 超详细)

    目录 1. 文章主要内容 2. 租用AutoDL服务器详细教程 2.1 注册AutoDL账号,并申请学生认证(学生认证有优惠,如果不是学生可以忽略此点) 2.2 算力市场选择GPU,并选择初始化配置环 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(二十七) - 卷积神经网络(CNN)
  2. awk使用shell中的变量
  3. Java黑皮书课后题第7章:**7.24(仿真:优惠券收集问题)优惠券收集问题是一个经典的统计问题。编写程序,模拟要得到四张不同花色的牌所需要的选取次数,然后显示选中的四张牌
  4. Cloudstack部署
  5. 因为你的电脑安装了即点即用_即你所爱
  6. C语言程序设计上机前三题,C语言程序设计(含上机实验与习题解答)
  7. HTML列表标记符有哪些,在HTML中,表格标记符为( )
  8. iphone:MKMapView
  9. 程序员,你可以更优秀些!加油!
  10. go interface 转 string_跟我一起学习go语言,map「string」interface「」代码示例
  11. NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并
  12. 分布式系列九: kafka
  13. 项目总结一:情感分类项目(emojify)
  14. 2022年整理LeetCode最新刷题攻略分享(附中文详细题解)
  15. 10HTML5期末大作业:影视在线网站设计——电影网H5(9页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  16. Matlab fftshift and ifftshift and some confusions
  17. CDLINUX——minidwep-gtk
  18. 新装的服务器发布iis网站后提示500.19错误代码:0x8007000d问题的解决过程
  19. spring + springmvc +mybatis 搭建 maven 项目的核心配置文件
  20. [shell] sed 插入多行文本

热门文章

  1. 华大开发板SW失效,无法下载程序
  2. 2019-06-17问答系统项目落地调研
  3. 网上购车平台上私户,不一样的上私户购车体验
  4. AML8726调试记录
  5. 《塞尔达传说:旷野之息》技术分析:游戏神作是怎么炼成的
  6. 我是培训机构出身的程序员,但不敢告诉任何人 !
  7. 探索者TSSD打印比例及绘图比例理解
  8. 大学matlab选择试题和答案,Matlab与信息处理-中国大学mooc-试题题目及答案
  9. Linux安装Git(真的超简单)
  10. 修复lsp,360浏览器可以上网其它软件不行