Я обучил модель с помощью EfficientNet и после отсутствия ошибок в обучении подставил модель в Tensorflow Model включенный в пакет Object_detection Python notebook.

def run_inference_for_single_image(model, image):
  image = np.asarray(image)
  input_tensor = tf.convert_to_tensor(image)
  input_tensor = input_tensor[tf.newaxis,...]

  model_fn = model.signatures['serving_default']


  output_dict = model_fn(input_tensor)

  num_detections = int(output_dict.pop('num_detections'))
  output_dict = {key:value[0, :num_detections].numpy()
                 for key,value in output_dict.items()}
  output_dict['num_detections'] = num_detections

  output_dict['detection_classes'] = output_dict['detection_classes'].astype(np.int64)

  return output_dict

def show_inference(model, image_path):
  image_np = np.array(Image.open(image_path))

  output_dict = run_inference_for_single_image(model, image_np)

# image_path здесь - это просто путь к .jpg
for image_path in TEST_IMAGE_PATHS:
  show_inference(detection_model, image_path)

Выявлена следующая ошибка:

TypeError: signature_wrapper(*, input_tensor) missing required arguments: input_tensor

During handling of the above exception, another exception occurred:

InvalidArgumentError                      Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     58     ctx.ensure_initialized()
     59     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
---> 60                                         inputs, attrs, num_outputs)
     61   except core._NotOkStatusException as e:
     62     if name is not None:

InvalidArgumentError: 2 root error(s) found.
  (0) Invalid argument:  Incompatible shapes: [1,256,256] vs. [1,1,3]
     [[{{node StatefulPartitionedCall/Preprocessor/sub}}]]
     [[StatefulPartitionedCall/Postprocessor/BatchMultiClassNonMaxSuppression/MultiClassNonMaxSuppression/Reshape_11/_112]]
  (1) Invalid argument:  Incompatible shapes: [1,256,256] vs. [1,1,3]
     [[{{node StatefulPartitionedCall/Preprocessor/sub}}]]
0 successful operations.
0 derived errors ignored. [Op:__inference_signature_wrapper_73496]

Модель была обучена и протестирована на (черных & белых) pngs, что является ключевым отличием примера (помимо того, что в примере используется другая модель). Преобразование pngs в jpgs изменяет корневые ошибки:

Invalid argument:  input must be 4-dimensional[1,256,256]

Если не начать снова с jpgs и тренироваться/тестировать это, я не уверен, в чем проблема.

pop

Ответов: 1

Ответы (1)

В API обнаружения объектов Tensorflow 2.X есть предварительно обученные модели & в репозитории github есть хорошая документация о том, как обучить собственную модель.

Но по умолчанию обучение/оценка проводится в формате JPEG. Поэтому, если у вас другой формат кодека для ваших изображений, вам придется их конвертировать.

Следующий фрагмент легко преобразует существующие изображения в кодек jpeg и сохранит с тем же именем файла + .jpg

Для бега

python convert.py folder_with_images

#convert.py
from PIL import Image     
import os
import sys 

path = sys.argv[1] # Source Folder
if path[-1] != '/':
    path = path +'/' 
for file in os.listdir(path):      
        extension = file.split('.')[-1]
        name = file.split('.')[0] + '.jpg'
        fileLoc = path+file
        img = Image.open(fileLoc)
        new = Image.new("RGB", img.size, (255, 255, 255))
        new.paste(img,None) # save the new image with jpg as extension
        new.save(path+name, 'JPEG', quality=100)
        if(extension != 'jpg'): #remove the old image
            os.remove(path+file)

2022 WebDevInsider