Печать этикетки для классификации изображений модели Tf Lite

#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]))