当前位置:   article > 正文

yolov5安装和运行时出现的问题以及解决办法_yolov5 requirements.txt

yolov5 requirements.txt

一、Anaconda 的安装
打开网址,现在是2023年12月,对应的anaconda版本是支持python3.11。如果想下载之前的版本,或者更低python版本的anaconda,可以打开网址

双击下载好的anaconda安装包,just me是说只供当前用户使用。all user 是供使用这台电脑的所有用户使用,是权限问题。对空间影响不大。如果你的电脑上只有建了一个用户,all users和just me 的作用是一样的。所以点击just me就好了

然后点击next,当让你选择安装安装路径的时候,最好不要选择默认位置,以后要在anaconda里面创建环境的时候会很占内存,最好在D盘中创建一个文件夹来放anaconda。选择好点击内next,接下来四个全部勾选上,点击安装就好了。

安装完成以后,打开开始菜单在左边就会出现anaconda3这个两个图标,可以发现anaconda已经安装好了。

二、Pytorch环境安装
打开开始菜单,打开anaconda  Prompt 。或者通过win+r然后打开cmd,通过输入下面代码进入也可以

conda activate

创建虚拟环境conda create -n 环境名字(英文) python=x.x(python版本),如下,我就是创建了一个名字叫pytorch,python是3.11版本的环境。

conda create -n pytorch python=3.11

在base环境中执行如上的命令,就会创建一个新的虚拟环境,这个虚拟环境会安装一些基础的包,如下图所示。询问是否安装的时候,输入y。就可以创建环境了。(我这里已经创建好了就显示已经存在了)

当安装好了以后,执行conda env list这个命令,就可以看到比一开始多了一个pytorch这个环境。现在我们可以在这个环境里面安装深度学习框架和一些Python包了。

conda env list

执行如下命令,激活这个环境。conda activate 虚拟环境名称

conda activate pytorch

安装pytorch-gup版的环境,由于pytorch的官网在国外,下载相关的环境包是比较慢的,所以我们给环境换源。在pytorch环境下执行如下的命名给环境换清华源。

  1. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  2. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
  3. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
  4. conda config --set show_channel_urls yes

 下载一个显卡驱动的, 显卡驱动的下载地址,可以直接在桌面右键,找到英伟达驱动控制面板打开就好了。

安装(更新)好了显卡驱动以后。我们按下win+R组合键,打开cmd命令窗口。输入如下的命令。

nvidia-smi

然后打开pytorch的官网,最高支持cuda11.5版本,所以我们选择cuda12.2版本的cuda,然后将下面红色框框中的内容复制下来

将复制的内容粘贴到pytorch环境下的终端,运行就可以了

至此。pytorch的深度学习环境就安装好了。

但是有部分不支持这么高的CUDA版本,那么我们就得找之前的版本,通过这个地方去找之前的版本,建议找11.3版本的

pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113

三、pycharm安装–验证CUDA和cudnn版本

打开这个pycharm网址,可以发现一共有两个版本一个是专业版(Professional),一个是社区版(Community),我们就下载安装免费的社区版就好了。将下载好的pycharm安装包,双击。安装的地址最好不要放在C盘。

这个部分的四个全部勾上

打开pycharm,创建一个新的工程,来测试anaconda是否在安装pytorch框架的时候也安装了cuda和cudnn。按如下图创建一个工程

新版的pycharm是这样的界面,选择anaconda(我这里已经选用了所以没显示)

按以上的方式创建了一个工程,这时候我们就要选择我们在anaconda里面安装的环境,在界面的右下角

选择Add New Inerpreter

选择你anaconda的位置,按照这个路径找到pytorch的python.exe

我们在创建的工程里面创建一个python脚本,在脚本中运行如下代码,查看是否anconda在安装pytorch环境的时候也安装了cuda和cudnn。

至此我们的深度学习环境安装就已经完全完成。接下来可以在相对的环境下进行深度学习的实验了。

四、labelimg的安装

首先按照上面的方式打开pytorch的环境。输入如下的命令:

 pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple

运行如上命令后,系统就会自动下载labelimg相关的依赖。

五、使用labelimg

