首页 > 其他分享 >基于YOLO-V3训练自己的数据与任务

基于YOLO-V3训练自己的数据与任务

时间:2023-08-03 22:12:26浏览次数:39  
标签:name 训练 标签 YOLO custom json V3 path data

目录

本文在YOLO-V3的基础上实现了把官方的coco数据集换成自己(的人、口罩二分类)的目标检测任务。训练自己的数据,并完成预测。

1.用labelme为数据打标签

  • 需提前pip install labelme;pyqt5; pillow。然后在Anaconda prompt中输入labelme进入标记数据页面,如下图:
  • 导入图片文件夹,右键选择矩形标注(注意标注时从左上角到右下角)点击上图的create polygons标注我们的数据,标注完成后并保存会生成.json文件,如下图:

2.写好模型所需的配置文件

(1)设置自己的分类数

  • 需要在create_custom_model.sh文件中把原来coco数据集的80分类改为现在的2分类,首先下载git(https://git-scm.com/ ),右键出现Git Bash Here,点击进入,输入bash create_custom_model.sh 2 (后面的数字表示你的任务的类别个数)如下图:

(2)自动生成配置文件yolov3-custom.cfg

  • 与yolov3比网络架构同,参数不同,如yolo层的分类为2

3.标签格式转换

  • labelme 的标签格式为x1,y1,x2,y2 需转换成 YOLO-V3的标签格式:Cx,Cy,W,H 相对位置(取值范围0-1)
  • json2yolo.py 用它来把标签转换成对的格式,代码如下:
import json
import os
#由x1,y1,x2,y2  ---->Cx,Cy,W,H 相对位置(取值范围0-1)
name2id = {'person':0,'mask':1}#写好自己的类别和标签
               
def convert(img_size, box):
    dw = 1./(img_size[0])#压缩到0-1之间
    dh = 1./(img_size[1])
    x = (box[0] + box[2])/2.0 - 1
    y = (box[1] + box[3])/2.0 - 1
    w = box[2] - box[0]
    h = box[3] - box[1]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)#返回中心点和WH
 
def decode_json(json_floder_path,json_name):
    #转换好的标签路径(转换好的放哪)
    txt_name = 'C:\\Users\\***\\AA-project\\pytorch\\PyTorch-YOLOv3\\data\\custom\\labels\\' + json_name[0:-5] + '.txt'
    txt_file = open(txt_name, 'w')
 
    json_path = os.path.join(json_floder_path, json_name)
    data = json.load(open(json_path, 'r', encoding='gb2312'))
 
    img_w = data['imageWidth']
    img_h = data['imageHeight']
 
    for i in data['shapes']:#标注文件中的
        
        label_name = i['label']#标注名称
        if (i['shape_type'] == 'rectangle'):#矩形
 
            x1 = int(i['points'][0][0])#拿到坐标
            y1 = int(i['points'][0][1])
            x2 = int(i['points'][1][0])
            y2 = int(i['points'][1][1])
 
            bb = (x1,y1,x2,y2)#组成框
            bbox = convert((img_w,img_h),bb)#转换
            txt_file.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\n')
    
if __name__ == "__main__":
    #读入json路径
    json_floder_path = 'C:\\Users\\***\\AA-project\\pytorch\\PyTorch-YOLOv3\\data\\custom\\label-test'
    json_names = os.listdir(json_floder_path)
    for json_name in json_names:
        decode_json(json_floder_path,json_name)

4.写好数据和标签的路径(json2yolo.py中)

  • 转换好的输出路径:data\custom\labels(代码23行)
    json_floder_path:labelme生成标签的文件夹(代码48行)
    执行json2yolo.py在对应路径得到转换后的数据,打开如下所示:(最开始的0、1表示类别所对应的索引)

5.完成其他配置操作

(1)数据放到相应位置,注意名字和label的得一致

(2)更改类别名字

  • 在data\custom\classes.names 改成你任务里有的类别名字
    按字典定义的顺序写好,多加一行空白,便于读取

(3)设置train.txt和val.txt

(4)设置custom.data

  • 在custom.data中按如下设置,其中classes为类别数。

6.训练代码更改

  • train.py需要设置的参数
    --model_def config/yolov3-custom.cfg
    --data_config config/custom.data
    --pretrained_weights weights/darknet53.conv.74 #看你想不想在人家基础上去做
  • 训练完后在checkpoints中生成如下模型文件,用最后一个训练好的模型来做测试

