---
id: wiki-2026-0508-noise-reduction-in-ai
title: Noise Reduction in AI
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Denoising, Noise Suppression, Audio Denoising, Image Denoising, Label Noise]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [denoising, audio, image, label-noise, signal-processing]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack: { language: Python, framework: PyTorch/torchaudio }
---

## 한 줄
오디오/이미지 신호의 노이즈 제거(전통 DSP + DNN)와 학습 데이터의 라벨 노이즈 처리(robust loss, 자가-학습)를 통합 다룬다.

## 핵심
- **오디오 전통**: spectral subtraction, Wiener filter, MMSE-LSA — 정상 잡음 가정.
- **오디오 DNN (2026)**: RNNoise (모바일 RT), Demucs v4 (음원 분리/디노이즈), DeepFilterNet, NSNet2, Meta's Voicebox.
- **이미지 전통**: BM3D (블록 매칭+3D 변환), NLM (non-local means), wavelet thresholding.
- **이미지 DNN**: DnCNN, Restormer, NAFNet — 합성 가우시안/실세계.
- **라벨 노이즈**: symmetric/asymmetric flip, instance-dependent. 처리: GCE/SCE loss, co-teaching, confident learning, label smoothing.

## 💻 패턴

```python
# 1) Spectral subtraction (오디오)
import numpy as np
import librosa

def spectral_subtract(y, sr, noise_clip, n_fft=512, alpha=2.0, beta=0.01):
    S = librosa.stft(y, n_fft=n_fft)
    N = np.mean(np.abs(librosa.stft(noise_clip, n_fft=n_fft)) ** 2, axis=1, keepdims=True)
    P = np.abs(S) ** 2
    P_clean = np.maximum(P - alpha * N, beta * N)
    S_clean = np.sqrt(P_clean) * np.exp(1j * np.angle(S))
    return librosa.istft(S_clean)
```

```python
# 2) RNNoise (실시간) — 파이썬 바인딩
# pip install pyrnnoise
from pyrnnoise import RNNoise
denoiser = RNNoise(sample_rate=48000)
clean_chunks = [denoiser.process_chunk(chunk) for chunk in audio_chunks_480]
```

```python
# 3) Demucs v4로 보컬/노이즈 분리
# pip install demucs
import torch, torchaudio
from demucs.pretrained import get_model
from demucs.apply import apply_model

model = get_model("htdemucs").cpu().eval()
wav, sr = torchaudio.load("noisy.wav")
with torch.no_grad():
    sources = apply_model(model, wav.unsqueeze(0), split=True)[0]
# sources: drums/bass/other/vocals
```

```python
# 4) BM3D (이미지)
# pip install bm3d
import bm3d, numpy as np
clean = bm3d.bm3d(noisy_img.astype(np.float32) / 255.0,
                   sigma_psd=25/255, stage_arg=bm3d.BM3DStages.ALL_STAGES)
```

```python
# 5) DnCNN (잔차 학습 디노이저)
import torch.nn as nn
class DnCNN(nn.Module):
    def __init__(self, depth=17, ch=64):
        super().__init__()
        layers = [nn.Conv2d(3, ch, 3, padding=1), nn.ReLU(inplace=True)]
        for _ in range(depth - 2):
            layers += [nn.Conv2d(ch, ch, 3, padding=1), nn.BatchNorm2d(ch), nn.ReLU(inplace=True)]
        layers += [nn.Conv2d(ch, 3, 3, padding=1)]
        self.net = nn.Sequential(*layers)
    def forward(self, x):
        return x - self.net(x)  # residual: predict noise
```

```python
# 6) Generalized Cross Entropy (라벨 노이즈에 강건)
import torch, torch.nn.functional as F
def gce_loss(logits, target, q=0.7):
    p = F.softmax(logits, dim=-1)
    pt = p.gather(1, target.unsqueeze(1)).squeeze(1).clamp(min=1e-7)
    return ((1 - pt ** q) / q).mean()
```

```python
# 7) Confident Learning으로 라벨 오류 추정
# pip install cleanlab
from cleanlab.classification import CleanLearning
from sklearn.linear_model import LogisticRegression
cl = CleanLearning(clf=LogisticRegression(max_iter=1000))
cl.fit(X, y_noisy)
issues = cl.find_label_issues(X, y_noisy)  # bool mask of suspect labels
```

```python
# 8) Co-teaching (두 네트워크 상호 small-loss 샘플 교환)
def co_teaching_step(net1, net2, x, y, forget_rate, opt1, opt2):
    l1 = F.cross_entropy(net1(x), y, reduction="none")
    l2 = F.cross_entropy(net2(x), y, reduction="none")
    k = int((1 - forget_rate) * len(y))
    idx1 = l1.argsort()[:k]; idx2 = l2.argsort()[:k]
    # 서로 작은 loss 샘플로 업데이트
    opt1.zero_grad(); F.cross_entropy(net1(x[idx2]), y[idx2]).backward(); opt1.step()
    opt2.zero_grad(); F.cross_entropy(net2(x[idx1]), y[idx1]).backward(); opt2.step()
```

## 결정 기준

| 상황 | 추천 |
|---|---|
| 음성 통화 RT, 모바일 | RNNoise |
| 오프라인 고품질 음원 분리 | Demucs v4 |
| 가우시안 노이즈 이미지 | BM3D (전통), Restormer (DL) |
| 실세계 카메라 노이즈 | NAFNet, paired data fine-tune |
| 30%+ 라벨 노이즈 | Co-teaching, GCE |
| 적은 라벨 노이즈 (<10%) | label smoothing + early stop |

## 🔗 Graph
- 부모: [[Computer Vision]]
- 라벨: [[Label Noise]], [[Confident Learning]]

## 🤖 LLM 활용
- 노이즈 유형 분류 (정상/비정상/부르스트) → 알고리즘 추천.
- 라벨 노이즈 패턴 (symmetric vs asymmetric) 진단 → loss 선택.
- 디노이저 하이퍼파라미터 튜닝 가이드.

## ❌ 안티패턴
- spectral subtraction에서 alpha 너무 크게 → musical noise.
- DnCNN을 합성 가우시안으로만 학습 → 실세계에서 실패.
- 라벨 노이즈 무시하고 hard CE만 사용.
- co-teaching에서 forget_rate를 노이즈율과 동기화 안 함.

## 🧪 검증
- 오디오: PESQ, STOI, SI-SDR.
- 이미지: PSNR, SSIM, LPIPS.
- 라벨: clean test set 성능 + 의심 라벨 audit.

## 🕓 Changelog
- 2026-05-08 Phase 1 자동 생성
- 2026-05-10 Manual cleanup — house style 적용
