IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> java调用python机器学习模型的坑 -> 正文阅读

[人工智能]java调用python机器学习模型的坑

Java调用Python的4中方法

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

下面我们介绍第三种方法

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

坑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)

坑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");

解决方案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')
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:11:01  更:2022-05-07 11:14:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:41:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码