7.预测

  • 在detect.py中指定参数,
    --image_folder data/samples/ #把需要预测的数据放到这里
    --checkpoint_model checkpoints/yolov3_ckpt_100.pth #训练好模型的路径
    --class_path data/custom/classes.names #画图时候要把框上显示出来name
  • 最后预测结果保存在output中,结果如下:
  • 由于训练数据只有6张加上口罩较小,所以最后的预测效果不太理想,只检测到人,期待一下后续的yolo版本把任务做的更好...

额外注意:create_custom_model.sh不能重复执行,要先把yolov3-custom.cfg删除掉才可以

标签:name,训练,标签,YOLO,custom,json,V3,path,data
From: https://www.cnblogs.com/lushuang55/p/17604582.html

相关文章

  • 2023.8.3 训练
    A有一个01矩阵,求最少取反若干矩阵,使得存在一条由左上到右下仅为0的路径,且只能向下向右走。设\(f(i,j,0/1)\)表示走到\((i.j)\),且那个点为0/1的最小值。用\(f(i-1,j),f(i,j-1)\)更新\(f(i,j)\)即可。B[AGC010C]Cleaning有一棵树,每次可以选择连接两个叶子的路......
  • 基于GPT搭建私有知识库聊天机器人(三)向量数据训练
    前文链接:基于GPT搭建私有知识库聊天机器人(一)实现原理基于GPT搭建私有知识库聊天机器人(二)环境安装基于GPT搭建私有知识库聊天机器人(四)问答实现在前面的文章中,我们介绍了实现原理和基本环境安装。本文将重点介绍数据训练的流程,以及如何加载、切割、训练数据,并使用向量数据库Milvus进......
  • 开源大模型训练框架 colossal AI chat 、 DeepSpeed chat
    Colossal-AI是一个专注于大规模模型训练的深度学习系统,Colossal-AI基于PyTorch开发,旨在支持完整的高性能分布式训练生态。Colossal-AI已在GitHub上开源。在Colossal-AI中,我们支持了不同的分布式加速方式,包括张量并行、流水线并行、零冗余数据并行、异构计算等。 ......
  • 暑假训练赛
    A......找ABC就行了第五次比赛-VirtualJudge(vjudge.net)#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<cmath>//#defineintlonglongu......
  • 第二周训练题单
    R、paritygame#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+50;intn,m,fa[N],r[N];map<int,int>mp;intans,cnt=0;intfind(intx){if(fa[x]==-1)returnx;intpre=find(fa[x])......
  • yolov5 算法环境(GPU CPU)搭建与使用(windows环境)
    文章目录前言前提说明一、环境搭建1.1、GPU环境Anaconda安装CUDA安装CUDNN安装(可不装,加速深度学习用途)二、项目启动2.1、构建yolov5环境2.2、实战深度学习预测示例1:预测图片示例2:预测视频上面案例过程中的问题1、CUDA不匹配当前GPU的版本(卸载重装)2、重新安装pyotrch版本2.3、训练模......
  • Android手部检测和手势识别(含训练代码+Android源码+手势识别数据集)
    Android手部检测和手势识别(含训练代码+Android源码+手势识别数据集)目录Android实时手势动作识别(含训练代码++手势识别数据集)1.前言2.手势识别的方法(1)基于多目标检测的手势识别方法(2)基于手部检测+手势分类识别方法3.手势识别数据集说明(1)HaGRID手势识别数据集(2)自定义数据集4.基于......
  • 语义检索系统之排序模块:基于ERNIE-Gram的Pair-wise和基于RocketQA的CrossEncoder训练
    语义检索系统之排序模块:基于ERNIE-Gram的Pair-wise和基于RocketQA的CrossEncoder训练的单塔模型文本匹配任务数据每一个样本通常由两个文本组成(query,title)。类别形式为0或1,0表示query与title不匹配;1表示匹配。基于单塔Point-wise范式的语义匹配模型ernie_matchi......
  • 语义检索系统:基于无监督预训练语义索引召回:SimCSE、Diffcse
    基于无监督预训练语义索引召回:SimCSE、Diffcse语义索引(可通俗理解为向量索引)技术是搜索引擎、推荐系统、广告系统在召回阶段的核心技术之一。语义索引模型的目标是:给定输入文本,模型可以从海量候选召回库中快速、准确地召回一批语义相关文本。语义索引模型的效果直接决定了语义相......
  • 基于无监督训练SimCSE+In-batch Negatives策略有监督训练的语义索引召回
    基于无监督训练SimCSE+In-batchNegatives策略有监督训练的语义索引召回语义索引(可通俗理解为向量索引)技术是搜索引擎、推荐系统、广告系统在召回阶段的核心技术之一。语义索引模型的目标是:给定输入文本,模型可以从海量候选召回库中快速、准确地召回一批语义相关文本。语义索引模......