我制作了一个模型,用于预测图像上的字符以进行车牌识别。在我的电脑上它工作得很好,但是我需要将这个工作放到 Android 应用程序中。所以我开发了一个小应用程序,并将我的 keras 模型转换为 tflite。现在它总是预测相同的字符。
我使用以下方式转换了模型:
mod_path = "License_character_recognition.h5"
def load_model(path,custom_objects={},verbose=0):
#from tf.keras.models import model_from_json
path = splitext(path)[0]
with open('MobileNets_character_recognition.json','r') as json_file:
model_json = json_file.read()
model = tf.keras.models.model_from_json(model_json, custom_objects=custom_objects)
model.load_weights('%s.h5' % path)
if verbose: print('Loaded from %s' % path)
return model
keras_mod = load_model(mod_path)
converter = tf.lite.TFLiteConverter.from_keras_model(keras_mod)
tflite_model = converter.convert()
# Save the TF Lite model.
with tf.io.gfile.GFile('ocr.tflite', 'wb') as f:
f.write(tflite_model)
有更好的方法将模型转换吗?还是我漏掉了什么?
编辑:这是我管理位图的方法。
try {
Mat bis = Utils.loadResource(MainActivity.this, R.drawable.plaque, Imgcodecs.IMREAD_COLOR);
cvtColor(bis, bis, COLOR_BGR2RGB);
Mat m = Utils.loadResource(MainActivity.this, R.drawable.plaque,Imgcodecs.IMREAD_GRAYSCALE);
blur(m, blur, new Size(2,2));
threshold(blur, bin, 0, 255, THRESH_BINARY_INV + THRESH_OTSU);
ArrayList<MatOfPoint> contours;
contours = getContours(bin);
//Try to sort from left to right
Collections.sort(contours, new SortByTopLeft());
Log.d("Contour", String.valueOf(contours.size()));
int i = 0;
for (MatOfPoint c : contours){
Rect cont = boundingRect(c);
float ratio = (float) (cont.height/cont.width);
Log.d("Ratio", String.valueOf(ratio));
float pourcent = ((float) cont.height/ (float) bin.height());
Log.d("pourcent", String.valueOf(pourcent));
if (ratio >= 1 && ratio <= 2.5){
if(pourcent >=0.5){
Log.d("Ui", String.valueOf(cont));
rectangle(bis, cont, new Scalar(0,255,0), 2);
//Separate numbers
Mat curr_num = new Mat(bin, cont);
Bitmap curbit = Bitmap.createBitmap(curr_num.cols(), curr_num.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(curr_num, curbit);
images[i].setImageBitmap(curbit);
int charac = classifier.classify(curbit);
Log.d("Result", String.valueOf(charac));
result.setText(String.valueOf(charac));
if (i < 6){
i++;
}
}
}
tensorflow_support_library.java
部分重新创建了输入和输出。 - T.K