variance_node.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. type variance_node_t = {
  2. base?: logic_node_t;
  3. };
  4. let variance_node_temp: image_t = null;
  5. let variance_node_image: image_t = null;
  6. let variance_node_inst: variance_node_t = null;
  7. let variance_node_prompt: string = "";
  8. function variance_node_create(arg: any): variance_node_t {
  9. let n: variance_node_t = {};
  10. n.base = logic_node_create();
  11. n.base.get_as_image = variance_node_get_as_image;
  12. n.base.get_cached_image = variance_node_get_cached_image;
  13. variance_node_inst = n;
  14. variance_node_init();
  15. return n;
  16. }
  17. function variance_node_init() {
  18. if (variance_node_temp == null) {
  19. variance_node_temp = image_create_render_target(512, 512);
  20. }
  21. }
  22. function variance_node_buttons(ui: zui_t, nodes: zui_nodes_t, node: zui_node_t) {
  23. variance_node_prompt = zui_text_area(zui_handle(__ID__), zui_align_t.LEFT, true, tr("prompt"), true);
  24. node.buttons[0].height = string_split(variance_node_prompt, "\n").length;
  25. }
  26. function variance_node_get_as_image(self: variance_node_t, from: i32): image_t {
  27. let strength: f32 = variance_node_inst.base.inputs[1].node.value;
  28. let source: image_t = logic_node_input_get_as_image(variance_node_inst.base.inputs[0]);
  29. g2_begin(variance_node_temp);
  30. g2_draw_scaled_image(source, 0, 0, 512, 512);
  31. g2_end();
  32. let bytes_img = image_get_pixels(variance_node_temp);
  33. let u8a = u8_array_create_from_buffer(bytes_img);
  34. let f32a = f32_array_create(3 * 512 * 512);
  35. for (let i: i32 = 0; i < (512 * 512); ++i) {
  36. f32a[i ] = (u8a[i * 4 ] / 255) * 2.0 - 1.0;
  37. f32a[i + 512 * 512 ] = (u8a[i * 4 + 1] / 255) * 2.0 - 1.0;
  38. f32a[i + 512 * 512 * 2] = (u8a[i * 4 + 2] / 255) * 2.0 - 1.0;
  39. }
  40. console_progress(tr("Processing") + " - " + tr("Variance"));
  41. krom_g4_swap_buffers();
  42. let vae_encoder_blob: buffer_t = data_get_blob("models/sd_vae_encoder.quant.onnx");
  43. let latents_buf = krom_ml_inference(vae_encoder_blob, [f32a.buffer], [[1, 3, 512, 512]], [1, 4, 64, 64], config_raw.gpu_inference);
  44. let latents = f32_array_create_from_buffer(latents_buf);
  45. for (let i: i32 = 0; i < latents.length; ++i) {
  46. latents[i] = 0.18215 * latents[i];
  47. }
  48. let noise = f32_array_create(latents.length);
  49. for (let i: i32 = 0; i < noise.length; ++i) {
  50. noise[i] = math_cos(2.0 * 3.14 * random_node_get_float()) * math_sqrt(-2.0 * math_log(random_node_get_float()));
  51. }
  52. let num_inference_steps = 50;
  53. let init_timestep = math_floor(num_inference_steps * strength);
  54. let timesteps = text_to_photo_node_timesteps[num_inference_steps - init_timestep];
  55. let alphas_cumprod = text_to_photo_node_alphas_cumprod;
  56. let sqrt_alpha_prod = math_pow(alphas_cumprod[timesteps], 0.5);
  57. let sqrt_one_minus_alpha_prod = math_pow(1.0 - alphas_cumprod[timesteps], 0.5);
  58. for (let i: i32 = 0; i < latents.length; ++i) {
  59. latents[i] = sqrt_alpha_prod * latents[i] + sqrt_one_minus_alpha_prod * noise[i];
  60. }
  61. let t_start = num_inference_steps - init_timestep;
  62. variance_node_image = text_to_photo_node_stable_diffusion(variance_node_prompt, latents, t_start);
  63. return variance_node_image;
  64. }
  65. function variance_node_get_cached_image(self: variance_node_t): image_t {
  66. return variance_node_image;
  67. }
  68. let variance_node_def: zui_node_t = {
  69. id: 0,
  70. name: _tr("Variance"),
  71. type: "variance_node",
  72. x: 0,
  73. y: 0,
  74. color: 0xff4982a0,
  75. inputs: [
  76. {
  77. id: 0,
  78. node_id: 0,
  79. name: _tr("Color"),
  80. type: "RGBA",
  81. color: 0xffc7c729,
  82. default_value: f32_array_create_xyzw(0.0, 0.0, 0.0, 1.0),
  83. min: 0.0,
  84. max: 1.0,
  85. precision: 100,
  86. display: 0
  87. },
  88. {
  89. id: 0,
  90. node_id: 0,
  91. name: _tr("Strength"),
  92. type: "VALUE",
  93. color: 0xffa1a1a1,
  94. default_value: f32_array_create_x(0.5),
  95. min: 0.0,
  96. max: 1.0,
  97. precision: 100,
  98. display: 0
  99. }
  100. ],
  101. outputs: [
  102. {
  103. id: 0,
  104. node_id: 0,
  105. name: _tr("Color"),
  106. type: "RGBA",
  107. color: 0xffc7c729,
  108. default_value: f32_array_create_xyzw(0.0, 0.0, 0.0, 1.0),
  109. min: 0.0,
  110. max: 1.0,
  111. precision: 100,
  112. display: 0
  113. }
  114. ],
  115. buttons: [
  116. {
  117. name: "variance_node_buttons",
  118. type: "CUSTOM",
  119. output: -1,
  120. default_value: null,
  121. data: null,
  122. min: 0.0,
  123. max: 1.0,
  124. precision: 100,
  125. height: 1
  126. }
  127. ],
  128. width: 0
  129. };