文章目录
前言
yolo图像识别最近非常火爆,本人之前学习yolo的过程中,发现想搭个环境,还是挺麻烦的,配置各种版本的库各个版本的torch也是焦头烂额,各种教程的方法也尽不相同,我就把自己安装环境以及简单的应用的整个流程记录一下。仅供大家参考,文末会把参考到的文章贴出来。
本文仅供大家参考。转载请附原文链接。
有不对的地方还请各位多多包涵。
各个需要下载的东西都给出对应的官方下载链接了,点击超链接即可跳转进行下载。
在下载各个软件,依赖库时如果发现速度特别慢,可以考虑使用镜像源或者magic
各个文件夹以及文件的命名最好最好不要使用中文,文件路径也不要含有中文。
一、安装清单
需要安装的一些软件和库,尽量都安上,如果有经验的话可以自行选择。
1.anaconda的安装
首先,从Anaconda官网下载并安装Anaconda。
Anaconda官网:Anaconda官网
进入后选择合适的版本下载:
下载好后直接开始安装即可。安装时建议勾选“Add Anaconda to my PATH environment variable”和“Register Anaconda as my default Python 3.x”这两项,以便于环境配置。
从开始菜单找到Anaconda Prompt。
打开Prompt后,输入代码创建环境,"yolo5"就是环境的名字,可以自己更改。
conda create -n yolo5 python=3.9
即指定创建一个环境名叫yolo5,使用python版本为3.9的conda环境。
2.pycharm的安装
进入这个链接去官网进行下载即可Pycharm官网
进入后下载社区版的即可,下载完直接安装就行。安装好后不用进行配置,后续会有详细的配置教程。
3.下载YOLOV5项目
本文使用yoloV5为例,所以python的版本、opencv的版本都是适合yoloV5的,如果你需要用其他版本的yolo,可以酌情调整,不过大致的流程不变。
直接去github上下载yolov5项目压缩包,然后解压即可。
Yolov5项目下载地址
4.安装yolov5的依赖库(分为CPU版和GPU版)
首先在pycharm中以项目形式打开yolov5文件夹。
在pycharm侧边找到requirements.txt这个文件,这个就是yolov5需要的依赖库和对应的版本。
然后从pycharm里面给yolov5项目配置一个环境,就是在第一章中用conda创建好的那个环境。
选择添加现有环境,找到刚刚使用conda创建的环境并使用。我刚刚创建的就叫yolo5所以直接找到yolo5即可。
然后如果是想使用GPU版本的,这时候需要在requirements文件中把图中所示的两行给注释掉,因为我是要使用GPU版本的torch,如果是使用CPU即可跳过这一步。
然后从pycharm打开终端,检查目录前面括号里的环境是否正确。
然后输入以下指令
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
这里我们使用了清华的镜像源,下载更稳定更快一些。等到显示安装成功即可。
5.下载图片标注软件labelimg
从我的链接下载labelimg文件。
Labelimg的Github下载地址
到此为止,使用CPU的话,所有需要安装和下载的东西都准备好了。
但是我本人是使用GPU运行YOLOV5的,所以还需要继续安装GPU所需的东西。
6.安装CUDA和cudnn
打开终端输入以下命令
nvidia-smi
那个CUDA Version,能够看到自己电脑支持安装的CUDA版本。然后去到英伟达官网下载安装CUDA
英伟达官网下载CUDA
找到小于等于自己电脑最高支持的CUDA版本,点进去后根据自己的电脑选择对应的选项即可。然后下载。
下载完就开始安装。要记住你安装的目录文件夹,一会需要用到。
然后去下载cudnn,下载这个需要有一个账号登录才行,没有的话根据提示注册一个即可。
Cudnn下载地址
选择对应的版本下载即可。一定要与CUDA的版本对应,下载好后解压,然后把这些文件复制到cuda的安装目录。
cuDNN其实就是 CUDA 的一个补丁而已,专为深度学习运算进行优化的。
7.下载并安装GPU版本的torch
Torch官网
进去后,根据自己的需求选择好版本,然后复制命令,打开prompt。
首先在conda里面激活之前创建的环境
打开Anaconda Prompt输入以下命令
conda activate yolo5
conda activate “your-env-name” ,把your-env-name换成你之间创建好的conda环境即可。
前面的base变成了你的环境名就激活成功了。
然后把刚刚的torch下载命令进行粘贴,敲下回车就开始下载了。我这里之前已经安装好了就不演示过程了。
等他加载完就是已经下载完了并且安装好了。
8.验证环境和torch是否安装成功
打开pycharm,选择GPU环境,输入以下代码
import torch
print(torch.cuda.is_available()) # 输出True表示可以使用GPU
print(torch.cuda.device_count()) # 返回GPU的数量
print(torch.cuda.get_device_name(0)) # 返回GPU的名字
如图所示,会输出cuda是否可用,GPU的数量,以及GPU的型号名字,如果能够正常输出,就证明你已经安装好了GPU的环境。到此为止,GPU的环境搭建完毕。
二、YOLOV5的简单应用
1.数据收集以及数据标注
这里我想要识别的是显示器,所以我直接用手机照了一些显示器的图片,然后改好名字,并且要注意把图片文件格式改成.JPG形式。
图片名字以及各级目录尽量不要出现中文,此外我还录制了一个显示器的视频,一会用来检测训练的模型的结果。
在yolov5-master文件夹下创建一个VOCData文件夹。后面的所有文件夹都创建在VOCData下。
创建一个images文件夹用于存放需要标注的图片。再创建一个名为‘Annotations’的文件夹,一会用来存放标注文件。
在pycharm中直接打开之前下载的labelimg文件夹,并打开labelimg.py文件,然后点击运行即可。
然后打开存放图片的images目录,并把存放目录改为‘Annotations’
介绍一些简单的使用方法:
按‘w’画框,进行物体标注,把你想要识别的物体用框画出来,并输入对应的标签,点击保存即可,也可以直接开启自动保存功能。
然后‘D’进行下一张图片的标注。所有图片标注完成后就可以关闭labelimg。图片标注的工作就完成了。
2.数据集分类以及配置文件修改
使用以下代码进行数据集的划分,会自动生成一个文件夹,存放分类好的数据集名字
default='Annotations’就是刚刚创建好的那个文件夹,检查是否正确创建。
其他地方可以根据需求进行更改,均有注释。
# coding:utf-8
import os
import random
import argparse
parser = argparse.ArgumentParser()
#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')
#数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='ImageSets/Main', type=str, help='output txt label path')
opt = parser.parse_args()
trainval_percent = 1.0 # 训练集和验证集所占比例。 这里没有划分测试集
train_percent = 0.9 # 训练集所占比例,可自己进行调整
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
os.makedirs(txtsavepath)
num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)
file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')
for i in list_index:
name = total_xml[i][:-4] + '\n'
if i in trainval:
file_trainval.write(name)
if i in train:
file_train.write(name)
else:
file_val.write(name)
else:
file_test.write(name)
file_trainval.close()
file_train.close()
file_val.close()
file_test.close()
然后再把xml文件(也就是使用labelimg生成的标注文件,放在Annotations文件夹下)转换成yolo需要的文本格式文件,直接用py文件转换即可,把in_file和out_file中的路径换成自己的。
只需要换部分路径,代码是我自己的文件路径,仅供参考。
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd
sets = ['train', 'val', 'test']
classes = ["display"] # 改成自己的类别
abs_path = os.getcwd()
print(abs_path)
def convert(size, box):
dw = 1. / (size[0])
dh = 1. / (size[1])
x = (box[0] + box[1]) / 2.0 - 1
y = (box[2] + box[3]) / 2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return x, y, w, h
def convert_annotation(image_id):
in_file = open('E:/pycode/pythontool/yolov5-master/yolov5-master/VOCData/Annotations/%s.xml' % (image_id), encoding='UTF-8')
out_file = open('E:/pycode/pythontool/yolov5-master/yolov5-master/VOCData/labels/%s.txt' % (image_id), 'w')
tree = ET.parse(in_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
for obj in root.iter('object'):
difficult = obj.find('difficult').text
# difficult = obj.find('Difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult) == 1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
float(xmlbox.find('ymax').text))
b1, b2, b3, b4 = b
# 标注越界修正
if b2 > w:
b2 = w
if b4 > h:
b4 = h
b = (b1, b2, b3, b4)
bb = convert((w, h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
for image_set in sets:
if not os.path.exists('E:/pycode/pythontool/yolov5-master/yolov5-master/VOCData/labels/'):
os.makedirs('E:/pycode/pythontool/yolov5-master/yolov5-master/VOCData/labels/')
image_ids = open('E:/pycode/pythontool/yolov5-master/yolov5-master/VOCData/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
if not os.path.exists('E:/pycode/pythontool/yolov5-master/yolov5-master/VOCData/dataSet_path/'):
os.makedirs('E:/pycode/pythontool/yolov5-master/yolov5-master/VOCData/dataSet_path/')
list_file = open('dataSet_path/%s.txt' % (image_set), 'w')
# 这行路径不需更改,这是相对路径
for image_id in image_ids:
list_file.write('E:/pycode/pythontool/yolov5-master/yolov5-master/VOCData/images/%s.jpg\n' % (image_id))
convert_annotation(image_id)
list_file.close()
如果按照步骤一步步做下来,那么此时你的文件夹下应该会有这几个文件夹,请自行检查是否缺失。
文件夹和命名不太懂建议跟着教程做一样的。
生成好了如上的文件夹后,数据集的划分和转换就完成了。
现在就需要更改一下配置文件。
在yolov5的data文件夹下创建一个myvoc.yaml文件,并打开。
(建议用pycharm打开,方便看格式是否正确。)
里面的内容为数据集的路径,如下图所示。
nc为需要识别的物体种类
names里面为该种类的标签名
train和val即为训练数据集和验证数据集的路径。
然后需要选择一个模型配置文件,有n、s、m、l、x版本,逐渐增大
(随着架构的增大,训练时间也是逐渐增大)。
该配置文件存放在yolov5下的models文件夹
我选用yolov5s这个配置文件,用记事本打开并进行更改,把这个nc改为你需要识别的种类数即可,我这里是一种。所以把nc的值改为1。
所有准备工作已经完成,然后就可以开始进行训练模型了。
3.使用YOLOV5进行模型训练
打开anaconda prompt,进入之前创建好的环境。
怎么进入环境前面有教,通过cd /d 路径名,进入yolov5项目的路径。还是不懂的可以看看下图,照着做,把路径改成你自己的就行。
输入训练命令,我的训练命令及参数如下:输入后,回车就开始训练。
python train.py --weights weights/yolov5s.pt --cfg models/yolov5s.yaml --data data/myvoc.yaml --epoch 300 --batch-size 2 --img 640 --device 0
参数的含义如下:
–weights weights/yolov5s.pt :这个也许你需要更改路径。我是将yolov5的pt文件都放在weights目录下,你可能没有,需要更改路径。
–epoch 300 :训练300次
–batch-size 2:训练8张图片后进行权重更新
–device 0:使用GPU训练。
输入训练命令后,如下图所示,即成功开始训练。静静等待训练完成即可。
如下图,训练完成了,训练好的权重文件存放到runs文件夹下了。一会检测的时候需要用到的。
权重文件就在weights中。
分为效果最好的权重文件和最后一次训练的权重文件,我们一会直接使用效果最好的即可。
到此为止,YOLOV5的训练模型就完成了。后面,我将使用训练好的权重文件对显示器进行检测。
4.使用训练好的权重文件进行检测
同样在anaconda prompt中进行,进入环境,进入yolov5项目文件夹。
然后输入指定的检测命令,我输入的检测命令如下:
python detect.py --weights runs/train/exp2/weights/best.pt --source E:/pycode/pythontool/yolov5-master/yolov5-master/VOCData/display.mp4
把source后面的路径改成需要检测的文件路径即可。我这里是检测一个我拍的各个显示器的视频。
输入指令后敲回车就开始检测
等一会就能够检测好,就如图所示,把检测后的结果文件保存到runs的detect目录下了。
最终的检测结果存放到runs\detect\exp下,简单的放一张检测视频的截图。
可以看到效果不错,基本是识别出来了
以上就是yolov5的GPU版本的环境搭建,以及基于YOLOV5识别显示器的全部内容。
5.补充一个在训练过程中可能会碰到的问题
在输入训练命令后,可能会出现如下图所示的报错,是页面文件太小的问题,去改一下虚拟内存即可。
进入电脑设置——找到系统——点开系统信息——高级系统设置
自定义虚拟内存的大小,改大一些就行。
总结
以上就是今天要讲的内容,本文详细介绍了YOLOV5的的CPU/GPU环境安装,并做了一个简单的标注+训练+识别的测试。
我主要基于所学的教程做了一个整合性的教程。从环境配置到软件安装再到简单的训练测试。
参考致谢
之前我自己在配置环境的时候就学习这几位博主的文章,写得非常好,大家有兴趣可以去看看。
写得非常好的一篇训练数据集的教程——>Yolov5训练自己的数据集
环境搭建的一篇教程——>python:yolo5使用