File size: 8,167 Bytes
b33cd6e
 
 
 
 
 
 
 
 
926bbda
b33cd6e
 
cf30fac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8439a3a
 
 
 
cf30fac
 
 
8439a3a
cf30fac
 
 
 
 
 
 
 
8439a3a
cf30fac
 
8439a3a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cf30fac
 
 
 
 
 
 
 
 
8439a3a
cf30fac
 
 
 
8439a3a
cf30fac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8439a3a
 
 
 
 
 
cf30fac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8439a3a
 
cf30fac
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
---
title: Rembg
emoji: πŸƒ
colorFrom: red
colorTo: pink
sdk: gradio
sdk_version: 6.27.0
python_version: '3.12'
app_file: app.py
pinned: true
---

# RemBG: Pemotong Latar Belakang Foto Berbasis AI

Aplikasi web modern untuk menghapus latar belakang foto secara otomatis dengan hasil PNG transparan 32-bit RGBA. Menggabungkan frontend **Next.js 14** bertema **Neubrutalism** dengan backend **Hugging Face ZeroGPU** bertenaga pustaka Python `rembg` (BiRefNet & ISNet).

---

## Pratinjau Tampilan Antarmuka

### 1. Halaman Utama (Neubrutalism Light Mode)
![Tampilan Halaman Utama](docs/screenshots/hero-preview.png)

### 2. Pratinjau Interaktif Sebelum & Sesudah (Before/After Slider)
Bandingkan foto asli referensi dengan hasil pemisahan latar belakang riil dari model `BiRefNet Portrait`:
![Slider Sebelum dan Sesudah](docs/screenshots/before-after-slider.png)

### 3. Editor Kerja Utama (Workspace Pemrosesan)
Area unggah drag-and-drop, seleksi model segmentasi, opsi alpha matting, dan inspeksi hasil:
![Editor Kerja Utama](docs/screenshots/main-workspace.png)

---

## Fitur Utama

- **Katalog 6 Model Segmentasi AI:**
  - `BiRefNet Portrait`: Khusus potret manusia, mendeteksi helai rambut halus dan lekuk pakaian.
  - `BiRefNet General`: Optimal untuk fotografi produk, katalog e-commerce, dan objek benda padat.
  - `ISNet General`: Pemrosesan cepat dengan batas tepi tegas untuk subjek umum.
  - `ISNet Anime`: Segmentasi spesifik ilustrasi 2D, karakter anime, dan grafik vektor.
  - `U2Net Standard`: Model segmentasi serbaguna dengan stabilitas tinggi.
  - `U2Net Human`: Segmentasi figur manusia ringan untuk kebutuhan cepat.
- **Alpha Matting Tepi Halus:** Opsi erosi piksel tepi dan ambang batas foreground/background untuk helai rambut tipis.
- **Slider Perbandingan Interaktif:** Tuas perbandingan Before/After responsif dengan kendali mouse, sentuhan layar (touch-friendly), dan aksesibilitas keyboard (`input[type="range"]`).
- **Ketahanan Kuota & Arsitektur Dual-Engine:**
  - **ZeroGPU + CPU Fallback:** Inferensi primer dipercepat oleh ZeroGPU (`remove_bg`). Jika kuota GPU limit atau antre, sistem otomatis melakukan failover ke worker CPU (`remove_bg_cpu`) tanpa interupsi.
  - **Multi-Token Rotation (`HF_TOKENS`):** Mendukung load-balancing kuota antar beberapa token akun Hugging Face secara acak.
  - **Rotasi & Forwarding IP Publik:** Melindungi server dari limit IP anonim terpusat dengan meneruskan IP pengunjung asli serta menyediakan generator IP publik acak untuk lingkungan internal.
- **Keamanan & Anti-Spam:**
  - Dilindungi Cloudflare Turnstile tanpa captcha yang mengganggu kenyamanan pengguna.
  - Dilengkapi *in-memory sliding window IP rate limiter* (15 req/menit) untuk mencegah bot flood.
- **Privasi Data Penuh:** Berkas gambar hanya diproses sementara di memori GPU/CPU terisolasi dan langsung dibuang setelah kanal alpha diekstrak. Tidak ada penyimpanan permanen di server.
- **Halaman Error 404 Kustom:** Tampilan 404 berdesain Neubrutalism yang aman tanpa kebocoran informasi internal server.
- **Telemetri Tanpa Pelacak Pribadi:** Modul telemetri aman yang siap dihubungkan dengan Google Analytics (`gtag`) atau Plausible tanpa merekam berkas gambar atau identitas pengguna.

---

## Arsitektur Sistem

```mermaid
flowchart TD
    A[Pengguna / Browser] -->|Unggah Gambar + Turnstile| B[Frontend Next.js 14]
    B -->|Validasi Ukuran & Rate Limit| C[API Route /api/remove-bg]
    C -->|Rotasi Token & IP Forwarding| D[Client hf-inference.js]
    
    subgraph Hugging Face Space [ilhamdev-rembg.hf.space]
        E[Endpoint ZeroGPU /remove_bg]
        F[Endpoint CPU Fallback /remove_bg_cpu]
        G[Pustaka Python rembg BiRefNet / ISNet]
    end

    D -->|Coba Primer: Akselerasi GPU| E
    E -->|Injeksi Tensor GPU| G
    E -.->|Jika ZeroGPU Quota Limit| F
    F -->|Eksekusi Worker CPU| G
    G -->|Ekstrak Alpha RGBA 32-bit| D
    D -->|Stream Data URL PNG| C
    C -->|Response JSON| B
    B -->|Pratinjau Checkerboard & Unduh| A
```

