4 puan yazan GN⁺ 2025-05-28 | 1 yorum | WhatsApp'ta paylaş
  • Rational Bloom Filter Video Compression, ham videoyu sıkıştırırken geri yüklenen sonucun kaynakla bit düzeyinde aynı olması gereken kayıpsız bir iş akışı uygular
  • Temel fikir, Bloom filtresine tam sayı olmayan sayıda hash fonksiyonu uygulayarak mevcut yöntemlere göre teorik olarak daha iyi sıkıştırma oranı hedefleyen bir yapı kurmaktır
  • Y4M, YUV, HDR gibi raw video content üzerinde çalışır ve tipik videolarda %40~50 alan tasarrufu sağladığını belirtir
  • Uygulama Python 3.7+ tabanlıdır ve numpy, opencv-python, xxhash, Pillow, scikit-image, HDR için pyexr gibi bağımlılıklar gerektirir
  • FFV1, HuffYUV ve H.264 kayıpsız modu ile karşılaştırmalı benchmark'lar içerir; gerçek kullanım öncesinde results.md içindeki sonuçlar ve yeniden üretim adımlarının incelenmesi önerilir

Rational Bloom Filter Video Compression genel bakış

  • Bu proje, rational Bloom filter tabanlı bir kayıpsız video sıkıştırma yaklaşımını uygular
  • Bloom filtresi, ikili veriyi verimli biçimde temsil eden olasılıksal bir veri yapısı olarak kullanılır
  • Fark yaratan nokta, Bloom filtresinde tam sayı olmayan rational hash function kullanılmasıdır
  • Amaç, sıkıştırma sonrası geri yüklenen sonucun kaynakla bit-exact biçimde eşleşmesidir

Desteklenen içerik ve sıkıştırma özellikleri

  • Sıkıştırma sistemi Y4M, YUV, HDR gibi raw video content için tasarlanmıştır
  • Sunulan özellikler şunlardır
    • Bit düzeyinde aynı geri yüklemeyi garanti eden true lossless compression
    • Tipik video içeriklerinde %40~50 alan tasarrufu
    • Çok iş parçacıklı kodlama ve kod çözme desteği
    • RGB, BGR, YUV gibi birden çok color space desteği
    • HDR içerik işleme desteği
  • HDR işleme için, “hızlı ve kullanılabilir hale getirmek adına daha fazla çalışma gerektiği” sınırlaması belirtilir

Kurulum gereksinimleri

  • Çalışma ortamı Python 3.7+ olmalıdır
  • Gerekli paketler şunlardır
    • numpy
    • opencv-python
    • matplotlib
    • pandas
    • tqdm
    • requests
    • xxhash
    • Pillow
    • scikit-image
    • pyexr: HDR desteği için
  • Bağımlılıklar şu komutla kurulur
pip install -r requirements.txt

Temel kullanım şekli

  • Python kodunda ImprovedVideoCompressor içe aktarılır ve sıkıştırıcı başlatılır
  • Örnek ayarlar arasında noise_tolerance=10.0, keyframe_interval=30, use_direct_yuv=True, verbose=True bulunur
  • compress_video(), giriş videosunu .bfvc dosyasına sıkıştırır
  • decompress_video(), .bfvc dosyasını geri açar
  • verify_lossless() ile kaynak kareler ve geri açılan karelerin kayıpsız olup olmadığı doğrulanır
from improved_video_compressor import ImprovedVideoCompressor

compressor = ImprovedVideoCompressor(
    noise_tolerance=10.0,
    keyframe_interval=30,
    use_direct_yuv=True,
    verbose=True
)

compressor.compress_video(
    input_file="input_video.y4m",
    output_file="compressed.bfvc"
)

compressor.decompress_video(
    input_file="compressed.bfvc",
    output_file="decompressed.mp4"
)

original_frames = compressor.extract_frames_from_video("input_video.y4m")
decompressed_frames = compressor.decompress_video("compressed.bfvc")
verification = compressor.verify_lossless(original_frames, decompressed_frames)
print(f"Lossless: {verification['lossless']}")

