AI

구글 딥마인드 SynthID와 디지털 워터마크의 원리

Medium 작성 포스팅 보러가기

AI로 만들어진 이미지인지 여부는 어떻게 확인할까요?

SynthID

구글 딥마인드에서 SynthID라는 툴로 워터마킹을 이미지에 추가할 수 있고, AI 이미지 여부도 확인할 수 있는 툴을 런칭했습니다.
현재는 Imagen을 사용하는 Vertex AI 고객에게 제한적으로 출시된 도구입니다. (SynthID를 다른 제품에 통합하고 제3자 사용자도 사용할 수 있도록 확장할 계획이라고 합니다.)

  • Vertex AI는 텍스트로 이미지를 생성하는 도구로 구글 클라우드에서 제공하는 AI 및 머신러닝 개발 및 배포 플랫폼입니다.

이 워터마크는 이미지 압축 손실에 영향을 미치지 않으며, 이미지에서 육안으로 확인되지 않는 디지털 워터마크입니다. 즉, 필터, 색상 변경 등의 이미지 변화 후에도 초기 이미지 생성이 AI에 의한 것인지 여부를 확인할 수 있습니다.
그럼 이 워터마크 어떻게 생성되고 이미지에 적용되었길래 보이지 않지만 식별이 가능하게 만들어진 걸까요?

디지털 워터마크의 원리

SynthID의 워터마크는 이미지의 픽셀에 직접 추가하여 인간의 눈으로는 관찰할 수 없도록 만드는 동시에 전문 AI 식별 알고리즘으로는 감지할 수 있도록 합니다. 두 개의 AI 모델을 사용해서 하나는 눈에 띄지 않는 워터마크를 추가하는 데 사용되고, 다른 하나는 이를 식별하는 데 사용됩니다. SynthID AI 모델의 원리에 대한 구체적인 내용은 아직 베타버전이고 보안 이슈라서 자세히 나와있지 않습니다.

대신에 OpenStego의 원리를 통해 어떤 방식들이 사용될 수 있는지 확인해 볼 수 있지 않을까라는 생각이 들어 찾아보게 되었습니다.
먼저, Steganography는 이미지, 비디오 등 컨텐츠에 메시지를 감추는 것을 말합니다. 이미지 일부분을 딥러닝 모델로 변경시키고 거의 원본 이미지와 유사하게 만들고 변경된 인코딩 정보를 이미지에 숨기는 방식입니다. 여기서 이미지의 변경은 픽셀의 일부 변경, 색상 값의 조정 등의 방식을 말합니다.
OpenStego는 모든 이미지 형식을 지원하며 이미지 특성과 시각적 변경이 없는 Steganography 툴입니다. 원하는 알고리즘과 비밀번호를 선택해 자신의 보안 요구 사항에 맞게 설정할 수 있습니다.
실제 OpenStego는 이미지 워터마크 처리를 위해 DCT(Discrete Cosine Transform) 기반의 DctLSBPlugin 그리고 DWT(Discrete Wavelet Transform) 기반의 DWTDugadPlugin, DWTKimPlugin, DWTXiePlugin을 가지고 있는 플러그인 기반 아키텍처로 구성되어 있습니다. 여기서 각 알고리즘은 Peter Meerwald의 코드를 사용했으며 이 분이 작성한 각 알고리즘을 적용한 이미지 사이트 에서 확인해 볼 수 있습니다.

잠깐 DCT와 DWT에 대한 개념을 정리하고 가겠습니다 :)

DCT와 DWT

DCT는 주로 주파수 도메인 표현 및 데이터 손실 압축에 사용되고, DWT는 다중 해상도 표현 및 데이터 손실 최소화에 사용됩니다.
DCT는 이미지를 작은 조각으로 나누어 색상 정보를 사용하여 숫자를 만들고, DWT는 이미지를 작은 조각으로 나누어 세부 정보를 사용하여 이미지를 만듭니다. 여기서 색상 정보는 조각 안의 색조, 채도 및 명도와 같은 것을 의미하고 세부 정보는 이미지의 고주파수 성분(이미지에서 작은 세부 사항, 엣지 (이미지 내의 뾰족한 변화), 텍스처 (균일하지 않은 패턴), 노이즈)을 의미합니다.

