在Docker+Node-RED环境加载.NET8 ML.NET模型时路径错误的解决求助
解决Docker容器中ML.NET模型路径错误问题
问题根源
ML.NET默认会从当前工作目录加载DLFrutasELegumes.mlnet模型文件,但Node-RED容器的默认工作目录是/usr/src/node-red,而你的模型实际存放在挂载的/data/app/(或其他指定路径)下,因此出现文件找不到的错误。
解决方案
方案1:修改C#代码指定绝对路径
直接在代码里指定模型的绝对路径,避免依赖当前工作目录:
- 确认模型文件在容器内的实际路径(比如
/data/app/DLFrutasELegumes.mlnet) - 修改C#代码,显式加载模型时指定路径:
static void Main(string[] args) { Console.WriteLine("App is running!!!"); Console.WriteLine(); // 指定模型绝对路径 string modelPath = "/data/app/DLFrutasELegumes.mlnet"; // 初始化MLContext并加载模型 var mlContext = new MLContext(); ITransformer model = mlContext.Model.Load(modelPath, out _); // 基于加载的模型创建预测引擎 var predictionEngine = mlContext.Model.CreatePredictionEngine<DLFrutasELegumes.ModelInput, DLFrutasELegumes.ModelOutput>(model); Console.WriteLine($"Path: {args[0]}"); var imageBytes = File.ReadAllBytes(args[0]); DLFrutasELegumes.ModelInput sampleData = new DLFrutasELegumes.ModelInput() { ImageSource = imageBytes, }; // 使用自定义的预测引擎获取结果 var result = predictionEngine.Predict(sampleData); // 处理排序和输出(匹配原PredictAllLabels逻辑) var sortedScoresWithLabel = result.Score .Select((score, index) => new { Label = DLFrutasELegumes.LabelNames[index], Score = score }) .OrderByDescending(x => x.Score) .ToDictionary(x => x.Label, x => x.Score); Console.WriteLine($"{ "Class",-40}{ "Score",-20}"); Console.WriteLine($"{ "-----",-40}{ "-----",-20}"); foreach (var score in sortedScoresWithLabel) { Console.WriteLine($"{score.Key,-40}{score.Value,-20}"); } }
方案2:运行.NET程序时切换工作目录
在Node-RED中调用.NET程序时,先切换到模型所在目录再执行命令:
cd /data/app && dotnet ImageClassify.dll [你的图片路径参数]
这样.NET进程的当前工作目录就是模型所在的/data/app/,ML.NET就能自动找到模型文件。
方案3:修改Dockerfile设置默认工作目录
在Dockerfile中添加WORKDIR指令,将容器的默认工作目录设置为模型所在路径:
FROM nodered/node-red:4.0.9-22 USER root RUN apk add dotnet8-runtime RUN mkdir /data/net8.0/ RUN cd /data/net8.0/ RUN wget https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-cpu-linux-x86_64-2.4.0.tar.gz RUN tar -C . -xzf libtensorflow-cpu-linux-x86_64-2.4.0.tar.gz USER node-red # 设置工作目录到模型所在的/data/app WORKDIR /data/app EXPOSE 1880
注意:确保/data/app目录存在,且模型文件已挂载到该路径下。
内容的提问来源于stack exchange,提问作者user30427748
相关产品推荐
相关产品推荐

