1.使用摄像头进行检测时,遇到以下问题。
错误原因:
根据提示在代码中找出错误处,在detect.py中的118行
cv2.imshow(p,im0)
通过断点调试,其中的p的类型为PosixPath,比较v3中相同代码处此处的p类型为str
解决方案:
在这行代码前添加:
p=str(p)#将其转换为str类型
最先找到原因也是在网上搜到相关博客链接
2.ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
参考博客
下面内容均来自该博客,只是害怕原博主删掉博客,所以copy过来做个记录
(1)在~/.bashrc文件中增加一行命令,操作步骤为:
cd ~
sudo gedit .bashrc或者使用sudo vim .bashrc
部分处理方法是在.bashrc文件中把source /opt/ros/kinetic/setup.bash添加#符号注释掉,但这样势必会造成再次使用ROS时又需要把注释#去掉。
因此查找相关的材料可以在打开的.bashrc文件中的最后增加如下一行:
export PYTHONPATH="/home/userx/anaconda3/lib/python3.5/site-packages:$PYTHONPATH"
注意:上面的路径中的userx需要换成你自己的用户名
PYTHONPATH后的/home/userx/anaconda3路径内容需要根据自己的anaconda安装路径来来进行更改,大多数默认的安装目录都是以上这种情况,只需要更改/userx就行。但是最后得出的结果可能会和之前提到的那种方法产生一样,即运行ROS时需要注释掉这行代码,运行非ROS时需要加上这行代码。而接下来的第二种方法会在python文件中进行处理。
(2)因为是受ROS安装的影响,ROS安装之后会在python pyth中加入:
'/opt/ros/kinetic/lib/python2.7/dist-packages'
而为了解决此问题,可以在需要运行的python文件(即使用import cv2的python文件)中,添加以下代码:
import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
通过这两行代码可以把ROS写入path中的路径给清除,进行可以import anaconda中的cv2包。
注:通过此方法再次import cv2时,问题得以解决,不再报错,但此方法并不一定可以保证在所有的情况下都适用,但还是值得一试滴。
3.一直不明白YOLO中的letterbox?
结合这篇文章中对letter box的理解
及这篇文章
letterbox就是在保持纵横比的前提下对图像做resize,先resize然后按需要在周围pad上0像素。
4.TypeError:can’t convert cuda:0 device type tensor to numpy.
错误如图所示
由图中的错误提示,找到tensor.py第630行的代码return self.numpy()将其改为return self.cpu().numpy()
即把CUDA tensor格式的数据改成numpy时,需要先将其转换成cpu float-tensor随后再转到numpy格式。numpy格式不能读取CUDA tensor需要将它转换为CPU tensor。
5.YOLOv5训练在Pycharm调试时会自动退出
出现的错误如下所示
Exception ignored in: <function Image.__del__ at 0x7f394ee224d0>
Traceback (most recent call last):
File "/home/ai2009/anaconda3/envs/yolov5/lib/python3.7/tkinter/__init__.py", line 3507, in __del__
self.tk.call('image', 'delete', self.name)
RuntimeError: main thread is not in main loop
Tcl_AsyncDelete: async handler deleted by the wrong thread
Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
通过百度,这可能与matplotlib、tkinter绘图相关,可能产生了多线程冲突等问题。解决方法,在YOLOv5的plot.py中,将
import matplotlib
import matplotlib.pyplot as plt
#改为
import matplotlib
matplotlib.use('Agg')#pycharm调试时添加这行代码就可以了,在终端训练时可将
#其注释掉,不会有错,最好将其注释掉,保持代码原样。
import matplotlib.pyplot as plt
另外,在解决这问题的过程中,也试着修改了batchsize, 但发现batchsize改小后,其调试时一直处于collecting data状态,无法继续调试。经过询问大佬,大佬说可以将numworker改为0(yolov5中默认为8,即参数workers)
这与pytorch的dataloader相关,可自行查询相关资料。
这篇博客中给出了相关的参考文章,如图所示