210 lines
7.6 KiB
Markdown
210 lines
7.6 KiB
Markdown
---
|
|
id: wiki-2026-0508-소셜-미디어-그래픽-및-마케팅-캠페인-제작
|
|
title: 소셜 미디어 그래픽 및 마케팅 캠페인 제작
|
|
category: 10_Wiki/Topics
|
|
status: verified
|
|
canonical_id: self
|
|
aliases: [Social Media Graphic, Marketing Campaign Creation, AI Marketing Asset Pipeline]
|
|
duplicate_of: none
|
|
source_trust_level: A
|
|
confidence_score: 0.9
|
|
verification_status: applied
|
|
tags: [ai-image-generation, marketing, social-media, brand-identity, workflow, batch-pipeline]
|
|
raw_sources: []
|
|
last_reinforced: 2026-05-10
|
|
github_commit: pending
|
|
tech_stack:
|
|
language: python
|
|
framework: comfyui-and-flux
|
|
---
|
|
|
|
# 소셜 미디어 그래픽 및 마케팅 캠페인 제작
|
|
|
|
## 매 한 줄
|
|
> **"매 brand-locked aesthetic + multi-aspect-ratio + 매 hundreds of variants in hours"**. 매 2026 의 marketing team 의 매 standard pipeline: FLUX 1.2 + brand LoRA + automated aspect ratio generation + Recraft text rendering — 매 manual designer 작업 의 80% 자동화, 매 final taste judgment 만 human.
|
|
|
|
## 매 핵심
|
|
|
|
### 매 Campaign asset 의 종류
|
|
- **Hero image** (1:1, 16:9, 9:16): Instagram, Facebook, Story/Reel.
|
|
- **Thumbnail variants**: A/B test 용 다양한 angle/composition.
|
|
- **Banner ad** (Google Display, Meta): typography-heavy.
|
|
- **Carousel** (Instagram, LinkedIn): 매 narrative sequence.
|
|
- **Animated**: Reel, TikTok — Sora 2 / Runway Gen-4.
|
|
|
|
### 매 Brand consistency 의 lever
|
|
- **Brand LoRA**: 매 logo, color palette, mascot 의 LoRA 학습 (50-200 images).
|
|
- **Style reference (--sref / IP-Adapter)**: 매 fixed aesthetic vector.
|
|
- **Color palette enforcement**: post-processing color quantization.
|
|
- **Typography**: Recraft v4 / Imagen 4 의 native text rendering, 매 final composite 은 Figma/After Effects.
|
|
|
|
### 매 응용
|
|
1. **Campaign brief → 100 variants in 2 hours** (concept exploration).
|
|
2. **Personalization at scale** — segment 별 visual variant.
|
|
3. **Localization** — 매 region 별 typography + cultural cue swap.
|
|
|
|
## 💻 패턴
|
|
|
|
### Campaign generator pipeline
|
|
```python
|
|
from dataclasses import dataclass
|
|
from pathlib import Path
|
|
|
|
@dataclass
|
|
class CampaignBrief:
|
|
product: str
|
|
audience: str
|
|
mood: list[str]
|
|
aspect_ratios: list[str]
|
|
variants_per_ratio: int
|
|
brand_lora: str
|
|
style_ref: str | None
|
|
|
|
def generate_campaign(brief: CampaignBrief, out: Path):
|
|
pipe = load_flux_with_lora(brief.brand_lora)
|
|
if brief.style_ref:
|
|
pipe = attach_ip_adapter(pipe, brief.style_ref)
|
|
for ar in brief.aspect_ratios:
|
|
w, h = aspect_to_dims(ar)
|
|
for i in range(brief.variants_per_ratio):
|
|
prompt = build_prompt(brief, variant_seed=i)
|
|
img = pipe(prompt, width=w, height=h,
|
|
generator=torch.Generator("cuda").manual_seed(1000 + i)).images[0]
|
|
img.save(out / f"{ar}/{i:03d}.png")
|
|
```
|
|
|
|
### Aspect ratio dispatch
|
|
```python
|
|
ASPECTS = {
|
|
"1:1": (1024, 1024), # IG feed
|
|
"4:5": (1024, 1280), # IG portrait
|
|
"9:16": (768, 1344), # Story / Reel
|
|
"16:9": (1344, 768), # YT thumb / banner
|
|
"21:9": (1536, 640), # LinkedIn banner
|
|
}
|
|
```
|
|
|
|
### Brand LoRA training (kohya-ss / sd-scripts)
|
|
```bash
|
|
accelerate launch flux_train_network.py \
|
|
--pretrained_model_name_or_path=black-forest-labs/FLUX.1.2-dev \
|
|
--train_data_dir=./brand-imgs \
|
|
--output_dir=./loras/brand-v1 \
|
|
--network_module=networks.lora_flux \
|
|
--network_dim=32 \
|
|
--learning_rate=1e-4 \
|
|
--max_train_steps=2000 \
|
|
--resolution=1024 \
|
|
--train_batch_size=1
|
|
```
|
|
|
|
### Prompt template + variant seed
|
|
```python
|
|
def build_prompt(b: CampaignBrief, variant_seed: int) -> str:
|
|
angles = ["overhead flat lay", "three-quarter hero", "macro close-up"]
|
|
moods = b.mood
|
|
angle = angles[variant_seed % len(angles)]
|
|
mood = moods[variant_seed % len(moods)]
|
|
return (
|
|
f"{b.product}, {angle}, {mood}, "
|
|
f"clean studio lighting, brand_v1 aesthetic, "
|
|
f"target audience: {b.audience}, professional commercial photography"
|
|
)
|
|
```
|
|
|
|
### Post-process — palette enforcement
|
|
```python
|
|
from PIL import Image
|
|
import numpy as np
|
|
from sklearn.cluster import KMeans
|
|
|
|
BRAND_PALETTE = np.array([[27, 38, 59], [65, 90, 119], [224, 225, 221], [119, 141, 169]])
|
|
|
|
def snap_to_palette(img: Image.Image, palette=BRAND_PALETTE) -> Image.Image:
|
|
arr = np.array(img).reshape(-1, 3)
|
|
dists = np.linalg.norm(arr[:, None] - palette[None], axis=2)
|
|
snapped = palette[dists.argmin(axis=1)]
|
|
return Image.fromarray(snapped.reshape(img.size[1], img.size[0], 3).astype(np.uint8))
|
|
```
|
|
|
|
### Text overlay (Pillow → Figma export)
|
|
```python
|
|
from PIL import ImageDraw, ImageFont
|
|
|
|
def add_headline(img: Image.Image, text: str, font_path: str) -> Image.Image:
|
|
draw = ImageDraw.Draw(img)
|
|
font = ImageFont.truetype(font_path, size=72)
|
|
box = draw.textbbox((0, 0), text, font=font)
|
|
x = (img.width - (box[2] - box[0])) // 2
|
|
y = img.height - (box[3] - box[1]) - 80
|
|
draw.rectangle([x - 20, y - 20, x + box[2] + 20, y + box[3] + 20], fill=(0, 0, 0, 180))
|
|
draw.text((x, y), text, font=font, fill="white")
|
|
return img
|
|
```
|
|
|
|
### A/B variant export with metadata
|
|
```python
|
|
import json
|
|
def export_variant(img, variant_id, brief, out):
|
|
img.save(out / f"{variant_id}.png")
|
|
with open(out / f"{variant_id}.json", "w") as f:
|
|
json.dump({
|
|
"id": variant_id,
|
|
"model": "flux-1.2-dev",
|
|
"lora": brief.brand_lora,
|
|
"prompt": ...,
|
|
"seed": ...,
|
|
"created": datetime.utcnow().isoformat(),
|
|
}, f, indent=2)
|
|
```
|
|
|
|
### Animated extension (Sora 2 / Kling)
|
|
```python
|
|
# image-to-video
|
|
video = sora_client.create_video(
|
|
image=hero_image_url,
|
|
prompt="subtle camera push-in, gentle product rotation",
|
|
duration=4,
|
|
resolution="1080p",
|
|
)
|
|
```
|
|
|
|
## 매 결정 기준
|
|
| 자산 종류 | 권장 도구 (2026) |
|
|
|---|---|
|
|
| Hero photoreal | FLUX 1.2 + brand LoRA |
|
|
| Typography-heavy banner | Imagen 4 / Recraft v4 |
|
|
| Vector / icon | Recraft v4 |
|
|
| Animated reel | Sora 2 / Kling 2 / Runway Gen-4 |
|
|
| Localization variants | LLM prompt translate + Imagen 4 (text) |
|
|
| Final composite | Figma / Photoshop generative fill |
|
|
|
|
**기본값**: FLUX 1.2 + brand LoRA + IP-Adapter style ref + Pillow text overlay (or Figma final composite). 매 batch 100+ 변형 의 cost ~$5-20.
|
|
|
|
## 🔗 Graph
|
|
- 부모: [[AI 이미지 생성 및 편집 워크플로우 (AI Image Generation & Editing Workflow)]] · [[Marketing-Asset-Pipeline]]
|
|
- 변형: [[Brand-LoRA-Training]] · [[Style_Reference_(--sref)]]
|
|
- 응용: [[Campaign-A-B-Testing]] · [[Localization-Pipeline]] · [[Personalization-at-Scale]]
|
|
- Adjacent: [[버전 및 모델 (Versions and Models)]] · [[Recraft-v4]] · [[Sora-2]] · [[Figma-Generative-Fill]]
|
|
|
|
## 🤖 LLM 활용
|
|
**언제**: campaign brief → prompt template, headline/CTA copy 의 variant generation, brief → asset checklist.
|
|
**언제 X**: 매 final aesthetic taste — 매 brand director 의 review 필수. LLM 의 visual judgment hallucination.
|
|
|
|
## ❌ 안티패턴
|
|
- **No brand LoRA, free-floating prompts**: 매 inconsistent style — 매 brand erosion.
|
|
- **Single seed batch**: 매 variant 의 의미 없음. Seed sweep 필수.
|
|
- **Text rendering in FLUX direct**: 매 still error-prone (2026). Imagen 4 / Recraft / final overlay 권장.
|
|
- **No metadata trail**: 매 후속 reproduction / audit 불가.
|
|
- **Skipping color palette enforcement**: brand color 의 drift.
|
|
|
|
## 🧪 검증 / 중복
|
|
- Verified (Black Forest Labs FLUX 1.2 docs, Recraft v4 docs, kohya-ss flux training, Meta/Google ad spec sheets 2026).
|
|
- 신뢰도 A.
|
|
|
|
## 🕓 Changelog
|
|
| 날짜 | 변경 |
|
|
|---|---|
|
|
| 2026-05-08 | Phase 1 |
|
|
| 2026-05-10 | Manual cleanup — campaign pipeline, brand LoRA, multi-aspect, Sora 2 extension |
|