1.安装cuda

  可以先看看自己的 显卡信息,支持哪个cuda版本

  cuda下载地址:https://developer.nvidia.com/cuda-toolkit-archive

  我的RTX3060,下载的cuda11.8

  

  下载后安装,直接默认安装到底,然后打开cmd,输入nvcc -V

  

  

 2.安装cudnn

  需要安装和cuda版本对应的cudnn

  地址:https://developer.nvidia.com/rdp/cudnn-archive

  下载对应的版本,解压替换到cuda安装目录下

3.安装Pytorch

  我使用的是conda默认的环境,python3.9

  进入pytorch官网:https://pytorch.org/

  

  找到对应的版本下载,我这里不指定torch版本,直接运行

  1.   pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

  等待安装完成即可

  

4.安装标注软件

  pip install labelImg

  安装成功后直接运行 labelImg 打开软件

  

  open dir打开图片文件夹,change save dir 选择保存的xml文件的文件夹

  create rectBox去框选需要检测的目标,输入label name

  标注完自己的数据

  

  一个img图片文件夹, 一个和图片对应的xml文件夹

  

5. 将数据集进行分割

  执行下面代码,即可得到分割好的数据集

  1. import os
  2. import random
  3. import shutil
  4.  
  5. img_path = 'img'
  6. xml_path = 'xml'
  7.  
  8. def split_file_name(file_name):
  9. f_name, _ = file_name.split('.')
  10. return f_name
  11.  
  12. def split_move_file(target_path, save_basic_path, train_scale=0.9):
  13. train_img_path = os.path.join(save_basic_path, 'images/train')
  14. train_xml_path = os.path.join(save_basic_path, 'xml/train')
  15. val_img_path = os.path.join(save_basic_path, 'images/val')
  16. val_xml_path = os.path.join(save_basic_path, 'xml/val')
  17. print(save_basic_path, train_img_path)
  18. if not os.path.exists(train_img_path):
  19. os.makedirs(train_img_path)
  20. if not os.path.exists(train_xml_path):
  21. os.makedirs(train_xml_path)
  22. if not os.path.exists(val_img_path):
  23. os.makedirs(val_img_path)
  24. if not os.path.exists(val_xml_path):
  25. os.makedirs(val_xml_path)
  26.  
  27. img_file_path = os.path.join(target_path, img_path)
  28. file_list = os.listdir(img_file_path)
  29. # print(file_list)
  30. # 得到名字列表
  31. file_name_li = list(map(lambda x: split_file_name(x), file_list))
  32. random.shuffle(file_name_li)
  33. # print(file_name_li)
  34. train_ind = int(len(file_name_li) * train_scale)
  35. train_data = file_name_li[:train_ind]
  36. val_data = file_name_li[train_ind:]
  37. print('total number', len(file_name_li))
  38. print('train number', len(train_data))
  39. print('val number', len(val_data))
  40.  
  41. for file in train_data:
  42.  
  43. file_path = os.path.join(img_file_path, file+'.jpg')
  44. save_path = os.path.join(train_img_path, file+'.jpg')
  45. if not os.path.exists(file_path):
  46. file_path = os.path.join(img_file_path, file + '.jpeg')
  47. save_path = os.path.join(train_img_path, file + '.jpg')
  48. if not os.path.exists(file_path):
  49. file_path = os.path.join(img_file_path, file + '.png')
  50. save_path = os.path.join(train_img_path, file + '.png')
  51. if os.path.exists(file_path):
  52. shutil.copyfile(file_path, save_path)
  53.  
  54. # xml文件
  55. xml_file_path = os.path.join(target_path, xml_path)
  56. file_path = os.path.join(xml_file_path, file + '.xml')
  57. save_path = os.path.join(train_xml_path, file + '.xml')
  58. if os.path.exists(file_path):
  59. shutil.copyfile(file_path, save_path)
  60. for file in val_data:
  61.  
  62. file_path = os.path.join(img_file_path, file+'.jpg')
  63. save_path = os.path.join(val_img_path, file+'.jpg')
  64. if not os.path.exists(file_path):
  65. file_path = os.path.join(img_file_path, file + '.jpeg')
  66. save_path = os.path.join(val_img_path, file + '.jpg')
  67. if not os.path.exists(file_path):
  68. file_path = os.path.join(img_file_path, file + '.png')
  69. save_path = os.path.join(val_img_path, file + '.png')
  70. if os.path.exists(file_path):
  71. shutil.copyfile(file_path, save_path)
  72.  
  73. # xml文件
  74. xml_file_path = os.path.join(target_path, xml_path)
  75. file_path = os.path.join(xml_file_path, file + '.xml')
  76. save_path = os.path.join(val_xml_path, file + '.xml')
  77. if os.path.exists(file_path):
  78. shutil.copyfile(file_path, save_path)
  79.  
  80. if __name__ == '__main__':
  81.  
  82. target_path = r'C:\Users\mojia\Desktop\maizi\maozi20230326'
  83. save_basic_path = r'C:\Users\mojia\Desktop\maizi\maozi20230326_train_val'
  84. if not os.path.exists(save_basic_path):
  85. os.mkdir(save_basic_path)
  86. scale = 0.9 # 训练集比例
  87. split_move_file(target_path, save_basic_path, scale)