그럼 다시 위에 DWTXiePlugin 중 워터마크를 이미지에 삽입하는 과정을 살펴보겠습니다. (DWTXiePlugin embedData 메서드 살펴보기)

public byte[] embedData(byte[] msg, String msgFileName, byte[] cover, String coverFileName, String stegoFileName) throws OpenStegoException {
// ...

    // Cover file is mandatory
    if (cover == null) {
        throw new OpenStegoException(null, NAMESPACE, DWTXieErrors.ERR_NO_COVER_FILE);
    } else {
        image = ImageUtil.byteArrayToImage(cover, coverFileName);
    }

    // ...

    // Wavelet transform
    dwt = new DWT(cols, rows, sig.filterID, sig.embeddingLevel, sig.waveletFilterMethod);
    dwtTree = dwt.forwardDWT(luminance);

    p = dwtTree;
    // Consider each resolution level
    while (p.getLevel() < sig.embeddingLevel) {
        // Descend one level
        p = p.getCoarse();
    }

    // Repeat binary watermark by sliding a 3-pixel window of approximation image
    for (int row = 0; row < p.getImage().getHeight(); row++) {
        for (int col = 0; col < p.getImage().getWidth() - 3; col += 3) {
            // Get all three approximation pixels in window
            pixel1 = new Pixel(0, DWTUtil.getPixel(p.getImage(), col, row));
            pixel2 = new Pixel(1, DWTUtil.getPixel(p.getImage(), col + 1, row));
            pixel3 = new Pixel(2, DWTUtil.getPixel(p.getImage(), col + 2, row));

            // Bring selected pixels in ascending order
            if (pixel1.value > pixel2.value) {
                swapPix(pixel1, pixel2);
            }
            if (pixel2.value > pixel3.value) {
                swapPix(pixel2, pixel3);
            }
            if (pixel1.value > pixel2.value) {
                swapPix(pixel1, pixel2);
            }

            // Apply watermarking transformation (modify median pixel)
            temp = wmTransform(sig.embeddingStrength, pixel1.value, pixel2.value, pixel3.value,
                    getWatermarkBit(sig.watermark, n % (sig.watermarkLength * 8)));

            // Write modified pixel
            DWTUtil.setPixel(p.getImage(), col + pixel2.pos, row, temp);

            n++;
        }
    }

    // ...

    return ImageUtil.imageToByteArray(image, stegoFileName, this);
}

코드를 요약하면,
cover image를 DWT로 다양한 해상도 레벨로 분해합니다. 그리고 각 픽셀 그룹에서 세 개의 근사화된 픽셀 값을 가져오고 이를 정렬합니다. 워터마크 변환을 적용하여 중간 픽셀을 수정하고, 수정된 값을 이미지에 쓰기 위해 DWTUtil.setPixel을 호출합니다.
마지막으로 워터마크가 적용된 이미지를 생성한 뒤, 바이트 배열로 변환해서 반환합니다.

조금 더 세분화해서 의미를 살펴보자면, DWT는 이미지를 다음과 같이 다른 레벨의 근사화 이미지와 세부 성분 이미지로 분해합니다. 워터마크를 세부 성분 이미지에 숨기면 이미지의 고주파 성분에 영향을 미칠 수 있으며, 이로 인해 이미지 품질이 손상될 수 있습니다. 그래서 보통 근사화 이미지의 픽셀 그룹을 선택하게 됩니다.
픽셀그룹은 세 개의 연속된 픽셀을 말하며, 그 중에서 밝기가 가장 낮은 픽셀을 찾아 워터마크 데이터의 비트에 따라 수정합니다. 픽셀 그룹을 선택하고 가장 낮은 픽셀을 수정하는 이유는 이미지의 세부한 부분을 변경하지 않으면서 워터마크를 더 효과적으로 숨기기 위함입니다. 이렇게 함으로써 워터마크가 이미지에 미세한 변화를 일으키지만, 인간 눈으로는 감지하기 어렵게 만듭니다.

