YOLOV5 中文Github网址:

https://github.com/wudashuo/yolov5

YOLOV5相关文件百度网盘连接:

链接: https://pan.baidu.com/s/19Mo5bnLEGXiegc3f2KOnyg 密码: 5av1
–来自百度网盘超级会员V3的分享

首先要确保自己安装了显卡驱动,cuda和cudnn
可以参考这位博主的文章

https://blog.csdn.net/qq_34496399/article/details/105770053

贴一下我这里的版本
在这里插入图片描述
当安装好后要安装OPENCV
先打开Ubuntu商店搜索Cmake安装
将下载好的OpenCV-4.5.1源码解压到主目录下,并在OpenCV-4.5.1中新建build文件夹
在这里插入图片描述
打开CMake,选择源码路径以及编译路径,并勾选Grouped和Advanced
点击Configure,选择Unix Makefiles ,勾选Use default native compilers
点击Configure
在这里插入图片描述
搜索OPENCV_EXTRA_MODULES_PATH,路径选择OpenCV4.5.1/opencv_contrib-4.5.1/modules
搜索cuda,勾选WITH_CUDA和OPENCV_DNN_CUDA
搜索NONFREE ,勾选OPENCV_ENABLE_NONFREE
点击Configure,会有自动下载一些文件。
但是由于网络原因,会下载失败,需要手动下载,打开/OpenCV-4.5.1/build/CMakeDownloadLog.txt,搜索文件内的cmake_download,找到要下载的文件的链接,复制链接,使用迅雷下载。
将下载好的文件复制到/OpenCV-4.5.1/opencv-4.5.1/.cache/下的对应文件夹内。
重新执行Configure,没有下载失败的报错后点击Generate。
然后终端进入OpenCV4.5.1/build

make -j8
sudo make install

接下来安装anaconda
可以参考下文博主的文章

https://blog.csdn.net/KIK9973/article/details/118772450
安装完成后

conda create -n YOLO5 python=3.7

进入文首的网址中,将代码下载下来并解压出来,如图在这里插入图片描述
打开终端,进入创建的anaconda环境

conda activate YOLO5
pip3 install -r requirement.txt

这里会自动下载需要的库
如果下载速度过慢或下载失败,可以选择其他源下载,比如指定清华源:

pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

通过以上步骤,Yolo v5运行所需的环境就已经配置好了,接下来就可以进行简单的测试。在yolov5-master文件夹下打开终端,然后运行以下命令:

python3 detect.py --source 0           	# 本机默认摄像头
                      file.jpg                       		# 图片 
                      file.mp4                      	# 视频
                      path/                          	# 文件夹下所有媒体
                      path/*.jpg                    	# 文件夹下某类型媒体
					  rtsp:// 						 	# rtsp视频流
                      http:// 							# http视频流

这里的含义是把0换成下面的这些指令就可以去检测别的,比如换成图片路径即为检测图片。
如果没有指定权重,则会自动下载默认的COCO预训练权重模型yolov5s.pt,最终检测结果会保存在./runs/detect/文件夹中。
当然我们还可以指定权重文件,权重文件下载链接为,将下载好的权重文件放在yolov5-master/weights/文件夹中,下述命令使用yolov5m.pt去检测./data/image文件夹中的所有图片和视频,并设置置信度为0.5:

python3 detect.py --source ./data/images/ --weights ./weights/yolov5m.pt --conf 0.5
detect命令中可使用的参数及其含义如下:
--source      	指定检测来源
--weights     	指定权重,不指定的话会使用yolov5s.pt预训练权重
--img-size    	指定推理图片分辨率,默认640,也可使用--img
--conf-thres   	指定置信度阈值,默认0.4,也可使用--conf
--iou-thres    	指定NMS(非极大值抑制)的IOU阈值,默认0.5
--device      	指定设备,如--device 0 --device 0,1,2,3 --device cpu
--classes     		只检测特定的类,如--classes 0 2 4 6 8
--project     		指定结果存放路径,默认./runs/detect/
--name      		指定结果存放名,默认exp
--view-img   		以图片形式显示结果
--save-txt     	输出标签结果(yolo格式)
--save-conf   	在输出标签结果txt中同样写入每个目标的置信度
--agnostic-nms 	使用agnostic NMS
--augment    	增强识别
--update     		更新所有模型
--exist-ok    		若重名不覆盖

以上的步骤都是使用官方训练好的权重模型进行检测,如果我们想训练自己的数据集,就需要经过采集图片,标注图片和训练模型这三步。下面将会对这些步骤一一介绍。

这里采用VOC数据集训练,用自己的数据集也是一样,下面的代码都可以通用,只要文件结构一样即可。

如果要制作自己的数据集

pip3 install labelImg
labelImg

打开labelImg的界面选择打开目录,选择你数据集图片的目录,选择创建区块选择目标检测的位置
在这里插入图片描述

首先是下载VOC数据集
在网盘中有
下载下来之后
在如图所示的位置创建split_train_val.py
在这里input xml label path改为Annotations的路径
output txt label path改为ImagSet下的Main文件夹,下面会贴上我的示例
在这里插入图片描述

# 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()

在这里插入图片描述
会在Main文件夹中生成四个文件
在这里插入图片描述
接下来在yolov5-master文件夹中创建voc_label.py
内容如下

# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog','horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']   # 改成自己的类别
abs_path = os.getcwd()
print(abs_path)

def convert(size, box):
    dw = 1./(size[0])  # 有的人运行这个脚本可能报错,说不能除以0什么的,你可以变成dw = 1./((size[0])+0.1)
    dh = 1./(size[1])  # 有的人运行这个脚本可能报错,说不能除以0什么的,你可以变成dh = 1./((size[0])+0.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('/home/flycar/yolov5-master/VOC2007/Annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('/home/flycar/yolov5-master/VOC2007/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('/home/flycar/yolov5-master/VOC2007/labels/'):
        os.makedirs('/home/flycar/yolov5-master/VOC2007/labels/')
    image_ids = open('/home/flycar/yolov5-master/VOC2007/ImageSets/Main/%s.txt' %(image_set)).read().strip().split()
    list_file = open('VOC2007/%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write(abs_path + '/VOC2007/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

python3 voc_label.py

运行结果如下没有报错接下来就可以准备训练了
在这里插入图片描述
接下来配置data文件夹中的yaml文件,创建voc_my.yaml文件内容如下,train和val后面换成自己的地址

train: /home/flycar/yolov5-master/VOC2007/train.txt
val: /home/flycar/yolov5-master/VOC2007/val.txt
nc: 20
names: ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog','horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'] 

然后更改models 下的yolov5s.yaml文件
在这里插入图片描述
将nc改为自己的种类数,VOC为20
接下来执行:

 python3 train.py --weights yolov5s.pt --img 640 --batch 20 --epoch 100 --data data/voc_my.yaml --cfg models/yolov5s.yaml 
train命令中可使用的参数及其含义如下:
--weights		指定权重,如果不加此参数会默认使用官方预训练的yolov5s.pt
--cfg 		指定模型文件
--data		指定数据文件 
--hyp		指定超参数文件
--epochs		指训练完整数据的次数,默认300
--batch-size	指一次迭代训练的数据大小,默认16,官方推荐越大越好,用你GPU
能承受最大的。可简写为--batch
--img-size 	指定训练图片大小,默认640,可简写为--img
--name 		指定结果文件名,默认result.txt
--device 		指定训练设备,如--device 0,1,2,3
--local_rank 	分布式训练参数,不要自己修改!
--log-imgs 	W&B的图片数量,默认16,最大100
--workers 	指定dataloader的workers数量,默认8
--project 		训练结果存放目录,默认./runs/train/
--name 		训练结果存放名,默认exp


训练结果会保存在/yolov5-master/runs/train/exp里,权重在/yolov5-master/runs/train/exp/weights里,想要使用自己训练的权重进行检测可以

python3 detect.py --source (你的图片路径) --weights ./runs/train/exp/weights/best.pt 

请添加图片描述
参考文章:

https://blog.csdn.net/weixin_43563233/article/details/114385130?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164553073716781685397702%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164553073716781685397702&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-114385130.first_rank_v2_pc_rank_v29&utm_term=ros+yolov5&spm=1018.2226.3001.4187
https://blog.csdn.net/qq_36756866/article/details/109111065

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