importar subproceso, sys, importlib def _sh(cmd): print(f”$ {cmd}”) subprocess.run(cmd, shell=True, check=False, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) def _need(mod): try: importlib.import_module(mod) devuelve False excepto ImportError: devuelve True si _need(“augly”): _sh(“apt-get -qq install -y libmagic1 > /dev/null 2>&1″) _sh(f'”{sys.executable}” -m pip install -q –no-deps augly’) _sh(f'”{sys.executable}” -m pip install -q “iopath>=0.1.8” “python-magic>=0.4.22″ ‘ f'”regex>=2021.4.4” “nlpaug==1.1.3″‘) importar numpy como np desde PIL importar imagen, ImageDraw, ImageFont, ImageFilter para _name, _builtin in ((“float”, float), (“int”, int), (“bool”, bool)): si no hasattr(np, _name): setattr(np, _name, _builtin) def _size(fuente, texto): izquierda, arriba, derecha, abajo = font.getbbox(texto) return (derecha, abajo) si no hasattr(ImageFont.FreeTypeFont, “getsize”): ImageFont.FreeTypeFont.getsize = lambda self, t, *a, **k: _size(self, t) si no hasattr(ImageFont.FreeTypeFont, “getsize_multiline”): def _getsize_multiline(self, text, dirección=Ninguno, espaciado=4, características=Ninguno, idioma=Ninguno, ancho_trazo=0): líneas = text.split(“\n”) w = max((_size(self, ln)[0] para ln en líneas), predeterminado=0) h = suma(_size(self, ln)[1] para ln en líneas) + espaciado * (len(líneas) – 1) return (w, h) ImageFont.FreeTypeFont.getsize_multiline = _getsize_multiline importar os, io, json, matemáticas, aleatorio, cadena, ajuste de texto, unicodedata, advertencias de clases de datos importar clase de datos al escribir importar Cualquiera, Dict, Lista, Opcional, Tuple importar matplotlib.pyplot como plt importar pandas como pd importar augly.image como imaugs importar augly.text como textaugs importar augly.utils como augutils desde augly.image.transforms importar BaseTransform como ImageBaseTransform advertencias.filterwarnings(“ignore”) pd.set_option(“display.width”, 160) SEMILLA = 1234 random.seed(SEED) np.random.seed(SEED) print(“\n” + “=” * 78) print(“Agosto listo. activos en:”, augutils.ASSETS_BASE_DIR) print(“imagen augs :”, len([f for f in dir(imaugs) if f[0].islower()])) print(“texto aumenta:”, len([f for f in dir(textaugs) if f[0].islower()])) print(“=” * 78 + “\n”) def make_image(idx: int, w: int = 320, h: int = 240) -> Tupla[Image.Image, Tuple[int, int, int, int]]: “””‘Foto’ generada por procedimientos + un bbox de verdad sobre el terreno en formato pascal_voc.””” rng = random.Random(SEED + idx) img = Image.new(“RGB”, (w, h), tuple(rng.randint(20, 90) for _ in range(3))) d = ImageDraw.Draw(img) for _ in range(70): x0, y0 = rng.randint(0, w), rng.randint(0, h) d.línea([x0, y0, x0 + rng.randint(-60, 60), y0 + rng.randint(-60, 60)]fill=tuple(rng.randint(60, 160) for _ in range(3)), width=rng.randint(1, 3)) ow, oh = rng.randint(70, 130), rng.randint(60, 110) ox, oy = rng.randint(10, w – ow – 10), rng.randint(10, h – oh – 10) box = (ox, oy, ox + ow, oy + oh) color = tupla(rng.randint(150, 255) for _ in range(3)) if idx % 3 == 0: d.ellipse(box, fill=color, contorno=(255, 255, 255), ancho=3) elif idx % 3 == 1: d.rectangle(cuadro, relleno=color, contorno=(255, 255, 255), ancho=3) else: d.polygon([(ox + ow // 2, oy), (ox + ow, oy + oh), (ox, oy + oh)]relleno=color, contorno=(255, 255, 255)) return img, cuadro N_IMAGES = 24 IMÁGENES, CAJAS = zip(*[make_image(i) for i in range(N_IMAGES)]) IMÁGENES, CAJAS = lista(IMÁGENES), lista(CAJAS) DEMO_IMG, DEMO_BOX = IMÁGENES[0]CAJAS[0]
def make_text_dataset(n_per_class: int = 260): “””Pequeño corpus de sentimientos creado a partir de plantillas -> aprendeble pero no trivial.””” rng = random.Random(SEED) pos_adj = [“excellent”, “delightful”, “superb”, “charming”, “brilliant”,
“flawless”, “wonderful”, “outstanding”, “impressive”, “lovely”]
neg_adj= [“terrible”, “awful”, “dreadful”, “disappointing”, “clumsy”,
“broken”, “miserable”, “useless”, “painful”, “sloppy”]
sujeto = [“the movie”, “this restaurant”, “the hotel room”, “their support team”,
“the new phone”, “the sequel”, “this laptop”, “the delivery service”]
cola_p = [“and I would recommend it to anyone”, “worth every rupee”,
“I left completely satisfied”, “easily the best of the year”,
“it exceeded all my expectations”]
cola_n = [“and I want a refund”, “a total waste of money”,
“I left extremely frustrated”, “easily the worst of the year”,
“it failed every expectation”]
filas = []
para _ en rango (n_per_class): filas.append((f”{rng.choice(subj)} era {rng.choice(pos_adj)} {rng.choice(tail_p)}”, 1)) filas.append((f”{rng.choice(subj)} era {rng.choice(neg_adj)} {rng.choice(tail_n)}”, 0)) rng.shuffle(filas) retorno [r[0] para r en filas], [r[1] para r en filas]TEXTOS, ETIQUETAS = make_text_dataset() DEMO_TEXT = “El veloz zorro marrón salta sobre el perro perezoso cerca de la orilla del río” def make_audio(segundos: float = 2.0, sr: int = 16000) -> Tupla[np.ndarray, int]: “””Un chirrido + armónicos + un poco de ruido = algo que realmente puedes escuchar cambiar.””” t = np.linspace(0, segundos, int(sr * segundos), endpoint=False) f = np.linspace(220, 880, t.size) sig = 0.5 * np.sin(2 * np.pi * f * t) + 0.2 * np.sin(2 * np.pi * 2 * f * t) sig += 0.02 * np.random.RandomState(SEED).randn(t.size) env = np.minimum(1.0, np.minimum(t * 8, (segundos – t) * 8)) return (sig * env).astype(np.float32), sr AUDIO, SR = make_audio() def show_grid(pares, columnas=4, título=””, figsize_scale=2.9): “””pares: lista de (título, PIL.Image).””” filas = math.ceil(len(pares) / columnas) fig, axes = plt.subplots(rows, cols, figsize=(cols * figsize_scale, filas * figsize_scale)) axes = np.atleast_1d(axes).ravel() para hacha, (cap, im) en zip(axes, pares): ax.imshow(im) ax.set_title(cap, fontsize=8) ax.axis(“off”) para hacha en ejes[len(pairs):]: ax.axis(“off”) if title: fig.suptitle(title, fontsize=13, y=1.0) plt.tight_layout() plt.show() def as_str(out) -> str: “””AugLy text augs devuelve str para entrada str en algunas transformaciones, lista en otras.””” return out[0] if isinstance(out, list) else out print(“\n### §2 AUMENTO DE IMAGEN + METADATOS ” + “#” * 38) resultado_funcional = imaugs.pixelization(DEMO_IMG, ratio=0.25) resultado_clase = imaugs.Pixelization(ratio=0.25, p=1.0)(DEMO_IMG) print(“funcional == clase:”, np.array_equal(np.array(resultado_funcional), np.array(resultado_clase))) IMAGE_ZOO = { “blur”: lambda im, m: imaugs.blur(im, radio=3.0, metadata=m), “brillo”: lambda im, m: imaugs.brightness(im, factor=1.7, metadata=m), “color_jitter”: lambda im, m: imaugs.color_jitter(im, factor_brillo=1.3, factor_contraste=1.4, factor_saturación=1.6, metadata=m), “crop”: lambda im, m: imaugs.crop(im, x1=.15, y1=.15, x2=.85, y2=.85, metadata=m), “encoding_quality”: lambda im, m: imaugs.encoding_quality(im, calidad=8, metadata=m), “escala de grises”: lambda im, m: imaugs.grayscale(im, metadata=m), “hflip”: lambda im, m: imaugs.hflip(im, metadata=m), “meme_format”: lambda im, m: imaugs.meme_format(im, text=”TOP TEXT”, caption_height=90, metadata=m), “opacity”: lambda im, m: imaugs.opacity(im, nivel=0.45, metadata=m), “overlay_emoji”: lambda im, m: imaugs.overlay_emoji(im, opacity=0.9, emoji_size=0.35, metadata=m), “overlay_screenshot”: lambda im, m: imaugs.overlay_onto_screenshot(im, metadata=m), “overlay_stripes”: lambda im, m: imaugs.overlay_stripes(im, line_width=0.4, line_opacity=0.7, metadata=m), “overlay_text”: lambda im, m: imaugs.overlay_text(im, opacity=0.9, metadata=m), “pad_square”: lambda im, m: imaugs.pad_square(im, metadata=m), “perspectiva”: lambda im, m: imaugs.perspective_transform(im, sigma=40.0, metadata=m), “pixelización”: lambda im, m: imaugs.pixelization(im, ratio=0.15, metadata=m), “random_noise”: lambda im, m: imaugs.random_noise(im, var=0.03, metadata=m), “rotate”: lambda im, m: imaugs.rotate(im, grados=17, metadata=m), “saturación”: lambda im, m: imaugs.saturation(im, factor=3.0, metadata=m), “scale”: lambda im, m: imaugs.scale(im, factor=0.35, metadata=m), “sharpen”: lambda im, m: imaugs.sharpen(im, factor=8.0, metadata=m), “shuffle_pixels”: lambda im, m: imaugs.shuffle_pixels(im, factor=0.15, metadata=m), “skew”: lambda im, m: imaugs.skew(im, skew_factor=0.35, metadata=m), “vflip”: lambda im, m: imaugs.vflip(im, metadata=m), } galería, image_meta = [(“ORIGINAL”, DEMO_IMG)], []
para nombre, fn en IMAGE_ZOO.items(): m = []
Pruebe: out = fn(DEMO_IMG, m) gallery.append((f”{nombre}\nintensity={m[0][‘intensity’]:.1f}”, fuera)) image_meta.append(m[0]) excepto excepción como e: print(f” [skip] {name}: {type(e).__name__}: {e}”) show_grid(gallery, cols=5, title=”§2 Aumentos de imágenes de AugLy (con la puntuación de intensidad propia de AugLy)”) meta_df = pd.DataFrame(image_meta)[[“name”, “intensity”, “src_width”, “src_height”,
“dst_width”, “dst_height”]]print(meta_df.sort_values(“intensidad”, ascending=False).head(10).to_string(index=False))
def make_text_dataset(n_per_class: int = 260): “””Pequeño corpus de sentimientos creado a partir de plantillas -> aprendeble pero no trivial.””” rng = random.Random(SEED) pos_adj = [“excellent”, “delightful”, “superb”, “charming”, “brilliant”,
“flawless”, “wonderful”, “outstanding”, “impressive”, “lovely”]
neg_adj= [“terrible”, “awful”, “dreadful”, “disappointing”, “clumsy”,
“broken”, “miserable”, “useless”, “painful”, “sloppy”]
sujeto = [“the movie”, “this restaurant”, “the hotel room”, “their support team”,
“the new phone”, “the sequel”, “this laptop”, “the delivery service”]
cola_p = [“and I would recommend it to anyone”, “worth every rupee”,
“I left completely satisfied”, “easily the best of the year”,
“it exceeded all my expectations”]
cola_n = [“and I want a refund”, “a total waste of money”,
“I left extremely frustrated”, “easily the worst of the year”,
“it failed every expectation”]
filas = []
para _ en rango (n_per_class): filas.append((f”{rng.choice(subj)} era {rng.choice(pos_adj)} {rng.choice(tail_p)}”, 1)) filas.append((f”{rng.choice(subj)} era {rng.choice(neg_adj)} {rng.choice(tail_n)}”, 0)) rng.shuffle(filas) retorno [r[0] para r en filas], [r[1] para r en filas]TEXTOS, ETIQUETAS = make_text_dataset() DEMO_TEXT = “El veloz zorro marrón salta sobre el perro perezoso cerca de la orilla del río” def make_audio(segundos: float = 2.0, sr: int = 16000) -> Tupla[np.ndarray, int]: “””Un chirrido + armónicos + un poco de ruido = algo que realmente puedes escuchar cambiar.””” t = np.linspace(0, segundos, int(sr * segundos), endpoint=False) f = np.linspace(220, 880, t.size) sig = 0.5 * np.sin(2 * np.pi * f * t) + 0.2 * np.sin(2 * np.pi * 2 * f * t) sig += 0.02 * np.random.RandomState(SEED).randn(t.size) env = np.minimum(1.0, np.minimum(t * 8, (segundos – t) * 8)) return (sig * env).astype(np.float32), sr AUDIO, SR = make_audio() def show_grid(pares, columnas=4, título=””, figsize_scale=2.9): “””pares: lista de (título, PIL.Image).””” filas = math.ceil(len(pares) / columnas) fig, axes = plt.subplots(rows, cols, figsize=(cols * figsize_scale, filas * figsize_scale)) axes = np.atleast_1d(axes).ravel() para hacha, (cap, im) en zip(axes, pares): ax.imshow(im) ax.set_title(cap, fontsize=8) ax.axis(“off”) para hacha en ejes[len(pairs):]: ax.axis(“off”) if title: fig.suptitle(title, fontsize=13, y=1.0) plt.tight_layout() plt.show() def as_str(out) -> str: “””AugLy text augs devuelve str para entrada str en algunas transformaciones, lista en otras.””” return out[0] if isinstance(out, list) else out print(“\n### §2 AUMENTO DE IMAGEN + METADATOS ” + “#” * 38) resultado_funcional = imaugs.pixelization(DEMO_IMG, ratio=0.25) resultado_clase = imaugs.Pixelization(ratio=0.25, p=1.0)(DEMO_IMG) print(“funcional == clase:”, np.array_equal(np.array(resultado_funcional), np.array(resultado_clase))) IMAGE_ZOO = { “blur”: lambda im, m: imaugs.blur(im, radio=3.0, metadata=m), “brillo”: lambda im, m: imaugs.brightness(im, factor=1.7, metadata=m), “color_jitter”: lambda im, m: imaugs.color_jitter(im, factor_brillo=1.3, factor_contraste=1.4, factor_saturación=1.6, metadata=m), “crop”: lambda im, m: imaugs.crop(im, x1=.15, y1=.15, x2=.85, y2=.85, metadata=m), “encoding_quality”: lambda im, m: imaugs.encoding_quality(im, calidad=8, metadata=m), “escala de grises”: lambda im, m: imaugs.grayscale(im, metadata=m), “hflip”: lambda im, m: imaugs.hflip(im, metadata=m), “meme_format”: lambda im, m: imaugs.meme_format(im, text=”TOP TEXT”, caption_height=90, metadata=m), “opacity”: lambda im, m: imaugs.opacity(im, nivel=0.45, metadata=m), “overlay_emoji”: lambda im, m: imaugs.overlay_emoji(im, opacity=0.9, emoji_size=0.35, metadata=m), “overlay_screenshot”: lambda im, m: imaugs.overlay_onto_screenshot(im, metadata=m), “overlay_stripes”: lambda im, m: imaugs.overlay_stripes(im, line_width=0.4, line_opacity=0.7, metadata=m), “overlay_text”: lambda im, m: imaugs.overlay_text(im, opacity=0.9, metadata=m), “pad_square”: lambda im, m: imaugs.pad_square(im, metadata=m), “perspectiva”: lambda im, m: imaugs.perspective_transform(im, sigma=40.0, metadata=m), “pixelización”: lambda im, m: imaugs.pixelization(im, ratio=0.15, metadata=m), “random_noise”: lambda im, m: imaugs.random_noise(im, var=0.03, metadata=m), “rotate”: lambda im, m: imaugs.rotate(im, grados=17, metadata=m), “saturación”: lambda im, m: imaugs.saturation(im, factor=3.0, metadata=m), “scale”: lambda im, m: imaugs.scale(im, factor=0.35, metadata=m), “sharpen”: lambda im, m: imaugs.sharpen(im, factor=8.0, metadata=m), “shuffle_pixels”: lambda im, m: imaugs.shuffle_pixels(im, factor=0.15, metadata=m), “skew”: lambda im, m: imaugs.skew(im, skew_factor=0.35, metadata=m), “vflip”: lambda im, m: imaugs.vflip(im, metadata=m), } galería, image_meta = [(“ORIGINAL”, DEMO_IMG)], []
para nombre, fn en IMAGE_ZOO.items(): m = []
Pruebe: out = fn(DEMO_IMG, m) gallery.append((f”{nombre}\nintensity={m[0][‘intensity’]:.1f}”, fuera)) image_meta.append(m[0]) excepto excepción como e: print(f” [skip] {name}: {type(e).__name__}: {e}”) show_grid(gallery, cols=5, title=”§2 Aumentos de imágenes de AugLy (con la puntuación de intensidad propia de AugLy)”) meta_df = pd.DataFrame(image_meta)[[“name”, “intensity”, “src_width”, “src_height”,
“dst_width”, “dst_height”]]print(meta_df.sort_values(“intensidad”, ascending=False).head(10).to_string(index=False))