首先这里需要准备我们需要打标注的数据集。这里我建议新建一个名为VOCdevkit的文件夹(这个是约定俗成,后续代码划分需要),在里面再创建一个VOC2007的文件夹,然后在VOC2007文件夹里面创建一个名为JPEGImages的文件夹存放我们需要打标签的图片文件;;再创建一个名为Annotations存放标注的标签文件;最后创建一个名字为predefined_classes.txt 的txt文件来存放所要标注的类别名称。

首先在JPEGImages这个文件夹放置待标注的图片然后再 predefined_classes.txt 这个txt文档里面输入定义的类别种类;之后打开刚刚下载的labelimg,用pycharm打开运行一下就好了

下面介绍图中的我们常用的按钮。

Open Dir是待标注图片数据的路径文件夹,这里输入命令的时候就选定了JPEGImages。(当然这是可以换的)Change Save Dir保存类别标签的路径文件夹,这里我们选定了Annotations文件夹。

这个按键可以说明我们标注的标签为voc格式,点击可以换成yolo或者createML格式。

常用快捷键如下:

A:切换到上一张图片

D:切换到下一张图片

W:调出标注十字架

del :删除标注框框

Ctrl+u:选择标注的图片文件夹

Ctrl+r:选择标注好的label标签存在的文件夹

记得把Auto Save mode勾选上这样就不用手动保存了

开始标注

我们按快捷键w,然后选定我们需要标注的对象。按住鼠标左键拖出框框就可以了。如下图所示,当我们选定目标以后,就会加载出来predefined_classes.txt 定义自己要标注的所有类别(如果类别多,是真的很方便,就不需要自己手打每个类别的名字了)。然后界面最右边会出现打好的类别标签。打好一张照片以后,快捷键D,就会进入下一张,这时候就会自动保存标签文件(voc格式会保存xml,yolo会保存txt格式)。标签打完以后可以去Annotations 文件下看到标签文件已经保存在这个目录下。

自此labelimg使用讲解就结束了。

voc标签转txt,并且划分测试集和验证集

