如何将自定义的基于openCV颜色的图像分割转换传递给keras CNN模型?
我试图在植物图片上训练Keras CNN模型。我需要在训练之前对这些图像进行预处理,因为它们包含我不希望模型了解的额外信息 解决方案:使用openCV进行基于颜色的分割,我只保留了绿色像素如何将自定义的基于openCV颜色的图像分割转换传递给keras CNN模型?,opencv,tensorflow,image-processing,keras,computer-vision,Opencv,Tensorflow,Image Processing,Keras,Computer Vision,我试图在植物图片上训练Keras CNN模型。我需要在训练之前对这些图像进行预处理,因为它们包含我不希望模型了解的额外信息 解决方案:使用openCV进行基于颜色的分割,我只保留了绿色像素 def segmented(image): foto = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) hsv_foto = cv2.cvtColor(foto, cv2.COLOR_RGB2HSV) colormin=(25,50,50) c
def segmented(image):
foto = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
hsv_foto = cv2.cvtColor(foto, cv2.COLOR_RGB2HSV)
colormin=(25,50,50)
colormax=(86,255,255)
mask = cv2.inRange(hsv_foto, colormin , colormax)
result = cv2.bitwise_and(foto, foto, mask=mask)
return result
问题:
该函数在可视化分割图像时运行良好,但我正在努力将其传递给Keras模型,以便在训练时只训练转换后的图像,而不是来自目录的原始图像
我的解决方案:我现在尝试的是将我的segmented()函数包含到keras ImageDataGenerator中:
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
validation_split=0.2)
train_generator = train_datagen.flow_from_directory(
segmented('../input/v2-plant-seedlings-dataset/nonsegmentedv2/'),
target_size=(64,64),
batch_size=32,
class_mode='categorical',
subset='training')
还是在训练
training=model.fit_generator(
segmented(train_generator),
steps_per_epoch=100,
epochs=20,
validation_data = segmented(validation_generator),
validation_steps = 30,
callbacks=[earlystopper1, checkpointer1]
)
但我发现这个错误可能与图像读取和打开有关
TypeError Traceback (most recent call last)
<ipython-input-47-3fc9e5fcdc32> in <module>
1 training=model.fit_generator(
----> 2 segmented1(train_generator),
3 steps_per_epoch=100,
4 epochs=20,
5 validation_data = validation_generator,
<ipython-input-46-24182f9d357f> in segmented1(np_image)
1 def segmented1(np_image):
2
----> 3 foto = cv2.cvtColor(np_image, cv2.COLOR_BGR2RGB)
4 hsv_foto = cv2.cvtColor(foto, cv2.COLOR_RGB2HSV)
5
TypeError: Expected Ptr<cv::UMat> for argument '%s'
TypeError回溯(最近一次调用)
在里面
1个培训=模型安装\u发电机(
---->2个分段1(列车发电机),
每个历元3步=100,
4个时代=20,
5验证数据=验证生成器,
分段1(np_图像)
1 def分段1(np_图像):
2.
---->3 foto=cv2.cvtColor(np_图像,cv2.COLOR_BGR2RGB)
4 hsv_foto=cv2.CVT颜色(foto,cv2.COLOR_RGB2HSV)
5.
TypeError:参数“%s”应为Ptr
我没有尝试过你的函数,但是下面是关于预处理函数
的输入和输出的解释,这在下面的链接中提到:https():
预处理函数:将应用于每个输入的函数。
该函数将在图像大小调整和增强后运行
函数应该有一个参数:一个图像(带秩的Numpy张量
3) ,并应输出具有相同形状的Numpy张量
您可能应该稍微修改一下
segmented
函数。您可以将分割直接应用于目录中的图像……并将生成的图像提供给您的模型……您必须将函数的名称放入数据生成器中。在flow_from_目录
之前,请使用kerasImageDataGenerator
在设置它的参数时,将你的分割的
函数设置为预处理函数
。这个源代码将帮助你:你可以编写分割的图像并使用这些文件进行训练。但是你真的想让你的网络在黑色背景上训练吗?或者你想把所有类型的随机背景增强到t软管样本?@Mika谢谢你的反馈。是的,我想在黑色背景上训练我的人际网络。你能详细介绍一下你的“imwrite”解决方案吗?@Meisam谢谢你的反馈!我刚刚编辑了我的帖子并加入了ImageDataGenerator
。你能告诉我我应该在哪一行加入这些内容吗函数,我在keras文档中迷路了。谢谢!这正是我要找的。
train_datagen = ImageDataGenerator(
preprocessing_function = segmented,
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
validation_split=0.2)