我正在使用ImageDataGenerator
批量加载灰度图像。我需要将每个灰度图像的内容复制到3个通道中。我尝试了以下代码,但似乎无法正常工作:
def grayscale_to_rgb(images, channel_axis=-1):
images= K.expand_dims(images, axis=channel_axis)
tiling = [1] * 4 # 4 dimensions: B, H, W, C
tiling[channel_axis] *= 3
images= K.tile(images, tiling)
return images
train_images_orign= grayscale_to_rgb(train_images_orign)
valid_images_orign= grayscale_to_rgb(valid_images_orign)
test_images_orign= grayscale_to_rgb(test_images_orign)
x_train, y_train = next(train_images_orign)
x_valid, y_valid = next(valid_images_orign)
x_test, y_test = next(test_images_orign)
我应该朝哪个方向完成?
答案 0 :(得分:3)
更新:事实证明,已在Keras中实现了load_img
功能in such a way,即如果要加载图像的颜色模式并使用给定的color_mode
参数(默认为'RGB'
)不同,然后图像将转换为给定的color_mode
。结果,在这种情况下,灰度图像将自动转换为RGB。
您也可以使用ImageDataGenerator
的preprocessing_function
参数(假设您使用的是color_mode='grayscale'
,否则上面的说明适用):
import numpy as np
def gray_to_rgb(img):
return np.repeat(img, 3, 2)
generator = ImageDataGenerator(..., preprocessing_function=gray_to_rgb)
train_gen = generator.flow_from_directory(color_mode='grayscale', ...)
请注意,在任何图像增强之后都将应用此功能:
preprocessing_function:函数将隐含在每个输入中。 该功能将在调整图像大小和扩大后运行。的 函数应该采用一个参数:一个图像(具有秩的块状张量 3),并应输出具有相同形状的Numpy张量。
答案 1 :(得分:0)
我没有使用ImageDataGenerator进行转换的直接方法,但是几天前我遇到了同样的问题,可以间接地使用opencv2将其转换为rgb,然后使用imageio将其读取为numpy。
import cv2
cv2.imread('path/to/img/a.png') # look at glob for reading from folder
cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB)
cv2.imwrite('path/to/output/a.png')
import imageio
import skimage.transform as transform
image_size = 64
dimensions=4
array = []
for image_path in glob.glob("path/to/output/*.png"):
try:
im = imageio.imread(image_path)
array = [*array, transform.resize(im, (image_size, image_size, dimensions))]
array_names = [*array_names, image_path.split("output/")[1].split(".png")[0]]
except ValueError:
""
np.array(array).shape
expand_dims可以与tensorflow 1.10.1辅助方法一起使用,这些方法与ImageDataGenerator紧密相关以直接执行相同操作,但是您必须以某种方式将其从gray2rgb进行转换,以改善此答案。
preprocess_input = tf.keras.applications.resnet50.preprocess_input
preds = model.predict(preprocess_input(np.expand_dims(array[0], axis=0))) # where model is some keras model
您将需要以下内容来解码输出
decode_predictions = tf.keras.applications.resnet50.decode_predictions
decode_predictions(preds, top=3)
如果这不能解决您的问题,或者至少提供解决方案的模板,请发表评论,我会相应地进行更新:)
答案 2 :(得分:0)
我认为我有一个更好的解决方案,那就是编写一个包装层
tbl:update longWgt:100f*longWgt, shortWgt:100f*shortWgt, netWgt:100f*netWgt from tbl;
tbl:update .Q.f[2] each longWgt, .Q.f[2] each shortWgt, .Q.f[2] each longWgtBeta, .Q.f[2] each shortWgtBeta, .Q.f[2] each longWgtRisk, .Q.f[2] each shortWgtRisk, .Q.f[2] each netWgt, .Q.f[2] each netExposure, .Q.f[2] each relativeBeta, .Q.f[2] each relativeRisk, .Q.f[2] each adjBeta, .Q.f[2] each adjRisk from tbl;
tbl:update {x,"%"} each longWgt, {x,"%"} each shortWgt, {x,"%"} each netWgt from tbl;
通过这种方式,class MyPreprocess( Layer ) :
def call( self, inputs ) :
# expand your input from gray scale to rgb
# if your inputs.shape = (None,None,1)
fake_rgb = K.concatenate( [inputs for i in range(3)], axis=-1 )
fake_rgb = K.cast( fake_rgb, 'float32' )
# else use K.stack( [inputs for i in range(3)], axis=-1 )
# preprocess for uint8 image
x = preprocess_input( fake_rgb )
return x
def compute_output_shape( self, input_shape ) :
return input_shape[:3] + (3,)
gray_in = Input(shape=(None,None,1), name='gray_uint8')
tensor_in = MyPreprocess(name='preproc')( gray_in )
pred_out = PretrainedModel( tensor_in )
new_model = Model( inputs=gray_in, outputs=pred_out )
可以直接用于预测new_model
图像。