AI 이미지 디지털 워터마크와 미래

AI 컨텐츠의 발전과 더불어 구글, 아마, 오픈AI를 비롯한 7개 업체들의 이용자 안전 조치에 대한 자발적 합의를 시작으로 점차 AI 컨텐츠에 대한 구별과 규제가 중요해지고 있습니다. SynthID와 같은 기술들은 육안으로 구분이 되지 않는 디지털 워터마크로 인해 잘못된 정보 또는 실제 사람의 흉내를 내는 등의 딥페이크 이미지 구분이 가능해집니다. 의미있는 저작권에 대한 진전이라고 보는 긍정적인 시각과 여전히 지금 이 기술로는 장기적 효용성에 대한 한계가 있다는 회의적인 의견이 공존하고 있습니다.



지도학습

분류, 회귀

classification.jpeg

베이스 모델
성능 측정의 기준이 되는 모델로 참조 지점으로 사용되는 단순한 모델 또는 휴리스틱을 말합니다. 머신러닝 모델이 의미있게 하는 가장 최소한의 성능을 제공하는 모델입니다.
참고로 휴리스틱이란, 시간이나 정보가 불충분해 합리적인 판단을 할 수 없거나 체계적이고 합리적인 판단이 필요없는 경우 신속하게 사용하는 어림짐작의 기술입니다.


분류
예측해야할 대상의 개수가 정해져 있는 문제를 말합니다. 예를 들어, 동물의 분류거나 이진 분류 값을 원하는 문제가 해당됩니다.

confusion_matrix.png

Confusion Matrix, 오차행렬이란 Traning을 통한 Prediction 성능을 측정하기 위해 예측값과 실제값을 비교하기 위한 표입니다. 여기서 True/False는 관심 범주의 여부를 의미하고 Positive/Negative는 분류를 제대로 했는지 여부를 의미한다. 이 정보를 바탕으로 Accuracy, Parecision, Recall 3가지 척도를 평가할 수 있습니다.

  1. Accuracy, 정확도
    (TP + TN) / (TP + TN + FP + FN)
    모델이 얼마나 정확한지를 파악하는 척도를 말합니다. 하지만 불균형 데이터에 사용하기는 부적합합니다. 예를 들어, 정확도는 높게 나오더라도 실제 검출해야 하는 값을 예측하지 못할 수 있기 때문입니다.
  2. Precision, 정밀도
    TP / (TP + FP)
    Negative인 데이터가 중요할 때, 이 데이터를 Positive로 판단하면 안 될 때 사용됩니다. 예를 들어, 스팸메일을 일반메일로 분류하면 안되는 경우에 해당합니다.
  3. Recall, 재현도
    TP / (TP + FN)
    Precision과 반대로 Positive인 데이터를 Negative로 판단하면 안되는 경우에 중요합니다. 관심 영역만을 얼마나 추출해냈는지를 말합니다.
  4. ROC(Receiver Operating Characteristic), 수신자 조작 특성
    제대로 판단하는 비율인 TRR(True Positive Rate)를 y축으로 하고, 잘못 판단하는 비율인 FPR(False Positive Rate)를 x축으로 하는 그래프를 말합니다. 즉, 곡선은 (0,0)(1,1)을 잇는 직선에서 (0,1) 지점으로 치우친 그래프를 갖는 모델이 가장 높은 성능을 보이는 모델임을 알 수 있습니다.
  5. AUC(Area Under Curve)
    ROC 곡선의 아래 curve의 밑면적으로 0~1 사이의 값을 갖습니다. 1에 가까울수록 예측을 잘하는 모델이라고 할 수 있습니다.


회귀
예측해야할 대상이 연속적인 숫자인 문제를 말합니다. 주어진 데이터를 가지고 날씨나 부동산 시세를 예측하는 것을 회귀의 예로 들 수 있습니다.


Confusion Matrix를 통한 분류 모델의 평가
Visualize Confusion Matrix Using Caret Package in R
[용어 설명] ROC curve와 AUC란?

results matching ""

    No results matching ""