Bilgisayarla görme modeli eğitimi için binlerce görüntü toplamak, genellikle iki sorunla karşılaşan bir görevdir: veri kaynağından (Google Görseller, Pinterest, pazar yerleri, stok siteleri) gelen engellemeler ve beklenmedik yüksek trafik tüketimi. Bir IP hızla yasaklanır ve proxy trafiği için fatura, veri setinin etiketlenmesinin maliyetini aşabilir. Bu yazıda, engellemeler nedeniyle veri kaybı yaşamayan bir görüntü ayrıştırıcısının nasıl tasarlanacağını ve trafik bütçesinin nasıl hesaplanacağını inceleyeceğiz.
CV için görüntü toplarken neden proxy kullanmalıyız
Bilgisayarla görme için veri setleri genellikle tek bir kaynaktan toplanmaz. Genellikle bu, görüntü arama sonuçları, pazar yerlerinde ürün kartları, stok fotoğraflar, sosyal medya ve açık API'lerin bir kombinasyonudur. Bu kaynakların neredeyse tamamı, bir IP'den gelen istek sayısına sınırlamalar getirir: Google Görseller, ardışık birkaç yüz istekten sonra CAPTCHA gösterirken, Pinterest API'ye geçici olarak erişimi engeller ve Wildberries ile Ozon, şüpheli etkinlik durumunda boş kartlar verir veya kontrol sayfasına yönlendirir.
Proxy olmadan, bir adresten günde birkaç yüz veya binlerce görüntü toplama sınırına ulaşırsınız. Eğer 50.000–500.000 görüntüden oluşan bir veri setine ihtiyacınız varsa (bu, genellikle sınıflandırma ve tespit görevlerinde konvolüsyonel ağlar ve transformerlar için gereken miktardır), dağıtılmış bir IP havuzu olmadan bunu makul bir sürede toplamak fiziksel olarak mümkün değildir — ya sürekli engellerle karşılaşacaksınız ya da günün saatine ve coğrafi konuma bağlı olarak oldukça kaydırılmış bir örneklem elde edeceksiniz.
İkinci neden, verilerin coğrafi çeşitliliğidir. Model, nesneleri çekim bölgesinden bağımsız olarak eşit derecede iyi tanımalıdır (örneğin, farklı ülkelerdeki trafik işaretleri veya yerel pazar yerlerindeki ürünler), bu nedenle ayrıştırıcının farklı ülkelerden IP'lerle bağlanması gerekir. Tek bir veri merkezi ile tek bir çıkış IP'si bu çeşitliliği sağlamaz.
Veri seti için gerçek trafik ne kadar
Görüntü toplarken trafik tüketimi genellikle göz ardı edilir. Sorun, yalnızca resimlerin boyutunda değil — HTML sayfaları, JS paketleri, önizlemeler, izleme pikselleri ve CSS de proxy üzerinden geçer, eğer ayrıştırıcı gerekli URL'ler için özel olarak ayarlanmamışsa.
| İçerik Türü | Ortalama Boyut | 10.000 adet için Trafik |
|---|---|---|
| Önizleme/thumbnail (150–300 px) | 15–40 KB | ~250 MB |
| Orta çözünürlüklü fotoğraf (800–1200 px) | 80–200 KB | ~1,4 GB |
| Yüksek çözünürlüklü fotoğraf (2000+ px) | 400 KB – 1,5 MB | ~9,5 GB |
| Ürün kartı HTML sayfası (resimsiz) | 150–400 KB | ~2,7 GB |
Pratikte, eğer 100.000 orta çözünürlüklü görüntü topluyorsanız ve ürün kartlarıyla birlikte (etiketleme için — kategoriler, kutular, özellikler) toplam trafik tüketimi genellikle 25–45 GB aralığında kalır. Küçük nesnelerin tespiti için yüksek çözünürlüklü görüntülere ihtiyaç varsa — aynı 100.000 parça için 80–150 GB hesaplayın. Bu rakamları proxy tarifinizi seçerken önceden dikkate almak önemlidir, sonradan değil.
Datacenter, residential ve mobile: hangisini seçmeli
Görüntü toplarken üç parametre önemlidir: hız, trafik maliyeti ve engellemelere karşı dayanıklılık. Bu parametreler, farklı proxy türleri arasında büyük farklılıklar gösterir.
| Parametre | Datacenter | Residential | Mobile |
|---|---|---|---|
| Hız | Yüksek | Orta | Düşük-orta |
| Engellemelere karşı dayanıklılık | Düşük | Yüksek | Çok yüksek |
| Trafik maliyeti | Düşük | Orta-yüksek | Yüksek |
| Uygun olduğu yerler | Açık API'ler, sıkı koruma olmayan stoklar | Google Görseller, Pinterest, pazar yerleri | Sert anti-bot koruması olan sosyal medya |
Çoğu görüntü toplama görevi için en iyi dengeyi residential proxy'ler sağlar — IP'ler normal kullanıcılar gibi görünür, bu nedenle pazar yerleri ve görüntü arama motorlarının anti-bot sistemleri daha nadir CAPTCHA tetikler. Eğer kaynak, açık bir stok fotoğraf veya sıkı limitleri olmayan bir API ise, daha hızlı ve GB başına daha düşük fiyatla büyük trafik hacimlerini geçirebilen datacenter proxy'leri kullanmak daha ucuzdur. Mobil uygulamalardan veya gelişmiş anti-bot koruması olan sosyal medyadan görüntü toplamak için en iyi seçenek mobil proxy'lerdir — bunlar gerçek telefon operatörlerinin IP'lerini kullanır ve neredeyse hiç engellenmez.
Proxy döngüsü ile requests üzerinde temel ayrıştırıcı
Başlamak için, her istek için veya belirli bir istek sayısından sonra proxy döngüsü ile basit bir senkron script yeterlidir. Aşağıda, içerik türünü kontrol eden ve dosya boyutunu sınırlayan bir URL listesi üzerinden görüntü indirme örneği verilmiştir, böylece yanlışlıkla yanlış formatta ağır bir dosya indirilmez.
import requests
import itertools
import hashlib
import os
PROXIES = [
"http://user:[email protected]:10000",
"http://user:[email protected]:10000",
"http://user:[email protected]:10000",
]
proxy_cycle = itertools.cycle(PROXIES)
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept": "image/avif,image/webp,image/*,*/*;q=0.8",
}
def download_image(url, save_dir="dataset", max_size_mb=10, timeout=15):
proxy = next(proxy_cycle)
proxies = {"http": proxy, "https": proxy}
try:
resp = requests.get(url, headers=HEADERS, proxies=proxies, timeout=timeout, stream=True)
resp.raise_for_status()
content_type = resp.headers.get("Content-Type", "")
if "image" not in content_type:
return None
content_length = int(resp.headers.get("Content-Length", 0))
if content_length > max_size_mb * 1024 * 1024:
return None
file_hash = hashlib.md5(url.encode()).hexdigest()
ext = content_type.split("/")[-1].split(";")[0]
filepath = os.path.join(save_dir, f"{file_hash}.{ext}")
os.makedirs(save_dir, exist_ok=True)
with open(filepath, "wb") as f:
for chunk in resp.iter_content(chunk_size=8192):
f.write(chunk)
return filepath
except requests.exceptions.RequestException as e:
print(f"{url} üzerinden {proxy} ile hata: {e}")
return None
Anahtar nokta, yanıt gövdesini indirmeden önce Content-Length kontrolüdür. Bu, aşırı ağır dosyaları tam yüklemeden önce ayıklayarak trafiği tasarruf ettirir. Proxy döngüsü itertools.cycle ile IP'ler arasında yükü eşit şekilde dağıtarak belirli bir adresin yasaklanma riskini azaltır.
aiohttp ile asenkron toplama
requests üzerinde senkron bir script birkaç bin görüntü için iyi bir seçimdir, ancak 50.000 dosyadan fazla veri setleri için asenkronluk gereklidir — aksi takdirde toplama günler sürecektir. aiohttp, eşzamanlılık sınırlaması için bir semafor ile birlikte, proxy havuzunu aşırı yüklemeden on binlerce eşzamanlı görev için çalışan bir seçenektir.
import asyncio
import aiohttp
import itertools
PROXIES = [
"http://user:[email protected]:10000",
"http://user:[email protected]:10000",
]
proxy_cycle = itertools.cycle(PROXIES)
sem = asyncio.Semaphore(50) # eşzamanlı istek sınırı
async def fetch_image(session, url, idx):
proxy = next(proxy_cycle)
async with sem:
try:
async with session.get(url, proxy=proxy, timeout=15) as resp:
if resp.status != 200:
return
content_type = resp.headers.get("Content-Type", "")
if "image" not in content_type:
return
data = await resp.read()
with open(f"dataset/{idx}.jpg", "wb") as f:
f.write(data)
except Exception as e:
print(f"{url} üzerinde hata: {e}")
async def main(urls):
async with aiohttp.ClientSession() as session:
tasks = [fetch_image(session, url, i) for i, url in enumerate(urls)]
await asyncio.gather(*tasks)
# asyncio.run(main(url_list))
50 eşzamanlı bağlantı için semafor — başlangıç noktasıdır. Eğer residential proxy'ler hata 429 ve zaman aşımı olmadan yükü kaldırıyorsa, 100–150'ye kadar yavaşça artırabilirsiniz. Anahtar, başarısız isteklerin yüzdesini izlemektir: eğer %5–7'nin üzerine çıkıyorsa, eşzamanlılığı azaltmak daha iyidir, proxy havuzunu sonsuz bir şekilde artırmak yerine.
Scrapy + proxy middleware ile ölçeklenebilir toplama
Üretim ortamında veri setleri toplamak için yerleşik bir kuyruk, yeniden denemeler ve URL'lerin deduplikasyonu ile Scrapy kullanmak daha uygundur. Bu, görüntüleri otomatik olarak indirir, geçerliliklerini PIL ile kontrol eder ve farklı boyutlarda önizlemeler oluşturabilir.
# settings.py
ITEM_PIPELINES = {
'scrapy.pipelines.images.ImagesPipeline': 1,
}
IMAGES_STORE = 'dataset_images'
IMAGES_MIN_HEIGHT = 200
IMAGES_MIN_WIDTH = 200
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.ProxyRotationMiddleware': 350,
}
CONCURRENT_REQUESTS = 32
DOWNLOAD_DELAY = 0.5
RETRY_TIMES = 3
# middlewares.py
import random
class ProxyRotationMiddleware:
PROXIES = [
"http://user:[email protected]:10000",
"http://user:[email protected]:10000",
"http://user:[email protected]:10000",
]
def process_request(self, request, spider):
request.meta['proxy'] = random.choice(self.PROXIES)
IMAGES_MIN_HEIGHT ve IMAGES_MIN_WIDTH parametreleri, veri setini kirleten ve trafiği gereksiz yere harcayan küçük simgeleri ve sprite'ları otomatik olarak ayıklar. DOWNLOAD_DELAY 0.5 saniye, bir proxy üzerinden isteklerin sıklığını azaltarak, Pinterest gibi sıkı anti-fraud izleme kaynaklarında CAPTCHA oranını düşürür.
Trafik tüketimini nasıl azaltırız
Proxy üzerinden trafik genellikle hacme göre ücretlendirilir, bu nedenle herhangi bir optimizasyon doğrudan bütçeyi tasarruf ettirir. İşte etkili yöntemler:
- Özgün yerine önizleme isteyin, eğer eğitim için 512–1024 px çözünürlüğü yeterliyse — çoğu kaynak, gerekli boyuttaki görüntüyü ayrı bir URL veya sorgu parametresi ile verir.
- Gövde indirilmeden önce Content-Length ile filtreleyin — HEAD isteği veya akış GET başlıklarını okumak, aşırı ağır dosyaları yükleme trafiği harcamadan ayıklamanıza olanak tanır.
- İlgili kaynakların indirilmesini devre dışı bırakın, eğer ayrıştırıcı headless tarayıcı ile çalışıyorsa: CSS, fontlar ve izleme scriptlerini engelleyerek yalnızca HTML ve gerekli görüntüleri bırakın.
- URL'leri istekte bulunmadan önce deduplikasyon yapın, indirdikten sonra değil — ürün kartlarındaki (örneğin, Wildberries'de) aynı görüntüleri tekrar indirmeye gerek yoktur.
- Yanıtların yerel önbelleğini kullanın ayrıştırıcıyı hata ayıklama sırasında tekrar çalıştırırken, her test kodu çalıştırmasında proxy üzerinden trafik geçirmemek için.
Sık karşılaşılan hatalar, 403 ve rate limit
Büyük hacimlerde görüntü toplarken, ayrıştırıcı kaçınılmaz olarak 403, 429 yanıtları ve kontrol sayfalarına geçici yönlendirmelerle karşılaşacaktır. Bu kodların doğru işlenmesi, hem trafiği hem de proxy havuzunu tasarruf ettirir.
| Kod/Belirti | Sebep | Ne yapmalı |
|---|---|---|
| 403 Yasaklı | IP kaynak tarafından kara listeye alındı | Proxy döngüsü, User-Agent değiştirin |
| 429 Çok Fazla İstek | Dakikada istek limiti aşıldı | DOWNLOAD_DELAY'yi artırın, eşzamanlılığı azaltın |
| CAPTCHA yönlendirmesi | Davranış analizi botu şüphelendi | Residential/mobil IP'lere geçin |
| Boş Content-Length | Chunked yanıt veya resim yerine taklit | İndirilen baytların gerçek boyutunu kontrol edin |
Her proxy için başarılı isteklerin oranını ayrı olarak günlüğe kaydetmek önemlidir. Eğer belirli bir IP, diğerlerinden daha sık 403 hatası veriyorsa — onu otomatik olarak döngüden çıkarın, tüm havuzun genel blok istatistiklerini etkilemesini beklemeden.
Proxy trafiği için bütçe hesaplaması
Toplama işlemine başlamadan önce, trafik hacmini önceden tahmin etmek faydalıdır, sonradan hesaplamak yerine. Formül basit: görüntü sayısı × dosya ortalama boyutu × dolaylı maliyet katsayısı (HTML, başlıklar, hata nedeniyle tekrar istekler — genellikle 1.3–1.6).
Orta çözünürlüklü (~150 KB) 200.000 görüntü için veri seti hesaplaması örneği: 200.000 × 150 KB = 30 GB temiz görüntü ağırlığı. HTML sayfaları ve geçici engellemeler nedeniyle tekrar istekler (katsayı 1.5) göz önüne alındığında, toplam tüketim — yaklaşık 45 GB. Eğer bazı kaynaklar, anti-bot koruması nedeniyle mobil IP'ler gerektiriyorsa, bunu proxy havuzuna ayrı olarak eklemelisiniz, çünkü mobil IP'lerdeki trafik genellikle residential veya datacenter'dan daha pahalıdır.
İyi bir uygulama, 1.000–2.000 görüntüden oluşan bir pilot parti toplamak, gerçek trafik tüketimini ve hata yüzdesini ölçmek ve ardından planlanan veri seti hacmine ekstrapolasyonda bulunmaktır. Bu, belirli bir kaynağın özelliklerini dikkate alarak, teorik hesaplamalardan daha doğrudur.
Sonuç
Bilgisayarla görme modellerinin eğitimi için görüntü toplamak, veri mühendisliği ve ağ altyapısının doğru yönetimi arasında bir görevdir. Doğru ayrıştırıcı mimarisi (asenkronluk, Content-Length ile filtreleme, URL deduplikasyonu) trafik tasarrufu sağlar, iyi bir proxy seçimi ise gerekli veri seti hacmini günler içinde mi yoksa sürekli engellemelerle haftalar içinde mi toplayacağınızı belirler.
Eğer veri kaynakları gelişmiş anti-bot koruması kullanıyorsa — görüntü arama motorları, pazar yerleri, sosyal medya — residential proxy'lerle başlayın: bunlar, yasaklara karşı dayanıklılık ve trafik maliyeti arasında en iyi dengeyi sağlar. Açık API'ler ve sıkı limitleri olmayan stoklar için datacenter proxy'leri ile tasarruf etmek mantıklıdır, en korunaklı mobil uygulamalar için ise mobil proxy'leri kullanarak toplamanın en zor kısmını gerçekleştirin.