간략한 설명
나이트쉐이드
시카고 대학교에서 개발한 프로젝트로, 예술가들이 그들의 이미지 데이터를 "독살(poisoning)"하여 AI 모델 훈련에 사용될 때 무용하거나 혼란을 주는 데이터로 만들 수 있게 하는 도구입니다. 이 도구의 목적은 AI 회사들이 창작자의 허락 없이 예술작품을 모델 훈련에 사용하는 것에 대항하는 방법을 예술가들에게 제공하는 것입니다. 나이트쉐이드를 사용함으로써, 예술가들은 그들의 작품이 AI에 의해 무단으로 사용되는 것을 방해하고, 저작권을 보호할 수 있습니다.
역시 직접 개념증명 PoC 코드를 돌려보자
import numpy as np
import matplotlib.pyplot as plt
# 가상의 이미지 데이터 생성 (예: 28x28 픽셀의 흑백 이미지)
original_image = np.random.rand(28, 28)
# 이미지에 미묘한 노이즈 추가하여 포이즈닝
# 이 노이즈는 사람의 눈으로는 거의 감지할 수 없지만, AI 모델의 학습에 영향을 줄 수 있음
noise_intensity = 0.005 # 노이즈 강도 조절
poisoned_image = original_image + noise_intensity * np.random.randn(28, 28)
# 원본 이미지와 포이즈닝된 이미지 비교 출력
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title("Original Image")
plt.imshow(original_image, cmap='gray')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.title("Poisoned Image")
plt.imshow(poisoned_image, cmap='gray')
plt.axis('off')
plt.show()
예시로 실행하면 결과로는 이렇게 나온다
큰 차이 없어 보인다 실제 이미지를 적용해보면?
와우 실제 차이가 거의 없다
내 눈이 나쁜거 아니라 진짜 크게 달라지게 눈에 보이지 않는다
풀 코드
# import numpy as np
# import matplotlib.pyplot as plt
# # 가상의 이미지 데이터 생성 (예: 28x28 픽셀의 흑백 이미지)
# original_image = np.random.rand(28, 28)
# # 이미지에 미묘한 노이즈 추가하여 포이즈닝
# # 이 노이즈는 사람의 눈으로는 거의 감지할 수 없지만, AI 모델의 학습에 영향을 줄 수 있음
# noise_intensity = 0.005 # 노이즈 강도 조절
# poisoned_image = original_image + noise_intensity * np.random.randn(28, 28)
# # 원본 이미지와 포이즈닝된 이미지 비교 출력
# plt.figure(figsize=(10, 5))
# plt.subplot(1, 2, 1)
# plt.title("cc.png")
# plt.imshow(original_image, cmap='gray')
# plt.axis('off')
# plt.subplot(1, 2, 2)
# plt.title("cc_done.png")
# plt.imshow(poisoned_image, cmap='gray')
# plt.axis('off')
# plt.show()
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
# 이미지 파일 경로 설정 (예시: 'your_image_path.jpg')
image_path = 'cc.png'
# 이미지 로드
image = Image.open(image_path)
# 이미지를 numpy 배열로 변환
image_np = np.array(image)
# 노이즈 강도 조절
noise_intensity = 0.02 # 이 값을 조정하여 노이즈의 강도를 변경
# 노이즈 생성 및 추가 (이미지가 컬러일 경우 RGB 채널 모두에 노이즈 적용)
if image_np.ndim == 3: # 컬러 이미지인 경우
noise = noise_intensity * np.random.randn(*image_np.shape)
else: # 흑백 이미지인 경우
noise = noise_intensity * np.random.randn(image_np.shape[0], image_np.shape[1])
poisoned_image_np = image_np + noise
poisoned_image_np = np.clip(poisoned_image_np, 0, 255) # 값의 범위를 0에서 255 사이로 제한
# 포이즈닝된 이미지를 PIL 이미지로 변환
poisoned_image = Image.fromarray(poisoned_image_np.astype('uint8'))
# 원본 이미지와 포이즈닝된 이미지 비교 출력
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title("Original Image")
plt.imshow(image)
plt.axis('off')
plt.subplot(1, 2, 2)
plt.title("Poisoned Image")
plt.imshow(poisoned_image)
plt.axis('off')
plt.show()
'Programing' 카테고리의 다른 글
[python] A Bytes-Like Object Is Required, Not ‘Str’ (0) | 2024.03.31 |
---|---|
[블로그 자동화 #1] - 플래닝 시작 (0) | 2024.03.25 |
[js] Cytoscape.js 랑 친해지기 (1) | 2024.02.18 |
[python] 배포를 쉽게 해주는 freeze 사용법 (0) | 2024.02.04 |
[python] python-dotnet 설치 및 활용기 (0) | 2024.01.22 |