почему я получаю предупреждение о тензорном потоке при запуске этого скрипта?

#python #tensorflow #computer-vision #warnings #face-detection

#python #tensorflow #компьютерное зрение #предупреждения #распознавание лиц

Вопрос:

 import glob
import os
from mtcnn.mtcnn import MTCNN
import warnings
import time

from numpy import asarray
from PIL import Image
#warnings.filterwarnings("ignore")
#os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

directory = input("insert input path n")

output_directory = input("insert output path n")
#mode=input("do you want to conver the outputs to Grayscale ?")
img_names=glob.glob(os.path.join(directory "/*.jpg"))

detector = MTCNN()
def process_image(img_name,mode='L',output_size=(160,160)):
    img = Image.open(directory img_name)
    img.thumbnail((160,160))
    pixels=asarray(img)
    results = detector.detect_faces(pixels)
    if results:
        # extract the bounding box from the requested face
        x1 ,y1,width,height=results[0]['box']
        x1,y1=abs(x1),abs(y1)
        x2,y2=x1   width,y1   height
        # extract the face by slicing
        face_boundary = pixels[y1:y2, x1:x2]
        # resize pixels to the model size
        #image1 = Image.fromarray(face_boundary)
        #image1 = image.resize(required_size)
        image=Image.fromarray(face_boundary)
        #if mode=='L':
         #   image=image.convert('L')
        image = image.resize(output_size)
        #image.thumbnail((160,160))
        #image = image.resize(())
        #face_array = asarray(image)
    #image.save(f"/kaggle/input/rashaa/rasha{img_name}")
        image.save(f'{output_directory}{img_name}')     
        print(f'{img_name} was processed...')
#for img in img_names:
 #       x.append(img.replace(directory,""))
x=[img.replace(directory,"") for img in img_names]
t1 = time.perf_counter()
y=[process_image(img) for img in x]

t2=time.perf_counter()
print(t2-t1)
 

код выполняет свою работу, обнаруживая и извлекая лица из входной папки и помещая извлеченные лица в выходную папку без каких-либо проблем
, но я хочу знать, почему это предупреждение появляется в первую очередь, и есть ли какой-либо способ исправить это «правильно» вместо того, чтобы подавлять его

Подробные сведения

  • Версия TensorFlow (CPU): 2.7.0
  • версия python 3.8.4

предупреждающее сообщение ПРЕДУПРЕЖДЕНИЕ:tensorflow:5 из последних 9 вызовов <function Model.make_predict_function ..predict_function в 0x0000000013E161F0> срабатывает повторное восстановление tf.function. Трассировка является дорогостоящей, и чрезмерное количество трассировок может быть связано с (1) многократным созданием @tf.function в цикле, (2) передачей тензоров с разными формами, (3) передачей объектов Python вместо тензоров. Для (1), пожалуйста, определите ваш @tf.function вне цикла. Для (2) в @tf.function есть параметр experimental_relax_shapes=True, который смягчает формы аргументов, что позволяет избежать ненужного восстановления. Для (3), пожалуйста, обратитесь к https://www.tensorflow.org/guide/function#controlling_retracing и https://www.tensorflow.org/api_docs/python/tf/function для получения более подробной информации.

Комментарии:

1. Какую версию Tensorflow вы используете? Я попробовал ваш фрагмент кода в Tensorflow 2.4.1 и не получил этого предупреждения.

2. в настоящее время я использую TensorFlow 2.7.0, вы используете версию GPU или CPU?

3. Я пробовал также с 2.7.0, а также с версиями CPU и GPU. По-прежнему нет сообщений об ошибках.

Ответ №1:

В вашем случае предупреждение происходит из-за (2) passing tensors with different shapes . И вы получаете тензоры разной формы из-за PIL. img.thumbnail изменяет размер некоторых ваших изображений неправильным образом. Он сохраняет соотношение сторон изображения, поэтому вы получаете изображение 160×160, только если ваше исходное изображение имело соотношение сторон 1: 1.

Используйте Tensorflow или OpenCV для обработки изображений, а не PIL, это очень медленно…

 def process_image(img_name, output_size=(160,160)):
    img = cv2.imread(directory img_name)
    img = img[..., ::-1] # convert BGR to RGB
    img = cv2.resize(img, output_size)
    results = detector.detect_faces(img)
    ...