Когда я декодирую изображение .jpeg в тензор с помощью tenorflowsharp, а затем кодирую тензор в Jpeg, новое изображение .jpeg изменяется на черный, что отличается от исходного изображения. в чем проблема?
Я пробовал много картинок и разных способов декодировать и кодировать эти картинки, но проблема всегда возникала.
код для декодирования изображения в тензор, как показано ниже:
private static void ConstructGraphToNormalizeImage(out TFGraph graph, out TFOutput input, out TFOutput output, TFDataType destinationDataType = TFDataType.Float)
{
int W = 288;
int H = 288;
float Scale = 1;
graph = new TFGraph();
input = graph.Placeholder(TFDataType.String);
output = graph.Cast(graph.Div(
x: graph.ResizeBilinear(
images: graph.ExpandDims(
input: graph.Cast(
graph.DecodeJpeg(contents: input, channels: 3), DstT: TFDataType.Float),
dim: graph.Const(0, "make_batch")),
size: graph.Const(new int[] { W, H }, "size")),
y: graph.Const(Scale, "scale")), destinationDataType);
}
public static TFTensor CreateTensor(TFTensor tensor, TFDataType destinationDataType = TFDataType.Float)
{
TFGraph graph;
TFOutput images, output;
ConstructGraphToNormalizeImage(out graph, out images, out output, destinationDataType);
using (var session = new TFSession(graph))
{
var normalized = session.Run(
inputs: new[] { images },
inputValues: new[] { tensor },
outputs: new[] { output });
return normalized[0];
}
}
код для кодирования тензора к изображению, как показано ниже:
private byte[] TensorToJpeg(TFTensor image)
{
var graph = new TFGraph();
var input = graph.Placeholder(TFDataType.Float);
var output = graph.Squeeze(input, new long[] {0}, "Squeeze_dimens");
output = graph.Cast(output, TFDataType.UInt8);
output = graph.EncodeJpeg(output);
using (var session = new TFSession(graph))
{
var result = session.Run(
inputs: new[] { input },
inputValues: new[] { image },
outputs: new[] { output });
var tensor = result[0];
byte[] buffer = new byte[(int)tensor.TensorByteSize-10];
System.Runtime.InteropServices.Marshal.Copy(tensor.Data+10, buffer, 0, buffer.Length);
return buffer;
}
}
var contents = File.ReadAllBytes(ImagePath);
var tensor = TFTensor.CreateString(contents);
TFTensor tensorNormalized = CreateTensor(tensor);
byte[] NewImage_Bytes = TensorToJpeg(tensorNormalized);
File.WriteAllBytes(SendPathName+"Newimage.jpeg", NewImage_Bytes);
обычно новое изображение должно совпадать с исходным, если я не нормализую его. но даже изображение нормализовано, я думаю, что новое изображение не должно быть черным.