关于 YOLO 识别违规骑行
由于并没有系统性的学习过深度学习和计算机视觉相关的知识,本篇帖子所记内容皆为实践和不断试错的结果;为使得已解决的bug和调通的方案具有可复现性,同时积累自己的经验而立此贴。
Anaconda相关指令
查看conda的环境配置
1 | conda config --show |
更新conda
1 | conda update conda |
查询某个命令的帮助
1 | conda create --help |
创建虚拟环境
1 | conda create -n env_name python=3.8 |
查看有哪些虚拟环境
1 | conda env list |
激活虚拟环境
1 | conda activate env_name |
退出虚拟环境
1 | conda activate |
删除虚拟环境
1 | conda remove --name env_name --all |
导出环境
1 | 获得环境中的所有配置 |
包(Package)的管理
查询包的安装情况
1 | conda list |
conda卸载包
1 | conda uninstall package_name --force |
包的安装和更新
1 | conda install package_name |
清理anaconda缓存
1 | conda clean -p # 删除没有用的包 --packages |
报错 & 解决方法
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 2467: illegal multibyte sequence
对 yolov7 添加 SimAM 注意力机制时(改进YOLOv7系列:24.添加SimAM注意力机制) ,在添加完对应的模块后,运行 train.py
报错如下:
在
models/yolo.py
按 ctrl + f 搜索with open
,将 517 行with open(cfg) as f:
改为with open(cfg, encoding='utf-8') as f:
说明: 在看到 ‘gbk’ codec can’t decode 时就知道又是要在什么地方加 , encoding='utf-8'
的时候了,于是轻车熟路的对 train.py
文件中的 65 行 with open(opt.data) as f:
添加了 , encoding='utf-8'
,重新运行后依然是这个报错,然后尝试了将 train.py
中所有 with open(...)...
都加了 encoding='utf-8'
,依然无效;在看到报错路径也有 model/yolo.py
于是尝试找到其中的 with open(..)..
添加 encoding='utf-8'
后解决报错
NameError: name ‘CNeB’ is not defined
同样是添加完 SimAM 注意力机制时的报错
将
SimAM.yaml
中的 CNeB 模块换成 ConV 等已有的模块
说明: 未定义/缺少对应的模块
训练模型无法识别物体
加完 SimAM 后浅浅 train 了 30 轮,欲观察是否可用,但跑完后模型识别率为零,无法识别任何物体(不打任何标记框)。
加大训练轮数(最少100轮),使模型收敛
说明: 在 SimAM 模块失效和模型没有收敛两种可能性徘徊的时候,远程连接了同事的主机克隆了自己的配置炼丹100轮,用训练集图片中的测试集图片来给模型推理,识别成功,幸亏不是前者的原因。
在SimAM.yaml中添加C3层报错 TypeError: __init__() missing 3 required positional arguments: ‘kernel_w’, ‘stride_h’, and ‘stride_w’
对SimAM.yaml中原本属于C3的层(当时没添加C3模块,被我改为默认卷积层Conv),运行train.py
出现如下报错:
将C3.py文件中的
from caffe2.python.layers.conv import Conv
改为from models.common import Conv
说明:原报错意思为 __init__()缺少3个必需的位置参数:“kernel_w”、“stride_h”和“strie_w”,通过报错中最后一行文件指向self.cv1 = Conv(c1, c_, 1, 1)
,几乎是创造性的想到大概是Conv参数要从common.py
中传来,因此尝试了在改模块导Conv包改为从common.py
来源,终于解决报错了;至于其中的所以然,是一点都不清楚。
跑test.py报错OSError: [WinError 1455] 页面文件太小,无法完成操作。
跑yolov7的test.py
代码时出现如下报错(还原麻烦 懒得还原 没有截图)
OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading “D:\Anaconda3\envs\yolov7\lib\site-packages\torch\lib\cudnn_adv_infer64_8.dll” or one of its dependencies.
在 PyCharm > 帮助(H) > 编辑自定义VM选项… 中
把-Xmx1008m
改大-Xmx2048m
说明:此前还修改了C盘的虚拟内存大小,没效果后修改PyCharm的内存大小,-Xmx2048m
表示PyCharm的最大内存为2018mb
参考:1【深度学习】“OSError [WinError 1455]页面文件太小,无法完成操作”解决方案
2 修改pycharm的使用内存
跑test.py报错BrokenPipeError: [Errno 32] Broken pipe
跑yolov7的test.py
代码时出现如下报错
将
datasets.py
中第87行num_workers=nw
修改为num_workers=0
1
2
3
4
5
6 dataloader = loader(dataset,
batch_size=batch_size,
num_workers=0, # nw => 0
sampler=sampler,
pin_memory=True,
collate_fn=LoadImagesAndLabels.collate_fn4 if quad else LoadImagesAndLabels.collate_fn)
说明:
1、每每轮到dataloader加载数据时:dataloader一次性创建num_worker个worker,(也可以说dataloader一次性创建num_worker个工作进程,worker也是普通的工作进程),并用batch_sampler将指定batch分配给指定worker,worker将它负责的batch加载进RAM。然后,dataloader从RAM中找本轮迭代要用的batch,如果找到了,就使用。如果没找到,就要num_worker个worker继续加载batch到内存,直到dataloader在RAM中找到目标batch。一般情况下都是能找到的,因为batch_sampler指定batch时当然优先指定本轮要用的batch。
2、num_worker设置得大,好处是寻找batch速度快,因为下一轮迭代的batch很可能在上一轮/上上一轮…迭代时已经加载好了。坏处是内存开销大,也加重了CPU负担(worker加载数据到RAM的进程是CPU复制的嘛)。num_workers的经验设置值是自己电脑/服务器的CPU核心数,如果CPU很强、RAM也很充足,就可以设置得更大些。
3、如果num_worker设为0,意味着每一轮迭代时,dataloader不再有自主加载数据到RAM这一步骤(因为没有worker了),而是在RAM中找batch,找不到时再加载相应的batch。缺点当然是速度更慢。
参考:yolov5 test.py BrokenPipeError: [Errno 32] Broken pipe问题解决