我们经常从网上获取一些目标检测的数据集资源标签的格式都是VOC(xml格式)的,而yolov5训练所需要的文件格式是yolo(txt格式)的,这里就需要对xml格式的标签文件转换为txt文件。同时训练自己的yolov5检测模型的时候,数据集需要划分为训练集和验证集。这里提供了一份代码将xml格式的标注文件转换为txt格式的标注文件,并按比例划分为训练集和验证集。这里要把这个代码文件和刚才创建的文件夹放在一起

  1. import xml.etree.ElementTree as ET
  2. import pickle
  3. import os
  4. from os import listdir, getcwd
  5. from os.path import join
  6. import random
  7. from shutil import copyfile
  8. classes = ["hat", "person"]
  9. #classes里面必须正确填写xml里面已经标注好的类,这里需要修改成自己的类
  10. TRAIN_RATIO = 80 #TRAIN_RATIO是训练集和验证集的比例,当等于80的时候,说明划分80%给训练集,20%给验证集。
  11. def clear_hidden_files(path):
  12. dir_list = os.listdir(path)
  13. for i in dir_list:
  14. abspath = os.path.join(os.path.abspath(path), i)
  15. if os.path.isfile(abspath):
  16. if i.startswith("._"):
  17. os.remove(abspath)
  18. else:
  19. clear_hidden_files(abspath)
  20. def convert(size, box):
  21. dw = 1./size[0]
  22. dh = 1./size[1]
  23. x = (box[0] + box[1])/2.0
  24. y = (box[2] + box[3])/2.0
  25. w = box[1] - box[0]
  26. h = box[3] - box[2]
  27. x = x*dw
  28. w = w*dw
  29. y = y*dh
  30. h = h*dh
  31. return (x,y,w,h)
  32. def convert_annotation(image_id):
  33. in_file = open('VOCdevkit/VOC2007/Annotations/%s.xml' %image_id)
  34. out_file = open('VOCdevkit/VOC2007/YOLOLabels/%s.txt' %image_id, 'w')
  35. tree=ET.parse(in_file)
  36. root = tree.getroot()
  37. size = root.find('size')
  38. w = int(size.find('width').text)
  39. h = int(size.find('height').text)
  40. for obj in root.iter('object'):
  41. difficult = obj.find('difficult').text
  42. cls = obj.find('name').text
  43. if cls not in classes or int(difficult) == 1:
  44. continue
  45. cls_id = classes.index(cls)
  46. xmlbox = obj.find('bndbox')
  47. b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
  48. bb = convert((w,h), b)
  49. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  50. in_file.close()
  51. out_file.close()
  52. wd = os.getcwd()
  53. wd = os.getcwd()
  54. data_base_dir = os.path.join(wd, "VOCdevkit/")
  55. if not os.path.isdir(data_base_dir):
  56. os.mkdir(data_base_dir)
  57. work_sapce_dir = os.path.join(data_base_dir, "VOC2007/")
  58. if not os.path.isdir(work_sapce_dir):
  59. os.mkdir(work_sapce_dir)
  60. annotation_dir = os.path.join(work_sapce_dir, "Annotations/")
  61. if not os.path.isdir(annotation_dir):
  62. os.mkdir(annotation_dir)
  63. clear_hidden_files(annotation_dir)
  64. image_dir = os.path.join(work_sapce_dir, "JPEGImages/")
  65. if not os.path.isdir(image_dir):
  66. os.mkdir(image_dir)
  67. clear_hidden_files(image_dir)
  68. yolo_labels_dir = os.path.join(work_sapce_dir, "YOLOLabels/")
  69. if not os.path.isdir(yolo_labels_dir):
  70. os.mkdir(yolo_labels_dir)
  71. clear_hidden_files(yolo_labels_dir)
  72. yolov5_images_dir = os.path.join(data_base_dir, "images/")
  73. if not os.path.isdir(yolov5_images_dir):
  74. os.mkdir(yolov5_images_dir)
  75. clear_hidden_files(yolov5_images_dir)
  76. yolov5_labels_dir = os.path.join(data_base_dir, "labels/")
  77. if not os.path.isdir(yolov5_labels_dir):
  78. os.mkdir(yolov5_labels_dir)
  79. clear_hidden_files(yolov5_labels_dir)
  80. yolov5_images_train_dir = os.path.join(yolov5_images_dir, "train/")
  81. if not os.path.isdir(yolov5_images_train_dir):
  82. os.mkdir(yolov5_images_train_dir)
  83. clear_hidden_files(yolov5_images_train_dir)
  84. yolov5_images_test_dir = os.path.join(yolov5_images_dir, "val/")
  85. if not os.path.isdir(yolov5_images_test_dir):
  86. os.mkdir(yolov5_images_test_dir)
  87. clear_hidden_files(yolov5_images_test_dir)
  88. yolov5_labels_train_dir = os.path.join(yolov5_labels_dir, "train/")
  89. if not os.path.isdir(yolov5_labels_train_dir):
  90. os.mkdir(yolov5_labels_train_dir)
  91. clear_hidden_files(yolov5_labels_train_dir)
  92. yolov5_labels_test_dir = os.path.join(yolov5_labels_dir, "val/")
  93. if not os.path.isdir(yolov5_labels_test_dir):
  94. os.mkdir(yolov5_labels_test_dir)
  95. clear_hidden_files(yolov5_labels_test_dir)
  96. train_file = open(os.path.join(wd, "yolov5_train.txt"), 'w')
  97. test_file = open(os.path.join(wd, "yolov5_val.txt"), 'w')
  98. train_file.close()
  99. test_file.close()
  100. train_file = open(os.path.join(wd, "yolov5_train.txt"), 'a')
  101. test_file = open(os.path.join(wd, "yolov5_val.txt"), 'a')
  102. list_imgs = os.listdir(image_dir) # list image files
  103. prob = random.randint(1, 100)
  104. print("Probability: %d" % prob)
  105. for i in range(0,len(list_imgs)):
  106. path = os.path.join(image_dir,list_imgs[i])
  107. if os.path.isfile(path):
  108. image_path = image_dir + list_imgs[i]
  109. voc_path = list_imgs[i]
  110. (nameWithoutExtention, extention) = os.path.splitext(os.path.basename(image_path))
  111. (voc_nameWithoutExtention, voc_extention) = os.path.splitext(os.path.basename(voc_path))
  112. annotation_name = nameWithoutExtention + '.xml'
  113. annotation_path = os.path.join(annotation_dir, annotation_name)
  114. label_name = nameWithoutExtention + '.txt'
  115. label_path = os.path.join(yolo_labels_dir, label_name)
  116. prob = random.randint(1, 100)
  117. print("Probability: %d" % prob)
  118. if(prob < TRAIN_RATIO): # train dataset
  119. if os.path.exists(annotation_path):
  120. train_file.write(image_path + '\n')
  121. convert_annotation(nameWithoutExtention) # convert label
  122. copyfile(image_path, yolov5_images_train_dir + voc_path)
  123. copyfile(label_path, yolov5_labels_train_dir + label_name)
  124. else: # test dataset
  125. if os.path.exists(annotation_path):
  126. test_file.write(image_path + '\n')
  127. convert_annotation(nameWithoutExtention) # convert label
  128. copyfile(image_path, yolov5_images_test_dir + voc_path)
  129. copyfile(label_path, yolov5_labels_test_dir + label_name)
  130. train_file.close()
  131. test_file.close()

