#python #tensorflow #tensorflow-lite #image-classification
Вопрос:
Я работаю над моделью TF Lite с Claasification для определения маски или отсутствия маски на человеческих лицах, используя эту ссылку. Я перешел по ссылке и обучил многоклассовую классификацию изображений в vertex AI и загрузил модель TF lite. Ярлыками модели являются «маска» и «no_mask». Чтобы протестировать модель, я написал следующий код:
interpret= tf.lite.Interpreter(model_path="<FILE_PATH>")
input= interpret.get_input_details()
output= interpret.get_output_details()
interpret.allocate_tensors()
pprint(input)
pprint(output)
data= cv2.imread("file.jpeg")
new_image= cv2.resize(data,(224,224))
interpret.resize_tensor_input(input[0]["index"],[1,224,224,3])
interpret.allocate_tensors()
interpret.set_tensor(input[0]["index"],[new_image])
interpret.invoke()
result= interpret.get_tensor(output[0]['index'])
print (" Prediction is - {}".format(result))
Использование этого кода для одного из моих изображений дает мне результат в виде :
[[30 246]]
Теперь я хочу также распечатать ярлык в результате. Например:
маска: 30
no_mask: 46
Есть ли какой-нибудь способ, которым я могу это реализовать?
Пожалуйста, помогите, так как я новичок в TF Lite
Комментарии:
1. Видели ли вы модель с netron.app, чтобы убедиться, что она выдает 2 метки? Результат мне видится неправильным.
2. Я проверил в приложении netron. Он выводит две метки. Массив равен [1,2].
3. Итак, что такое [[30 246]] ?
4. [[30 246]] являются результатом прогнозирования. Я отправил изображение для предсказания маски или no_mask, поэтому любое из значений является предсказанием маски, а другое — предсказанием no_mask. Мне нужно выяснить, какая именно метка также должна быть напечатана. Например: [[ Маска: 30, No_mask: 246]]. Примечание: значения 30 и 246 являются промежуточным результатом. Доверительное значение или вероятность будут рассчитаны путем деления этих значений на 255. Таким образом, фактические вероятности будут: [[ 0,11, 0,96]]
5. Я думаю, вы уже ответили на это сами. Используйте python для получения значений. Метки — это все, что вы установили в начале. Проверьте исходную модель, чтобы увидеть, что равно 30, а что 246.
Ответ №1:
Я решил это сам. Модель .tflite, загруженная из Vertex AI, содержит файл ярлыка с именем ‘dict.txt — там есть все ярлыки. Проверьте документ GCP здесь. Чтобы получить этот файл ярлыка, нам сначала нужно разархивировать файл .tflite, который даст нам dict.txt . Для получения дополнительной информации ознакомьтесь с документацией tflite и как читать ассоциированный файл из моделей.
После этого я выполнил следующий код, взяв ссылку из ссылки на github label.py:
import argparse
import time
import numpy as np
from PIL import Image
import tensorflow as tf
interpret= tf.lite.Interpreter(model_path="<FILE_PATH>")
input= interpret.get_input_details()
output= interpret.get_output_details()
interpret.allocate_tensors()
pprint(input)
pprint(output)
data= cv2.imread("file.jpeg")
new_image= cv2.resize(data,(224,224))
interpret.resize_tensor_input(input[0]["index"],[1,224,224,3])
interpret.allocate_tensors()
interpret.set_tensor(input[0]["index"],[new_image])
interpret.invoke()
floating_model= input[0]['dtype'] == np.float32
op_data= interpret.get_tensor(output[0]['index'])
result= np.squeeze(op_data)
top_k=result.agrsort()[-5:][::1]
labels=load_labels("dict.txt")
for i in top_k:
if floating_model:
print('{:08.6f}: {}'.format(float(result[i]), labels[i]))
else:
print('{:08.6f}: {}'.format(float(result[i] / 255.0), labels[i]))