写BUG的派大星

Patrick Star

  • 首页
  • 归档

  • 搜索
设计模式 Gis Kafka Druid 微信小程序 Java 开源项目源码 物体识别 机器学习 Mybatis 微服务 Feign OpenVPN CSS Streamsets CDH SpringCloud SpringBoot maven 分布式 Shell Tree Linux js WebSocket 多线程 集群 Hadoop 大数据 JDK ElasticSearch MySQL 数据库 Redis Http Nginx

一次使用YoloV5进行物体识别的记录

发表于 2020-09-03 | 分类于 Python | 0 | 阅读次数 1120

下载anaconda

官网下载安装即可。

image-20200830004449612

主要用作环境隔离等。

下载cuda

这里选择的版本是10.0

image-20200830004548306

在安装程序中一路下一步即可。

安装过程中有一个配置安装路径,后面安装cudnn需要用到。

cuda主要是驱动等

安装cudnn

cudnn版本需要与cuda对应

cudnn主要功能是提供神经网络的支持

在官网下载时需要有一个开发者帐号

然后下载下来是一个压缩包

image-20200830004820116

分别将这三个文件夹复制到cuda安装路径下

然后就结束啦

项目实操

从Github拉取YoloV5代码

GitHub地址:https://github.com/ultralytics/yolov5

该模型主要用作物体识别,初始提供s、m、l、x四个预训练的模型,下面是官方给出的数据。随着模型从小杯到大杯,识别速度下降、准确度提高,可以根据实际需求选择。

image-20200903190129196

从Github直接克隆下来的项目是没有模型的,要手动下载。

模型下载地址:https://github.com/ultralytics/yolov5/releases

GithubRelease的文件是放在亚马逊AWS上的,国内访问的话速度可能慢的令人发指。

如果有云服务器的话,则可以复制下载地址,然后用wget命令下载下来以后,通过SFTP传输到本地。

一个猜想:既然是由于服务器在国外而导致下载速度慢,或许可以通过使用代理的方式提升速度,但是没有尝试。

模型下载好就可以放在weights文件夹下备用了

让yolov5运行起来

yolov5推荐的环境是Python3.8、pytorch1.6、torchvision0.7.0

为了避免各版本环境混乱,所以新建了一个虚拟环境用以运行这个模型。

  1. 使用conda create -n newyolo python=3.8新建一个python3.8的环境。

  2. 环境创建好以后屏幕会有提示,然后使用conda activate newyolo进入这个虚拟环境。

  3. 进入刚刚拉取的yolov5的项目根目录,使用pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple,末尾的-i参数是指定使用清华大学的镜像源,会比直接安装快一点。

  4. 由于清华的源好久没更新,导致安装过程中找不到pytorch1.6、torchvision0.7.0,比较尴尬的是即使使用默认源也无法找到。

    所以采用如下方法下载:

    pip install torch==1.6.0 -f https://download.pytorch.org/whl/torch_stable.html --proxy=127.0.0.1:1080

    通过从pytorch官网进行下载,为了提速,使用了代理。没有代理则去掉--proxy=127.0.0.1:1080

    同样的方法 下载torchvision

    pip install torchvision==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html --proxy=127.0.0.1:1080

  5. 将这两个难下载的下载好以后,再执行一遍pip install -r .\requirements.txt --proxy=127.0.0.1:1080,从pip源下载其他依赖(由于发现清华镜像不靠谱,所以直接走代理了,发现代理也很快,可以在6-10M/s左右)

  6. 至此前期准备工作已经完成了,验证一下结果。 python .\detect.py --source inference\images\bus.jpg --weights weights\yolov5x.pt

    image-20200903192349321

    结果是识别出来了4个人,1辆自行车,1辆公交车,文件保存在inference\output目录。

    效果如下:

    image-20200903192559031

    还是不错的,甚至连第一眼没注意到的自行车也识别成功了。

    因为这个是项目中提供的图片,可能准确率比较高,换另一张网上找的图片尝试一下:

    timg

    识别结果:

    image-20200903193034705

    不得不说,效果确实很好。

训练一个模型

官方wiki:https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data

训练命令如下:

python train.py --img 640 --batch 16 --epochs 5 --data ./data/coco128.yaml --cfg ./models/yolov5s.yaml --weights ''

通过阅读wiki,了解到大致可以分成以下几步:

  1. 总体说明:准备数据集,包括图片和标记。然后将这些卸载yaml的配置文件中。其中图片与标记的文件夹要一一对应。

  2. 配置文件说明,同样地,先看官方样例:
    image-20200903193617733
    其中的注释说的很清楚了,除download外,需要写train、val、nc、names。分别代表训练集、验证集、类型数目、类型名称。

  3. 文件结构说明:

    首先分为图片与标记,这两个文件夹中的子文件应该是一一对应的,除扩展名外的文件名也要相同。

    官方给出的样例:

    image-20200903193459660

    即:假设coco/images/train2017目录下有一个a.jpg,那么coco/labels/train2017目录中也要有一个a.txt

  4. 标记文件说明:

    image-20200903194142589

    官方示例指出,图片中有多少物体就有几行数据,每行数据中五个数字,第一个数字代表类型,后面四个代表归一化后的数值(中心点横坐标、中心点纵坐标、宽、高)。

    具体计算方法可看wiki。

安全帽识别

理清楚上面的逻辑以后,就可以开始寻找数据集,然后训练了。

这里以安全帽数据为例。

有一个标注好的数据集,格式如下:

image-20200903194635381

有三个文件夹,其中Annotations代表标注,里面有很多xml数据。
image-20200903194755711
每个xml格式是这样的,如果有多个物体就有多个object:

<annotation>
	<folder>hat01</folder>
	<filename>000000.jpg</filename>
	<path>D:\dataset\hat01\000000.jpg</path>
	<source>
		<database>Unknown</database>
	</source>
	<size>
		<width>947</width>
		<height>1421</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>hat</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>60</xmin>
			<ymin>66</ymin>
			<xmax>910</xmax>
			<ymax>1108</ymax>
		</bndbox>
	</object>
</annotation>

ImageSets是图片设置,将图片分类为训练集、验证集、测试集等,有四个txt文档,每个文档中都记录了一些文件名称。

image-20200903194819085

JPEGImages中有各种图片,文件名与xml对应

image-20200903194923748

数据处理

要将现有的数据集处理成yolov5需要的格式,于是写了一个脚本,进行以下操作:

  1. 将文件按照txt给出的进行分类。
  2. 将xml中的数据转为yolov5需要的txt格式。

代码地址Github:https://github.com/mwgPatrick/PythonCode/blob/master/xml2yolotxt.py

处理以后的成果:

images中有四个文件夹

image-20200903195712990

labels文件与images对应

image-20200903195802750

txt文件中的数据:

image-20200903195848259

准备好以后就可以开始训练了

开始训练

首先新建一个yaml文件,两个路径是与yolov5的相对路径。

image-20200903200013434

其中只有这四行,nc与names需要与数据集中标记的一样。

准备以后执行命令python train.py --batch 4 --epochs 5 --data .\data\patrick.yaml --cfg .\models\yolov5x.yaml --weight .\weights\yolov5x.pt 继续接着x模型训练。

由于硬件性能有限,所以batch只能设置为4了,不然总是提示GPU内存不足。

出现如下界面说明开始训练,默默等待即可。

image-20200903200124637

验证训练成果

由于时间关系,只训练了五次,花了不到1.5小时。所以效果肯定不会太好。

模型存放在runs\exp13\weights\last.pt具体是exp几要看实际情况,共生成了两个模型文件,一个last,一个best。但是目前区别不大,所以暂且使用last.pt。

从网上找了两张图片验证识别效果:

image-20200903201016666

image-20200903201044086

  • 本文作者: Patrick
  • 本文链接: https://www.write1bug.cn/archives/一次使用yolov5进行物体识别的记录
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 设计模式 # Gis # Kafka # Druid # 微信小程序 # Java # 开源项目源码 # 物体识别 # 机器学习 # Mybatis # 微服务 # Feign # OpenVPN # CSS # Streamsets # CDH # SpringCloud # SpringBoot # maven # 分布式 # Shell # Tree # Linux # js # WebSocket # 多线程 # 集群 # Hadoop # 大数据 # JDK # ElasticSearch # MySQL # 数据库 # Redis # Http # Nginx
Feign请求头设置/传递问题(同步方法设置Header/异步方法设置Header)
Java中通过druid修改sql中表名、别名
  • 文章目录
  • 站点概览
Patrick

Patrick

不是在改BUG,就是在写BUG。

52 日志
9 分类
36 标签
RSS
E-mail
Creative Commons
© 2018 — 2023 Patrick
人生如逆旅|我亦是行人
鲁ICP备18043140号-1