1 环境安装、工程下载
工程链接:https://github.com/ultralytics/yolov5
工程环境配置记录:
本人电脑已有环境:ubuntu18、cuda10.0、anaconda
创建虚拟环境并激活
conda create -n yolov5 python=3.6
source activate yolov5
下载工程并安装工程环境
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
按照工程所说,git下载会自动下载最新的YOLOv5模型。如果是直接下载工程并解压,到工程根目录激活虚拟环境后 运行
pip install -r requirements.txt
。这样我们需要手动下载模型,本人是手动下载的。
从这里进入链接,在如下图位置进行下载模型,为了测试该工程的性能,个人把所有的模型全部下载
该链接下,当前更新到了 v6.0,主要增加了YOLOv5n、YOLOv5n6,纳米版的yolov5,比yolov5s的模型还小,更合适移动端移植的任务。
为了工程文件的整洁性,在工程目录下创建文件夹【MODEL】,将下载的模型移到此处
2 模型测试
- 使用yolov5s.pt,测试工程提供的图片:
python detect.py --weight MODEL/yolov5s.pt
默认图片所在位置【data/images/】,工程提供了两张图片,运行命令会将路径下的 图片以及视频 都进行预测,结果默认路径为:【runs/detect/】。- 如果要预测单个图片或视频,
python detect.py --weight MODEL/yolov5s.pt --source data/images/bus.jpg
python detect.py --weight MODEL/yolov5s.pt --source data/images/**.mp4
3 onnx模型格式的导出与预测
- onnx库的安装:
pip install -U coremltools onnx scikit-learn==0.19.2
- yolov5的onnx模型的导出:(注意:这里模型路径根据自己实际情况而定)
python export.py --weights MODEL/yolov5s.pt --include onnx --dynamic
- 使用onnx模型进行预测:
python detect.py --weights MODEL/yolov5s.onnx
4 网络结构可视化
使用 netron 工具来可视化网络结构。软件安装命令
snap install netron
,结束后输入netron
即可打开软件。
- 【yaml格式】yolov5工程提供的网络文件是【yaml格式】,与yolov3/yolov4提供的【cfg文件】不同,无法直接进行可视化
- 【开源的pt格式】yolov5工程提供了训练好的【pt格式】权重模型,这个模型打开后可视化的结构不是详细的全部网络结构。这里粘贴局部内容
- 【onnx格式】我们【pt模型】转换成【onnx模型】,然后再使用netron进行可视化。这里显示的onnx模型,与网络本身定义的有一定的变化,比如没有bn、激活函数变化了。这也不是我们想要的。粘贴局部模型:
- 【重新保存的pt模型】我们只想可视化网络结构,与代码中定义的结构保持一致,训练参数暂时不关注。具体方法为:
在代码【models/yolo.py】中添加如下代码。我们可以看到保存的【test.pt】模型大小为 29.4M,作者提供的【yolov5s.pt】大小为 14.7M。inputs = torch.ones(size=(1, 3, 640, 640)).to(device) script_model = torch.jit.trace(model,inputs) script_model.save("test.pt")
额外说一句:这里我们在可视化的网络结构图中,发现yolov5中的 Focus操作不见了,这是因为这里显示的是 yolov5s v6.0的结构,将原本的Focus 操作替换成了一个卷积层,方便导出模型。
5 v6.0的更新内容
v6.0 修复了 上一个版本yolov5 v5.0的错误,以及合并了许多新功能;带来了架构调整,还引入了新的模型 P5 和 P6 的纳米版模型:YOLOv5n 和 YOLOv5n6。
Nano模型保持 YOLOv5s de 深度的0.33倍,但将YOLOv5s 的宽度倍数从 0.50减少到0.25,从而减少了约75%的参数,从7.5M 到1.9M,非常适合移动端和CPU解决方案。
重要更新:
- Roboflow 集成:使用我们新集成可直接在Roboflow数据集上训练 YOLOv5 模型
- YOLOv5n 纳米模型:低于 YOLOv5s(7.5M参数)的新的更小的 YOLOv5n(1.9M参数)模型,导出INT8模型大小为2.1M,非常适合超轻型移动解决方案。
- TensorFlow 和 Keras 导出:集成了 导出tensorflow、keras、TFLite、TF.js 模型的功能
python export.py --include saved_model pb tflite tfjs
- OpenCV DNN:导出 YOLOv5 ONNX 模型 支持opencv DNN 和 ONNX Runtime,无需开发者自己修改。导出后调用:
python detect.py --weights yolov5n.onnx --dnn --source data/images/bus.jpg --img 640
- 模型架构:更新后的主干更小、更快、更准确
- 更好的导出性:将【Focus()】替换为一个等效的【Conv(k=6,s=2,p=2)】
- 减少操作:使用【SPPF()】代替原本的【SPP()】层
- 提高速度:将backbone中的 P3 中的 C3() 从9个减少为6个
- 【SPPF()】在主干末端重新排序位置
- 在最后一个C3() 主干层重新引入 shortcut
- 更新超参数:增加了 mixup 和 copy-paste 的数据增强
v5.0 和 v6.0 的性能对比