6. 将标注的xml文件转换为txt文件格式

  

  1. import xml.etree.ElementTree as ET
  2.  
  3. import os
  4.  
  5. def convert(size, box):
  6. dw = 1. / (size[0])
  7. dh = 1. / (size[1])
  8. x = (box[0] + box[1]) / 2.0 - 1
  9. y = (box[2] + box[3]) / 2.0 - 1
  10. w = box[1] - box[0]
  11. h = box[3] - box[2]
  12. x = x * dw
  13. w = w * dw
  14. y = y * dh
  15. h = h * dh
  16. if w >= 1:
  17. w = 0.99
  18. if h >= 1:
  19. h = 0.99
  20. return (x, y, w, h)
  21.  
  22. folder_li = ['train', 'val']
  23. def convert_annotation(rootpath, classes):
  24. labelpath = rootpath + '/labels' # 生成的.txt文件会被保存在labels目录下
  25. if not os.path.exists(labelpath):
  26. os.makedirs(labelpath)
  27. for folder in folder_li:
  28. xmlpath = rootpath + '/xml/'+folder
  29. file_list = os.listdir(xmlpath)
  30. for xmlname in file_list:
  31. xmlfile = os.path.join(xmlpath, xmlname)
  32. with open(xmlfile, "r", encoding='UTF-8') as in_file:
  33. txtname = xmlname[:-4] + '.txt'
  34. # print(txtname)
  35. txtpath = labelpath + '/' + folder
  36. if not os.path.exists(txtpath):
  37. os.makedirs(txtpath)
  38. txtfile = os.path.join(txtpath, txtname)
  39. with open(txtfile, "w+", encoding='UTF-8') as out_file:
  40. tree = ET.parse(in_file)
  41. root = tree.getroot()
  42. size = root.find('size')
  43. w = int(size.find('width').text)
  44. h = int(size.find('height').text)
  45. out_file.truncate()
  46. for obj in root.iter('object'):
  47. difficult = obj.find('difficult').text
  48. cls = obj.find('name').text
  49. if cls not in classes or int(difficult) == 1:
  50. continue
  51. cls_id = classes.index(cls)
  52. xmlbox = obj.find('bndbox')
  53. b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
  54. float(xmlbox.find('ymax').text))
  55. bb = convert((w, h), b)
  56. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  57.  
  58. if __name__ == "__main__":
  59. rootpath = r'C:\Users\mojia\Desktop\maizi\maozi20230326_train_val'
  60. # 数据标签
  61. classes = ['帽子'] # 需要修改
  62. convert_annotation(rootpath, classes)

得到下面这个的目录结构

txt文件里有标签索引和归一化后的坐标和宽高信息

7.下载yolov5源码

  直接将代码下载到本地,我下载的时v7.0

  

  

  

  下载版本对应的与训练模型

  

  

 8.修改训练的数据集路径及参数

  修改data/coco128.yaml,给出数据集的路径

  

  修改models/yolov5s.yaml,注意我训练时用的yolov5s.pt。这里主要将标签数改成一样的,nc字段改为1个,我只标了一个。

  

  修改train.py,这个我只将device改为0,也就是启用GPU训练,其他参数没有改变,或者在运行train.py时传入参数也一样。

  

  直接运行 python train.py

9.查看训练结果

  可以查看损失函数,准确率等信息

  训练好的结果在run/train文件夹下面,找到最新的文件夹

  可以运行tensorboard --logdir=C:\Users\mojia\Desktop\yolov5-master\runs\train\exp14 通过浏览器查看运行的结果

  训练好的权重参数保存在weights文件夹下面

10.进行预测

  修改detect.py文件, 修改使用的权重文件,和检测的目标文件

  

  运行 python detect.py

  结果保存在/runs/detect路径下最新的文件夹里

  

