我做了一个模型,预测一个字符在一个图像,做车牌识别。它在我的电脑上运行得非常好,但我需要把这项工作放在一个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 Lite Android支持库。该库旨在帮助处理TensorFlow Lite模型的输入和输出,并使TensorFlow Lite解释器更易于使用。
如以下所示,在本文中找到更多信息:
Bitmap assetsBitmap = getBitmapFromAsset(mContext, "picture.jpg");
// Initialization code
// Create an ImageProcessor with all ops required. For more ops, please
// refer to the ImageProcessor Architecture.
ImageProcessor imageProcessor =
new ImageProcessor.Builder()
.add(new ResizeOp(32, 32, ResizeOp.ResizeMethod.BILINEAR))
//.add(new NormalizeOp(127.5f, 127.5f))
.build();
// Create a TensorImage object. This creates the tensor of the corresponding
// tensor type (flot32 in this case) that the TensorFlow Lite interpreter needs.
TensorImage tImage = new TensorImage(DataType.FLOAT32);
// Analysis code for every frame
// Preprocess the image
tImage.load(assetsBitmap);
tImage = imageProcessor.process(tImage);
// Create a container for the result and specify that this is not a quantized model.
// Hence, the 'DataType' is defined as FLOAT32
TensorBuffer probabilityBuffer = TensorBuffer.createFixedSize(new int[]{1, 10}, DataType.FLOAT32);
interpreter.run(tImage.getBuffer(), probabilityBuffer.getBuffer());
Log.i("RESULT", Arrays.toString(probabilityBuffer.getFloatArray()));
return getSortedResult(result);
}
我正在开发一个端到端训练和量化感知的训练示例。使用CIFAR10数据集,我加载了一个预训练的MobilenetV2模型,然后使用TensorFlow指南中的代码来量化我的模型。整个过程适当结束后,我得到以下结果: 注意,我并没有更改我从TensorFlow指南中附带的代码,我只是使用了一个不同的数据集和模型。
这是我在Android Studio上导入的tensorflow Lite模型的代码: 在此处输入图像描述 这是我运行应用程序时的输出: 在此处输入图像描述 我不明白,怎么才能得到模型输出?? 更新: 输出是6个元素的浮点数组,但我想要的是 Largesse 元素的索引,我尝试了这样的代码: 在此处输入图像描述 对吗??我在每个预测上都得到相同的输出
以上是目前我的CNN的架构。然而,它说它有1.8m可训练的参数。为什么会这样?我以为第一层给出了(32*4=128个参数),但是我如何找到模型的其余部分有多少个参数? 我的理解是,CNN架构应该只依赖于过滤和最大池,因为它们是共享权重。为什么我有这么多参数?我应该如何着手减少这个数字? 我不是问如何使用“汇总”找到参数的数量。我是问为什么我的模型有这么多参数,以及我如何减少这个数字。我不直观地理解
我已经使用tensorflow后端训练了一个DNN,我想在FireBase中托管它。训练好的模型被保存为.meta文件,我尝试使用下面的代码将模型转换为tflite,但我遇到了一些错误。那么我如何将这个模型转换成Tensorflow Lite呢?
我正在培训一个Keras模型,我想在量化的8位环境(微控制器)中使用TFLite部署它。为了提高量化性能,我进行量化感知训练。然后,我使用验证集作为代表性数据集创建量化的TFLite模型。使用验证集评估性能,如图所示: 不同条件下20次运行的不同批次的错误率 如果我不是简单地从QA训练模型(图中红色)生成TFLite模型(图中青色),而是将权重从QA训练模型复制到原始模型,然后生成TFLite模型
我使用Deeplab官方Github页面上的python脚本,用自己的数据集训练了一个语义分割模型。培训和测试都进行得很好。 然后我使用以下命令使用export_model.py将模型导出到冻结图: 这也成功了。现在我想使用convert_to_tflite.py将我的冻结图形转换为tflite。这个脚本有2个我不理解的输入参数:“input_tensor_name”和“output_tensor