가장 작은 이미지 크기를로 조정 하는와 tensorflow
동등한 작업을 시도 하고 있습니다. 이 같은torch.transforms.Resize(TRAIN_IMAGE_SIZE)
TRAIN_IMAGE_SIZE
def transforms(filename):
parts = tf.strings.split(filename, '/')
label = parts[-2]
image = tf.io.read_file(filename)
image = tf.image.decode_jpeg(image)
image = tf.image.convert_image_dtype(image, tf.float32)
# this doesn't work with Dataset.map() because image.shape=(None,None,3) from Dataset.map()
image = largest_sq_crop(image)
image = tf.image.resize(image, (256,256))
return image, label
list_ds = tf.data.Dataset.list_files('{}/*/*'.format(DATASET_PATH))
images_ds = list_ds.map(transforms).batch(4)
간단한 대답은 다음과 같습니다. Tensorflow : 이미지의 가장 큰 중앙 사각형 영역 자르기
그러나와 함께 메소드를 사용하면 내부에서 tf.data.Dataset.map(transforms)
얻습니다 . 정상적으로 호출하면 메소드가 제대로 작동합니다.shape=(None,None,3)
largest_sq_crop(image)
답변
답을 찾았습니다. 내 resize 메소드는 열악한 실행에서 잘 작동했지만 사실 내 tf.executing_eagerly()==True
에서 사용될 때 실패 했다는 사실과 관련이 있습니다 dataset.map()
. 분명히 그 실행 환경에서 tf.executing_eagerly()==False
.
스케일링을 위해 치수를 얻기 위해 이미지의 모양을 풀 때 오류가 발생했습니다. Tensorflow 그래프 실행은 tensor.shape
튜플 에 대한 액세스를 지원하지 않는 것 같습니다 .
# wrong
b,h,w,c = img.shape
print("ERR> ", h,w,c)
# ERR> None None 3
# also wrong
b = img.shape[0]
h = img.shape[1]
w = img.shape[2]
c = img.shape[3]
print("ERR> ", h,w,c)
# ERR> None None 3
# but this works!!!
shape = tf.shape(img)
b = shape[0]
h = shape[1]
w = shape[2]
c = shape[3]
img = tf.reshape( img, (-1,h,w,c))
print("OK> ", h,w,c)
# OK> Tensor("strided_slice_2:0", shape=(), dtype=int32) Tensor("strided_slice_3:0", shape=(), dtype=int32) Tensor("strided_slice_4:0", shape=(), dtype=int32)
dataset.map()
함수 에서 다운 스트림 셰이프 치수를 사용 하고 있었고 None
값 대신 가져 오기 때문에 다음 예외가 발생했습니다 .
TypeError: Failed to convert object of type <class 'tuple'> to Tensor. Contents: (-1, None, None, 3). Consider casting elements to a supported type.
에서 모양을 수동으로 개봉하는 것으로 전환했을 때 tf.shape()
모든 것이 정상적으로 작동했습니다.