yolov5训练自己的数据

目录

  • 1. 环境搭建
  • 2. 数据准备
  • 3. 数据标注
  • 4. 数据整理
    • 4.1 数据集切分
    • 4.2 修改数据文件
    • 4.3 修改模型文件
  • 5. 训练模型
    • 5.1 训练
    • 5.2 验证
    • 5.3 测试
  • 6. 训练结果分析

1. 环境搭建

安装anaconda、python、 cuda、 cudnn、 pytoch、 torchvision、 torchaudio等等。这里不详述

2. 数据准备

如果网上能找到开源数据集最好,找不到的话,需要自己爬取。
以下是爬取图片的代码:

from bs4 import BeautifulSoup# -*- coding:utf-8
import re
import requests
from urllib import error
from bs4 import BeautifulSoup
import osurlHead = 'https://photo.fengniao.com/'  # 爬取网站地址
url = 'https://photo.fengniao.com/pic_48723655.html'  # 网站中一张图片地址,即爬取的初始位置def getHtmlurl(url):  # 获取网址try:r = requests.get(url)# 解决解析乱码问题r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:return ""def getpic(html):  # 获取图片地址并下载,再返回下一张图片地址# 指定BeautifulSoup的解析器为:html.parsersoup = BeautifulSoup(html, 'html.parser')all_img = soup.find('a', class_='downPic')img_url = all_img['href']reg = r'<h3 class="title overOneTxt">(.*?)</h3>'# 找到网页源代码中图片链接的位置,使用 正则表达式截取图片链接r'<a\sclass=".*?"\starget=".*?"\shref=".*?">(.*)</a>'  # 正则表达式reg_ques = re.compile(reg)  # 编译一下正则表达式,运行的更快image_name = reg_ques.findall(html)  # 匹配正则表达式urlNextHtml = soup.find('a', class_='right btn')urlNext = urlHead + urlNextHtml['href']print('正在下载:' + img_url)root = 'F:\YOLO-datasets\other'path = os.path.join(root,image_name[0] + '.jpg')try:  # 创建或判断路径图片是否存在并下载if not os.path.exists(root):os.mkdir(root)if not os.path.exists(path):r = requests.get(img_url)with open(path, 'wb') as f:f.write(r.content)f.close()print("图片下载成功")else:print("文件已存在")except:print("爬取失败")return urlNext# 主函数
def main():html = (getHtmlurl(url))print(html)return getpic(html)num = 0
numPicture = 0
file = ''
List = []#检测图片数量函数
def Find(url):global List  #设置为全局变量print('正在检测图片总数,请稍等.....')t = 0  #objURL 分页数初始值i = 1s = 0while t < 1000:Url = url + str(t) # url地址加上分页数try:Result = requests.get(Url, timeout=7) #获取到url.timeout时间为7秒.如果获取不到7秒后退出except BaseException:t = t + 60 #源代码分页数为60continueelse:result = Result.text #以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。pic_url = re.findall('"objURL":"(.*?)",', result, re.S)  # 先利用正则表达式找到图片urls += len(pic_url) #根据正则表达式循环取出图片.(根据图片的数量长度来取,其实就是统计图片的个数)if len(pic_url) == 0: #长度为0说明没有符合条件的图片了退出breakelse:List.append(pic_url) #将取出的图片存入到list中去t = t + 60return s#推荐函数(推荐函数,主要是根据你键入的文本,在百度图片里找到相似的内容,返回给用户,类似于百度搜索的最下面)
def recommend(url):Re = []try:html = requests.get(url) #获取urlexcept error.HTTPError as e:returnelse:html.encoding = 'utf-8'  #html解码格式为utf-8bsObj = BeautifulSoup(html.text, 'html.parser') #html.text 根据encoding定义的code返回内容. html.parser 是解析器div = bsObj.find('div', id='topRS') # 通过find()函数获取标签<div id="topRS">if div is not None:listA = div.findAll('a')  #获取子标签 find_All()返回的是一个list find()直接返回结果for i in listA:if i is not None:Re.append(i.get_text())return Re#下载图片函数
def dowmloadPicture(html, keyword):global num# t =0pic_url = re.findall('"objURL":"(.*?)",', html, re.S)  # 先利用正则表达式找到图片urlprint('找到关键词:' + keyword + '的图片,即将开始下载图片...')for each in pic_url:print('正在下载第' + str(num + 1) + '张图片,图片地址:' + str(each))try:if each is not None:pic = requests.get(each, timeout=7)else:continueexcept BaseException:print('错误,当前图片无法下载')continueelse:string = file + r'\\' + keyword + '_' + str(num) + '.jpg'fp = open(string, 'wb')fp.write(pic.content)#text 返回的是unicode 型的数据,一般是在网页的header中定义的编码形式。# content返回的是bytes,二级制型的数据。也就是说你如果想要提取文本就用text.但是如果你想要提取图片、文件,就要用到contentfp.close()num += 1if num >= numPicture:returnif __name__ == '__main__':  # 主函数入口word = input("请输入搜索关键词(可以是人名,地名等): ")# add = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%BC%A0%E5%A4%A9%E7%88%B1&pn=120'url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&pn='tot = Find(url)Recommend = recommend(url)  # 记录相关推荐print('经过检测%s类图片共有%d张' % (word, tot))numPicture = int(input('请输入想要下载的图片数量 '))file = input('请建立一个存储图片的文件夹,输入文件夹名称即可')y = os.path.exists(file)if y == 1:print('该文件已存在,请重新输入')file = input('请建立一个存储图片的文件夹,)输入文件夹名称即可')os.mkdir(file)else:os.mkdir(file)t = 0tmp = urlwhile t < numPicture:try:url = tmp + str(t)result = requests.get(url, timeout=10)print(url)except error.HTTPError as e:print('网络错误,请调整网络后重试')t = t + 60else:dowmloadPicture(result.text, word)t = t + 60print('当前搜索结束,感谢使用')print('猜你喜欢')for re in Recommend:print(re, end='  ')# 循环下载图片!
#if __name__ == '__main__':
#    for i in range(1, 50):
#        url = main()