在VOCdevkit目录下生成images和labels文件夹,文件夹下分别生成了train文件夹和val文件夹,里面分别保存着训练集的照片和txt格式的标签,还有验证集的照片和txt格式的标签。images文件夹和labels文件夹就是训练yolov5模型所需的训练集和验证集。在VOCdevkit/VOC2007目录下还生成了一个YOLOLabels文件夹,里面存放着所有的txt格式的标签文件。
 至此,xml格式的标签文件转换为txt格式的标签文件并划分为训练集和测试集就讲完了。
项目的克隆和必要的环境依赖

YOLOv5的代码是开源的,因此我们可以从github上克隆其源码。首先打开yolov5的github的官网,打开的官网界面如下。

将我们下载好的yolov5的代码解压,然后用一款IDE打开(我用的是pycharm),打开之后整个代码目录如下图:

现在来对代码的整体目录做一个介绍:

  1. data:主要是存放一些超参数的配置文件(这些文件(yaml文件)是用来配置训练集和测试集还有验证集的路径的,其中还包括目标检测的种类数和种类的名称);还有一些官方提供测试的图片。如果是训练自己的数据集的话,那么就需要修改其中的yaml文件。但是自己的数据集不建议放在这个路径下面,而是建议把数据集放到yolov5项目的同级目录下面。
  2. models:里面主要是一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x。从名字就可以看出,这几个版本的大小。他们的检测测度分别都是从快到慢,但是精确度分别是从低到高。这就是所谓的鱼和熊掌不可兼得。如果训练自己的数据集的话,就需要修改这里面相对应的yaml文件来训练自己模型。
  3. utils:存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等等。
  4. weights:放置训练好的权重参数。
  5. detect.py:利用训练好的权重参数进行目标检测,可以进行图像、视频和摄像头的检测。
  6. train.py:训练自己的数据集的函数。
  7. test.py:测试训练的结果的函数。
  8. requirements.txt:这是一个文本文件,里面写着使用yolov5项目的环境依赖包的一些版本,可以利用该文本导入相应版本的包。

以上就是yolov5项目代码的整体介绍。

环境的安装和依赖的安装
打开requirements.txt这个文件,可以看到里面有很多的依赖库和其对应的版本要求。我们打开pycharm的命令终端,在中输入如下的命令,就可以安装了。

pip install -r requirements.txt

在这个地方可能会存在下载不下来的问题

那么就得通过cmd来下载,这里先输入yolov5所在的磁盘(以D盘d:),然后在找到yolov5的位置,通过cd+yolov5位置,然后按照之前的通过cmd激活pytorch环境再输入上面内容。

至此,深度学习的环境和依赖包就都结束了。

数据集和预训练权重的准备
利用labelimg标注数据和数据的准备,上面已经说过了
获得预训练权重

yolov5的5.0版本给我们提供了几个预训练权重,我们可以对应我们不同的需求选择不同的版本的预训练权重。通过如下的图可以获得权重的名字和大小信息,可以预料的到,预训练权重越大,训练出来的精度就会相对来说越高,但是其检测的速度就会越慢。预训练权重可以通过这个网址进行下载,本次训练自己的数据集用的预训练权重为yolov5s.pt。

训练自己的模型
修改数据配置文件
预训练模型和数据集都准备好了,就可以开始训练自己的yolov5目标检测模型了,训练目标检测模型需要修改两个yaml文件中的参数。一个是data目录下的相应的yaml文件,一个是model目录文件下的相应的yaml文件。

   修改data目录下的相应的yaml文件。找到目录下的coco128.yaml文件,将该文件复制一份,将复制的文件重命名,最好和项目相关,这样方便后面操作。我这里修改为Car.yaml。(这个名字是随便起的)。打开你的改好的yaml文件,修改train,val的地址,记得把下面两个也改成自己的类,nc是你一共有多少个类。

