mmdetection3.1.0 训练自己的数据集

news2024/12/26 23:10:16

目录

  • 前言
  • 安装mmcv
  • 安装mmdetection
  • 验证安装
  • 数据集
    • 转为COCO
    • 划分训练集、验证集及测试集
      • 安装PaddlePaddle
      • 安装PaddleX
      • 划分数据集
  • 修改对应文件
    • 修改coco.py
    • 重新安装
    • 修改模型文件
  • 训练
  • 测试
    • 测试带真值的图像
    • 测试不带真值的图像
      • 批量测试
  • 错误集锦
    • ValueError: need at least one array to concatenate
    • Downgrade the protobuf package

前言

去年打比赛期间,深入学习了mmdetection框架,今年有个项目着急看效果,在A100服务器上重新安装了mm,发现已经是3.X版本了,改动了一些函数,故重新记录一下。

安装mmcv

pip install -U openmim
mim install mmengine
mim install "mmcv>=2.0.0"

安装mmdetection

git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
pip install -v -e .
# "-v" means verbose, or more output
# "-e" means installing a project in editable mode,
# thus any local modifications made to the code will take effect without reinstallation.

验证安装

mim download mmdet --config rtmdet_tiny_8xb32-300e_coco --dest .
python demo/image_demo.py demo/demo.jpg rtmdet_tiny_8xb32-300e_coco.py --weights rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth --device cpu

出现下图,则证明安装成功

在这里插入图片描述

数据集

数据集采用的是布匹瑕疵检测的数据集,

转为COCO

首先将下载后的标签文件转为COCO格式


import json
from tqdm import tqdm
import cv2, os
from glob import glob
from collections import defaultdict

base_dirs = ['/home/xray/guangdong1_round1/', ]
            

mp = {"破洞": 1, "水渍": 2, "油渍": 2, "污渍": 2,  "三丝": 3, "结头": 4, "花板跳": 5, "百脚": 6, "毛粒": 7,
      "粗经": 8, "松经": 9, "断经": 10, "吊经": 11, "粗维": 12, "纬缩": 13, "浆斑": 14, "整经结": 15, "星跳": 16, "跳花": 16,
      "断氨纶": 17, "稀密档": 18, "浪纹档": 18, "色差档": 18, "磨痕": 19, "轧痕": 19, "修痕":19, "烧毛痕": 19, "死皱": 20,
      "云织": 20, "双纬": 20, "双经": 20, "跳纱": 20, "筘路": 20, "纬纱不良": 20
      }


def make_coco_traindataset(images2annos, name='train'):

    idx = 1
    image_id = 20190000000
    images = []
    annotations = []

    for im_name in tqdm(images2annos):

#         im = cv2.imread(base_dir + 'defect_Images/' + im_name)
#         h, w, _ = im.shape
        h, w = 1000, 2446
        image_id += 1
        image = {'file_name': im_name, 'width': w, 'height': h, 'id': image_id}
        images.append(image)

        annos = images2annos[im_name]
        for anno in annos:
            bbox = anno[:-1]
            seg = [bbox[0], bbox[1], bbox[0], bbox[3],
                   bbox[2], bbox[3], bbox[2], bbox[1]]

            bbox = [bbox[0], bbox[1], bbox[2] - bbox[0], bbox[3] - bbox[1]]
            anno_ = {'segmentation': [seg], 'area': bbox[2] * bbox[3], 'iscrowd': 0, 'image_id': image_id,
                   'bbox': bbox, 'category_id': anno[-1], 'id': idx, 'ignore': 0}
            idx += 1
            annotations.append(anno_)

    ann = {}
    ann['type'] = 'instances'
    ann['images'] = images
    ann['annotations'] = annotations
    category = [{'supercategory':'none', 'id': id, 'name': str(id)} for id in range(1, 21)]
    ann['categories'] = category
    json.dump(ann, open(base_dir + '{}.json'.format(name),'w'))

for idx, base_dir in enumerate(base_dirs, 1):
    annos = json.load(open(base_dir + 'Annotations/anno_train.json'))
    images2annos = defaultdict(list)
    for anno in annos:
        images2annos[anno['name']].append(anno['bbox'] + [mp[anno['defect_name']]])
    make_coco_traindataset(images2annos, 'train' + str(idx))

划分训练集、验证集及测试集

