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