yolov5训练自己的数据集的更多相关文章

  1. [炼丹术]YOLOv5训练自定义数据集

    YOLOv5训练自定义数据 一.开始之前的准备工作 克隆 repo 并在Python>=3.6.0环境中安装requirements.txt,包括PyTorch>=1.7.模型和数据集会从 ...

  2. yolov5训练自定义数据集

    yolov5训练自定义数据 step1:参考文献及代码 博客 https://blog.csdn.net/weixin_41868104/article/details/107339535 githu ...

  3. 【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控

    [写在前面] 用Tensorflow(TF)已实现好的卷积神经网络(CNN)模型来训练自己的数据集,验证目前较成熟模型在不同数据集上的准确度,如Inception_V3, VGG16,Inceptio ...

  4. 目标检测算法SSD之训练自己的数据集

    目标检测算法SSD之训练自己的数据集 prerequesties 预备知识/前提条件 下载和配置了最新SSD代码 git clone https://github.com/weiliu89/caffe ...

  5. 可变卷积Deforable ConvNet 迁移训练自己的数据集 MXNet框架 GPU版

    [引言] 最近在用可变卷积的rfcn 模型迁移训练自己的数据集, MSRA官方使用的MXNet框架 环境搭建及配置:http://www.cnblogs.com/andre-ma/p/8867031. ...

  6. caffe训练自己的数据集

    默认caffe已经编译好了,并且编译好了pycaffe 1 数据准备 首先准备训练和测试数据集,这里准备两类数据,分别放在文件夹0和文件夹1中(之所以使用0和1命名数据类别,是因为方便标注数据类别,直 ...

  7. 使用yolo3模型训练自己的数据集

    使用yolo3模型训练自己的数据集 本项目地址:https://github.com/Cw-zero/Retrain-yolo3 一.运行环境 1. Ubuntu16.04. 2. TensorFlo ...

  8. Win10中用yolov3训练自己的数据集全过程(VS、CUDA、CUDNN、OpenCV配置,训练和测试)

    在Windows系统的Linux系统中用yolo训练自己的数据集的配置差异很大,今天总结在win10中配置yolo并进行训练和测试的全过程. 提纲: 1.下载适用于Windows的darknet 2. ...

  9. TensorFlow学习笔记——LeNet-5(训练自己的数据集)

    在之前的TensorFlow学习笔记——图像识别与卷积神经网络(链接:请点击我)中了解了一下经典的卷积神经网络模型LeNet模型.那其实之前学习了别人的代码实现了LeNet网络对MNIST数据集的训练 ...

  10. YOLO训练自己的数据集的一些心得

    YOLO训练自己的数据集 YOLO-darknet训练自己的数据 [Darknet][yolo v2]训练自己数据集的一些心得----VOC格式 YOLO模型训练可视化训练过程中的中间参数 项目开源代 ...

随机推荐

  1. linux 学习之xargs

    xargs 可以将筛选结果作为执行条件 如 ls *.go | xargs rm -rf 删除当前目前所有后缀为go的文件 指定单行列数 cat test.txt | xargs -n2

  2. Maven-高级

    Mvaen 高级 1 导入其他工程 资源文件 先install到仓库里 然后根据组织名项目名版本号写在dependence里正常导入 <dependence> <groupId> ...

  3. Unity 安装的编辑器版本不见了 记录问题

    新的一天打开unity 报错,然后再打开就找不到我之前安装的编辑器版本了 (猜测是我不正常关闭的原因吧,不懂这个) 之前在网上找到过解决办法,后来找不到了.趁现在还记得,记录一下 先把进程停了 再把缓 ...

  4. [cisco]Configure private VLAN

    vlan 100 private-vlan isolated ! vlan 200 private-vlan community ! vlan 300 private-vlan primary pri ...

  5. How to Show/Hide a Button Using the Business Process Flow Stage

    How to Show/Hide a Button Using the Business Process Flow Stage In today's blog, we'll discuss how t ...

  6. redis windows版本安装

    1.redis3.0-win版本微软已停止更新 链接:https://github.com/microsoftarchive/redis 非官方在持续更新 链接:https://github.com/ ...

  7. DBeaver的使用

    1.下载安装: https://dbeaver.io/download/ 2.下载后解压到指定目录,双击安装包: 然后 进行连接,在连接数据库的时候,会提示下载文件,下载的时候老是出错,选择强制下载就 ...

  8. Springboot ehcache/redis双缓存问题

    问题1:两个CacheManager 会报两个相同的实现类错误需要继承CachingConfigurerSupport 重写cacheManager方法,指定默认一个返回缓存提供者 @Configur ...

  9. bytes转化为字典

    import requestsurl='https://su.ke.com/api/listtop?type=resblock&resblock_id=2311062653496924& ...

  10. 一个小数据库SQLite

    参考 https://blog.csdn.net/csdnhsh/article/details/93376733 https://www.runoob.com/sqlite/sqlite-creat ...