以上代码是转过来的,出处记不清了,不过很好用。
注意:数据量一般应该在500张以上,正反例至少是1:1,反例不需要标注,但是需要生成label文件,只不过文件是空的

3. 数据标注

数据标注可以使用X-AnyLabeling进行自动标注,省事省心
参考:X-Anylabeling: 一款多SOTA深度学习模型集成的新一代自动标注工具

注意:

  • 选择输出格式时,需要加载一个分类文件,这个分类文件是个简单的txt,内容一行一个分类即可。
    在这里插入图片描述
    在这里插入图片描述

  • 设置模型识别的目标,找到模型下载目录下的config.yaml,增加filter_classes:字段
    比如只识别飞机

filter_classes:
- airplane
classes:
- person
- bicycle
- car
- motorcycle
- airplane

4. 数据整理

4.1 数据集切分

训练集、验证集、测试集的比例是训练集80%,验证集和测试集分别是10~20%
images和labels都要进行切分,存储在相应的目录下
yolov5的数据目录结构如下:
在这里插入图片描述

4.2 修改数据文件

将yolov5的data目录下,coco.yaml复制一份并重命名,修改内容中的数据文件路径、数据文件名、分类数及分类名。
如下:

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# COCO 2017 dataset http://cocodataset.org
# Example usage: python train.py --data coco.yaml
# parent
# ├── yolov5
# └── datasets
#     └── coco  ← downloads here# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ./data/datasets/airplane  # dataset root dir
train: train.txt  # train images (relative to 'path') 118287 images
val: val.txt  # train images (relative to 'path') 5000 images
test: test.txt  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794# Classes
nc: 2  # number of classes
names: ['airplane', 'other']  # class names

4.3 修改模型文件

以训练yolov5m.yaml模型为例,复制一份yolov5m.yaml并重命名,修改文件中的nc为训练数据的类别数即可。
如下:

nc: 2  # number of classes
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32
。。。

5. 训练模型

5.1 训练

