用keras训练了一个.h5模型,然后用.py文件调用.h5模型,最后用Java调用.py文件,主要思路就是用java的Runtime.getRuntime().exec(arguments)方法在cmd中调用.py文件。关于传参的方法,网上找了很多,不过都没用,然后把网上的方法总结了一下,结果无意中就运行成功了。其实传参的思路并不是很复杂,只需几句代码就行了。
Java代码:
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
String[] arguments = new String[] {"python","D:\\ccc\\1.py","D:/ccc/"}; //这里构建要在cmd中输入的参数,第二个参数表示.py文件的路径,第二个之后的参数都表示要传给.py文件的参数,可以根据.py文件的需求写
try {
Process process = Runtime.getRuntime().exec(arguments);//这个方法相当于在cmd中输入 python D:\\ccc\\1.py D:/ccc/
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line); //在java编译器中打印.py文件的执行结果
}
in.close();
int re = process.waitFor();//因为是process这个进程调用.py文件, 所以要将当前进程阻塞等待.py文件执行完毕, 若果.py文件成功运行完毕,此方法将返回0,代表执行成功
System.out.println(re); //执行成功的话这里会打印一个0,否则会打印1,2或者其他数字
} catch (Exception e) {
e.printStackTrace();
}
}
}
用keras训练了一个图像识别的模型,这个.py文件所需要的参数就是一个文件夹路径
.py文件
#!/usr/bin/env python
# coding: utf-8
import os
from keras.models import load_model
import numpy as np
from keras.preprocessing import image
import argparse
import sys
def predict(pic_dir):
#加载模型h5文件
model = load_model("D:/ccc/model.h5") #加载模型
#model.summary()
img=[]
predict_pic=os.listdir(pic_dir)
for i in predict_pic:
#print(i)
if i.endswith('jpg'): #读取该文件夹下面所有以.jpg结尾的图片
images = image.load_img(pic_dir+i, target_size=(32,32))
x = image.img_to_array(images)
x = np.expand_dims(x, axis=0)
img.append(x)
img=np.concatenate((img),axis=0)
img=np.array(img,dtype=int)
img_normalize=img.astype("float32")/255.0
pre_y=model.predict(img_normalize) #调用模型预测所读取的图片
return pre_y
prediction=predict(sys.argv[1]) #sys.argv[0]表示当前运行的.py文件的名字,sys.arg[1]才是从外面传进来的参数,如果有需要,可以增加sys.arg[2],sys.arg[3].......,以此类推
print(prediction)