///<summary>Выполняет стилизацию. Метод выполняется в потоке Stylizer.</summary> private void Stylize() { var content = IOConverters.ImageToTensor(this.ContentImage.Image as Bitmap); var style = IOConverters.ImageToTensor(this.StyleImage.Image as Bitmap); var Result = StyleTransfer.Stylize(this.encoder1, this.decoder1, this.encoder2, this.decoder2, this.encoder3, this.decoder3, this.encoder4, this.decoder4, this.encoder5, this.decoder5, content, style); this.ResultImage.Image = IOConverters.TensorToImage(Result); this.Stylized = true; this.Progress.Value = 0; this.GenerateOrSaveResult.Text = "Сохранить"; this.GenerateOrSaveResult.Click -= this.StopProcess; this.GenerateOrSaveResult.Click += this.SaveResult; this.OpenContent.Enabled = true; this.OpenStyle.Enabled = true; }
///<summary>Выполняет стилизацию. Метод выполняется в потоке Stylizer.</summary> private void Stylize() { var content = IOConverters.ImageToTensor(this.ContentImage.Image as Bitmap); var Result = transformer.Stylize(content); this.ResultImage.Image = IOConverters.TensorToImage(Result); this.Progress.Value = 0; this.GenerateOrSaveResult.Text = "Сохранить"; this.GenerateOrSaveResult.Click -= this.StopProcess; this.GenerateOrSaveResult.Click += this.SaveResult; this.OpenContent.Enabled = true; this.SelectStyle.Enabled = true; }
///<summary>Открывает файловый диалог и устанавливает выбранное контентное изображение. Обработчик события.</summary> public void OpenContentHandler(object sender, EventArgs E) { var OFD = new OpenFileDialog(); OFD.Title = "Открыть контентное изображение"; OFD.Filter = "Изображения (*.bmp; *.emf; *.exif; *.gif; *.ico; *.jpg; *.png; *.tiff; *.wmf)|*.bmp; *.emf; *.exif; *.gif; *.ico; *.jpg; *.png; *.tiff; *.wmf|Все файлы|*.*"; if (OFD.ShowDialog() == DialogResult.OK) { this.ContentImageBox.Image = new Bitmap(OFD.FileName); Program.Content = IOConverters.ImageToTensor(this.ContentImageBox.Image as Bitmap); Program.X = Program.Content.Clone(); this.ResultImageBox.Image = IOConverters.TensorToImage(Program.X); } }
///<summary>Открывает файловый диалог и устанавливает выбранное контентное изображение. Обработчик события.</summary> public void OpenContentHandler(object sender, EventArgs E) { var OFD = new OpenFileDialog(); OFD.Title = "Открыть контентное изображение"; OFD.Filter = "Изображения (*.bmp; *.emf; *.exif; *.gif; *.ico; *.jpg; *.png; *.tiff; *.wmf)|*.bmp; *.emf; *.exif; *.gif; *.ico; *.jpg; *.png; *.tiff; *.wmf|Все файлы|*.*"; if (OFD.ShowDialog() == DialogResult.OK) { this.ContentImageBox.Image = new Bitmap(OFD.FileName); Program.Content = IOConverters.ImageToTensor(new Bitmap(this.ContentImageBox.Image, GetSize(this.ContentSizes.SelectedIndex))); Program.X = Tensor.Mix(Tensor.Noise(Program.Content.Width, Program.Content.Height, 3, -128, 128), Program.Content, 0.2f); this.ResultImageBox.Image = IOConverters.TensorToImage(Program.X); } }
///<summary>Инициализирует главную форму приложения. Конструктор.</summary> public MainForm() : base() { this.Initialize(); this.ContentImageBox.Image = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("Content.jpg")); this.StyleImageBox.Image = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("Style.jpg")); Program.Net = new VGG16(Assembly.GetExecutingAssembly().GetManifestResourceStream("Net.HModel")); Program.Net.OnIterationDone += this.FixIteration; Program.Style = IOConverters.ImageToTensor(new Bitmap(StyleImageBox.Image, ContentImageBox.Image.Size)); Program.Content = IOConverters.ImageToTensor(ContentImageBox.Image as Bitmap); Program.X = Program.Content.Clone(); this.ResultImageBox.Image = IOConverters.TensorToImage(Program.X); this.StartProcess.Click += this.StartProcessHandler; this.OpenContent.Click += this.OpenContentHandler; this.OpenStyle.Click += this.OpenStyleHandler; this.StopProcess.Click += this.StopProcessHandler; this.Closing += this.ClosingHandler; this.SaveResult.Click += this.SaveResultHandler; }
///<summary>Инициализирует главную форму приложения. Конструктор.</summary> public MainForm() : base() { this.Initialize(); this.ContentImageBox.Image = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("Content.jpg")); this.StyleImageBox.Image = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("Style.jpg")); Program.Net = new VGG16(Assembly.GetExecutingAssembly().GetManifestResourceStream("Net.Model")); Program.Style = IOConverters.ImageToTensor(new Bitmap(StyleImageBox.Image, GetSize(this.StyleSizes.SelectedIndex))); Program.Content = IOConverters.ImageToTensor(new Bitmap(ContentImageBox.Image, GetSize(this.ContentSizes.SelectedIndex))); Program.X = Tensor.Mix(Tensor.Noise(Program.Content.Width, Program.Content.Height, 3, -128, 128), Program.Content, 0.2f); this.ResultImageBox.Image = IOConverters.TensorToImage(Program.X); this.StartProcess.Click += this.StartProcessHandler; this.OpenContent.Click += this.OpenContentHandler; this.OpenStyle.Click += this.OpenStyleHandler; this.StopProcess.Click += this.StopProcessHandler; this.Closing += this.ClosingHandler; this.SaveResult.Click += this.SaveResultHandler; this.ContentSizes.SelectedIndexChanged += this.ContentSizesHandler; this.StyleSizes.SelectedIndexChanged += this.StyleSizesHandler; }
///<summary>Выполняет стилизацию. Метод выполняется в потоке Stylizer.</summary> private void Stylize() { var content = IOConverters.ImageToTensor(this.ContentImage.Image as Bitmap); var style = IOConverters.ImageToTensor(this.StyleImage.Image as Bitmap); var content_features = encoder.Encode(content); var style_features = encoder.Encode(style); var Total = Layers.AdaIN(content_features, style_features); var Decoded = decoder.Decode(Total); this.ResultImage.Image = IOConverters.TensorToImage(Decoded); this.Stylized = true; this.Progress.Value = 0; this.TotalProgress = 0f; this.GenerateOrSaveResult.Text = "Сохранить"; this.GenerateOrSaveResult.Click -= this.StopProcess; this.GenerateOrSaveResult.Click += this.SaveResult; this.OpenContent.Enabled = true; this.OpenStyle.Enabled = true; }
///<summary>Выполняет фиксацию итерации. Обработчик события.</summary> ///<param name="iter">Итерация.</param> ///<param name="loss">Ошибка.</param> public void FixIteration(int iter, float loss) { this.Iteration.Text = "Iteration: " + (iter + 1).ToString() + "; Time: " + (DateTime.Now - Program.DT).TotalSeconds.ToString(); this.ResultImageBox.Image = IOConverters.TensorToImage(Program.X); Program.DT = DateTime.Now; }
///<summary>Изменяет внутренние параметры приложения в зависимости от установленного разрешения стиля. Обработчик события.</summary> public void StyleSizesHandler(object sender, EventArgs E) { Program.Style = IOConverters.ImageToTensor(new Bitmap(StyleImageBox.Image, GetSize(this.StyleSizes.SelectedIndex))); }
///<summary>Изменяет внутренние параметры приложения в зависимости от установленного разрешения контента. Обработчик события.</summary> public void ContentSizesHandler(object sender, EventArgs E) { Program.Style = IOConverters.ImageToTensor(new Bitmap(StyleImageBox.Image, GetSize(this.StyleSizes.SelectedIndex))); Program.Content = IOConverters.ImageToTensor(new Bitmap(ContentImageBox.Image, GetSize(this.ContentSizes.SelectedIndex))); Program.X = Tensor.Mix(Tensor.Noise(Program.Content.Width, Program.Content.Height, 3, -128, 128), Program.Content, 0.2f); }