увеличение изображений, чтобы они выглядели как настоящий пример Python
1 ответ
Решение
Ознакомьтесь с библиотекой: . Попробуйте ответить на вопрос: «Чем отличается изображение, которое у вас есть, от изображения, которое вы хотите?» . Например, это изображение:
- более пиксельный,
- зернистый
- имеет более низкое разрешение,
- на нем также могут быть гвозди / крепежные винты
- может быть что-то еще написано под или над основным числом
- на нем могут быть тени
- номерной знак может быть неравномерно ярким в некоторых местах и т. д.
, поможет вам придумать множество типов увеличения изображения. Пожалуйста, попытайтесь решить эту проблему, как я предлагал, а затем попытайтесь выяснить, какие изменения вам нужны, по альбументациям.
Пример увеличения изображения с помощью
albumentations
В следующем блоке кода ( источникAlbumentations ) показано, как применять альбументацию для увеличения изображения. Если у вас есть изображение и маска, они оба претерпят идентичные преобразования.
Другой пример от kaggle: демонстрация увеличения изображения с альбументацией.
from albumentations import (
HorizontalFlip, IAAPerspective, ShiftScaleRotate, CLAHE, RandomRotate90,
Transpose, ShiftScaleRotate, Blur, OpticalDistortion, GridDistortion, HueSaturationValue,
IAAAdditiveGaussianNoise, GaussNoise, MotionBlur, MedianBlur, IAAPiecewiseAffine,
IAASharpen, IAAEmboss, RandomBrightnessContrast, Flip, OneOf, Compose
)
import numpy as np
def strong_aug(p=0.5):
return Compose([
RandomRotate90(),
Flip(),
Transpose(),
OneOf([
IAAAdditiveGaussianNoise(),
GaussNoise(),
], p=0.2),
OneOf([
MotionBlur(p=0.2),
MedianBlur(blur_limit=3, p=0.1),
Blur(blur_limit=3, p=0.1),
], p=0.2),
ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=45, p=0.2),
OneOf([
OpticalDistortion(p=0.3),
GridDistortion(p=0.1),
IAAPiecewiseAffine(p=0.3),
], p=0.2),
OneOf([
CLAHE(clip_limit=2),
IAASharpen(),
IAAEmboss(),
RandomBrightnessContrast(),
], p=0.3),
HueSaturationValue(p=0.3),
], p=p)
image = np.ones((300, 300, 3), dtype=np.uint8)
mask = np.ones((300, 300), dtype=np.uint8)
whatever_data = "my name"
augmentation = strong_aug(p=0.9)
data = {"image": image, "mask": mask, "whatever_data": whatever_data, "additional": "hello"}
augmented = augmentation(**data)
image, mask, whatever_data, additional = augmented["image"], augmented["mask"], augmented["whatever_data"], augmented["additional"]
Стратегия
- Сначала уменьшите количество аугментаций до минимума
- Сохранить одно увеличенное изображение
- Сохраните несколько изображений для публикации дополнений.
- Теперь протестируйте и обновите свой конвейер дополнений, чтобы он соответствовал вашим требованиям имитации сценария достоверности информации.
- доработайте конвейер и запустите его на большем количестве изображений.
- Время: сколько времени это займет, сколько изображений.
- Затем, наконец, запустите его на всех изображениях: на этот раз вы можете оценить время, которое потребуется для его запуска.
ПРИМЕЧАНИЕ: каждый раз, когда изображение проходит через конвейер дополнения, из него выходит только один экземпляр дополненного изображения. Итак, скажем, вам нужно 10 различных расширенных версий каждого изображения, вам нужно будет пропустить каждое изображение через конвейер увеличения 10 раз, прежде чем перейти к следующему изображению.
# this will not be what you end up using
# but you can begin to understand what
# you need to do with it.
def simple_aug(p-0,5):
return return Compose([
RandomRotate90(),
# Flip(),
# Transpose(),
OneOf([
IAAAdditiveGaussianNoise(),
GaussNoise(),
], p=0.2),
])
# for a single image: check first
image = ... # write your code to read in your image here
augmentation = strong_aug(p=0.5)
augmented = augmentation({'image': image}) # see albumentations docs
# SAVE the image
# If you are using imageio or PIL, saving an image
# is rather straight forward, and I will let you
# figure that out.
# save the content of the variable: augmented['image']
Для нескольких изображений
Предполагая, что каждое изображение проходит
10
раз через конвейер дополнений ваш код мог бы выглядеть следующим образом:
import os
# I assume you have a way of loading your
# images from the filesystem, and they come
# out of `images` (an iterator)
NUM_AUG_REPEAT = 10
AUG_SAVE_DIR = 'data/augmented'
# create directory of not present already
if not os.path.isdir(AUG_SAVE_DIR):
os.makedirs(AUG_SAVE_DIR)
# This will create augmentation ids for the same image
# example: '00', '01', '02', ..., '08', '09' for
# - NUM_AUG_REPEAT = 10
aug_id = lambda x: str(x).zfill(len(str(NUM_AUG_REPEAT)))
for image in images:
for i in range(NUM_AUG_REPEAT):
data = {'image': image}
augmented = augmentation(**data)
# I assume you have a function: save_image(image_path, image)
# You need to write this function with
# whatever logic necessary. (Hint: use imageio or PIL.Image)
image_filename = f'image_name_{aug_id(i)}.png'
save_image(os.path.join(AUG_SAVE_DIR, image_filename), augmented['image'])