Răsfoiți Sursa

Darknet shortcut support for new fork (#410)

Lutz Roeder 6 ani în urmă
părinte
comite
020315dd6e
4 a modificat fișierele cu 25 adăugiri și 35 ștergeri
  1. 2 2
      README.md
  2. 1 1
      setup.py
  3. 19 29
      src/darknet.js
  4. 3 3
      test/models.json

+ 2 - 2
README.md

@@ -3,9 +3,9 @@
 
 Netron is a viewer for neural network, deep learning and machine learning models. 
 
-Netron supports **ONNX** (`.onnx`, `.pb`, `.pbtxt`), **Keras** (`.h5`, `.keras`), **Core ML** (`.mlmodel`), **Caffe** (`.caffemodel`, `.prototxt`), **Caffe2** (`predict_net.pb`, `predict_net.pbtxt`), **MXNet** (`.model`, `-symbol.json`), **ncnn** (`.param`) and **TensorFlow Lite** (`.tflite`).
+Netron supports **ONNX** (`.onnx`, `.pb`, `.pbtxt`), **Keras** (`.h5`, `.keras`), **Core ML** (`.mlmodel`), **Caffe** (`.caffemodel`, `.prototxt`), **Caffe2** (`predict_net.pb`, `predict_net.pbtxt`), **Darknet** (`.cfg`), **MXNet** (`.model`, `-symbol.json`), **ncnn** (`.param`) and **TensorFlow Lite** (`.tflite`).
 
-Netron has experimental support for **TorchScript** (`.pt`, `.pth`), **PyTorch** (`.pt`, `.pth`), **Torch** (`.t7`), **Arm NN** (`.armnn`), **BigDL** (`.bigdl`, `.model`), **Chainer** (`.npz`, `.h5`), **CNTK** (`.model`, `.cntk`), **Deeplearning4j** (`.zip`), **Darknet** (`.cfg`), **ML.NET** (`.zip`), **MNN** (`.mnn`), **OpenVINO** (`.xml`), **PaddlePaddle** (`.zip`, `__model__`), **scikit-learn** (`.pkl`), **TensorFlow.js** (`model.json`, `.pb`) and **TensorFlow** (`.pb`, `.meta`, `.pbtxt`, `.ckpt`, `.index`).
+Netron has experimental support for **TorchScript** (`.pt`, `.pth`), **PyTorch** (`.pt`, `.pth`), **Torch** (`.t7`), **Arm NN** (`.armnn`), **BigDL** (`.bigdl`, `.model`), **Chainer** (`.npz`, `.h5`), **CNTK** (`.model`, `.cntk`), **Deeplearning4j** (`.zip`), **ML.NET** (`.zip`), **MNN** (`.mnn`), **OpenVINO** (`.xml`), **PaddlePaddle** (`.zip`, `__model__`), **scikit-learn** (`.pkl`), **TensorFlow.js** (`model.json`, `.pb`) and **TensorFlow** (`.pb`, `.meta`, `.pbtxt`, `.ckpt`, `.index`).
 
 <p align='center'><a href='https://www.lutzroeder.com/ai'><img src='.github/screenshot.png' width='800'></a></p>
 

+ 1 - 1
setup.py

@@ -66,7 +66,7 @@ setuptools.setup(
     version=package_version(),
     description="Viewer for neural network, deep learning and machine learning models",
     long_description='Netron is a viewer for neural network, deep learning and machine learning models.\n\n' +
-                     'Netron supports **ONNX** (`.onnx`, `.pb`), **Keras** (`.h5`, `.keras`), **Core ML** (`.mlmodel`), **Caffe** (`.caffemodel`, `.prototxt`), **Caffe2** (`predict_net.pb`), **MXNet** (`.model`, `-symbol.json`), ncnn (`.param`) and **TensorFlow Lite** (`.tflite`). Netron has experimental support for **TorchScript** (`.pt`, `.pth`), **PyTorch** (`.pt`, `.pth`), **Torch** (`.t7`), **ArmNN** (`.armnn`), **BigDL** (`.bigdl`, `.model`), **Chainer** (`.npz`, `.h5`), **CNTK** (`.model`, `.cntk`), **Darknet** (`.cfg`), **Deeplearning4j** (`.zip`), **PaddlePaddle** (`__model__`), **ML.NET** (`.zip`), MNN (`.mnn`), **OpenVINO** (`.xml`), **scikit-learn** (`.pkl`), **TensorFlow.js** (`model.json`, `.pb`) and **TensorFlow** (`.pb`, `.meta`, `.pbtxt`, `.ckpt`, `.index`).',
+                     'Netron supports **ONNX** (`.onnx`, `.pb`), **Keras** (`.h5`, `.keras`), **Core ML** (`.mlmodel`), **Caffe** (`.caffemodel`, `.prototxt`), **Caffe2** (`predict_net.pb`), **Darknet** (`.cfg`), **MXNet** (`.model`, `-symbol.json`), ncnn (`.param`) and **TensorFlow Lite** (`.tflite`). Netron has experimental support for **TorchScript** (`.pt`, `.pth`), **PyTorch** (`.pt`, `.pth`), **Torch** (`.t7`), **ArmNN** (`.armnn`), **BigDL** (`.bigdl`, `.model`), **Chainer** (`.npz`, `.h5`), **CNTK** (`.model`, `.cntk`), **Deeplearning4j** (`.zip`), **PaddlePaddle** (`__model__`), **ML.NET** (`.zip`), MNN (`.mnn`), **OpenVINO** (`.xml`), **scikit-learn** (`.pkl`), **TensorFlow.js** (`model.json`, `.pb`) and **TensorFlow** (`.pb`, `.meta`, `.pbtxt`, `.ckpt`, `.index`).',
     keywords=[
         'onnx', 'keras', 'tensorflow', 'tflite', 'coreml', 'mxnet', 'caffe', 'caffe2', 'torchscript', 'pytorch', 'ncnn', 'mnn' 'openvino', 'darknet', 'paddlepaddle', 'chainer',
         'artificial intelligence', 'machine learning', 'deep learning', 'neural network',

+ 19 - 29
src/darknet.js

@@ -198,17 +198,25 @@ darknet.Graph = class {
             layer.outputs = [ new darknet.Argument(i.toString(), null, null) ];
             layer.weights = [];
             switch (section.type) {
-                case 'shortcut':
+                case 'shortcut': {
+                    const from = options.from ? options.from.split(',').map((item) => Number.parseInt(item.trim(), 10)) : [];
+                    for (let index of from) {
+                        index = (index < 0) ? i + index : index;
+                        const item = sections[index].layer;
+                        if (item) {
+                            layer.inputs.push(item.outputs[0]);
+                        }
+                    }
+                    delete options.from;
+                    break;
+                }
                 case 'sam':
                 case 'scale_channels': {
                     let index = option_find_int(options, 'from', 0);
-                    if (index < 0) {
-                        index = i + index;
-                    }
-                    const from = sections[index].layer;
-                    if (from) {
-                        layer.inputs.push(from.outputs[0]);
-                        layer.from = from;
+                    index = (index < 0) ? i + index : index;
+                    const item = sections[index].layer;
+                    if (item) {
+                        layer.inputs.push(item.outputs[0]);
                     }
                     delete options.from;
                     break;
@@ -562,14 +570,6 @@ darknet.Graph = class {
                         layer.outputs[0].type = new darknet.TensorType('float32', new darknet.TensorShape([ layer.out ]));
                         break;
                     }
-                    case 'sam': {
-                        const activation = option_find_str(options, 'activation', 'linear');
-                        if (activation !== 'linear') {
-                            section.chain.push({ type: activation });
-                        }
-                        infer = false;
-                        break;
-                    }
                     case 'route': {
                         let layers = [].concat(layer.layers);
                         layer.out = 0;
@@ -594,19 +594,9 @@ darknet.Graph = class {
                         layer.outputs[0].type = new darknet.TensorType('float32', new darknet.TensorShape([ layer.out_w, layer.out_h, layer.out_c ]));
                         break;
                     }
-                    case 'shortcut': {
-                        const activation = option_find_str(options, 'activation', 'linear');
-                        layer.out_w = params.w;
-                        layer.out_h = params.h;
-                        layer.out_c = params.c;
-                        layer.out = params.w * params.h * params.c;
-                        layer.outputs[0].type = new darknet.TensorType('float32', new darknet.TensorShape([ params.w, params.h, params.c ]));
-                        if (activation !== 'linear') {
-                            section.chain.push({ type: activation });
-                        }
-                        break;
-                    }
-                    case 'scale_channels': {
+                    case 'shortcut':
+                    case 'scale_channels':
+                    case 'sam': {
                         const activation = option_find_str(options, 'activation', 'linear');
                         layer.out_w = params.w;
                         layer.out_h = params.h;

+ 3 - 3
test/models.json

@@ -2015,10 +2015,10 @@
   },
   {
     "type":   "darknet",
-    "target": "yolov3-tiny_occlusion_track.cfg",
-    "source": "https://github.com/AlexeyAB/darknet/blob/master/cfg/yolov3-tiny_occlusion_track.cfg?raw=true",
+    "target": "yolov3-tiny_3l_shortcut_multilayer_per_feature_softmax.cfg",
+    "source": "https://github.com/lutzroeder/netron/files/4074756/yolov3-tiny_3l_shortcut_multilayer_per_feature_softmax.cfg.zip[yolov3-tiny_3l_shortcut_multilayer_per_feature_softmax.cfg]",
     "format": "Darknet",
-    "link":   "https://github.com/AlexeyAB/darknet"
+    "link":   "https://github.com/lutzroeder/netron/issues/410"
   },
   {
     "type":   "darknet",