我使用Tensorflow作为Keras的后端,并试图了解如何将我的标签引入到图像分割培训中。
我使用的是LFW零件数据集,它既有地面真实图像,也有地面真相掩码,看起来如下* 1500张训练图像:


由于我理解这个过程,在培训期间,我加载了两个
为了满足我的需要分批做这件事。现在我的问题是,仅仅将它们(图像和掩模图像)加载为NumPy数组(N,N,3)就足够了,还是需要以某种方式处理/重塑掩码图像。实际上,掩码/标签被表示为R、G、B像素,其中:
我可以这样做,把它正常化为0-1,我不知道我是否应该这么做:
im = Image.open(path)
label = np.array(im, dtype=np.uint8)
label = np.multiply(label, 1.0/255)所以我以:
我在网上找到的一切都使用了tensorflow或keras中的现有数据集。如果您有一个可能被认为是自定义数据集,那么在如何完成任务方面,没有什么是那么清楚的。
我发现这与咖啡有关:https://groups.google.com/forum/#!topic/caffe-users/9qNggEa8EaQ
他们主张将掩膜图像转换为(H, W, 1) (HWC),我的类将分别作为背景、头发和脸的0, 1 ,2。
这可能是重复的(类似问题/答案的组合):
Tensorflow:如何创建Pascal VOC风格的图像
我找到了一个将PascalVOC处理为(N,N,1)的示例,我对其进行了调整:
LFW_PARTS_PALETTE = {
(0, 0, 255) : 0 , # background (blue)
(255, 0, 0) : 1 , # hair (red)
(0, 0, 255) : 2 , # face (green)
}
def convert_from_color_segmentation(arr_3d):
arr_2d = np.zeros((arr_3d.shape[0], arr_3d.shape[1]), dtype=np.uint8)
palette = LFW_PARTS_PALETTE
for i in range(0, arr_3d.shape[0]):
for j in range(0, arr_3d.shape[1]):
key = (arr_3d[i, j, 0], arr_3d[i, j, 1], arr_3d[i, j, 2])
arr_2d[i, j] = palette.get(key, 0) # default value if key was not found is 0
return arr_2d我认为这可能接近我想要的,但没有着落。我想我应该是(N,N,3),因为我有3节课?上述版本和另一个版本源自这两个地点:
https://github.com/martinkersner/train-CRF-RNN/blob/master/utils.py#L50
resnet/utils.py#L41 (这个链接-热的值)
发布于 2017-12-14 03:14:28
因为这是语义分割,所以你要对图像中的每个像素进行分类,所以你最有可能使用的是交叉熵损失。Keras以及TensorFlow都要求您的掩码是一个热编码的,而且,您的掩码的输出维应该是类似批处理、高度、宽度、num_classes <- -在计算交叉熵掩码之前,您必须以与您的掩码相同的方式进行整形,这实际上意味着您必须将您的逻辑和掩码重塑为张量形状-1,num_classes -1表示“任意数量”。
由于您的问题是关于加载您自己的图像,所以我刚刚构建了一个输入管道,以便自己进行分段,虽然是在TensorFlow中,所以我不知道它是否对您有帮助,请看一看您是否感兴趣:用于分割的Tensorflow输入管道
https://stackoverflow.com/questions/45178513
复制相似问题