Komut satırı kullanımı

  • Video sıkıştırma şu şekilde çalıştırılır
python -m improved_video_compressor compress input_video.y4m output.bfvc --max-frames 30
  • Ham YUV dosyaları genişlik, yükseklik ve format birlikte belirtilerek işlenir
python -m improved_video_compressor process-yuv input.yuv output.bfvc --width 1920 --height 1080 --format YUV444

Benchmark ve karşılaştırma hedefleri

  • Proje, Rational Bloom Filter sıkıştırmasını diğer kayıpsız sıkıştırma yöntemleri ile karşılaştıran bir benchmark sistemi içerir
  • Karşılaştırma hedefleri FFV1, HuffYUV ve H.264'ün kayıpsız modudur
  • Tam benchmark'ı çalıştırma komutu şöyledir
python benchmark_compression.py
  • Belirli veri kümeleri ve yöntemler seçilerek de çalıştırılabilir
python benchmark_compression.py --datasets y4m --methods bloom ffv1 --max-frames 10
  • Ayrıntılı benchmark sonuçları ve yeniden üretim yöntemi results.md içinde yer alır

Sıkıştırma yönteminin çalışma akışı

  • Sıkıştırma şeması şu adımlarla çalışır
    • Frame Extraction: giriş videosundan kareler çıkarılır
    • Keyframe Selection: anahtar kareler doğrudan zlib ile sıkıştırılmış kareler olarak saklanır
    • Bloom Filter Compression: ara kareler, fark haritası rational Bloom filter ile sıkıştırılır
    • Lossless Verification: çözme sırasında bit-exact geri yükleme doğrulanır
  • rational Bloom filter, alan ile doğruluk arasındaki dengeyi optimize etmek için tam sayı olmayan hash fonksiyonu sayısı k* kullanır
  • Uygulama, ⌊k*⌋ adet hash fonksiyonunu deterministik olarak kullanır ve ek hash fonksiyonu k* - ⌊k*⌋ olasılığıyla uygulanır

Proje dosya yapısı

  • improved_video_compressor.py: sıkıştırma algoritmasının main implementation
  • verify_true_lossless.py: kayıpsız geri yüklemeyi doğrulayan betik
  • benchmark_compression.py: birden fazla sıkıştırma yöntemini karşılaştıran benchmark sistemi
  • download_*.py: test veri kümesi indirme betikleri
  • results.md: ayrıntılı benchmark sonuçları ve analiz

Lisans ve atıf

  • Lisans MIT License'tır; ayrıntılar LICENSE dosyasında bulunabilir
  • Araştırmada kod kullanıldığında, README içinde yer alan BibTeX biçimindeki citation'ın kullanılması önerilir

