Linux部署自定义训练YOLO报错:Couldn't open file: data/obj.names
这种跨Windows/Linux部署YOLO模型时碰到的文件读取问题,我之前也遇到过好几次,大概率是跨系统的文件格式差异或者配置细节没适配Linux环境导致的,给你几个针对性的排查和解决步骤:
检查并转换文件换行符格式
Windows系统默认用CRLF(回车+换行)作为换行符,而Linux用LF(仅换行)。Darknet在读取配置类文件时可能对这个细节敏感——哪怕文件内容完全正确,换行符格式不对也会触发"无法打开文件"的错误。你可以用dos2unix工具快速转换:dos2unix data/obj.names如果没安装dos2unix,也可以用sed命令手动替换:
sed -i 's/\r$//' data/obj.names确认文件权限是否足够
虽然你能用cat查看文件,但运行darknet的用户可能没有读取该文件的权限(比如你用root用户上传的文件,现在用普通用户运行darknet)。执行下面的命令赋予读权限:chmod +r data/obj.names保险起见也可以给整个data目录批量加权限:
chmod -R +r data/检查obj.data里的路径配置
打开data/obj.data文件,确认里面的names字段路径是Linux风格的正斜杠,而且没有Windows的盘符或反斜杠。比如要确保是:names = data/obj.names而不是
names = data\obj.names或者带C:\之类的Windows路径。如果还是不行,试试用绝对路径指定,比如:names = /home/your_username/your_darknet_dir/data/obj.names验证文件名大小写
Linux是严格区分大小写的系统,如果你在Windows里创建的文件是Obj.names或者OBJ.NAMES,但配置里写的是obj.names,就会出现找不到文件的情况。执行ls -l data/查看实际文件名,确保和配置里的完全一致。在测试命令中强制指定names文件
直接在detector test命令后加上-names参数强制指定文件路径,绕开配置文件的读取问题,试试这个命令:./darknet detector test data/obj.data cfg/yolo-obj.cfg yolo-obj_25000.weights -names data/obj.names
按这个顺序排查,一般都能解决问题。
内容的提问来源于stack exchange,提问作者cabritoIncognito

