YOLOv7:第一篇之实践和推理
1. 下载源码
git clone https://github.com/WongKinYiu/yolov7.git
本文下载代码时间:2022.08.03
可能需要安装的库:
清华源加速安装:
-i https://pypi.tuna.tsinghua.edu.cn/simple
需要安装 yaml:
pip install pyyaml # 注意这里是 pyyaml,使用yaml 会安装失败找不到包。
2. 推理
python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg
首次使用会自动下载 yolov7.pt
文件到主目录。
输出信息:
Namespace(weights=['yolov7.pt'], source='inference/images/horses.jpg', img_size=640, conf_thres=0.25, iou_thres=0.45, device='', view_img=False, save_txt=False, save_conf=False, nosave=False, classes=None, agnostic_nms=False, augment=False, update=False, project='runs/detect', name='exp', exist_ok=False, no_trace=False) YOLOR 🚀 v0.1-47-g4f6e390 torch 1.10.1+cu102 CPU Downloading https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt to yolov7.pt... 100%|██████████████████████████████████████| 72.1M/72.1M [02:16<00:00, 553kB/s] Fusing layers... RepConv.fuse_repvgg_block RepConv.fuse_repvgg_block RepConv.fuse_repvgg_block /home/xx/programs/miniconda3/envs/yolo/lib/python3.9/site-packages/torch/functional.py:445: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ../aten/src/ATen/native/TensorShape.cpp:2157.) return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined] Model Summary: 306 layers, 36905341 parameters, 6652669 gradients, 104.7 GFLOPS Convert model to Traced-model... traced_script_module saved! model is traced! The image with the result is saved in: runs/detect/exp/horses.jpg Done. (0.359s)
需要注意的是上面的内容:
Model Summary: 306 layers, 36905341 parameters, 6652669 gradients, 104.7 GFLOPS Convert model to Traced-model... traced_script_module saved! model is traced!
暂时不太清楚啥意思。
3. onnx导出
python export.py --weights yolov7.pt --grid --end2end --simplify \ --topk-all 100 --iou-thres 0.65 --conf-thres 0.35 --img-size 640 640 --max-wh 640
这里我们主要关注得到的 yolov7.onnx
,我们使用 netron 进行可视化,以结合源码查看网络架构。
4. 网络配置yaml 文件解读
文件路径:cfg/training/yolov7.yaml
点击查看代码
# parameters nc: 80 # number of classes depth_multiple: 1.0 # model depth multiple width_multiple: 1.0 # layer channel multiple # anchors anchors: - [12,16, 19,36, 40,28] # P3/8 - [36,75, 76,55, 72,146] # P4/16 - [142,110, 192,243, 459,401] # P5/32 # yolov7 backbone backbone: # [from, number, module, args] [[-1, 1, Conv, [32, 3, 1]], # 0 [-1, 1, Conv, [64, 3, 2]], # 1-P1/2 [-1, 1, Conv, [64, 3, 1]], # 2 [-1, 1, Conv, [128, 3, 2]], # 3-P2/4 # -2 [-1, 1, Conv, [64, 1, 1]], # 4 # -6 [-2, 1, Conv, [64, 1, 1]], # 5 # -5 [-1, 1, Conv, [64, 3, 1]], # 6 [-1, 1, Conv, [64, 3, 1]], # 7 # -3 [-1, 1, Conv, [64, 3, 1]], # 8 [-1, 1, Conv, [64, 3, 1]], # 9 # -1 [[-1, -3, -5, -6], 1, Concat, [1]], # 10 [-1, 1, Conv, [256, 1, 1]], # 11 [-1, 1, MP, []], # 12 [-1, 1, Conv, [128, 1, 1]], # 13 # -3 [-3, 1, Conv, [128, 1, 1]], # 14 [-1, 1, Conv, [128, 3, 2]], # 15 # -1 [[-1, -3], 1, Concat, [1]], # 16-P3/8 # -2 [-1, 1, Conv, [128, 1, 1]], # 17 # -6 [-2, 1, Conv, [128, 1, 1]], # 18 # -5 [-1, 1, Conv, [128, 3, 1]], # 19 [-1, 1, Conv, [128, 3, 1]], # 20 # -3 [-1, 1, Conv, [128, 3, 1]], # 21 [-1, 1, Conv, [128, 3, 1]], # 22 # -1 [[-1, -3, -5, -6], 1, Concat, [1]], # 23 [-1, 1, Conv, [512, 1, 1]], # 24 # -3 [-1, 1, MP, []], # 25 [-1, 1, Conv, [256, 1, 1]], # 26 # -3 [-3, 1, Conv, [256, 1, 1]], # 27 [-1, 1, Conv, [256, 3, 2]], # 28 # -1 [[-1, -3], 1, Concat, [1]], # 29-P4/16 # -2 [-1, 1, Conv, [256, 1, 1]], # 30 # -6 [-2, 1, Conv, [256, 1, 1]], # 31 # -5 [-1, 1, Conv, [256, 3, 1]], # 32 [-1, 1, Conv, [256, 3, 1]], # 33 # -3 [-1, 1, Conv, [256, 3, 1]], # 34 [-1, 1, Conv, [256, 3, 1]], # 35 # -1 [[-1, -3, -5, -6], 1, Concat, [1]], # 36 [-1, 1, Conv, [1024, 1, 1]], # 37 # -3 [-1, 1, MP, []], # 38 [-1, 1, Conv, [512, 1, 1]], # 39 # -3 [-3, 1, Conv, [512, 1, 1]], # 40 [-1, 1, Conv, [512, 3, 2]], # 41 # -1 [[-1, -3], 1, Concat, [1]], # 42-P5/32 # -2 [-1, 1, Conv, [256, 1, 1]], # 43 # -6 [-2, 1, Conv, [256, 1, 1]], # 44 # -5 [-1, 1, Conv, [256, 3, 1]], # 45 [-1, 1, Conv, [256, 3, 1]], # 46 # -3 [-1, 1, Conv, [256, 3, 1]], # 47 [-1, 1, Conv, [256, 3, 1]], # 48 # -1 [[-1, -3, -5, -6], 1, Concat, [1]], # 49 [-1, 1, Conv, [1024, 1, 1]], # 50 ] # yolov7 head head: [[-1, 1, SPPCSPC, [512]], # 51 [-1, 1, Conv, [256, 1, 1]], # 52 [-1, 1, nn.Upsample, [None, 2, 'nearest']], # 53 # -2 [37, 1, Conv, [256, 1, 1]], # route backbone P4 # 54 # -1 [[-1, -2], 1, Concat, [1]], # 55 # -2 [-1, 1, Conv, [256, 1, 1]], # 56 # -6 [-2, 1, Conv, [256, 1, 1]], # 57 # -5 [-1, 1, Conv, [128, 3, 1]], # 58 # -4 [-1, 1, Conv, [128, 3, 1]], # 59 # -3 [-1, 1, Conv, [128, 3, 1]], # 60 # -2 [-1, 1, Conv, [128, 3, 1]], # 61 # -1 [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]], # 62 [-1, 1, Conv, [256, 1, 1]], # 63 [-1, 1, Conv, [128, 1, 1]], # 64 [-1, 1, nn.Upsample, [None, 2, 'nearest']], # 65 # -2 [24, 1, Conv, [128, 1, 1]], # route backbone P3 # 66 [[-1, -2], 1, Concat, [1]], # 67 # -2 [-1, 1, Conv, [128, 1, 1]], # 68 # -6 [-2, 1, Conv, [128, 1, 1]], # 69 # -5 [-1, 1, Conv, [64, 3, 1]], # 70 # -4 [-1, 1, Conv, [64, 3, 1]], # 71 # -3 [-1, 1, Conv, [64, 3, 1]], # 72 # -2 [-1, 1, Conv, [64, 3, 1]], # 73 # -1 [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]], # 74 [-1, 1, Conv, [128, 1, 1]], # 75 [-1, 1, MP, []], # 76 [-1, 1, Conv, [128, 1, 1]], # 77 # -3 [-3, 1, Conv, [128, 1, 1]], # 78 [-1, 1, Conv, [128, 3, 2]], # 79 # -1 [[-1, -3, 63], 1, Concat, [1]], # 80 # -2 [-1, 1, Conv, [256, 1, 1]], # 81 [-2, 1, Conv, [256, 1, 1]], # 82 [-1, 1, Conv, [128, 3, 1]], # 83 [-1, 1, Conv, [128, 3, 1]], # 84 [-1, 1, Conv, [128, 3, 1]], # 85 [-1, 1, Conv, [128, 3, 1]], # 86 [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]], # 87 [-1, 1, Conv, [256, 1, 1]], # 88 # -3 [-1, 1, MP, []], # 89 [-1, 1, Conv, [256, 1, 1]], # 90 # -3 [-3, 1, Conv, [256, 1, 1]], # 91 [-1, 1, Conv, [256, 3, 2]], # 92 # -1 [[-1, -3, 51], 1, Concat, [1]], # 93 # -2 [-1, 1, Conv, [512, 1, 1]], # 94 [-2, 1, Conv, [512, 1, 1]], # 95 [-1, 1, Conv, [256, 3, 1]], # 96 [-1, 1, Conv, [256, 3, 1]], # 97 [-1, 1, Conv, [256, 3, 1]], # 98 [-1, 1, Conv, [256, 3, 1]], # 99 [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]], # 100 [-1, 1, Conv, [512, 1, 1]], # 101 [75, 1, RepConv, [256, 3, 1]], # 102 [88, 1, RepConv, [512, 3, 1]], # 103 [101, 1, RepConv, [1024, 3, 1]], # 104 [[102,103,104], 1, IDetect, [nc, anchors]], # Detect(P3, P4, P5) # 105 # IDetect 训练和部署不一样 ]
已完成:
- 翻译下面的论文:
https://arxiv.org/pdf/2101.03697.pdf
【论文阅读】RepVGG: Making VGG-style ConvNets Great Again
待完成:
-
理解YOLOv7 中的 RepConv啥意思。
-
画出 YOLOv7的网络架构图
-
有时间的话,将YOLOv7 部分代码模块化,显然现在的YOLOv7的模型搭建还不够模块化。
5.推理参数
使用 detect.py 来检测:
python .\detect.py --source 0 # source:0 调用笔记本摄像头 # 'xx.jpg' 直接检测图片 # '传入文件夹' 检测文件夹的目录 # '传入视频文件' 直接检测视频文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人