yolov5训练步骤及安全帽检测_yolov5安全帽检测训练好的模型-程序员宅基地

技术标签: yolov5  机器学习  深度学习  人工智能  安全帽检测  

环境部署问题、训练后无法识别问题都有介绍注意事项
一、说明
  • 系统uname -ar:ubuntu18.0.4(Linux ubuntu 5.4.0-122-generic) 64bit
  • 显卡lspci:GeForce GT 1030
  • nvidia版本:NVIDIA-Linux-x86_64-470.129.06.run (该网址搜索下载:https://www.nvidia.cn/geforce/drivers)
  • cuda版本: cuda_10.2.89_440.33.01_linux.run (历史版本:https://developer.nvidia.com/cuda-toolkit-archive)
  • yolov5: 代码是tag v6.1
二、PC机nvidia显卡(没有忽略用CPU方式)
  1. 禁用 nouveau驱动
    lsmod | grep nouveau
    		禁用:
    		sudo vim /etc/modprobe.d/blacklist.conf
    			blacklist nouveau
    			options nouveau modeset=0
    		
    		sudo update-initramfs -u
    
  2. nvidia驱动安装
    sudo apt install dkms build-essential linux-headers-generic
    	sudo apt-get install -y libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1
    	sudo ./NVIDIA-Linux-x86_64-470.129.06.run --dkms --no-opengl-files
    	
    	一定操作,否则会失败
    		在BIOS界面,禁用secure boot(安全模式)
    	
    	(安装失败重装)
    	sudo nvidia-uninstall
    	sudo apt-get remove --purge nvidia*
    
  3. 安装cuda10.2
    A、sudo service lightdm stop
    
    B、如果已安装nvidia驱动,安装时把驱动取消,建议先安装驱动,并且驱动版本大于cuda后缀的440.33.01,否则cuda安装失败)
    		wget https://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda_10.2.89_440.33.01_linux.run
    		sudo sh cuda_10.2.89_440.33.01_linux.run --no-opengl-libs (如果开始安装了nvidia-390.151版本驱动会有问题)
    C、vi ~/.bashrc
    		export PATH="/usr/local/cuda-10.2/bin:$PATH" 
    		export LD_LIBRARY_PATH="/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH"
    	
    D、sudo service lightdm start
    
  4. nvidia-smi:失败
    ls /usr/src | grep nvidia  #查看自己安装的nvidia版本,我的是470.129.06
    sudo apt install dkms
    sudo dkms install -m nvidia -v 470.129.06 
    
三、python升级
  1. python3.6–>pyhton3.9 (系统自带3.6)
  2. 安装依赖
    sudo apt-get install libffi-dev zlib1g-dev libbz2-dev libssl-dev liblzma-dev
    
  3. 下载python3.9
    wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz
    
  4. 编译
    ./configure --with-ssl --enable-optimizations (--with-ssl 参数要加上否则使用中会出错)
    	make
    	sudo make install
    
  5. 设置软连接
    sudo ln -s /usr/local/bin/python3 /usr/bin/python39 #不要修改系统python3软连接,否则一些命令无法使用
    sudo ln -s /usr/local/bin/pip3 /usr/bin/pip3
    
四、pytorch安装
  1. 官网
    https://pytorch.org/get-started/locally/
    
  2. CPU
    pip install torch==1.9.0+cpu torchvision==0.10.0+cpu torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
    如果失败进入https://download.pytorch.org/whl/torch_stable.html 下载对应版本
    
  3. GPU
    pip install torch==1.9.0+cu102 torchvision==0.10.0+cu102 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
    	
    pip3 install torch-1.9.0+cu102-cp39-cp39-linux_x86_64.whl
    pip3 install torchvision-0.10.0+cu102-cp39-cp39-linux_x86_64.whl
    pip3 install torchaudio-0.9.0-cp39-cp39-linux_x86_64.whl
    
五、pip 依赖
absl-py==0.12.0
altgraph==0.17
backcall==0.2.0
backports.lzma==0.0.14
cachetools==4.2.1
certifi==2020.12.5
chardet==4.0.0
charset-normalizer==2.1.0
click==8.1.3
cycler==0.10.0
decorator==5.1.1
docker-pycreds==0.4.0
future==0.18.2
gitdb==4.0.9
GitPython==3.1.27
google-auth==1.28.1
google-auth-oauthlib==0.4.4
GPUtil==1.4.0
grpcio==1.37.0
idna==2.10
importlib-metadata==4.12.0
ipython==7.34.0
jedi==0.18.1
kiwisolver==1.3.1
lxml==4.9.1
Markdown==3.4.1
matplotlib==3.3.4
matplotlib-inline==0.1.3
numpy==1.21.6
oauthlib==3.2.0
opencv-python==4.5.1.48
pandas==1.3.5
parso==0.8.3
pathtools==0.1.2
pexpect==4.8.0
pickleshare==0.7.5
Pillow==9.2.0
promise==2.3
prompt-toolkit==3.0.30
protobuf==3.15.8
psutil==5.9.1
ptyprocess==0.7.0
pyasn1==0.4.8
pyasn1-modules==0.2.8
Pygments==2.12.0
pyparsing==3.0.9
PyQt5==5.15.4
pyqt5-plugins==5.15.4.2.2
PyQt5-Qt5==5.15.2
PyQt5-sip==12.11.0
pyqt5-tools==5.15.4.3.2
PyQtChart==5.15.4
PyQtChart-Qt5==5.15.2
python-dateutil==2.8.2
python-dotenv==0.20.0
pytz==2022.1
PyYAML==6.0
qt5-applications==5.15.2.2.2
qt5-tools==5.15.2.1.2
requests==2.25.1
requests-oauthlib==1.3.1
rsa==4.9
scipy==1.6.1
seaborn==0.11.2
sentry-sdk==1.8.0
setproctitle==1.2.3
shortuuid==1.0.9
six==1.16.0
smmap==5.0.0
tensorboard==2.4.1
tensorboard-plugin-wit==1.8.1
tornado==6.1
tqdm==4.64.0
traitlets==5.3.0
typing-extensions==4.3.0
urllib3==1.26.5
wandb==0.12.21
wcwidth==0.2.5
Werkzeug==1.0.1
wincertstore==0.2
zipp==3.8.1

六、准备数据集
  1. YOLOv5代码
    git clone https://github.com/ultralytics/yolov5
    
  2. 图片资源,用飞桨安全帽资源,已经标注好了
    HelmetDetection包括images(原始图片)和annotations(标注信息xml) 
    下载地址:https://aistudio.baidu.com/aistudio/datasetdetail/50329
    
  3. yolov5中创建目录(资源转成VOC格式)
    helmet_source
    		Annotations  #标注信息xml
    		dataSet_path #
    		images       #原始图片
    		ImageSets    #数据集分类txt文件(自写make_voc_txt.py脚本生成)
    		labels       #voc格式的标签文件(自写make_voc_label.py脚本生成)
    
  4. 注意
    1. 按照上述目录结构训练结果可以检测出图片
    2. 在data中创建的目录训练cls一直是0,检测图片也不识别
    3. 尝试换环境版本,调参数都不行
    4. 最后觉的可能哪里路径有问题
    
七、训练
  1. 将coco.yaml复制一份helmet.yaml修改如下:
    train: helmet_source/dataSet_path/train.txt  # train images (relative to 'path') 118287 images
    val: helmet_source/dataSet_path/val.txt  # val images (relative to 'path') 5000 images
    # test: helmet_source/dataSet_path/test.txt  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794
    
    # Classes
    nc: 2  # number of classes
    names: ['helmet', 'head']  # class names
    
  2. 将models/yolov5s.yaml修改
    nc: 2  # number of classes  改为自己的类别个数
    
  3. 训练指令(我的测试资源和脚本以及官网权重在文中后面有写)
    python39 train.py --img 416 --batch 4 --epochs 100 --data data/helmet.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt --device 0 #--device cpu
    
  4. 说明
    输出:runs/train/exp/weights/best.pt 和 last.pt
    说明:训练100次,效果不太好,500次会好点,当然越多越好
    YOLOv5 训练 ( train.py )、验证 ( val.py )、推理 ( detect.py ) 和导出 ( export.py ) 的正确操作
    

5.训练结果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、测试
  1. 检测指令
    python39 detect.py --data data/helmet.yaml --weights runs/train/exp/weights/best.pt --source helmet_test.png #--conf-thres 0.1 --iou-thres 0.9
    
  2. 原始图片和结果
    原始图片
    在这里插入图片描述
九、资源及脚本
  1. 测试资源下载点击这里下载

  2. 分类脚本 make_voc_txt.py

    import os
    import random
    trainval_percent = 0.1
    train_percent = 0.9
    root_path = 'helmet_source'
    xmlfilepath = '%s/Annotations' % root_path
    txtsavepath = '%s/ImageSets' % root_path
    total_xml = os.listdir(xmlfilepath)
    num = len(total_xml)
    list = range(num)
    tv = int(num * trainval_percent)
    tr = int(tv * train_percent)
    trainval = random.sample(list, tv)
    train = random.sample(trainval, tr)
    ftrainval = open('%s/trainval.txt' % txtsavepath, 'w')
    ftest = open('%s/test.txt' % txtsavepath, 'w')
    ftrain = open('%s/train.txt' % txtsavepath, 'w')
    fval = open('%s/val.txt' % txtsavepath, 'w')
    for i in list:
        name = total_xml[i][:-4] + '\n'
        if i in trainval:
            ftrainval.write(name)
            if i in train:
                ftest.write(name)
            else:
                fval.write(name)
        else:
            ftrain.write(name)
    ftrainval.close()
    ftrain.close()
    fval.close()
    ftest.close()
    
    
  3. 生产yolo需要的标注数据格式make_voc_label.py(同时可以产生标注图片)

    import xml.etree.ElementTree as ET
    import pickle
    import os, cv2
    from os import listdir, getcwd
    from os.path import join
    from tqdm import tqdm
    
    sets = ['train', 'test','val']
    classes = ['helmet', 'head']
    colors = {
          'helmet': (60, 60, 250), 'head': (250, 60, 60)}
    
    root_path = "helmet_source"
    dataSet_path = "%s/dataSet_path" % root_path
    image_path = "%s/images" % root_path
    Annotations_path = "%s/Annotations" % root_path
    ImageSets_path = "%s/ImageSets" % root_path
    labels_path = "%s/labels" % root_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
        # x_center = (box[0]+box[1])/2.0
        # y_center = (box[2]+box[3])/2.0
        # x = x_center / size[0]
        # y = y_center / size[1]
        
        # w = (box[1] - box[0]) / size[0]
        # h = (box[3] - box[2]) / size[1]
        return (x, y, w, h)
    def convert_annotation(image_id):
        in_file = open('%s/%s.xml' % (Annotations_path, image_id))
        out_file = open('%s/%s.txt' % (labels_path, image_id), 'w')
        im = cv2.imread('%s/%s.png' % (image_path, image_id))
        print('%s/%s.png' % (image_path, image_id))
    	
        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
            cls = obj.find('name').text
            if cls not in classes or int(difficult) == 1:
                continue
            cls_id = classes.index(cls)
            xmlbox = obj.find('bndbox')
            xmin = xmlbox.find('xmin').text
            xmax = xmlbox.find('xmax').text
            ymin = xmlbox.find('ymin').text
            ymax = xmlbox.find('ymax').text
            b = (float(xmin), float(xmax), float(ymin), float(ymax))
            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')
    		
            print(cls, colors[cls], xmin, xmax, ymin, ymax)
            cv2.rectangle(im, (int(xmin), int(ymin)), (int(xmax), int(ymax)), colors[cls])
            cv2.putText(im, cls, (int(xmin), int(ymin) - 3), cv2.FONT_HERSHEY_SIMPLEX, 0.5, colors[cls])
        # cv2.imshow('result', im)
        # cv2.waitKey(0)
        cv2.imwrite('%s/%s_tag.png' % (image_path, image_id), im)
    		
    wd = getcwd()
    print(wd)
    for image_set in sets:
        if not os.path.exists(labels_path):
            os.makedirs(labels_path)
        image_ids = open('%s/%s.txt' % (ImageSets_path, image_set)).read().strip().split()
        list_file = open('%s/%s.txt' % (dataSet_path, image_set), 'w')
        for image_id in image_ids:
            # print(image_id)
            list_file.write('%s/%s.png\n' % (image_path, image_id))
            convert_annotation(image_id)
        list_file.close()
    
  4. 文件重命名分序make_voc_file.py

    import os
    path = "./image"
    filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
    count=0 #从零开始
    for file in filelist:
        print(file)
    for file in filelist:   #遍历所有文件
        Olddir=os.path.join(path,file)   #原来的文件路径
        if os.path.isdir(Olddir):   #如果是文件夹则跳过
            continue
        filename=os.path.splitext(file)[0]   #文件名
        filetype=os.path.splitext(file)[1]   #文件扩展名
        Newdir=os.path.join(path,str(count).zfill(6)+filetype)  #用字符串函数zfill 以0补全所需位数
        os.rename(Olddir,Newdir)#重命名
        count+=1
    

5.下载官方权重(里面有download_weights.sh脚本)

from utils.downloads import attempt_download

models = ['n', 's', 'm', 'l', 'x']
models.extend([x + '6' for x in models])  # add P6 models

for x in models:
	attempt_download(f'yolov5{
      x}.pt')
附:
1、pip3 install backports.lzma (3.9忽略)
	  sudo vi /usr/local/lib/python3.7/lzma.py
		from _lzma import *
		from _lzma import _encode_filter_properties, _decode_filter_properties
		修改:
		try:
			from _lzma import *
			from _lzma import _encode_filter_properties, _decode_filter_properties
		except ImportError:
			from backports.lzma import *
			from backports.lzma import _encode_filter_properties, _decode_filter_properties
	
2、labelImg使用
		git clone https://github.com/tzutalin/labelImg
		pip3 install lxml
		pyrcc5 -o resources.py resources.qrc , 将Qt文件格式(.qrc)转为Python(.py)格式,将生成的resources.py拷贝到同级的libs目录下
		sudo apt-get install libxcb-xinerama0 (解决 qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found)
		
3、pip3 运行出错:subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1  
		sudo cp /usr/lib/python3/dist-packages/lsb_release.py /usr/local/lib/python3.7  (3.9忽略)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hanbo622/article/details/126126323

智能推荐

linux devkmem 源码,linux dev/mem dev/kmem实现访问物理/虚拟内存-程序员宅基地

文章浏览阅读451次。dev/mem: 物理内存的全镜像。可以用来访问物理内存。/dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。调试嵌入式Linux内核时,可能需要查看某个内核变量的值。/dev/kmem正好提供了访问内核虚拟内存的途径。现在的内核大都默认禁用了/dev/kmem,打开的方法是在 make menuconfig中选中 device drivers --> ..._dev/mem 源码实现

vxe-table 小众但功能齐全的vue表格组件-程序员宅基地

文章浏览阅读7.1k次,点赞2次,收藏19次。vxe-table,一个小众但功能齐全并支持excel操作的vue表格组件_vxe-table

(开发)bable - es6转码-程序员宅基地

文章浏览阅读62次。参考:http://www.ruanyifeng.com/blog/2016/01/babel.htmlBabelBabel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行// 转码前input.map(item => item + 1);// 转码后input.map(function (item) { return item..._让开发环境支持bable

FPGA 视频处理 FIFO 的典型应用_fpga 频分复用 视频-程序员宅基地

文章浏览阅读2.8k次,点赞6次,收藏29次。摘要:FPGA视频处理FIFO的典型应用,视频输入FIFO的作用,视频输出FIFO的作用,视频数据跨时钟域FIFO,视频缩放FIFO的作用_fpga 频分复用 视频

R语言:设置工作路径为当前文件存储路径_r语言设置工作目录到目标文件夹-程序员宅基地

文章浏览阅读575次。【代码】R语言:设置工作路径为当前文件存储路径。_r语言设置工作目录到目标文件夹

background 线性渐变-程序员宅基地

文章浏览阅读452次。格式:background: linear-gradient(direction, color-stop1, color-stop2, ...);<linear-gradient> = linear-gradient([ [ <angle> | to <side-or-corner>] ,]? &l..._background线性渐变

随便推点

【蓝桥杯省赛真题39】python输出最大的数 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析-程序员宅基地

文章浏览阅读1k次,点赞26次,收藏8次。第十三届蓝桥杯青少年组python编程省赛真题一、题目要求(注:input()输入函数的括号中不允许添加任何信息)1、编程实现给定一个正整数N,输出正整数N中各数位最大的那个数字。例如:N=132,则输出3。2、输入输出输入描述:只有一行,输入一个正整数N输出描述:只有一行,输出正整数N中各数位最大的那个数字输入样例:

网络协议的三要素-程序员宅基地

文章浏览阅读2.2k次。一个网络协议主要由以下三个要素组成:1.语法数据与控制信息的结构或格式,包括数据的组织方式、编码方式、信号电平的表示方式等。2.语义即需要发出何种控制信息,完成何种动作,以及做出何种应答,以实现数据交换的协调和差错处理。3.时序即事件实现顺序的详细说明,以实现速率匹配和排序。不完整理解:语法表示长什么样,语义表示能干什么,时序表示排序。转载于:https://blog.51cto.com/98..._网络协议三要素csdn

The Log: What every software engineer should know about real-time data's unifying abstraction-程序员宅基地

文章浏览阅读153次。主要的思想,将所有的系统都可以看作两部分,真正的数据log系统和各种各样的query engine所有的一致性由log系统来保证,其他各种query engine不需要考虑一致性,安全性,只需要不停的从log系统来同步数据,如果数据丢失或crash可以从log系统replay来恢复可以看出kafka系统在linkedin中的重要地位,不光是d..._the log: what every software engineer should know about real-time data's uni

《伟大是熬出来的》冯仑与年轻人闲话人生之一-程序员宅基地

文章浏览阅读746次。伟大是熬出来的  目录  前言  引言 时间熬成伟大:领导者要像狼一样坚忍   第一章 内圣外王——领导者的心态修炼  1. 天纵英才的自信心  2. 上天揽月的企图心  3. 誓不回头的决心  4. 宠辱不惊的平常心  5. 换位思考的同理心  6. 激情四射的热心  第二章 日清日高——领导者的高效能修炼  7. 积极主动,想到做到  8. 合理掌控自己的时间和生命  9. 制定目标,马..._当狼拖着受伤的右腿逃生时,右腿会成为前进的阻碍,它会毫不犹豫撕咬断自己的腿, 以

有源光缆AOC知识百科汇总-程序员宅基地

文章浏览阅读285次。在当今的大数据时代,人们对高速度和高带宽的需求越来越大,迫切希望有一种新型产品来作为高性能计算和数据中心的主要传输媒质,所以有源光缆(AOC)在这种环境下诞生了。有源光缆究竟是什么呢?应用在哪些领域,有什么优势呢?易天将为您解答!有源光缆(Active Optical Cables,简称AOC)是两端装有光收发器件的光纤线缆,主要构成部件分为光路和电路两部分。作为一种高性能计..._aoc 光缆

浏览器代理服务器自动配置脚本设置方法-程序员宅基地

文章浏览阅读2.2k次。在“桌面”上按快捷键“Ctrl+R”,调出“运行”窗口。接着,在“打开”后的输入框中输入“Gpedit.msc”。并按“确定”按钮。如下图 找到“用户配置”下的“Windows设置”下的“Internet Explorer 维护”的“连接”,双击选择“自动浏览器配置”。如下图 选择“自动启动配置”,并在下面的“自动代理URL”中填写相应的PAC文件地址。如下..._設置proxy腳本