1 yorum

 
GN⁺ 2025-05-28
Hacker News yorumları
  • Belgenin çok basit bir fikri iyi açıklayamadığını düşünüyorum. Doğru anladıysam, önce her biti görüntünün bir pikseli olarak gören bir bitmap oluşturuluyor; 0. kareden 1. kareye geçerken değişen piksel 1, değişmeyen 0 yapılıyor.
    Ardından 1 olan konumların ofsetleri hash’lenip Bloom filter’a ekleniyor. Böylece ilgili indeksler ve belirli oranda yanlış pozitif indeksler pozitif çıkıyor.
    Sonra Bloom filter sorgulanarak pozitif olan tüm indeksler bulunuyor; bu pikseller için değişmiş ham piksel verisi saklanırsa sonraki kare kolayca yeniden oluşturulabiliyor.
    İki kare arasındaki deltayı değişen tüm piksellerin x,y,r,g,b değerleri olarak saklayan; ama x,y kısmını büyük ölçüde sıkıştırıp gerekenden biraz daha fazla r,g,b saklayan bir yöntem olarak görülebilir.
    0→1 karelerinde değişen piksellerin konumu, çoğu zaman 1→2 karelerinde değişecek konumlara benzer olacağından, sonraki karede uygun bir bayrak ayarlayıp yalnızca öncekinden ek olarak farklılaşan ofsetleri olduğu gibi saklayarak daha da sıkıştırma olasılığı var gibi görünüyor.

    • Gerçek sıkıştırma oranının ne kadar iyi olduğunu merak ediyorum. Yaklaşık 22 yıl önce görüntü sıkıştırma için wavelet denediğim zamanları hatırlattı.
      Ters dönüşüm, küçük bir piksel görüntüsüyle başlayıp aynı sayıda katsayı kullanarak genişliği ya da yüksekliği iki kat olan bir görüntüye dönüştürür ve bunu tekrar eder.
      Kilit nokta, verinin çoğunun katsayılardan oluşması ve bunların çoğunun 0’a yakın olduğu için 0’a itilebilmesiydi. Böyle olunca sorun, 0 olmayan konumların nasıl kodlanacağına dönüşür; bitmap ve 0 olmayan değerler dizisi gibi bir yapı ortaya çıkar.
      0 olmayan değerleri kodlayan algoritmaların ihtiyatlılık derecesi farklıydı, ama genelde bu değerlerin epey kümelenmiş olma özelliğinden yararlanıyordu. Bu ise Bloom filter’da kullanılan tipik hash fonksiyonlarının tam tersidir.
      Bu tür görüntü sıkıştırma, hem dönüşümün kendisinde hem de katsayı sıkıştırmada yerelliği çok kötü olduğu için yavaştı; bu yüzden bana çıkmaz yol gibi gelmişti.
    • Bir kareden sonraki kareye delta değişimleri saklanıyorsa, değişmeyen pikseller zaten 0’dır. 0 dizilerini sıkıştırmak kayıpsız sıkıştırmadaki en sıradan işlerden biridir ve Bloom filter’ın aksine yanlış pozitif de yoktur.
      Bloom filter’ın karmaşık bir hibrit sıkıştırma stratejisinin parçası olarak kullanılabileceğini düşünüyorum. Böyle sıkıştırıcılarda ne kadar çok araç varsa o kadar iyi, ama ortalamada büyük bir iyileşme sağlayacak gibi görünmüyor.
    • Bloom filter’ın hash table gibi bir şeye kıyasla ne fayda sağladığını merak ediyorum.
    • Video sıkıştırmanın önemli bir kısmı hareketi ele almaktan ibarettir. Panning yüzünden aynı pikselin sola iki piksel kaydığı durumun nasıl işlendiğini merak ediyorum.
  • Girdi videosu zaten YouTube’da sıkıştırılıp geri açılmış bir görüntü olduğu için daha iyi çalışıyor gibi görünüyor.
    Girdi özgün görüntü olsaydı, “ardışık kareler arasında piksellerin çoğu yalnızca az değişir ya da hiç değişmez; bu yüzden seyrek bir fark matrisi oluşur” varsayımı bozulurdu gibi.
    Çok temiz bir sinyalde, örneğin düşük gürültülü sensör ve parlak sahnede mümkün olabilir; ama gerçek dünyadaki çoğu sinyalde gürültü 1 LSB’den büyük olduğundan alt bitlerin en az yarısının değişmesini beklerim.
    Videoyu bir kez sıkıştırma ve geri açma sürecinden geçirince bu tür gürültü genelde temizlenir; böylece bu varsayımın geçerli olduğu yapay olarak statik bir görüntü oluşur.

    • Görünüşe göre bu da kayıpsız değil: https://github.com/ross39/new_bloom_filter_repo/blob/main/vi...
      r,g,b değerlerindeki ortalama değişimi 10’dan düşük olan pikseller için farkı saklamıyor gibi görünüyor. O zaman tek bir piksel ardışık karelerde saf maviden (#00ff00) saf kırmızıya (#ff0000) değişse bile, iki kare de saf mavi olarak geri oluşturulabilir.
    • Fotoğraflarda PNG kullanmadığımız gibi, gerçek çekim görüntülerinde kayıpsız video codec kullanılacağını sanmıyorum.
      Kayıpsız video, ekran kaydı gibi dijital içeriklere çok daha uygundur. Ardışık kareler arasında değişen piksel sayısının az olduğu varsayımı da orada daha makuldür.
    • Sıradan insanlar raw kullanmadığı için büyük bir sorun olmayabilir. Telefonlar ve kameralar zaten MP4 ya da AV1 gibi dosyalara kaydediyor.
      Bunu özellikle açıp dosya boyutunu ve işlem yükünü göze almadıkları sürece, ham ya da işlenmemiş veri diye bir kavramın hâlâ var olduğunu bile bilmiyor olabilirler.
      Daha önce bunu böyle düşünmemiştim.
    • Mevcut haliyle animasyonlara çok iyi uyacak gibi.
    • Tembel yöntem olarak 8K video indirip yaklaşık 720p’ye downsample etmek yeterli.
      Ya da bir kamera alıp günlük sahnelerin ham 8K görüntüsünü kendiniz çekebilirsiniz.
  • Grafik [1]’e göre bu yeni sıkıştırma yöntemi, sadece GZIP kullanmaktan her zaman kesin biçimde daha kötü değil mi?
    [1] https://github.com/ross39/new_bloom_filter_repo/blob/main/co...

    • Grafikte yok ama Bloom filter yönteminin gzip’ten en azından daha hızlı olabileceğini düşünüyorum. Yine de başka yerlerde de performans metrikleri bulamadım.
  • “Temel içgörü: İkili bir dizgede 1 yoğunluğu düşükse, özellikle p* ≈ 0.32453’ün altındaysa, ham dizgeyi saklamaktansa yalnızca 1’lerin konumlarını kodlamak daha verimlidir.”
    JPEG/MPEG’in yaptığı işin önemli bir bölümü, problemi uzun 0 dizileri oluşturabilecek şekilde yeniden düzenlemektir. DCT bloklarını AC/DC bileşenlerinin konumlarına göre tarama biçimi, birçok video ve görüntü sıkıştırma tekniğindeki en yenilikçi kısımlardan biri olabilir

    • Bu yöntem aslında video sıkıştırma için epey kötü. Çünkü tipik videolarda bulunan piksel değişimi yerelliğini aktif biçimde çöpe atıyor
      Daha iyi ifade edersek, bu teknikte video karelerine özgü hiçbir şey yok. Aynı uzunluktaki iki bit dizisi arasındaki farkı sıkıştırmak için de aynı fikir kullanılabilir
      Yine de bu problemin mevcut sıkıştırma yöntemlerinden, örneğin iki bloğu birleştirip gzip’lemekten daha iyi olma olasılığı düşük. Sıkıştırmanın işe yaraması için girdi dağılımının, burada farklı bit konumları kümesinin, çok öngörülebilir ve rastgele olmayan bir yapıda olması gerekir; veriyi bir hash fonksiyonundan geçirince bu özellik bozulur. Özellikle kriptografik olarak güçlü hash’lerin amacı, çıktıyı rastgeleden ayırt edilemez hâle getirmektir
    • Bence bu açıklama doğru değil
      DCT ve renk gösterimi dönüşümünün yaptığı şey, ince detayları yüksek frekansa, temel detayları düşük frekansa dönüştürmektir. Bundan sonra görüntü kalitesi ve sıkıştırma oranı, yüksek frekans gösteriminin ne kadarının atıldığına indirgenir
      Bunun dışında JPEG, görüntü boyutunu daha da küçültmek için Huffman tabloları kullanır
      Bildiğim kadarıyla uzun 0 dizilerini azaltmak için özel bir şey yapmaz. Bu yüzden 0’ları hizalamanın pek büyük faydası olmaz
  • Şu satır kafamı karıştırıyor: https://github.com/ross39/new_bloom_filter_repo/blob/4798d90...
    Bu durumda sıkıştırma kayıplı sıkıştırma hâline geliyor ve örneğin #ffffff’ten #fffffa’ya geçişi atacak gibi görünüyor. Hemen üstteki satırda piksel verisinin ortalamasını alan kısım da eşikten bağımsız olarak #ff0000’dan #00ff00’a geçişi atacak gibi duruyor
    O kod satırının rolünü yanlış mı anlıyorum bilmiyorum. Sonuç maskesinde 0 olanlar Bloom filter’a kodlanmıyor gibi görünüyor

  • Sıkıştırma oranının nasıl hesaplandığı yazılmış, ama en kötü/ortalama/en iyi sıkıştırma oranı örnekleri de var mı merak ediyorum
    Düzenleme: Depoda görsel olduğunu gördüm. README’ye koymak faydalı olabilir

    • Yazarıyım. Depo tamamen dağınık durumda, ama kodu kurcalamaya niyetliysen grafikler vb. üreten kod içinde var
      Çok sayıda düzgün test yapıp bunu çok daha somut hâle getirmeyi planlıyorum. Şimdilik çok dağınık bir devam eden iş sayılır
  • Yazarıyım. Çok iyi geri bildirimler aldığım için bir süre orijinal video ve gürültülü görüntüler üzerinde daha sıkı testlere odaklanmaya karar verdim. Depoyu sık sık güncellemeye devam edeceğim
    Henüz çok erken, ama orijinal video testlerinde bazı ipuçlarıyla birlikte oldukça iyi sonuçlar çıktı. Sıkıştırma oranı %4,8, yani boyutta %95,2 azalma; sıkıştırma hızı 8,29fps; açma hızı 9,16fps; keyframe olarak karelerin yalnızca %4’ü gerekiyor; algısal olarak kayıpsız çıktı (PSNR 31,10dB)
    Standart codec’lerle karşılaştırınca Rational Bloom Filter %4,8, JPEG2000 kayıpsız %3,7, FFV1 kayıpsız %36,5, H.265/HEVC kayıplı %9,2, H.264 kayıplı %0,3
    Mevcut sınırlamalar ve gelecek çalışmalar da var. Sıkıştırma sonuçları umut verici olsa da renk kanalı işlemede henüz gerçekten kayıpsız değil. Mevcut uygulama YUV’den BGR’ye renk uzayı dönüşümü sırasında zorluk yaşıyor; renk uzayı dönüşüm hassasiyeti nedeniyle küçük yuvarlama hataları oluşuyor ve piksel değerlerinde ortalama yaklaşık 4,7’lik bir fark kalıyor
    Ayrıca mevcut uygulama, dönüşümden sonra renk kanallarını BGR biçiminde işleyerek ek hassasiyet kaybına yol açıyor
    Bundan sonra BGR dönüşümü olmadan doğrudan YUV işlemeyi, renk verisini bit düzeyinde tam doğrulukla ele almayı, krominans alt örnekleme desenlerine göre Bloom filter parametrelerini ayarlamayı ve her renk kanalını bağımsız olarak doğrulayan özel bir sistem oluşturmayı planlıyorum
    Matematiksel olarak kayıpsız olduğunu kanıtlamak istiyorum ama daha gidilecek çok yol var. Bu kayıpsız sıkıştırma fikrini kurcalamaya devam edeceğim; Rational Bloom Filter’ı başka alanlarda kullanmaya dair birkaç fikrim de var

  • H.264 gibi codec’ler de gerçek kayıpsız modda çalıştırılabilir. Sadece neredeyse kimse öyle kullanmıyor

    • NVENC ile donanım hızlandırmalı hâle getirmiştim. Ancak oynatması zordu; ffplay çalışıyordu ama diğerleri çalışmıyordu
  • Sevimli bir kavram, ama seyrek bir ikili dizgeniz varsa geleneksel yöntemlerle daha iyisini yapma olasılığınız yüksek

  • Depoyu takip etmek zor, ama sıkıştırma oranı ne kadar çok piksel farkının atılabildiğine bakılarak hesaplanıyor gibi görünüyor
    İlginç, fakat daha önemli karşılaştırma noktası, sıkıştırılmış YouTube videosunda her karenin ortalama bayt boyutu olurdu. Bu karşılaştırma olmadan mevcut yöntemlere göre bir iyileşme olup olmadığını değerlendirmek zor
    Algoritma kayıplıysa, yani küçük farkları 0’a bastırıyorsa, kayıpsız değil; diğer kayıplı algoritmalarla karşılaştırılması gerekir gibi görünüyor