参考资料
- B站小土堆YOLOv5
https://www.bilibili.com/video/BV1tf4y1t7ru/? - YOLOv5开源项目(我下载的是master,因为v5运行出问题)
https://github.com/ultralytics/yolov5 - ipykernel_launcher.py: error
https://blog.csdn.net/weixin_41693877/article/details/109549914 - NotImplementedError: cannot instantiate ‘PosixPath’ on your system
https://zhuanlan.zhihu.com/p/578487709
环境
pytorch (CPU) + jupyter notebook
问题
1. 报错:NameError: name ‘file’ is not defined
原始代码:
FILE = Path(__file__).resolve()
ROOT = FILE.parents[0] # YOLOv5 root directory
修改代码:
ROOT = Path().resolve() # YOLOv5 root directory
原因分析:在jupyter notebook,__file__变量一般未被定义,所以使用它会报错。修改代码使用Path().resolve()获取当前工作目录的绝对路径,适用于jupyter notebook环境。
2. 报错:ipykernel_launcher.py: error
原始代码:
def parse_opt:
# ...
opt = parser.parse_args()
opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1 # expand
print_args(vars(opt))
return opt
修改代码:
#opt = parser.parse_args()
opt = parser.parse_known_args()[0]
opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1 # expand
print_args(vars(opt))
return opt
原因分析:使用argparse解析命令行参数,parser.parse_args()会尝试解析jupyter的一些特殊参数,导致与kernel通信的参数无法正确解析。用parser.parse_known_args()[0]替代parser.parse_args(),解析命令行参数时,只选择已知参数(保存在[0]列表),避免与kernel通信时受未知参数干扰。
3. 报错:NotImplementedError: cannot instantiate ‘PosixPath’ on your system
添加代码:
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
原因分析:在代码中使用了pathlib模块,而在windows上posixpath与windowspath有一些不同之处,导致某些情况下无法正确实例化。将posixpath替换成windowspath,改变pathlib模块的默认行为,使用windows系统的路径处理方式,保证跨平台兼容性,解决报错。