图像在训练过程中被旋转



我正在尝试训练一个ssd_mobilenet_v2_keras用于在大约6000张图像的数据集上进行对象检测。问题是图像在训练过程中是随机旋转的(或者至少,从tensorboard上看是这样的)。这是我在管道中使用的配置。配置文件:

train_config {
batch_size: 32
data_augmentation_options {
random_horizontal_flip {
}
}
data_augmentation_options {
random_rgb_to_gray {
probability: 0.25
}
}
data_augmentation_options {
random_jpeg_quality {
random_coef: 0.8
min_jpeg_quality: 50
max_jpeg_quality: 100
}
}
sync_replicas: true
optimizer {
adam_optimizer: {
epsilon: 1e-7
learning_rate: {
cosine_decay_learning_rate {
learning_rate_base: 1e-3
total_steps: 50000
warmup_learning_rate: 2.5e-4
warmup_steps: 5000
}
}
}
use_moving_average: false
}
fine_tune_checkpoint: "pre-trained-models/ssd_mobilenet_v2_320x320_coco17_tpu-8/checkpoint/ckpt-0"
num_steps: 50000
startup_delay_steps: 0.0
replicas_to_aggregate: 8
max_number_of_boxes: 100
unpad_groundtruth_tensors: false
fine_tune_checkpoint_type: "detection"
fine_tune_checkpoint_version: V2
}

我还试图删除随机水平翻转(我知道这可能无法解决任何问题,我只是给了它一个尝试…)但没有任何变化,我仍然看到一些训练图像在tensorboard中旋转,而且如果我运行评估有时图像被旋转。当然,带有边界框坐标的xml不会"旋转"。因此,tensorboard中的ground truth图像出现完全错误,对象处于一个位置,而ground truth box处于一个完全不同的位置(如果图像没有旋转,则为正确位置…)

这可能早就应该了,但我在这个&我花了好几个星期才弄明白。我只是想分享一下我的解决方案。也很抱歉格式不好,我还在学习。

显然,Exif方向元数据存在这个问题,计算机/笔记本电脑读取它的方式与智能手机/数码相机不同。你可以在这里阅读更多

  1. 所以,为了检查这个,你可以先检查图像的方向。
# Determine image orientation using Exif metadata
IMAGE_PATHS = path/to/your/images
image_dir = Path(IMAGE_PATHS).glob('*.jpg')
for image_path in image_dir:
# Check condition of image
img = Image.open(image_path)

# Check if the image has Exif metadata (not all images do)
if hasattr(img, '_getexif'):
# Get the Exif metadata
exif_data = img._getexif()

# Check if the Exif data contains the orientation tag (tag number 0x0112)
if 0x0112 in exif_data:
# Read the orientation value
orientation = exif_data[0x0112]

# Determine the orientation based on the value
if orientation == 1:
print("Normal (0 degrees)")
elif orientation == 3:
print("Upside down (180 degrees)")
elif orientation == 6:
print("Rotated 90 degrees clockwise")
elif orientation == 8:
print("Rotated 90 degrees counterclockwise")
# Add more cases as needed for other orientation values
else:
print("No orientation tag found in Exif data.")
else:
print("No Exif data found in the image.")

如果你碰巧收到其他结果除了"正常",你的图像是高度旋转的。你可能不会在屏幕上看到它,但它确实存在。这是因为Windows或任何其他操作系统会自动旋转您的图像以方便查看。

  1. 修正出口方向元数据
import cv2
image_dir = 'path/to/your/image' #folder must have image only
file_list = os.listdir(image_dir)
for i in range(0,len(file_list)):
file_name = file_list[i]
#print(file_name)
save_path = image_dir + file_name

image_np = load_image_into_numpy_array(save_path)

# For a portrait/vertical image, the width (shape[0]) < height (shape[1]), 
# rotate the image to overwrite the Exif metadata
if image_np.shape[0] < image_np.shape[1]:
image_np = np.rot90(image_np,3).copy()
else:
continue
cv2.imwrite(image_dir + '/' + str(file_name), cv2.cvtColor(image_np, cv2.COLOR_BGR2RGB))

从那里,你可以再次运行训练,看看在tensorboard的'train_input_image'来验证你的新训练图像是正确的。希望对你有帮助。

相关内容

  • 没有找到相关文章

最新更新