Son dönemde hızla popülerlik kazanan stable diffusion konusunu, araç görüntülerine uygulamanın büyüleyici dünyasını keşfetmeye karar verdik. Bu makale, araç görüntülerinizin arka planını ve zeminini dilediğiniz gibi değiştirme ve araçlarınıza çarpıcı gölgeler ekleyebilme yeteneğini size sunacak. Her ne kadar bu yazı, özellikle araç görüntüleri üzerinde duruyor gibi görünse de, bu algoritma ile elde edebileceğiniz maskeleri kullanarak tüm görüntüleri dönüştürme potansiyeline sahipsiniz.
Bu blog yazısı ile kolay maskeler oluşturma, profesyonel görünüm sağlama ve görsel düzenleme yeteneğine sahip olabilirsiniz.
“Stable Diffusion” algoritması için ilk olarak görüntülerin maskelerine ihtiyaç duyulmaktadır. Python ile görüntülerin maskelerini otomatik olarak elde etmek için iki ayrı kod parçacığını detaylı olarak ele alalım.
1. Görüntülerden Otomatik Olarak Maske Elde Etme
1.1 Remove.bg Sitesine API Gönderme
remove.bg sitesini ziyaret edip “Remove Background” sekmesini inceleyebilirsiniz. Aşağıdaki şekillerde örnek bir görüntü mevcuttur.
Python ile arka plan düzenleme istediği göndermek için siteye üye olmalı ve API KEY‘i elde etmelisiniz.
API referansına linkten erişim sağlayabilirsiniz. Aşağıda dosyadan okunan veya ‘np.array’ olarak işlem gören görüntüler için kullanılabilecek python kod örneği ve çıktı görüntüleri bulunmaktadır.
import requests
from PIL import Image
import numpy as np
import io
import cv2
def get_image_handler(img_arr):
## np.array görüntülerini buffer'e export etme fonksiyonu.
img_arr = cv2.cvtColor(img_arr, cv2.COLOR_RGB2BGR)
ret, img_encode = cv2.imencode('.jpg', img_arr)
str_encode = img_encode.tobytes()
img_byteio = io.BytesIO(str_encode)
reader = io.BufferedReader(img_byteio)
return reader
class RemoveBG:
def __init__(self, image_path:str):
self.api_key = "ed3eUhrQfo8hxYEovyjVtMER"
self.url = "https://api.remove.bg/v1.0/removebg"
self.header = {'X-Api-Key': self.api_key}
self.image_path = image_path
def request_with_image_path(self):
## Dosyadan okunan görüntüler için kullanılabilir
response = requests.post(self.url,
files={'image_file': open(self.image_path, 'rb')},
data={'size': 'auto',
'add_shadow':0, # 1 ile gölge eklenir.
'format': 'auto',
'scale':'original'},
headers=self.header,)
if response.status_code == requests.codes.ok:
rgbaImage = np.asarray(Image.open(io.BytesIO(response.content))) ## 4 Kanallı görüntü elde edilir,
color_image = cv2.cvtColor(rgbaImage[:,:, :-1],cv2.COLOR_RGB2BGR) ## Renkli görüntünün elde etmek
mask_image = rgbaImage[:, :, -1] ## Maske Görüntüsünü elde etme
else:
mask_image, color_image = None, None
print("Error:", response.status_code, response.text)
return mask_image, color_image
def request_with_array_image(self):
## np.array olarak işlem gören görüntüler için kullanılabilir.
response = requests.post(self.url,
files={'image_file': get_image_handler(np.asarray(Image.open(self.image_path)))},
data={'size': 'auto',
'add_shadow':0,
'format': 'auto',
'scale':'original'},
headers=self.header,)
if response.status_code == requests.codes.ok:
rgbaImage = np.asarray(Image.open(io.BytesIO(response.content))) ## 4 Kanallı görüntü elde edilir,
color_image = cv2.cvtColor(rgbaImage[:,:, :-1],cv2.COLOR_RGB2BGR) ## Renkli görüntünün elde etmek
mask_image = rgbaImage[:, :, -1] ## Maske Görüntüsünü elde etme
else:
mask_image, color_image = None, None
print("Error:", response.status_code, response.text)
return mask_image, color_image
if __name__ == '__main__':
remove_bg = RemoveBG(image_path='audi_001.jpg')
mask_image, color_image = remove_bg.request_with_image_path()
mask_image2, color_image2 = remove_bg.request_with_array_image()
cv2.imshow("mask_image", mask_image)
cv2.imshow("color_image", color_image)
cv2.imshow("mask_image2", mask_image2)
cv2.imshow("color_image2", color_image2)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 CarveKit Algoritması
Carvekit algoritması kullanıcıya 4 farklı maskeleme modeli ve her model için görüntü piksel büyüklüğü sunar.
CarveKit insan görüntüleri için U2net modelini, genel görüntüler için ise tracer_b7 modelini kullanmamızı önermektedir. Colab üzerinden de farklı modelleri tecrübe edebilirsiniz.
CarveKit kütüphanesini kurmak için aşağıdaki adımları izleyebilirsiniz.
## CPU KULLANIMI
pip install carvekit --extra-index-url https://download.pytorch.org/whl/cpu
## GPU KULLANIMI (Nvidia markalı 8GB'tan fazla vram'ı olan ekran kartları)
pip install carvekit --extra-index-url https://download.pytorch.org/whl/cu113
## MODELLER
from carvekit.ml.files.models_loc import download_all
download_all();
Son işleme (post-processing) için CarveKit algoritmasında U2-Net modeli önerilmiştir. Diğer modellerde görüntü üzerinde bozukluklara sebep olduğu tespit edilmiştir.
Algoritma girdi olarak Python Görüntü Kütüphanesi (PIL) formatında görüntü kabul etmektedir. Aşağıda örnek kod parçacığı bulunmaktadır.
Ek olarak: CarveKit algoritması birden fazla görüntünün maskesini aynı anda çıkarabilmektedir.
from carvekit.web.schemas.config import MLConfig
from carvekit.web.utils.init_utils import init_interface
from PIL import Image
import numpy as np
import cv2
class CarveKit_BG:
def __init__(self):
## CONFİG PARAMETRELERİ
self.SHOW_FULLSIZE = True #@param {type:"boolean"}
self.PREPROCESSING_METHOD = "stub" #@param ["stub", "none"]
self.SEGMENTATION_NETWORK = "tracer_b7" #@param ["u2net", "deeplabv3", "basnet", "tracer_b7"]
self.POSTPROCESSING_METHOD = "none" #@param ["fba", "none"]
self.SEGMENTATION_MASK_SIZE = 640 #@param ["640", "320"] {type:"raw", allow-input: true}
self.TRIMAP_DILATION = 30 #@param {type:"integer"}
self.TRIMAP_EROSION = 5 #@param {type:"integer"}
# self.DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu'
self.DEVICE = 'cpu'
self.config = MLConfig(
segmentation_network=self.SEGMENTATION_NETWORK,
preprocessing_method=self.PREPROCESSING_METHOD,
postprocessing_method=self.POSTPROCESSING_METHOD,
seg_mask_size=self.SEGMENTATION_MASK_SIZE,
trimap_dilation=self.TRIMAP_DILATION,
trimap_erosion=self.TRIMAP_EROSION,
device=self.DEVICE)
## MODEL INITIALIZE
self.interface = init_interface(self.config)
def main(self, image:Image):
images = self.interface([image]) ## Birden fazla görüntüyü algoritmaya dahil edebilirsiniz.
rgba_image = np.asarray(images[0])
color_image = rgba_image[:, :, :-1]
mask_image = rgba_image[:, :, -1]
return cv2.cvtColor(color_image, cv2.COLOR_RGB2BGR), mask_image
if __name__ == '__main__':
image = Image.open('audi_008.jpg')
carvekit_bg = CarveKit_BG()
color_image, mask_image = carvekit_bg.main(image=image)
cv2.imshow("mask_image", mask_image)
cv2.imshow("color_image", color_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
EK NOT
Bu iki algoritma ile beraber ek olarak Google’ın sunduğu MediaPipe algoritmasına da bir göz atabilirsiniz. Online olarak nesne tespit, görüntü segmentasyonu, el hareketi takip etme, görüntü sınıflandırma, yüz tespiti gibi modelleri deneyebilirsiniz. Bu modellerin dokümanlarını inceleyerek javascript, python ve android kodlarına erişebilirsiniz.
Burada “interactive image segmentation” modeli ile görüntü üzerinde istediğiniz bir bölgenin maskesini elde edebilirsiniz.
Bir sonra ki yazımızda bu maskeler ile stable diffusion konusunu ele alıp, kodları paylaşacağız. Keyifli okumalar dileriz.