Обучить keras ResNet50V2 16-битным изображениям?

#python #tensorflow #keras #tf.keras #resnet

#python #тензорный поток #keras #tf.keras #resnet

Вопрос:

У меня есть 3-канальные tif-изображения (16-разрядные). Теперь я хотел бы использовать их в качестве обучающих образов на предварительно обученном ResNet50V2 от keras. Я понял, что я должен вызывать tf.keras.applications.resnet_v2.preprocess_input функцию предварительной обработки as при использовании ImageDataGenerators. Я просмотрел документацию функции (preprocess_input), и она говорит мне, по крайней мере, что она ожидает 8-битные данные. Есть ли какой-либо способ передать 16-разрядные изображения в ImageDataGenerator?

Или мне нужно преобразовать мои изображения в 8-разрядные, прежде чем отправлять их в ImageDataGenerator?

Я рад любому совету!

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

1. Я отредактировал ваш вопрос, чтобы он был посвящен только одному вопросу, в соответствии с рекомендациями сайта.

Ответ №1:

Я не вижу никаких ссылок на 8-битные данные в документации, на которую вы ссылались.

И да, он может принимать 16-разрядные:

 import tensorflow as tf
import numpy as np

x = np.random.randint(0, 256, (1, 224, 224, 3), dtype=np.uint16)

tf.keras.applications.resnet_v2.preprocess_input(x)
 
 array([[[[ 0.43529415, -0.24705881, -0.23137254],
         [-0.81960785,  0.3411765 , -0.5921569 ],
         [-0.7882353 ,  0.58431375,  0.0196079 ],
         ...,
         [-0.60784316, -0.4980392 ,  1.        ],
         [-0.654902  ,  0.99215686, -0.38039213],
         [ 0.03529418, -0.7411765 , -0.8901961 ]]]], dtype=float32)
 

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

1. В документации указано, что для аргумента ‘x’: numpy.array с плавающей запятой или tf. Тензорный, 3D или 4D с 3 цветовыми каналами, со значениями в диапазоне [0, 255]. Предварительно обработанные данные записываются поверх входных данных, если типы данных совместимы. Чтобы избежать такого поведения, можно использовать numpy.copy(x) .

2. Наверное, я должен был упомянуть, что мои изображения имеют значения полного 16-битного диапазона (0,65535)

3. Разделить их на 65535?

4. Но тогда они все еще не используют диапазон [0,255]. И я вообще не знаю, что должна делать эта функция предварительной обработки — масштабирование от -1 до 1? Если это все, мне пришлось бы масштабировать изображения до [0,255] раньше. Но в какой момент это возможно?

5. Разделите на 65535, затем умножьте на 255