python train.py --weights yolov5m6.pt --data data/airplane.yaml --img 640 --device 0 --cfg models/yolov5m-airplane.yaml --batch-size 8 --epochs 100
  • –weights 加载预训练权重
  • –data 数据文件路径
  • –img 输入数据分辨率640
  • –device GPU编号
  • –cfg 模型配置文件

5.2 验证

python val.py --weights E:\code\other\yolov5-6.0\runs\train\exp10\weights\best.pt --data ./data/airplane.yaml --img 640 --iou-thres 0.65 --conf-thres 0.25

5.3 测试

python detect.py --weights E:\code\other\yolov5-6.0\runs\train\exp10\weights\best.pt --source ./data/datasets/airplane/images/test --conf-thres 0.25 --iou-thres 0.45 --save-txt --save-conf```

6. 训练结果分析

参考:链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/240435.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试大作业||测试计划+测试用例+性能用例+自动化用例+测试报告

xxx学院 2023—2024 学年度第二学期期末考试 《软件测试》&#xff08;A&#xff09;试题&#xff08;开卷&#xff09; 题目&#xff1a;以某一 web 系统为测试对象&#xff0c;完成以下文档的编写&#xff1a; &#xff08;满分 100 分&#xff09; &#xff08;1&am…

量化研究员!你应该如何写一手好代码

即使是Quant Researcher&#xff0c; 写一手高质量的代码也是非常重要的。再好的思路&#xff0c;如果不能正确地实现&#xff0c;都是没有意义的。 写一手高质量的代码的意义&#xff0c;对Quant developer来讲就更是自不待言了。这篇笔记就介绍一些python best practice。 始…

QT第二周周三

题目&#xff1a;使用图片绘制出仪表盘 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *paren…

申请开启|成为亚马逊云科技 Community Builder,共建云端社区!

在探索由技术打造的云端世界时&#xff0c;和同行者一起学习&#xff0c;与技术专家共同探讨是开发者成长的最佳助力&#xff01; 亚马逊云科技开发者社区 Community Builders 为技术爱好者和新兴思想领袖提供技术资源、学习和交流机会&#xff0c;帮助开发者探索、分享技术相关…

【车载HMI开发工具--EB GUIDE 与 Unity 合作提供一体化的沉浸式 HMI 设计开发工具链】【转载】

随着车载高性能计算平台的日益普及以及显示器尺寸和数量的不断增加&#xff0c;沉浸式车载人机交互界面&#xff08;HMI&#xff09;的需求也在持续增长。为了将实时 3D 技术带入车载 HMI 领域&#xff0c;Unity 与 Elektrobit (EB)展开了合作&#xff0c;EB 是推进 HMI 功能安…

CC工具箱使用指南:【添加字段(批量)】

一、简介 Arcgis中添加字段是常用的一个操作&#xff0c;软件中也自带有添加字段工具。 如果要给一个要素或表批量添加字段&#xff0c;可以用迭代器或批处理。 但如果理复杂一点&#xff0c;有多个GDB要素、表格&#xff0c;或者是SHP文件&#xff0c;需要给这个要素或表添…

Git将某个文件合并到指定分支

企业开发中&#xff0c;经常会单独拉分支去做自己的需求开发&#xff0c;但是某些时候一些公共的配置我们需要从主线pull&#xff0c;这时候整个分支merge显然不合适 1.切换至待合并文件的分支 git checkout <branch>2.将目标分支的单个文件合并到当前分支 git checkou…

.NET国产化改造探索(三)、银河麒麟安装.NET 8环境

随着时代的发展以及近年来信创工作和…废话就不多说了&#xff0c;这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来&#xff0c;看操作。 上一篇介绍了如何在银河麒麟操作系统上安装人大金仓数据库&#xff0c;这篇文章详细介绍下在银河麒麟操作系统上安装.NET8环境。…

最新 生成pdf文字和表格

生成pdf文字和表格 先看效果 介绍 java项目&#xff0c;使用apache的pdfbox工具&#xff0c;可分页&#xff0c;自定义列 依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.22<…

第一讲_HarmonyOS应用开发环境准备

HarmonyOS应用开发环境准备 1. 知识储备2. 环境搭建2.1 安装node.js2.2 配置node.js2.3 安装命令行工具2.4 安装DevEco Studio2.5 配置DevEco Studio 1. 知识储备 HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架可…

Flutter开发进阶之动画

Flutter开发进阶之动画 在Flutter中&#xff0c;动画是至关重要的一个部分&#xff0c;它能够为应用程序提供更加丰富和生动的用户体验&#xff0c;Flutter中的动画系统是UI框架的核心功能之一&#xff0c;也是开发者学习Flutter框架的重要部分&#xff0c;由于动画原理在所有…

架设一台NFS服务器,并按照以下要求配置

1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 2、开放/nfs/upload目录&#xff0c;为192.168.xxx.0/24网段主机可以上传目录&#xff0c; 并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3、将/home/tom目录仅共享给192.168.xxx.xxx这台主机&#xff0c;…

Linux系统:yum仓库

目录 一、yum 1、yum概述 2、yum仓库 3、yum实现过程原理 二、yum配置文件详解 1、主配置文件 2、yum仓库设置文件 3、yum日志文件 三、yum命令详解 1、查询 1.1 yum list [软件名] 1.2 yum info [软件名] 1.3 yum search <关键词> 1.4 yum provides <关…

【Web】CTFSHOW PHP特性刷题记录(全)

知其然知其所以然&#xff0c;尽量把每种特性都详细讲明白。 目录 web89 web90 web91 web92 web93 web94 web95 web96 web97 web98 web99 web100 web101 web102 web103 web104 web105 web106 web107 web108 web109 web110 web111 web112 web113 web…

Clickhouse表引擎之CollapsingMergeTree引擎的原理与使用

前言 继续上次关于clickhouse的一些踩坑点&#xff0c;今天讲讲另外一个表引擎——CollapsingMergeTree。这个对于引擎对于数据量较大的场景是个不错的选择。注意&#xff0c;选择clickhouse的一般原因都是为了高效率查询&#xff0c;提高用户体验感&#xff0c;说白了就是以空…

zabbix实验

目录 一、zabbix 自动发现与自动注册 1、zabbix 自动发现 ①关闭防火墙和安全机制 ②在服务端和客户端上配置 hosts 解析 ③在 Web 页面配置自动发现 2、zabbix 自动注册 ①环境准备 ②在服务端和客户端上配置 hosts 解析 ③修改 zabbix-agent2 配置文件 ④在 Web 页…

查看centos的CPU、内存、磁盘空间等配置信息

目录 查看CPU/proc/cpuinfo中的信息 查看内存/proc/meminfo中的信息 查看磁盘空间df 命令du命令使用fdisk命令 查看CPU /proc/cpuinfo中的信息 前置&#xff1a; [ltkjltkj front]$ cat /proc/cpuinfo| grep "physical id" physical id : 0 physical id : 0 physi…

7.5 MySQL对数据的增改删操作(❤❤❤)

7.5 MySQL对数据的基本操作 1. 提要2. 数据添加2.1 insert语法2.2 insert 子查询2.3 ignore关键字 3. 数据修改3.1 update语句3.2 update表连接 4. 数据删除4.1 delete语句4.2 delete表连接4.3 快速删除数据表全部数据 1. 提要 2. 数据添加 2.1 insert语法 2.2 insert 子查询 …

【白皮书下载】GPU计算在汽车中的应用

驾驶舱域控制器 (CDC) 是汽车 GPU 的传统应用领域。在这里&#xff0c;它可以驱动仪表板上的图形&#xff0c;与车辆保持高度响应和直观的用户界面&#xff0c;甚至为乘客提供游戏体验。随着车辆屏幕数量的增加和分辨率的提高&#xff0c;对汽车 GPU 在 CDC 中进行图形处理的需…

Hive数据定义(1)

hive数据定义是hive的基础知识&#xff0c;所包含的知识点有&#xff1a;数据仓库的创建、数据仓库的查询、数据仓库的修改、数据仓库的删除、表的创建、表的删除、内部表、外部表、分区表、桶表、表的修改、视图。本篇文章先介绍&#xff1a;数据仓库的创建、数据仓库的查询、…