采用的是paddleX工具进行划分,比例为7:2:1

安装PaddlePaddle

python -m pip install paddlepaddle-gpu==2.2.2 -i https://mirror.baidu.com/pypi/simple

安装PaddleX

pip install paddlex -i https://mirror.baidu.com/pypi/simple

划分数据集

paddlex --split_dataset --format COCO --dataset_dir D:/MyDataset --val_value 0.2 --test_value 0.1

修改对应文件

修改coco.py

路径 /mmdetection/mmdet/dataset/coco.py
将类别修改为自己的类别名称。
在这里插入图片描述

重新安装

重新执行下述命令,修改才会生效。

pip install -v -e .

修改模型文件

ctrl+F 查找 num_classes, 改为自己数据集的类别数量,不需要加背景

训练

python tools/train.py \
    ${CONFIG_FILE} \
    [optional arguments]

测试

测试带真值的图像

将测试结果保存到文件夹中

python tools/test.py \
    configs/rtmdet/rtmdet_l_8xb32-300e_coco.py \
    checkpoints/rtmdet_l_8xb32-300e_coco_20220719_112030-5a0be7c4.pth \
    --show-dir faster_rcnn_r50_fpn_1x_results

测试不带真值的图像

批量测试

Todo

错误集锦

ValueError: need at least one array to concatenate

解决方案: 修改coco.py文件对应的类别

Downgrade the protobuf package

If you cannot immediately regenerate your protos, some other possible workarounds are: 1. Downgrade the protobuf package to 3.20.x or lower. 2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).

解决方案:
卸载原有的
重新安装低版本的

pip uninstall protobuf

pip install protobuf==3.20.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/767053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式 ~ 发布订阅者

发表订阅者模式 用于实现对象之间的松耦合通信; 在该模式中,存在一个或多个发布者(Publishers)和一个或多个订阅者(Subscribers); 发布者负责发布消息,而订阅者负责订阅感兴趣的消息…

C++中的“三重”

博文内容:重载、重定义(隐藏),重写(覆盖) 三重区别及联系 概念联系及区别1、作用域2、函数要求 概念 重载 函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同。 …

如何应对黑产进行验证图片资源遍历

第一期,我们分享的攻防点是:验证图片资源遍历。 “遍历”指黑产通过穷举法获得所有验证码图片的答案,以便能在未来彻底无视验证码。由于验证码主要是通过图片语义答案来识别人机,因此攻破这层防御最有效的方式就是遍历该验证码图…

【电路原理学习笔记】第4章:能量与功率:4.4 能量转换与电阻的电压降

第4章:能量与功率 4.4 能量转换与电阻的电压降 图4-11以电子作为电荷进行举例说明,电子从电池的负极流过电路,然后流回正极。当它们从负极出来时,电子具有最高的能量水平。电子流经过每个电阻,这些电阻连接在一起形成…

微信要怎么定时自动发布朋友圈呢?

大家都知道,朋友圈营销在当今十分重要。对于那些做了私域的人来说,他们知道这可以给自己带来多少的收益。最近,很多客户都纷纷向我咨询朋友圈发圈的问题。客户们认为朋友圈多号操作很费事,拥有多个号容易漏发;若看到同…

【Ceph集群应用】Ceph对象存储系统之RGW接口详解

Ceph对象存储系统之RGW接口详解 1.创建Ceph对象存储系统RGW接口2. 开启httphttps,更改监听端口3. 更改监听端口4.S3接口访问测试5.实验中遇到的故障案例 接上文基于ceph-deploy部署Ceph集群详解 1.创建Ceph对象存储系统RGW接口 (1)对象存储概念 对象存…

【C语言】杨氏矩阵中寻找元素

题目名称: 杨氏矩阵 题目内容: 有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从下到上递增的(杨氏矩阵的定义),请编写程序在这样的矩阵中查找某个数字是否存在。 形如这样的矩阵就是杨氏…

基于51单片机和proteus的八路抢答器系统

此系统是基于51单片机和proteus的仿真设计,功能如下: 1. 分别采集八路抢答器按键输入信号和系统按键信号。 2. 检测到按键输入后蜂鸣器发出提示音。 3. 数码管显示八路中首次按下的按键。 4. 重置按键可重置系统,重新抢答。 功能框图如下…

