| @@ -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); | ||||
| } | } | ||||
| @@ -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); | ||||
| }); | }); | ||||
| @@ -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) | ||||
| { | { | ||||