修改模型配置文件
由于该项目使用的是yolov5s.pt这个预训练权重,所以要使用models目录下的yolov5s.yaml文件中的相应参数。同上修改data目录下的yaml文件一样,我们最好将yolov5s.yaml文件复制一份,然后将其重命名。(这里需要注意一下一定是要下载版本对应的预训练权重pt文件不然会报错),我这里因为电脑可以支持yolov5x,所以就用的yolov5x.yaml,模型修改的内容是一样的,只需要修改nc为自己类的个数就行了。

至此,相应的配置参数就修改好了。

训练自己的模型
如果上面的数据集和两个yaml文件的参数都修改好了的话,就可以开始yolov5的训练了。首先我们找到train.py这个py文件。

然后找到主函数的入口,这里面有模型的主要参数。

根据下面内容进行调整

  1. opt模型主要参数解析:
  2. weights:初始化的权重文件的路径地址(修改default,改成自己的权重地址,就是自己pt文件)
  3. cfg:模型yaml文件的路径地址(修改default,改成自己的模型地址)
  4. data:数据yaml文件的路径地址(修改default,改成自己的数据的yaml那个文件)
  5. hyp:超参数文件路径地址(默认就好了)
  6. epochs:训练轮次(超过200次就好了,超过200次就趋向稳定了)
  7. batch-size:喂入批次文件的多少(根据自己电脑配置修改,配置不高经量调低成84
  8. img-size:输入图片尺寸(根据自己电脑配置修改,配置不高经量调低)
  9. rect:是否采用矩形训练,默认False(默认就好了)
  10. resume:接着打断训练上次的结果接着训练(默认就好了)
  11. nosave:不保存模型,默认False(默认就好了)
  12. notest:不进行test,默认False(默认就好了)
  13. noautoanchor:不自动调整anchor,默认False(默认就好了)
  14. evolve:是否进行超参数进化,默认False(默认就好了)
  15. bucket:谷歌云盘bucket,一般不会用到(默认就好了)
  16. cache-images:是否提前缓存图片到内存,以加快训练速度,默认False(默认就好了)
  17. image-weights:使用加权图像选择进行训练(默认就好了)
  18. device:训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu设备)(改成0

至此,就可以运行train.py函数训练自己的模型了。但是由于目前一些内容改变,还是会出现报错,报错内容也五花八门,我也是找了许多帖子才跑通。

报错1UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 6: invalid start byte

 return subprocess.check_output(s, shell=True, stderr=subprocess.STDOUT).decode()[:-1]
return subprocess.check_output(s, shell=True, stderr=subprocess.STDOUT).decode(encoding='gbk')[:-1]

把上面那个改成下面这个就好了

报错2:AttributeError: module 'numpy' has no attribute 'int'.
`np.int` was a deprecated alias for the builtin `int`. To avoid this error in existing code, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the release note link for additional information.
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:

这个报错会发生好三四次,出现就修改就行了

把np.int改成np.int_

报错3:IndexError: list index out of range

这个报错原因有好多,第一个是pt文件版本不对或者名字不对,第二个可能是data的yaml文件里的nc或者类没有修改

报错4:untimeError: result type Float can't be cast to the desired output type __int64

把改成这个就可以了

indices.append((b, a, gj.clamp_(0, gain[3].long() - 1), gi.clamp_(0, gain[2].long() - 1)))  # image, anchor, grid indices

到此我碰到的报错都在这,还有其他的问题,可以自行查阅

识别检测detect.py

调参

找到def parse_opt():这行,以下是我们要调参的位置

  1. parser.add_argument('--weights', nargs='+', type=str, default='D:/Pycharm code/yolov5-5.0/runs/train/exp31/weights/last.pt', help='model.pt path(s)')(这里改成训练完的权重文件last.pt或者best.pt)
  2. parser.add_argument('--source', type=str, default='D:/Pycharm code/yolov5-5.0/Car/datasets/images/test', help='source') # file/folder, 0 for webcam(测试数据,可以是图片/视频路径,也可以是’0’(电脑自带摄像头),也可以是rtsp等视频流)
  3. parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')
  4. parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')(置信度阈值你希望多少)
  5. parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')
  6. parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/806825
推荐阅读
相关标签
  

闽ICP备14008679号