【文生图系列】stable diffusion webui 汉化(双语)教程

文章目录 安装双语插件下载json源文件设置双语 这篇博文记录于我成功安装双语插件之后,所以以下的示例页面均是双语。汉化教程分为三步,安装插件,JSON源文件下载和最后一步的双语设置。 安装双语插件 在扩展(extensions&#xf…

HCIA作业(一)

题目 实现Client1能够通过域名www.baidu.com来获取Serverlet1(Http服务器)所放置的文件 配置信息 Servlet1配置: PC1配置: PC2配置: Client1配置: Servlet2配置: AR1配置: 结果

ceph集群(二)

ceph 一、资源池 Pool 管理二、创建 CephFS 文件系统 MDS 接口三、创建 Ceph 块存储系统 RBD 接口四、创建 Ceph 对象存储系统 RGW 接口五、OSD 故障模拟与恢复 一、资源池 Pool 管理 上次我们已经完成了 Ceph 集群的部署,但是我们如何向 Ceph 中存储数据呢&#x…

problem(1):VMware网络虚拟编辑器添加VMnet0+IDA远程调试

VMware网络虚拟编辑器添加VMnet0 桥接模式:由于VMnet0是跟桥接模式有关系的,是ping通的条件,所以很重要。是IDA远程调试的 关键(remote window debugger) NAT模式:外部网络(桥接模式&#xff…

Pyhon:串口应用及数据解析过程

Pyhon:串口应用及数据解析过程 串口通信是一种常用的通信协议,本文重点记录在Python中使用串口,并且以一款电源保护板的串口数据协议为例,对其进行解析,记录收发过程中对16进制数据进行转换的过程。 1. 调用串口 在Python中进行…

浅谈HTTPS抓包原理,为什么Charles能够抓取HTTPS报文?

Charles作用其实相当于拦截器,当客户端和服务器通信时,Charles其实会先接收到服务器的证书,但是它会自己生成一个证书发送给客户端(不管是Web端或App应用),也就是说它不仅仅是拦截,甚至还可以修改。 由于Charles更改了…

[数据结构 -- 手撕排序算法第六篇] 递归实现快速排序(集霍尔版本,挖坑法,前后指针法为一篇的实现方法,很能打)

目录 1、常见的排序算法 1.1 交换排序基本思想 2、快速排序的实现方法 2.1 基本思想 3 hoare(霍尔)版本 3.1 实现思路 3.2 思路图解 3.3 为什么实现思路的步骤2、3不能交换 3.4 hoare版本代码实现 3.5 hoare版本代码测试 4、挖坑法 4.1 实现…

SpringCloud(六)Config配置中心

一、配置中心 官方文档:**https://docs.spring.io/spring-cloud-config/docs/current/reference/html/ 经过前面的学习,我们对于一个分布式应用的技术选型和搭建已经了解得比较多了,但是如果我们的微服务项目需要部署很多个实例&#xff0c…

基于时域特征和频域特征组合的敏感特征集,再利用SVM或KNN传统分类器进行轴承故障诊断(python编程,代码有详细注释)

1.文件夹介绍(使用的是CWRU数据集) 0HP-3HP四个文件夹装载不同工况下的内圈故障、外圈故障、滚动体故障和正常轴承数据。 这里以打开0HP文件为例进行展示,creat_data.py是处理原始数据的脚本,负责将原始数据切不重叠割成1024的固…

postgresql导入导出数据库的一些问题

新建一个数据库 别忘了添加空间数据的扩展 备份之前的数据库 注意一定要自定义表,去掉 spatial_ref_sys ,要不然需要先drop在创建,可能会报错。 一般不会去导函数,如果有个别自己创建的函数可以手动复制一下,全部导的话…

联合接地的概念和优势——通信设备的“保命秘籍”

夏日炎炎,强对流天气多发,雷电灾害也需要引起关注。雷电是大气中的超长距离放电过程。雷电有着强大的电流、炙热的高温、强烈的电磁辐射以及猛烈的冲击波,这让其能够瞬间变身“无敌破坏王”,造成雷电灾害。如若强大的瞬间过电压冲…

【Python爬虫开发基础⑭】Scrapy架构(组件介绍、架构组成和工作原理)

🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~ 💡往期推荐: ⭐️前面比较重要的基础内容: 【Python爬…