Araç Görüntülerinden Otomatik Maske Elde Etme

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.

REMOVE.BG SİTESİ ARKA PLAN KALDIRMA ÖRNEĞİ

Python ile arka plan düzenleme istediği göndermek için siteye üye olmalı ve API KEY‘i elde etmelisiniz.

API KEY ELDE ETME SAYFASI

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()

api kod çıktısı
REMOVE.BG PYTHON MASKE ELDE ETME GÖRÜNTÜLERİ

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 ALGORİTMA MODELLERİ VE ÖZELLİKLERİ

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()

CARVEKİT ALGORİTMASI MASKE ELDE ETME GÖRÜNTÜLERİ

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.