Я уже задал этот вопрос в Google AI для разработчиков, но не получил ответа, поэтому я попробую здесь. В настоящее время я работаю над скоростью вывода вывода различных моделей обнаружения объектов, и мой код работает для RT-DETRV2, YOLO11 и YOLO8. К сожалению, Yolox не работает, я воссоздал трубопровод с вывода рабочего сценария вывода Python в моем проекте Android, в то время как значения входного буфера для модели Android такие же, как и у массива Numpy, вывода в версии Python (подтвержденные визуально и проверяют позиции в массиве), выход совершенно другой. Настолько, что модель ничего не обнаруживает на тестовом изображении в Android, одновременно создавая правильные ограничительные ящики в Python. Весь код с спецификациями среды доступен на GitHub, ниже приведена сокращенная версия кода.
Python: < /p>
if len(img.shape) == 3:
padded_img = np.ones((input_size[0], input_size[1], 3), dtype=np.uint8) * 114
else:
padded_img = np.ones(input_size, dtype=np.uint8) * 114
r = min(input_size[0] / img.shape[0], input_size[1] / img.shape[1])
resized_img = cv2.resize(img,(int(img.shape[1] * r), int(img.shape[0] * r)),
interpolation=cv2.INTER_LINEAR,).astype(np.uint8)
padded_img[: int(img.shape[0] * r), : int(img.shape[1] * r)] = resized_img
padded_img = np.ascontiguousarray(padded_img, dtype=np.float32)
interpreter = tf.lite.Interpreter(model_path=MODEL_PATH)
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
interpreter.set_tensor(input_details[0]['index'], img[None, :, :, :])
< /code>
android (kotlin) < /p>
val imgmat = Mat()
Utils.bitmapToMat(decode,imgmat)
val imgmat3 = Mat()
Imgproc.cvtColor(imgmat,imgmat3,Imgproc.COLOR_RGBA2BGR)
val resizedmat = Mat()
val paddedmat = Mat()
val size = Size((1920F*ratio).toDouble(),(1080F*ratio).toDouble())
val scalar = Scalar(114.0,114.0,114.0)
Imgproc.resize(imgmat3,resizedmat,size, 0.0, 0.0,INTER_LINEAR)
Core.copyMakeBorder(resizedmat,paddedmat,0,(imsize- (1080*ratio)).toInt(),0,0,Core.BORDER_CONSTANT,scalar)
val bitmap = createBitmap(paddedmat.cols(),paddedmat.width(),Bitmap.Config.ARGB_8888)
Imgproc.cvtColor(paddedmat,argbmat,Imgproc.COLOR_RGB2RGBA)
Utils.matToBitmap(argbmat,bitmap)
val image = TensorImage(DataType.UINT8)
image.load(bitmap)
val tensorproc = ImageProcessor.Builder().add(CastOp(INPUT_IMAGE_TYPE)).build()
val proctensor = tensorproc.process(image)
val imageBuffer = proctensor.buffer
val output = TensorBuffer.createFixedSize(intArrayOf(numChannel, numElements), OUTPUT_IMAGE_TYPE)
interpreter.run(imageBuffer, output.buffer)
< /code>
Большинство связанных темы посвящены вопросам с эндзианностью входного буфера, это не применяется здесь, из -за использования данных о тензорамере, который обрабатывает это автоматически. Мое текущее подозрение состоит в том, что TensorFlow не использует входные значения в том же порядке, что и будет отображаться, если массив был распущен, но я не знаю, как легко проверить это.
Я был бы признателен за любую информацию по этой теме.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... t-for-same