下载anaconda
官网下载安装即可。
主要用作环境隔离等。
下载cuda
这里选择的版本是10.0
在安装程序中一路下一步即可。
安装过程中有一个配置安装路径,后面安装cudnn需要用到。
cuda主要是驱动等
安装cudnn
cudnn版本需要与cuda对应
cudnn主要功能是提供神经网络的支持
在官网下载时需要有一个开发者帐号
然后下载下来是一个压缩包
分别将这三个文件夹复制到cuda安装路径下
然后就结束啦
项目实操
从Github拉取YoloV5代码
GitHub地址:https://github.com/ultralytics/yolov5
该模型主要用作物体识别,初始提供s、m、l、x四个预训练的模型,下面是官方给出的数据。随着模型从小杯到大杯,识别速度下降、准确度提高,可以根据实际需求选择。
从Github直接克隆下来的项目是没有模型的,要手动下载。
模型下载地址:https://github.com/ultralytics/yolov5/releases
GithubRelease的文件是放在亚马逊AWS上的,国内访问的话速度可能慢的令人发指。
如果有云服务器的话,则可以复制下载地址,然后用wget命令下载下来以后,通过SFTP传输到本地。
一个猜想:既然是由于服务器在国外而导致下载速度慢,或许可以通过使用代理的方式提升速度,但是没有尝试。
模型下载好就可以放在weights文件夹下备用了
让yolov5运行起来
yolov5推荐的环境是Python3.8、pytorch1.6、torchvision0.7.0
为了避免各版本环境混乱,所以新建了一个虚拟环境用以运行这个模型。
-
使用
conda create -n newyolo python=3.8
新建一个python3.8的环境。 -
环境创建好以后屏幕会有提示,然后使用
conda activate newyolo
进入这个虚拟环境。 -
进入刚刚拉取的yolov5的项目根目录,使用
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
,末尾的-i参数是指定使用清华大学的镜像源,会比直接安装快一点。 -
由于清华的源好久没更新,导致安装过程中找不到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
-
将这两个难下载的下载好以后,再执行一遍
pip install -r .\requirements.txt --proxy=127.0.0.1:1080
,从pip源下载其他依赖(由于发现清华镜像不靠谱,所以直接走代理了,发现代理也很快,可以在6-10M/s左右) -
至此前期准备工作已经完成了,验证一下结果。
python .\detect.py --source inference\images\bus.jpg --weights weights\yolov5x.pt
结果是识别出来了4个人,1辆自行车,1辆公交车,文件保存在
inference\output
目录。效果如下:
还是不错的,甚至连第一眼没注意到的自行车也识别成功了。
因为这个是项目中提供的图片,可能准确率比较高,换另一张网上找的图片尝试一下:
识别结果:
不得不说,效果确实很好。
训练一个模型
官方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,了解到大致可以分成以下几步:
-
总体说明:准备数据集,包括图片和标记。然后将这些卸载yaml的配置文件中。其中图片与标记的文件夹要一一对应。
-
配置文件说明,同样地,先看官方样例:
其中的注释说的很清楚了,除download外,需要写train、val、nc、names。分别代表训练集、验证集、类型数目、类型名称。 -
文件结构说明:
首先分为图片与标记,这两个文件夹中的子文件应该是一一对应的,除扩展名外的文件名也要相同。
官方给出的样例:
即:假设
coco/images/train2017
目录下有一个a.jpg,那么coco/labels/train2017
目录中也要有一个a.txt -
标记文件说明:
官方示例指出,图片中有多少物体就有几行数据,每行数据中五个数字,第一个数字代表类型,后面四个代表归一化后的数值(中心点横坐标、中心点纵坐标、宽、高)。
具体计算方法可看wiki。
安全帽识别
理清楚上面的逻辑以后,就可以开始寻找数据集,然后训练了。
这里以安全帽数据为例。
有一个标注好的数据集,格式如下:
有三个文件夹,其中Annotations
代表标注,里面有很多xml数据。
每个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文档,每个文档中都记录了一些文件名称。
JPEGImages
中有各种图片,文件名与xml对应
数据处理
要将现有的数据集处理成yolov5需要的格式,于是写了一个脚本,进行以下操作:
- 将文件按照txt给出的进行分类。
- 将xml中的数据转为yolov5需要的txt格式。
代码地址Github:https://github.com/mwgPatrick/PythonCode/blob/master/xml2yolotxt.py
处理以后的成果:
images
中有四个文件夹
labels
文件与images
对应
txt文件中的数据:
准备好以后就可以开始训练了
开始训练
首先新建一个yaml文件,两个路径是与yolov5的相对路径。
其中只有这四行,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内存不足。
出现如下界面说明开始训练,默默等待即可。
验证训练成果
由于时间关系,只训练了五次,花了不到1.5小时。所以效果肯定不会太好。
模型存放在runs\exp13\weights\last.pt
具体是exp几要看实际情况,共生成了两个模型文件,一个last,一个best。但是目前区别不大,所以暂且使用last.pt
。
从网上找了两张图片验证识别效果: