Parcourir la source

Update darknet.js

Lutz Roeder il y a 4 ans
Parent
commit
56c970e3a1
1 fichiers modifiés avec 58 ajouts et 44 suppressions
  1. 58 44
      source/darknet.js

+ 58 - 44
source/darknet.js

@@ -183,7 +183,14 @@ darknet.Graph = class {
             layer.out = layer.out_w * layer.out_h * layer.out_c;
             layer.weights.push(load_weights(prefix + 'biases', [ n ], prefix === ''));
             if (batch_normalize) {
-                load_batch_normalize_weights(layer, prefix, n);
+                if (prefix) {
+                    load_batch_normalize_weights(layer, prefix, n);
+                }
+                else {
+                    const batchnorm_layer = { weights: [] };
+                    load_batch_normalize_weights(batchnorm_layer, prefix, n);
+                    layer.chain.push({ type: 'batchnorm', layer: batchnorm_layer });
+                }
             }
             layer.weights.push(load_weights(prefix + 'weights', [ Math.floor(c / groups), n, size, size ], prefix === ''));
             layer.outputs[0].type = new darknet.TensorType('float32', make_shape([ layer.out_w, layer.out_h, layer.out_c ], 'make_convolutional_layer'));
@@ -196,7 +203,14 @@ darknet.Graph = class {
             layer.out = outputs;
             layer.weights.push(load_weights(prefix + 'biases', [ outputs ], prefix === ''));
             if (batch_normalize) {
-                load_batch_normalize_weights(layer, prefix, outputs);
+                if (prefix) {
+                    load_batch_normalize_weights(layer, prefix, outputs);
+                }
+                else {
+                    const batchnorm_layer = { weights: [] };
+                    load_batch_normalize_weights(batchnorm_layer, prefix, outputs);
+                    layer.chain.push({ type: 'batchnorm', layer: batchnorm_layer });
+                }
             }
             layer.weights.push(load_weights(prefix + 'weights', [ inputs, outputs ], prefix === ''));
             layer.outputs[0].type = new darknet.TensorType('float32', make_shape([ outputs ], 'make_connected_layer'));
@@ -236,11 +250,11 @@ darknet.Graph = class {
         for (let i = 0; i < sections.length; i++) {
             const section = sections[i];
             section.name = i.toString();
-            section.chain = [];
             section.layer = {
                 inputs: [],
                 weights: [],
-                outputs: [ new darknet.Argument(section.name, null, null) ]
+                outputs: [ new darknet.Argument(section.name, null, null) ],
+                chain: []
             };
         }
 
@@ -326,7 +340,7 @@ darknet.Graph = class {
                         const activation = option_find_str(options, 'activation', 'logistic');
                         make_convolutional_layer(layer, '', params.w, params.h, params.c, n, groups, size, stride_x, stride_y, padding, batch_normalize);
                         if (activation !== 'logistic' && activation !== 'none') {
-                            section.chain.push({ type: activation });
+                            layer.chain.push({ type: activation });
                         }
                         break;
                     }
@@ -336,7 +350,7 @@ darknet.Graph = class {
                         const activation = option_find_str(options, 'activation', 'logistic');
                         make_connected_layer(layer, '', params.inputs, outputs, batch_normalize);
                         if (activation !== 'logistic' && activation !== 'none') {
-                            section.chain.push({ type: activation });
+                            layer.chain.push({ type: activation });
                         }
                         break;
                     }
@@ -358,7 +372,7 @@ darknet.Graph = class {
                         layer.weights.push(load_weights('biases',[ layer.out_w * layer.out_h * layer.out_c ]));
                         layer.outputs[0].type = new darknet.TensorType('float32', make_shape([ layer.out_w, layer.out_h, layer.out_c ], 'local'));
                         if (activation !== 'logistic' && activation !== 'none') {
-                            section.chain.push({ type: activation });
+                            layer.chain.push({ type: activation });
                         }
                         break;
                     }
@@ -408,7 +422,7 @@ darknet.Graph = class {
                         if (antialiasing) {
                             const blur_size = antialiasing === 2 ? 2 : 3;
                             const blur_pad = antialiasing === 2 ? 0 : Math.floor(blur_size / 3);
-                            layer.input_layer = { weights: [], outputs: layer.outputs };
+                            layer.input_layer = { weights: [], outputs: layer.outputs, chain: [] };
                             make_convolutional_layer(layer.input_layer, '', layer.out_h, layer.out_w, layer.out_c, layer.out_c, layer.out_c, blur_size, blur_stride_x, blur_stride_y, blur_pad, 0);
                             layer.out_w = layer.input_layer.out_w;
                             layer.out_h = layer.input_layer.out_h;
@@ -441,11 +455,11 @@ darknet.Graph = class {
                         const pad = option_find_int(options, 'pad', 0);
                         const padding = pad ? (size >> 1) : option_find_int(options, 'padding', 0);
                         const batch_normalize = option_find_int(options, 'batch_normalize', 0);
-                        layer.input_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.input_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_convolutional_layer(layer.input_layer, 'input_', params.h, params.w, params.c, hidden_filters, groups, size, stride, stride, padding, batch_normalize);
-                        layer.self_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.self_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_convolutional_layer(layer.self_layer, 'self_', params.h, params.w, hidden_filters, hidden_filters, groups, size, stride, stride, padding, batch_normalize);
-                        layer.output_layer = { weights: [], outputs: layer.outputs };
+                        layer.output_layer = { weights: [], outputs: layer.outputs, chain: [] };
                         make_convolutional_layer(layer.output_layer, 'output_', params.h, params.w, hidden_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
                         layer.weights = layer.weights.concat(layer.input_layer.weights);
                         layer.weights = layer.weights.concat(layer.self_layer.weights);
@@ -461,11 +475,11 @@ darknet.Graph = class {
                         const hidden = option_find_int(options, 'hidden', 1);
                         const batch_normalize = option_find_int(options, 'batch_normalize', 0);
                         const inputs = params.inputs;
-                        layer.input_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.input_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.input_layer, 'input_', inputs, hidden, batch_normalize);
-                        layer.self_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.self_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.self_layer, 'self_', hidden, hidden, batch_normalize);
-                        layer.output_layer = { weights: [], outputs: layer.outputs };
+                        layer.output_layer = { weights: [], outputs: layer.outputs, chain: [] };
                         make_connected_layer(layer.output_layer, 'output_', hidden, outputs, batch_normalize);
                         layer.weights = layer.weights.concat(layer.input_layer.weights);
                         layer.weights = layer.weights.concat(layer.self_layer.weights);
@@ -480,17 +494,17 @@ darknet.Graph = class {
                         const inputs = params.inputs;
                         const outputs = option_find_int(options, 'output', 1);
                         const batch_normalize = option_find_int(options, 'batch_normalize', 0);
-                        layer.input_z_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.input_z_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.input_z_layer, 'input_z', inputs, outputs, batch_normalize);
-                        layer.state_z_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.state_z_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.state_z_layer, 'state_z', outputs, outputs, batch_normalize);
-                        layer.input_r_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.input_r_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.input_r_layer, 'input_r', inputs, outputs, batch_normalize);
-                        layer.state_r_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.state_r_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.state_r_layer, 'state_r', outputs, outputs, batch_normalize);
-                        layer.input_h_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.input_h_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.input_h_layer, 'input_h', inputs, outputs, batch_normalize);
-                        layer.state_h_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.state_h_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.state_h_layer, 'state_h', outputs, outputs, batch_normalize);
                         layer.weights = layer.weights.concat(layer.input_z_layer.weights);
                         layer.weights = layer.weights.concat(layer.state_z_layer.weights);
@@ -506,21 +520,21 @@ darknet.Graph = class {
                         const inputs = params.inputs;
                         const outputs = option_find_int(options, 'output', 1);
                         const batch_normalize = option_find_int(options, 'batch_normalize', 0);
-                        layer.uf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.uf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.uf, 'uf_', inputs, outputs, batch_normalize);
-                        layer.ui = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.ui = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.ui, 'ui_', inputs, outputs, batch_normalize);
-                        layer.ug = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.ug = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.ug, 'ug_', inputs, outputs, batch_normalize);
-                        layer.uo = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.uo = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.uo, 'uo_', inputs, outputs, batch_normalize);
-                        layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.wf, 'wf_', outputs, outputs, batch_normalize);
-                        layer.wi = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.wi = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.wi, 'wi_', outputs, outputs, batch_normalize);
-                        layer.wg = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.wg = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.wg, 'wg_', outputs, outputs, batch_normalize);
-                        layer.wo = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.wo = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_connected_layer(layer.wo, 'wo_', outputs, outputs, batch_normalize);
                         layer.weights = layer.weights.concat(layer.uf.weights);
                         layer.weights = layer.weights.concat(layer.ui.weights);
@@ -548,31 +562,31 @@ darknet.Graph = class {
                         const batch_normalize = option_find_int(options, 'batch_normalize', 0);
                         const bottleneck = option_find_int(options, "bottleneck", 0);
                         const peephole = option_find_int(options, "peephole", 0);
-                        layer.uf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.uf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                         make_convolutional_layer(layer.uf, 'uf_', params.h, params.w, params.c, output_filters, groups, size, stride, stride, padding, batch_normalize);
-                        layer.ui = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.ui = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: []  };
                         make_convolutional_layer(layer.ui, 'ui_', params.h, params.w, params.c, output_filters, groups, size, stride, stride, padding, batch_normalize);
-                        layer.ug = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.ug = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: []  };
                         make_convolutional_layer(layer.ug, 'ug_', params.h, params.w, params.c, output_filters, groups, size, stride, stride, padding, batch_normalize);
-                        layer.uo = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                        layer.uo = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: []  };
                         make_convolutional_layer(layer.uo, 'uo_', params.h, params.w, params.c, output_filters, groups, size, stride, stride, padding, batch_normalize);
                         layer.weights = layer.weights.concat(layer.uf.weights);
                         layer.weights = layer.weights.concat(layer.ui.weights);
                         layer.weights = layer.weights.concat(layer.ug.weights);
                         layer.weights = layer.weights.concat(layer.uo.weights);
                         if (bottleneck) {
-                            layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                            layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                             make_convolutional_layer(layer.wf, 'wf_', params.h, params.w, output_filters * 2, output_filters, groups, size, stride, stride, padding, batch_normalize);
                             layer.weights = layer.weights.concat(layer.wf.weights);
                         }
                         else {
-                            layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                            layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                             make_convolutional_layer(layer.wf, 'wf_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
-                            layer.wi = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                            layer.wi = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                             make_convolutional_layer(layer.wi, 'wi_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
-                            layer.wg = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                            layer.wg = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                             make_convolutional_layer(layer.wg, 'wg_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
-                            layer.wo = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                            layer.wo = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                             make_convolutional_layer(layer.wo, 'wo_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
                             layer.weights = layer.weights.concat(layer.wf.weights);
                             layer.weights = layer.weights.concat(layer.wi.weights);
@@ -580,11 +594,11 @@ darknet.Graph = class {
                             layer.weights = layer.weights.concat(layer.wo.weights);
                         }
                         if (peephole) {
-                            layer.vf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                            layer.vf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                             make_convolutional_layer(layer.vf, 'vf_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
-                            layer.vi = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                            layer.vi = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                             make_convolutional_layer(layer.vi, 'vi_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
-                            layer.vo = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
+                            layer.vo = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
                             make_convolutional_layer(layer.wo, 'vo_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
                             layer.weights = layer.weights.concat(layer.vf.weights);
                             layer.weights = layer.weights.concat(layer.vi.weights);
@@ -744,7 +758,7 @@ darknet.Graph = class {
                             layer.outputs[0].type = new darknet.TensorType('float32', make_shape([ layer.out_w, layer.out_h, layer.out_c ], 'shortcut|scale_channels|sam'));
                         }
                         if (activation !== 'linear' && activation !== 'none') {
-                            section.chain.push({ type: activation });
+                            layer.chain.push({ type: activation });
                         }
                         break;
                     }
@@ -756,7 +770,7 @@ darknet.Graph = class {
                         layer.out = params.w * params.h * params.c;
                         layer.outputs[0].type = new darknet.TensorType('float32', make_shape([ params.w, params.h, params.c ], 'shortcut|scale_channels|sam'));
                         if (activation !== 'linear' && activation !== 'none') {
-                            section.chain.push({ type: activation });
+                            layer.chain.push({ type: activation });
                         }
                         break;
                     }
@@ -880,8 +894,8 @@ darknet.Node = class {
         if (layer && layer.outputs && layer.outputs.length > 0) {
             this._outputs.push(new darknet.Parameter(layer.outputs.length <= 1 ? 'output' : 'outputs', true, layer.outputs));
         }
-        if (section.chain) {
-            for (const chain of section.chain) {
+        if (layer && layer.chain) {
+            for (const chain of layer.chain) {
                 this._chain.push(new darknet.Node(metadata, net, chain, ''));
             }
         }