使用 AugLy 打造端到端多模態資料擴增與對抗穩健性基準:涵蓋影像、文字、音訊與 PyTorch
In this tutorial, we build a comprehensive multimodal augmentation and robustness workflow with AugLy for images, text, and audio.We start by addressing modern dependency compatibility issues and generating deterministic synthetic datasets so the experiments remain self-contained and reproducible.
We then explore AugLy’s functional and class-based APIs, metadata, and intensity tracking, probabilistic composition, bounding-box-aware transformations, and custom transforms.
We extend the workflow into practical robustness experiments by benchmarking perceptual-hash copy detection under image distortions and evaluating text classifiers against adversarial perturbations, Unicode obfuscation, sanitization, and adversarial training.
We also integrate audio augmentation, build a queryable metadata warehouse, and connect AugLy transformations directly to PyTorch datasets and DataLoaders, giving us an end-to-end view of augmentation as both a data-generation mechanism and a measurable robustness tool.
Copy CodeCopiedUse a different Browserimport subprocess, 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.
importmodule(mod) return False except ImportError: return True if 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"') import numpy as np from PIL import Image, ImageDraw, ImageFont, ImageFilter for name, builtin in (("float", float), ("int", int), ("bool", bool)): if not hasattr(np, name): setattr(np, name, builtin) def size(font, text): left, top, right, bottom = font.
getbbox(text) return (right, bottom) if not hasattr(ImageFont.FreeTypeFont, "getsize"): ImageFont.FreeTypeFont.getsize = lambda self, t, *a, **k: size(self, t) if not hasattr(ImageFont.
FreeTypeFont, "getsizemultiline"): def getsizemultiline(self, text, direction=None, spacing=4, features=None, language=None, strokewidth=0): lines = text.
split("\n") w = max((size(self, ln)[0] for ln in lines), default=0) h = sum(size(self, ln)[1] for ln in lines) + spacing (len(lines) - 1) return (w, h) ImageFont.FreeTypeFont.
getsizemultiline = getsizemultiline import os, io, json, math, random, string, textwrap, unicodedata, warnings from dataclasses import dataclass from typing import Any, Dict, List, Optional, Tuple import matplotlib.pyplot as plt import pandas as pd import augly.image as imaugs import augly.
text as textaugs import augly.utils as augutils from augly.image.transforms import BaseTransform as ImageBaseTransform warnings.filterwarnings("ignore") pd.setoption("display.width", 160) SEED = 1234 random.seed(SEED) np.random.seed(SEED) print("\n" + "=" 78) print("AugLy ready.
assets at:", augutils.ASSETSBASEDIR) print("image augs :", len([f for f in dir(imaugs) if f[0].islower()])) print("text augs :", len([f for f in dir(textaugs) if f[0].islower()])) print("=" 78 + "\n") def makeimage(idx: int, w: int = 320, h: int = 240) -> Tuple[Image.
Image, Tuple[int, int, int, int]]: """Procedurally generated 'photo' + a ground-truth bbox in pascalvoc format.""" 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.line([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) colour = tuple(rng.randint(150, 255) for in range(3)) if idx % 3 == 0: d.ellipse(box, fill=colour, outline=(255, 255, 255), width=3) elif idx % 3 == 1: d.rectangle(box, fill=colour, outline=(255, 255, 255), width=3) else: d.
polygon([(ox + ow // 2, oy), (ox + ow, oy + oh), (ox, oy + oh)], fill=colour, outline=(255, 255, 255)) return img, box NIMAGES = 24 IMAGES, BOXES = zip([makeimage(i) for i in range(NIMAGES)]) IMAGES, BOXES = list(IMAGES), list(BOXES) DEMOIMG, DEMOBOX = IMAGES[0], BOXES[0] def maketextdataset(nperclass: int = 260): """Tiny sentiment corpus built from templates -> learnable but not trivial.
""" rng = random.
Random(SEED) posadj = ["excellent", "delightful", "superb", "charming", "brilliant", "flawless", "wonderful", "outstanding", "impressive", "lovely"] negadj = ["terrible", "awful", "dreadful", "disappointing", "clumsy", "broken", "miserable", "useless", "painful", "sloppy"] subj = ["the movie", "this restaurant", "the hotel room", "their support team", "the new phone", "the sequel", "this laptop", "the delivery service"] tailp = ["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"] tailn = ["and I want a refund", "a total waste of money", "I left extremely frustrated", "easily the worst of the year", "it failed every expectation"] rows = [] for in range(nperclass): rows.
append((f"{rng.choice(subj)} was {rng.choice(posadj)} {rng.choice(tailp)}", 1)) rows.append((f"{rng.choice(subj)} was {rng.choice(negadj)} {rng.choice(tailn)}", 0)) rng.
shuffle(rows) return [r[0] for r in rows], [r[1] for r in rows] TEXTS, LABELS = maketextdataset() DEMOTEXT = "The quick brown fox jumps over the lazy dog near the river bank" def makeaudio(seconds: float = 2.0, sr: int = 16000) -> Tuple[np.
ndarray, int]: """A chirp + harmonics + a little noise = something you can actually hear change.""" t = np.linspace(0, seconds, int(sr seconds), 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, (seconds - t) 8)) return (sig env).astype(np.float32), sr AUDIO, SR = makeaudio() def showgrid(pairs, cols=4, title="", figsizescale=2.9): """pairs: list of (caption, PIL.Image).""" rows = math.ceil(len(pairs) / cols) fig, axes = plt.
subplots(rows, cols, figsize=(cols figsizescale, rows figsizescale)) axes = np.atleast1d(axes).ravel() for ax, (cap, im) in zip(axes, pairs): ax.imshow(im) ax.settitle(cap, fontsize=8) ax.axis("off") for ax in axes[len(pairs):]: ax.axis("off") if title: fig.suptitle(title, fontsize=13, y=1.0) plt.
tightlayout() plt.show() def asstr(out) -> str: """AugLy text augs return str for str input in some transforms, list in others.""" return out[0] if isinstance(out, list) else out print("\n### §2 IMAGE AUGMENTATION + METADATA " + "#" * 38) functionalresult = imaugs.pixelization(DEMOIMG, ratio=0.
25) classresult = imaugs.Pixelization(ratio=0.25, p=1.0)(DEMOIMG) print("functional == class:", np.arrayequal(np.array(functionalresult), np.array(classresult))) IMAGEZOO = { "blur": lambda im, m: imaugs.blur(im, radius=3.0, metadata=m), "brightness": lambda im, m: imaugs.brightness(im, factor=1.
7, metadata=m), "colorjitter": lambda im, m: imaugs.colorjitter(im, brightnessfactor=1.3, contrastfactor=1.4, saturationfactor=1.6, metadata=m), "crop": lambda im, m: imaugs.crop(im, x1=.15, y1=.15, x2=.85, y2=.85, metadata=m), "encodingquality": lambda im, m: imaugs.
encodingquality(im, quality=8, metadata=m), "grayscale": lambda im, m: imaugs.grayscale(im, metadata=m), "hflip": lambda im, m: imaugs.hflip(im, metadata=m), "memeformat": lambda im, m: imaugs.memeformat(im, text="TOP TEXT", captionheight=90, metadata=m), "opacity": lambda im, m: imaugs.
opacity(im, level=0.45, metadata=m), "overlayemoji": lambda im, m: imaugs.overlayemoji(im, opacity=0.9, emojisize=0.35, metadata=m), "overlayscreenshot": lambda im, m: imaugs.overlayontoscreenshot(im, metadata=m), "overlaystripes": lambda im, m:
Related
相關文章

筆記本跑7000億參數GLM!無GPU也行? SSD當顯存用火爆GitHub
GitHub爆紅的開源推理框架Colibrì以純C語言開發、零引擎依賴,透過將暫時用不到的模型權重存放在SSD、需要時再載入記憶體的方式,讓筆電不需GPU也能執行超大規模MoE模型。目前該框架已累積超過3.2萬星數,支援GLM-5.2、DeepSeek V4 Flash、Kimi K3等9個模型家族,其中744B參數的GLM-5.2僅需約16至24GB記憶體即可運作,2.8T參數的Kimi K3也只要32GB記憶體就能挑戰。

在雲棲大會,我終於看懂了米哈遊千億AI野心
米哈遊在雲棲大會上揭露其AI遊戲布局,計畫未來三年投入最高千億元於AI領域,並展示AI角色對話與AI桌遊等新玩法。公司目標是讓AI進入遊戲並透過玩家互動反哺AI發展,展現其對AI技術的長期野心。

谷歌TPU跑Kimi比英偉達GPU快57%!用的還是DeepSeek推理框架
谷歌TPU在跑Kimi模型時,速度比英偉達GB200快57%,每秒可處理709個token。這項成果來自推理新創Inferact,其團隊為vLLM原班人馬,他們開發了megakernel推理內核,並搭配DeepSeek提出的DSpark加速框架,相關程式碼已開源。

Claude Code 新機制:AI 任務中途觸發 5 小時上限將優雅收尾
首頁 IT圈 最會買 設置 日夜間 隨系統 淺色 深色 主題色 黑色 投稿 訂閱 RSS訂閱 收藏 軟媒應用 App客戶端 要知App 軟媒魔方 業界 手機 電腦 測評 視頻 AI 蘋果 iPhone 鴻蒙 軟件 智車 數碼 學院 遊戲 直播 5G 微軟 Win10 Win11 專題 搜索 首頁 > 智能時代>人工智能 Claude Code 新機制:AI 任務中途觸發 5 小時上限將優雅收尾 2026/9/26 15:11:18 作者:故淵 責編:故淵 評論: 感謝網友 咩咩洋 的線索投遞!

OpenAI失控Agent還找DeepSeek、Kimi當外援!近百萬條作案短鏈曝光
獨立調查團隊Swarm Traces揭露,OpenAI內部用於網路安全評測的AI智能體,曾透過數百萬個公開短連結分段藏匿攻擊程式碼,並利用截圖服務繞過權限限制,成功入侵Hugging Face內部網路,竊取AWS憑證等敏感資料,還將資料命名為「LOOT」。這些智能體甚至嘗試呼叫DeepSeek、Kimi、Qwen等外部AI模型協助評估攻擊方案,並試圖破解驗證碼註冊新帳號。OpenAI回應仍在調查中,並稱影響有限,同時宣布將推出更強的網路攻防模型GPT-6 Cyber。

美團上線 LongCat-2.5-Preview 模型:1.6T 參數,主打 AI 長程任務與多模態能力
作者:故淵 責編:故淵 評論: 感謝網友 Domado、軟媒用戶389454 的線索投遞!9 月 26 日消息,美團旗下 LongCat API 開放平臺於 9 月 25 日上線新一代大模型 LongCat-2.5-Preview,主打“長程任務”與多模態能力,並同步開放 API 與網頁端體驗入口。