从重叠的图像补丁

时间:2017-12-20 03:04:42

标签: python-3.x machine-learning tensorflow computer-vision

我使用tf.extract_image_patches()来获得重叠补丁的张量  来自this链接中描述的图像。上述链接中的答案建议使用tf.space_to_depth()从重叠的补丁中重建图像。但问题是,在我的案例中,这并没有给出理想的结果,经过研究,我发现tf.space_to_depth()没有处理重叠的块。我的代码如下:

import tensorflow as tf
import numpy as np

c = 3
height = 3900
width = 6000
ksizes = [1, 150, 150, 1]
strides = [1, 75, 75, 1]

image = #image of shape [1, height, width, 3]

patches = tf.extract_image_patches(image, ksizes = ksizes, strides= strides, [1, 1, 1, 1], 'VALID')
patches = tf.reshape(patches, [-1, 150, 150, 3])

reconstructed = tf.reshape(patches, [1, height, width, 3])
rec_new = tf.space_to_depth(reconstructed,75)
rec_new = tf.reshape(rec_new,[height,width,3])

这给了我错误:

        

InvalidArgumentError Traceback(最近一次调用   持续)   d:\ AnacondaIDE \ LIB \站点包\ tensorflow \ python的\框架\ common_shapes.py   在_call_cpp_shape_fn_impl中(op,input_tensors_needed,   input_tensors_as_shapes_needed,require_shape_fn)       653 graph_def_version,node_def_str,input_shapes,input_tensors,    - > 654 input_tensors_as_shapes,status)       655除了errors.InvalidArgumentError为错误:

     

D:\ AnacondaIDE \ lib \ contextlib.py在退出(自我,类型,价值,   追溯)        87尝试:   ---> 88下一个(self.gen)        89除StopIteration外:

     

d:\ AnacondaIDE \ lib中\站点包\ tensorflow \蟒\框架\ errors_impl.py   在raise_exception_on_not_ok_status()中       465 compat.as_text(pywrap_tensorflow.TF_Message(status)),    - > 466 pywrap_tensorflow.TF_GetCode(status))       467终于:

     

InvalidArgumentError :尺寸大小必须可被整除   ' Reshape_22'是70200000但是271957500 (输入:'重塑')输入   形状:[4029,150,150,3],[4]并且输入张量计算为   部分形状:输入1 = [?,3900,6000,3]。

     

在处理上述异常期间,发生了另一个异常:

     

ValueError 回溯(最近一次通话   最后)in()   ----> 1重建= tf.reshape(特征,[-1,高度,宽度,通道])         2 rec_new = tf.space_to_depth(重建,75)         3 rec_new = tf.reshape(rec_new,[h,h,c])

     

d:\ AnacondaIDE \ lib中\站点包\ tensorflow \蟒\ OPS \ gen_array_ops.py   重塑(张量,形状,名称)2617""" 2618结果=   _op_def_lib.apply_op("重塑",张量=张量,形状=形状,    - > 2619 name = name)2620返回结果2621

     

d:\ AnacondaIDE \ lib中\站点包\ tensorflow \蟒\框架\ op_def_library.py   在apply_op中(self,op_type_name,name,** keywords)       765 op = g.create_op(op_type_name,inputs,output_types,name = scope,       766 input_types = input_types,attrs = attr_protos,    - > 767 op_def = op_def)       768如果output_structure:       769输出= op.outputs

     

D:\ AnacondaIDE \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py in   create_op(self,op_type,inputs,dtypes,input_types,name,attrs,   op_def,compute_shapes,compute_device)2630
  original_op = self._default_original_op,op_def = op_def)2631 if   compute_shapes:    - > 2632 set_shapes_for_outputs(ret)2633 self._add_op(ret)2634
  self._record_op_seen_by_control_dependencies(RET)

     

D:\ AnacondaIDE \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py in   set_shapes_for_outputs(op)1909 shape_func =   _call_cpp_shape_fn_and_require_op 1910    - > 1911 shapes = shape_func(op)1912如果形状为无:1913引发RuntimeError(

     

D:\ AnacondaIDE \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py in   call_with_requiring(op)1859 1860 def   call_with_requiring(OP):    - > 1861返回call_cpp_shape_fn(op,require_shape_fn = True)1862 1863 _call_cpp_shape_fn_and_require_op =   call_with_requiring

     

d:\ AnacondaIDE \ lib中\站点包\ tensorflow \蟒\框架\ common_shapes.py   在call_cpp_shape_fn中(op,require_shape_fn)       593 res = _call_cpp_shape_fn_impl(op,input_tensors_needed,       594 input_tensors_as_shapes_needed,    - > 595 require_shape_fn)       596如果不是isinstance(res,dict):       597#处理_call_cpp_shape_fn_impl调用unknown_shape(op)的情况。

     

d:\ AnacondaIDE \ lib中\站点包\ tensorflow \蟒\框架\ common_shapes.py   在_call_cpp_shape_fn_impl中(op,input_tensors_needed,   input_tensors_as_shapes_needed,require_shape_fn)       657 missing_shape_fn =真       658否则:    - > 659引发ValueError(err.message)       660       661 if missing_shape_fn:

     

ValueError :尺寸大小必须可被70200000整除,但是   271957500 for' Reshape_22' (op:' Reshape')输入形状:   [4029,150,150,3],[4]和输入张量计算为部分   形状:输入1 = [?,3900,6000,3]。

我知道这是由于不兼容的尺寸造成的错误,但它应该是这样的,对吧?请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

我想问题是,在您发布的链接中,作者使用Navigate | Next Occurrencestrides的相同值,而您使用ksizes等于strides的一半{ {1}}。这就是为什么尺寸不匹配的原因,您应该在粘贴之前编写减小补丁大小的逻辑(例如,通过选择每个补丁的中心方块)。