Browse Source

Finish backbone.darknet53() for YOLOv3. #360

tags/v0.12
Oceania2018 6 years ago
parent
commit
38f1a10534
3 changed files with 58 additions and 2 deletions
  1. +12
    -0
      test/TensorFlowNET.Examples/ImageProcessing/YOLO/YOLOv3.cs
  2. +23
    -0
      test/TensorFlowNET.Examples/ImageProcessing/YOLO/backbone.cs
  3. +23
    -2
      test/TensorFlowNET.Examples/ImageProcessing/YOLO/common.cs

+ 12
- 0
test/TensorFlowNET.Examples/ImageProcessing/YOLO/YOLOv3.cs View File

@@ -58,6 +58,18 @@ namespace TensorFlowNET.Examples.ImageProcessing.YOLO
{ {
Tensor route_1, route_2; Tensor route_1, route_2;
(route_1, route_2, input_data) = backbone.darknet53(input_data, trainable); (route_1, route_2, input_data) = backbone.darknet53(input_data, trainable);
input_data = common.convolutional(input_data, new[] { 1, 1, 1024, 512 }, trainable, "conv52");
input_data = common.convolutional(input_data, new[] { 3, 3, 512, 1024 }, trainable, "conv53");
input_data = common.convolutional(input_data, new[] { 1, 1, 1024, 512 }, trainable, "conv54");
input_data = common.convolutional(input_data, new[] { 3, 3, 512, 1024 }, trainable, "conv55");
input_data = common.convolutional(input_data, new[] { 1, 1, 1024, 512 }, trainable, "conv56");

var conv_lobj_branch = common.convolutional(input_data, new[] { 3, 3, 512, 1024 }, trainable, name: "conv_lobj_branch");
var conv_lbbox = common.convolutional(conv_lobj_branch, new[] { 1, 1, 1024, 3 * (num_class + 5) },
trainable: trainable, name: "conv_lbbox", activate: false, bn: false);

input_data = common.convolutional(input_data, new[] { 1, 1, 512, 256 }, trainable, "conv57");
input_data = common.upsample(input_data, name: "upsample0", method: upsample_method);


return (conv_lbbox, conv_mbbox, conv_sbbox); return (conv_lbbox, conv_mbbox, conv_sbbox);
} }


+ 23
- 0
test/TensorFlowNET.Examples/ImageProcessing/YOLO/backbone.cs View File

@@ -18,8 +18,31 @@ namespace TensorFlowNET.Examples.ImageProcessing.YOLO
foreach (var i in range(1)) foreach (var i in range(1))
input_data = common.residual_block(input_data, 64, 32, 64, trainable: trainable, name: $"residual{i + 0}"); input_data = common.residual_block(input_data, 64, 32, 64, trainable: trainable, name: $"residual{i + 0}");


input_data = common.convolutional(input_data, filters_shape: new[] { 3, 3, 64, 128 },
trainable: trainable, name: "conv4", downsample: true);

foreach (var i in range(2))
input_data = common.residual_block(input_data, 128, 64, 128, trainable: trainable, name: $"residual{i + 1}");

input_data = common.convolutional(input_data, filters_shape: new[] { 3, 3, 128, 256 },
trainable: trainable, name: "conv9", downsample: true);

foreach (var i in range(8))
input_data = common.residual_block(input_data, 256, 128, 256, trainable: trainable, name: $"residual{i + 3}");

var route_1 = input_data; var route_1 = input_data;
input_data = common.convolutional(input_data, filters_shape: new int[] { 3, 3, 256, 512 },
trainable: trainable, name: "conv26", downsample: true);

foreach (var i in range(8))
input_data = common.residual_block(input_data, 512, 256, 512, trainable: trainable, name: $"residual{i + 11}");

var route_2 = input_data; var route_2 = input_data;
input_data = common.convolutional(input_data, filters_shape: new[] { 3, 3, 512, 1024 },
trainable: trainable, name: "conv43", downsample: true);

foreach (var i in range(4))
input_data = common.residual_block(input_data, 1024, 512, 1024, trainable: trainable, name: $"residual{i + 19}");


return (route_1, route_2, input_data); return (route_1, route_2, input_data);
}); });


+ 23
- 2
test/TensorFlowNET.Examples/ImageProcessing/YOLO/common.cs View File

@@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text; using System.Text;
using Tensorflow; using Tensorflow;
using static Tensorflow.Binding; using static Tensorflow.Binding;
@@ -22,7 +24,8 @@ namespace TensorFlowNET.Examples.ImageProcessing.YOLO
(int pad_h, int pad_w) = ((int)Math.Floor((filters_shape[0] - 2) / 2.0f) + 1, (int)Math.Floor((filters_shape[1] - 2) / 2.0f) + 1); (int pad_h, int pad_w) = ((int)Math.Floor((filters_shape[0] - 2) / 2.0f) + 1, (int)Math.Floor((filters_shape[1] - 2) / 2.0f) + 1);
var paddings = tf.constant(new int[,] { { 0, 0 }, { pad_h, pad_h }, { pad_w, pad_w }, { 0, 0 } }); var paddings = tf.constant(new int[,] { { 0, 0 }, { pad_h, pad_h }, { pad_w, pad_w }, { 0, 0 } });
input_data = tf.pad(input_data, paddings, "CONSTANT"); input_data = tf.pad(input_data, paddings, "CONSTANT");
throw new NotImplementedException("");
strides = new[] { 1, 2, 2, 1 };
padding = "VALID";
} }
else else
{ {
@@ -44,7 +47,9 @@ namespace TensorFlowNET.Examples.ImageProcessing.YOLO
} }
else else
{ {
throw new NotImplementedException("");
var bias = tf.get_variable(name: "bias", shape: filters_shape.Last(), trainable: true,
dtype: tf.float32, initializer: tf.constant_initializer(0.0f));
conv = tf.nn.bias_add(conv, bias);
} }


if (activate) if (activate)
@@ -54,6 +59,22 @@ namespace TensorFlowNET.Examples.ImageProcessing.YOLO
}); });
} }


public static Tensor upsample(Tensor input_data, string name, string method = "deconv")
{
Debug.Assert(new[] { "resize", "deconv" }.Contains(method));
Tensor output = null;
if (method == "resize")
{

}
else if(method == "deconv")
{

}

return output;
}

public static Tensor residual_block(Tensor input_data, int input_channel, int filter_num1, public static Tensor residual_block(Tensor input_data, int input_channel, int filter_num1,
int filter_num2, Tensor trainable, string name) int filter_num2, Tensor trainable, string name)
{ {


Loading…
Cancel
Save