Class: Gsplat::Compression::Png

Inherits:
Object
  • Object
show all
Defined in:
lib/gsplat/compression/png.rb

Overview

Self-contained PNG and K-means Gaussian parameter compression.

Constant Summary collapse

PNG8_PARAMETERS =

Parameter names encoded as 8-bit PNG images.

%w[scales quats opacities sh0].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(use_sort: true, kmeans_clusters: 256, kmeans_iterations: 8, sh_quantization: 6) ⇒ Png

Returns a new instance of Png.



21
22
23
24
25
26
27
# File 'lib/gsplat/compression/png.rb', line 21

def initialize(use_sort: true, kmeans_clusters: 256, kmeans_iterations: 8, sh_quantization: 6)
  @use_sort = use_sort
  @kmeans_clusters = Integer(kmeans_clusters)
  @kmeans_iterations = Integer(kmeans_iterations)
  @sh_quantization = Integer(sh_quantization)
  validate_options!
end

Instance Attribute Details

#kmeans_clustersObject (readonly)

Returns the value of attribute kmeans_clusters.



19
20
21
# File 'lib/gsplat/compression/png.rb', line 19

def kmeans_clusters
  @kmeans_clusters
end

#kmeans_iterationsObject (readonly)

Returns the value of attribute kmeans_iterations.



19
20
21
# File 'lib/gsplat/compression/png.rb', line 19

def kmeans_iterations
  @kmeans_iterations
end

#sh_quantizationObject (readonly)

Returns the value of attribute sh_quantization.



19
20
21
# File 'lib/gsplat/compression/png.rb', line 19

def sh_quantization
  @sh_quantization
end

#use_sortObject (readonly)

Returns the value of attribute use_sort.



19
20
21
# File 'lib/gsplat/compression/png.rb', line 19

def use_sort
  @use_sort
end

Instance Method Details

#compress(directory, parameters) ⇒ String

Compresses Gaussian arrays into an upstream-compatible directory.

Parameters:

  • directory (String)

    output directory

  • parameters (Hash{String, Symbol=>Numo::NArray})

    arrays with a shared first dimension

Returns:

  • (String)

    the output directory



34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/gsplat/compression/png.rb', line 34

def compress(directory, parameters)
  FileUtils.mkdir_p(directory)
  values, side = GridSort.prepare(parameters, use_sort: use_sort)
  values["means"] = log_transform(values.fetch("means"))
  values["quats"] = Math::Quaternion.normalize(values.fetch("quats"))
   = values.to_h do |name, value|
    validate_name!(name)
    [name, compress_parameter(directory, name, value, side)]
  end
  File.write(File.join(directory, "meta.json"), "#{JSON.pretty_generate()}\n")
  directory
end

#decompress(directory) ⇒ Hash{Symbol=>Numo::NArray}

Restores Gaussian arrays from a compressed directory.

Parameters:

  • directory (String)

    directory produced by #compress

Returns:

  • (Hash{Symbol=>Numo::NArray})


51
52
53
54
55
56
57
58
59
# File 'lib/gsplat/compression/png.rb', line 51

def decompress(directory)
   = JSON.parse(File.read(File.join(directory, "meta.json")))
  values = .to_h do |name, entry|
    validate_name!(name)
    [name.to_sym, decompress_parameter(directory, name, entry)]
  end
  values[:means] = inverse_log_transform(values.fetch(:means))
  values
end