YOLOv5使用二期
简述
遇到了至少8个ERROR😅,好在解决的都很迅速,这次使用,用到了给视频打标的功能,任务算是完成的比较好的吧。
流程
- 试运行train.py,遇到ERROR1,具体解决过程参考该文档,很容易解决,以下为报错:
wandb: ERROR api_key not configured (no-tty). call wandb.login(key=[your_api_key])
- 配置环境,遇到ERROR2,具体解决过程直接翻到ERROR部分看,以下为报错:
# numpy版本太新
`np.int` was a deprecated alias for the builtin `int`. To avoid this error in existing code, use `int` by itself.
# 新版torch不会自动转换浮点型为整型
RuntimeError: result type Float can‘t be cast to the desired output type __int64
-
觉得自己打标太麻烦,参照了该视频,采用边训练边打标的模式,节约时间成本(这周真的太忙了,而且因为任务的特殊性,是标注叶子,打标也很麻烦),以下是使用的对应文件及其需要导出的参数:
python .\detect.py –-save-txt
-
采用上面办法,又遇到问题,这次是pillow的版本太高导致的,归类为ERROR3,解决方案报错如下:
DLL load failed while importing _imaging
-
决定放弃之前想省事的想法,原因如下:
我们打标的对象是叶子,用上述方法,打了之后,需要自己筛选,其实花的时间和精力更大。
不代表这种方法不能用,作为一个循环打标法,对于打标对象如果在图里面比较分散,这种方法是很实用,很省事的。
-
时间不太多,打了50+的图就打算拿来先训练了,遇到ERROR4,解决办法就是吧bitch-size改小,降低最大使用内存。
RuntimeError: DataLoader worker (pid(s) 16272) exited unexpectedly
-
启动detect.py,出现一个模块不联网启动不了这个包的问题,联网解决。
-
发现任务搞错了,重新打标,认清任务目标之后,发现任可以沿用3的方法,借用LL打的标之后,继续进行训练,出现ERROR5,以下是内容:
WARNING: NMS time limit 10.0s exceeded
具体原理是进行NMS的时间阈值太短,需要调高阈值,具体解决过程看ERROR PART。
-
后面又出现以下ERROR6,网上的说法是opencv里面多线程套了多线程,所以导致程序卡死,尝试把上一步的time_limit改小,有可能是开太大了,现在从1000.0秒改成100.0秒,暂时能正常工作。
cv2.error: Caught error in DataLoader worker process 5.
-
又出现两个新error,其一是检测图片有可能损坏,为下图,报错为
Corrupt JPEG data: 2 extraneous bytes before marker 0xd9
,其二仍是9的问题,查看一篇文章,发现yolo会自动帮我们跳过这些损坏的图片,遂不处理,9的问题则限制最大多线程,具体参考这篇文章,剩下解决过程在ERROR6。 -
解决了一直都有的一个ERROR,称其ERROR7,一直没影响就没管,解决方法放ERROR,报错如下:
AttributeError: 'FreeTypeFont' object has no attribute 'getsize'
-
执行train.py,生成的训练成果除了train_loss,val_loss有点训练不充分,其他的数据都比较正常:
-
更改detect.py中pause_opt函数中的
--save-txt
参数,添加default = True
来在运行detect.py时自动保存标签,来辅助打标,在150张量级的训练之后,准确率已经相当高了,只有一两个是没有标上的。
修改后参数表
无关紧要的就不在这里面了,都是默认参数
- train.py
parser.add_argument('--epochs', type=int, default=400)
- scratch.yaml
lr0: 0.02 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.2 # final OneCycleLR learning rate (lr0 * lrf)
degrees: 0.1 # image rotation (+/- deg)
shear: 0.1 # image shear (+/- deg)
perspective: 0.01 # image perspective (+/- fraction), range 0-0.001
ERROR
-
wandb: ERROR api_key not configured (no-tty). call wandb.login(key=[your_api_key])
其实就是这个叫wandb的东西没登录上,按照我给的解决文档很快就搞定了
-
numpy版本太新
解决方案,根据你安装的YOLO包的requirement.txt去换numpy版本,以下提供几个可用命令
pip uninstall packname # pip卸载指定包 pip install packname==version_number # pip安装制定版本的包
途中重装了很多次包,找到比较稳定的版本:1.20.3(谢谢你浪费我那么久来试😅)
-
新版torch不会自动转换浮点型为整型
-
DLL load failed while importing _imaging
pillow版本过高导致的,参考该文档,看看对应python版本,降一降版本就行了
-
bitch-size开太大
RuntimeError: DataLoader worker (pid(s) 16272) exited unexpectedly
我的卡太垃圾了,显存遭不住😩
-
NMS时间阈值太低
WARNING: NMS time limit 10.0s exceeded
需要修改一个叫做time_limit,具体原理在这篇文章,但是我用的版本time_limit参数设置不在val.py里面,而是在general.py里面,具体位置如下:
-
OpenCV多线程超时
cv2.error: Caught error in DataLoader worker process 5.
更改一个叫做workers的参数,这个直接在train.py的parse_opt函数里面可以找到,在下图最后一行,把默认值 (default) 改成比较小的数值就行了,为0则直接是关闭多线程。
-
找不到名为getsize的对象
AttributeError: 'FreeTypeFont' object has no attribute 'getsize'
原理是pillow在10.0版本之后删除了getsize的功能,你的解释器应该找不到这个方法,getsize()的目的是为了获取字体宽度 (w) 和高度 (h) ,大部分的文章都会叫你pillow降级,但是一个配好的环境,换一个版本的库可能就会运行不了,所以将报错的所有位置的
getsize()
换成以下形式代码即可:# w,h = font.getsize(text) 更改前 box = font.getbbox(text) w, h = box[2] - box[0], box[3] - box[1]
笔者的只在plots.py中找到两处:
解决方法:该篇文章的评论区的大神提到的方法
配置
-
系统环境:win11家庭版
-
英伟达显卡:GeForce RTX 3050
-
YOLOv5:6.0
-
pytorch:2.2.2