---

## Struktur Direktori Proyek

```text
rembg/
β”œβ”€β”€ app.py                     # Entry point backend Gradio, API ZeroGPU & CPU Fallback
β”œβ”€β”€ requirements.txt           # Dependensi Python (rembg, gradio, spaces, pillow)
β”œβ”€β”€ README.md                  # Dokumentasi proyek & konfigurasi HF Space
β”œβ”€β”€ DESIGN.md                  # Panduan desain Neubrutalism (warna, border, tipografi)
β”œβ”€β”€ docs/
β”‚   └── screenshots/           # Tangkapan layar dokumentasi (hero, slider, workspace)
└── frontend/                  # Aplikasi web Next.js 14
    β”œβ”€β”€ package.json
    β”œβ”€β”€ next.config.js
    β”œβ”€β”€ vercel.json            # Konfigurasi deployment Vercel
    β”œβ”€β”€ .env.example           # Contoh variabel lingkungan
    β”œβ”€β”€ public/
    β”‚   └── samples/           # Sampel foto sebelum dan sesudah AI
    └── src/
        β”œβ”€β”€ app/
        β”‚   β”œβ”€β”€ globals.css    # Sistem desain Neubrutalism lengkap
        β”‚   β”œβ”€β”€ layout.js      # Metadata, Schema.org JSON-LD, OpenGraph
        β”‚   β”œβ”€β”€ page.js        # UI utama, dropzone, slider before/after
        β”‚   β”œβ”€β”€ not-found.js   # Halaman 404 kustom
        β”‚   β”œβ”€β”€ robots.js      # Generator robots.txt dinamis
        β”‚   β”œβ”€β”€ sitemap.js     # Generator sitemap.xml dinamis
        β”‚   β”œβ”€β”€ icon.svg       # Favicon Neubrutalist
        β”‚   └── api/
        β”‚       β”œβ”€β”€ remove-bg/      # Handler pemrosesan utama + Turnstile
        β”‚       └── demo-remove-bg/ # Handler live demo sampel
        └── lib/
            β”œβ”€β”€ analytics.js        # Dispatcher telemetri aman privasi
            β”œβ”€β”€ demo-data.js        # Data URI gambar referensi 512x512 ter-embed
            β”œβ”€β”€ hf-inference.js     # Klien Hugging Face, token rotation, IP forwarding, failover CPU
            β”œβ”€β”€ hf-inference.test.js# Pengujian unit modul inferensi
            β”œβ”€β”€ rate-limit.js       # Sliding-window rate limiter
            └── turnstile.js        # Verifikator server-side Cloudflare Turnstile
```

---

## Panduan Menjalankan Secara Lokal

### 1. Menjalankan Backend Python (Gradio)

Pastikan Python 3.10+ terpasang:

```bash
# Pasang dependensi Python
pip install -r requirements.txt

# Jalankan server Gradio
python app.py
```
Aplikasi backend akan aktif di `http://localhost:7860`.

### 2. Menjalankan Frontend Next.js

Masuk ke folder `frontend`:

```bash
cd frontend

# Pasang dependensi Node.js
npm install

# Buat berkas environment lokal dari template
cp .env.example .env.local

# Jalankan server pengembang
npm run dev
```
Buka browser di `http://localhost:3000`.

### 3. Menjalankan Pengujian Unit

```bash
cd frontend
npm test
```

---

## Konfigurasi Variabel Lingkungan (`frontend/.env.local`)

| Variabel | Keterangan | Nilai Contoh |
|---|---|---|
| `NEXT_PUBLIC_SITE_URL` | Domain kanonikal untuk sitemap dan SEO | `https://rembg.vercel.app` |
| `NEXT_PUBLIC_HF_SPACE_URL` | Alamat backend Hugging Face ZeroGPU | `https://ilhamdev-rembg.hf.space` |
| `HF_TOKEN` | Token akun Hugging Face untuk alokasi kuota ZeroGPU resmi | `hf_xxxxxxxxxxxxxxxxxxxxxxxx` |
| `HF_TOKENS` | Multi-token dipisah koma untuk round-robin/random quota distribution | `hf_token1,hf_token2` |
| `NEXT_PUBLIC_TURNSTILE_SITE_KEY` | Site Key Cloudflare Turnstile | Disediakan Cloudflare |
| `TURNSTILE_SECRET_KEY` | Secret Key Cloudflare Turnstile | Disediakan Cloudflare |
| `NEXT_PUBLIC_GSC_VERIFICATION` | Token verifikasi Google Search Console (opsional) | `google-site-verification-...` |
| `NEXT_PUBLIC_GA_ID` | Google Analytics Measurement ID (opsional) | `G-XXXXXXXXXX` |

> **Catatan Pengujian Lokal:** Jika variabel Turnstile dikosongkan saat pengujian lokal, sistem otomatis menggunakan Dummy Test Key resmi dari Cloudflare (`1x00000000000000000000AA`).

---

## Lisensi & Atribusi

- Pustaka Segmentasi: [danielgatis/rembg](https://github.com/danielgatis/rembg)
- Model BiRefNet: [ZhengPeng7/BiRefNet](https://github.com/ZhengPeng7/BiRefNet)
- Hosting Inferensi: [Hugging Face Spaces (ZeroGPU)](https://huggingface.co/spaces/ilhamdev/rembg)