- Birkaç saat içinde yalnızca bana özel bir yapay zeka görüntü modeli eğitip, sanki gerçekten benim çekilmiş fotoğraflarım gibi görseller üretmeye yönelik bir proje denedim
- Örnek: "Süperman" kostümü giymiş benim fotoğrafımı üretmek
- Deneme nedenim: eğlenceli görünüyordu, çocuklarla birlikte oynamak için uygundu ve özel model/gelişmiş yapay zeka tarafında biraz daha fazla şey öğrenebiliyordum
- 12-18 ay önce bu iş oldukça karmaşıktı, ama artık çok kolay hale gelmiş
- 2 saatten kısa sürede modeli oluşturup istediğim görselleri elde ettim; işin püf noktası doğru araçları hızlıca belirlemekti
Model/eğitim deseni seçimi
- Gerekli bileşenler
- temel model (base model)
- eğitim/fine-tuning tekniği
- eğitim veri seti (kendinizin birkaç fotoğrafı gibi)
- Pek çok yapay zeka aracı Stable Diffusion önerse de, Pieter Levels'ın kullandığı Flux modelinin daha iyi performans verdiği söylendiği için Flux'u seçtim
- Tam anlamıyla en yeni SOTA model değil, ama fazlasıyla iyi
- Eğitim tekniği olarak LoRA(Low-Rank Adaptation) kullandım
- Tüm modeli yeniden eğitmek yerine, yalnızca belirli bir "sihirli kelime" ile bağlantılı kısmı eğitiyor
- Örnek: modele "czue" gibi nadir bir kelimeyi öğretip, prompt içinde bu kelime kullanıldığında veri setinin özelliklerini yansıtmasını sağlamak
Eğitim seti oluşturma
- Eğitilecek öznenin birkaç fotoğrafını (yaklaşık 10-15 adet) hazırlamak gerekiyor
- Yüz ifadesi, arka plan, ışık, açı gibi unsurlar ne kadar çeşitli olursa o kadar iyi
- Bir fotoğrafta yalnızca bir kişi olması tercih edilir
- Eğitim sırasında metinsel açıklama gerekir ve bu açıklamada sihirli kelime yer almalıdır
- Örnek: "a photo of czue on the beach, wearing a blue shirt"
- Ancak son dönemdeki araçlar görüntü açıklamalarını otomatik oluşturduğu için bunları elle yazmaya gerek kalmıyor
Model eğitimi
- Başta modeli yerelde eğitmeyi düşündüm ama GPU ve RAM yetersizliği nedeniyle zor oldu
- GPU bulut sunucusunda kodu doğrudan çalıştırmak mümkün olsa da, sonunda Replicate'i kullandım
- Bu bir GPU kiralama hizmeti ve hazır tarifleri doğrudan kullanabiliyorsunuz
- Bu örnekte ostris/flux-dev-lora-trainer tarifini kullandım
- Replicate hesabı oluşturduktan sonra faturalama bilgilerini ayarlamak gerekiyor
- Başlıca parametreler
- input_images: eğitim fotoğrafları (zip)
- trigger_word: sihirli kelime, ör. "czue"
- hf_repo_id, hf_token: Hugging Face repository/token
- autocaption_prefix: otomatik üretilen açıklamaların başına eklenecek ifade (ör. "A photo of czue,")
Modeli Hugging Face'e kaydetme
- Hugging Face, modelleri saklama ve paylaşma platformudur
- Replicate de eğitilmiş modeli bir yerde saklıyor, ama Hugging Face'e yüklerseniz diğer araçlarla entegrasyon daha kolay oluyor
- Hesabı ve modeli oluşturduktan sonra
hf_repo_iddeğerini veriyorsunuz- Erişim token'ı settings/tokens sayfasından alınabilir
- Eğitim tamamlandığında "lora.safetensors" adlı büyük bir dosya (yaklaşık 180MB) Hugging Face'e yükleniyor
Modelle görsel üretme
- Eğitim tamamlandıktan sonra, modele metin verip görsel üreten inference sürecine geçiliyor
- Bunu yerelde de deneyebilirdim ama yine Replicate kullandım
- lucataco/flux-dev-lora üzerinde yalnızca hf_lora alanını ayarlamak yeterli
- public Hugging Face repository ID'si veya Replicate'e yüklenmiş eğitilmiş model bağlantısı
- lucataco/flux-dev-lora üzerinde yalnızca hf_lora alanını ayarlamak yeterli
- Örneğin "a photo of czue surfing" yazarsanız, aşağıdakine benzer şekilde sörf yapan kendi görselinizi elde edersiniz
Modeli programatik olarak çalıştırma
- Farklı prompt'ları denemek ve sonuçları otomatik kaydetmek istiyorsanız API çağrısı yöntemi daha pratiktir
- Aşağıdaki Python betiğini örnek olarak hazırladım (tam kod Github'da)
# /// script # requires-python = ">=3.12" # dependencies = [ # "replicate", # ] # /// import argparse import os import re import replicate import uuid DEFAULT_MODEL = "czue/me-v1" DEFAULT_COUNT = 1 def get_input(prompt, model=DEFAULT_MODEL, count=DEFAULT_COUNT): return { "prompt": prompt, "hf_lora": model, "num_outputs": count } def main(): parser = argparse.ArgumentParser() parser.add_argument("prompt", help="Prompt for the photo") parser.add_argument("--model", default=DEFAULT_MODEL, help="Model to use (default: %(default)s)") parser.add_argument("--count", default=DEFAULT_COUNT, help="Number of photos to generate (default: %(default)s)", type=int) args = parser.parse_args() input = get_input(args.prompt, args.model, args.count) output = replicate.run( "lucataco/flux-dev-lora:091495765fa5ef2725a175a57b276ec30dc9d39c22d30410f2ede68a3eab66b3", input=input ) output_dir = "output" os.makedirs(output_dir, exist_ok=True) prompt_slug = "-".join(args.prompt.split(" ")[-3:]) prompt_slug = re.sub(r'[^a-zA-Z0-9\-]', '', prompt_slug).lower() for index, item in enumerate(output): file_id = uuid.uuid4().hex[:5] output_path = os.path.join(output_dir, f"{prompt_slug}-{file_id}.webp") with open(output_path, "wb") as file: file.write(item.read()) print(f"Saved photo {output_path}") if __name__ == "__main__": main() - Örnek kullanım
uv run main.py "a photo of czue, a 40 year old man, writing a blog post" \ --model="czue/me-v1" \ --count=4
Sonuçlar
- Model performansı dalgalı
- Kişinin özelliklerini zaman zaman oldukça benzer yakalıyor, ama bazen tamamen başka birini de üretebiliyor
- Prompt içine belirli yaş, cinsiyet gibi bilgileri eklemek doğruluğu biraz artırıyor
- Örneğin "a photo of czue, a 40 year old man, writing a blog post" görece tutarlı görseller üretiyor
- Buna karşılık "a photo of czue writing a blog post" çok daha dağınık sonuçlar verdi
- Başka bir kişiyi birlikte eklediğinizde yüzlerin karışması gibi sorunlar yaşanabiliyor
- Barack Obama ile birlikte bir fotoğraf üretmeye çalıştığımda, yüzümün bazı kısımları Obama'ya yansıyor ve tersi de oluyordu
- Yine de yeterince eğlenceli ve kullanışlıydı; çocuklarla birlikte farklı denemeler yapabildik
Maliyet
- Ücretsiz değil ama çok pahalı da değil
- Benim ve çocukların toplamında 3 model eğittim; her biri yaklaşık ~$2.50 tuttu
- Görsel üretimi görsel başına yaklaşık $0.03, yani 30 görsel üretseniz bile yaklaşık $1 ediyor
- Tüm deney için $10'dan az harcadım ve maliyetin beklediğimden düşük olmasından memnun kaldım
- Yapay zeka modeli eğitimi ve görsel üretimi ilginizi çekiyorsa, düşündüğünüzden daha kolay denenebildiği için denemeye değer
5 yorum
Eğlencesine ben de denedim; gerçekten çok kolaymış.
(https://www.youtube.com/watch?v=sNpQ9ULDMoo)
Bir şeyler yapıp denerken epey güldüm...
Sonunda hepimiz, ölmeden önce benim gibi eğitilmiş bir modeli ağa yükleyip sonra ölmeye çalışmayacak mıyız? Hayatta kalma içgüdüsü gibi... O "ben" değil ama.
Teknolojiyi görünce aklıma bir roman geldi, onu tanıtmak istedim. Yazar Lee Yuri’nin yayımladığı Bisutbangul Pong adlı öykü kitabında yer alan
Chronosadlı kısa öykü; bir insanı, yani kendi verilerini depolayıp öğrenen bir yapay zekayı konu alıyor. Tıpkı o yorumdaki kedi gibi. Demansa yakalanan anne, belirtiler daha da ağırlaşmadan önce onu kullanıyor. Sonra çocukları da çatışma yaşıyor. Hem teselli buluyorlar hem de suçluluk hissediyorlar. Bu teknolojiye ve o kedinin hikâyesine ilgi duyan biriyseniz, bir kez okuyun derim.Bir Hacker News yorumu dikkat çekiyor
Bilgilendirici bir yorum da var
"Yeterince gelişmiş bilim ve teknoloji sihirden ayırt edilemez - Arthur C. Clarke"
Daha sadece 2 yıl önce bile ancak bir SF filminde görebileceğimiz bir şeydi; şimdi ise sihrin gerçeğe dönüştüğü ana gerçekten de canlı canlı tanıklık ediyoruz 😳