当前位置:   article > 正文

java调用python机器学习模型的坑_java调用python算法模型

java调用python算法模型

Java调用Python的4中方法

1在java类中直接执行python语句
2在java类中直接调用本地python脚本
3使用Runtime.getRuntime()执行python脚本文件(推荐)
4调用python脚本中的函数
  • 1
  • 2
  • 3
  • 4

下面我们介绍第三种方法

Runtime.getRuntime()

Java端

public static void main(String[] args) throws IOException, InterruptedException {
            String exe = "C:\\xxxxxx\\python.exe";//调用自己的python路径
            String command = "F:\\xxxxxxxx\\test.py";//要调用的python函数脚本
            String url="C:\\xxxxxxxx\\R-C.jpg";//传递的参数可以多个,python端取就可以
            String[] cmdArr = new String[] {exe, command,url};//将参数封装
            Process process = Runtime.getRuntime().exec(cmdArr);//采用Process调用
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));//用输入流读取
            String line = null;
            while ((line = in.readLine()) != null) {
                    System.out.println(line);//输出调用结果
            }
            in.close();
            process.waitFor();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

坑1

坑1:String exe 一定要是自己电脑的python路径,否则可能会解析出null。

Python端

这是自己写的第一个机器学习的人脸识别情绪的模型调用预测代码。

emotion_dict = {'生气': 0, '悲伤': 5, '中性': 4, '厌恶': 1, '惊讶': 6, '恐惧': 2, '高兴': 3}
# 载入图像
url = argv[1]//传递的第一个参数
image = face_recognition.load_image_file(url)
face_locations = face_recognition.face_locations(image)
top, right, bottom, left = face_locations[0]
face_image = image[top:bottom, left:right]
face_image = cv2.resize(face_image, (48, 48))
face_image = cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY)
face_image = np.reshape(face_image, [1, face_image.shape[0], face_image.shape[1], 1])
model = load_model("F:\\xxxxxxx\\model_v6_23.hdf5")//调用模型
predicted_class = np.argmax(model.predict(face_image))
label_map = dict((v, k) for k, v in emotion_dict.items())
predicted_label = label_map[predicted_class]
# print(type(predicted_label))

print(predicted_label)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

坑2

坑2:model的调用,不能采用相对路径,一定要是绝对路径,否则因为是java调用python,所以会找不到机器学习模型加载。

坑3

坑3:java调用python输出会出现中文乱码的情况

网上有许多解决方案,包括修改java端的编码为utf-8还有修改python端的编码为utf-8等但都不管用。

原因

这是因为python中print函数的机制问题。
他的默认编码格式是(‘zh_CN’, ‘cp936’),而cp36
就是编码GB2312。
知道问题所在后我们就可以解决了。

解决方案1(Java端修改)

我采用的是Process方式。因此需要在java端将输入流的字符编码设置成Gb2312

BufferedReader in =
 new BufferedReader(new InputStreamReader(process.getInputStream(),"gb2312");

  • 1
  • 2
  • 3

解决方案2(python端修改)

如果调用方式不一样的话,就可以采用在python端修改,修改他的输出编码格式。
(在文件头添加)

import io
import sys

sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/936799
推荐阅读
相关标签
  

闽ICP备14008679号