// Loop private async void Loop() { for (; ;) { //if(requestImageDraw) { requestImageDraw = false; float[] noise; if (FixNoiseCheckBox.IsChecked.Value) { noise = constantNoise; } else { noise = DatasetUtility.GetNoiseArray(ImageData.NoiseCount); } WriteableBitmap bitmap = brain.PredictImage(noise.Concat(new float[] { NumberEditor_input0.Value, NumberEditor_input1.Value, NumberEditor_input2.Value, }).ToArray()); GeneratedImageView.Source = bitmap; GeneratedImageView.InvalidateVisual(); //Console.WriteLine("Image updated"); //} await Task.Delay(Mathf.Clamp(NumberEditor_refreshRate.IntValue, 10, 100000)); } }
// Event - Window private void OnLoaded(object sender, RoutedEventArgs e) { constantNoise = DatasetUtility.GetNoiseArray(ImageData.NoiseCount); brain = new PantheonBrain("ImageDrawer"); brain.CreateModels(); brain.TrainImageData(1000000); // RegisterEvents NumberEditor_input0.ValueChanged += OnInputChanged; NumberEditor_input1.ValueChanged += OnInputChanged; NumberEditor_input2.ValueChanged += OnInputChanged; // Start loop Loop(); }
public static ImageData[] GetSampleDatas() { List <ImageData> datasetList = new List <ImageData>(); string[] imageFilenames = Directory.GetFiles(DataImageDir, "*.png"); //int i = 0; //foreach (string imageFile in imageFilenames) { // ImageData imageData = ImageData.FromFile(imageFile, new float[] { (float)i / (imageFilenames.Length - 1) }); // datasetList.Add(imageData); // ++i; //} // Stick // 1. 앉음 - 서있음 // 2. 왼쪽 - 오른쪽 // 3. 주먹 - 손으로 V //AddWithNoise("01.png", new float[] { 1f, 0f, 0f }); //AddWithNoise("02.png", new float[] { 1f, 1f, 0f }); //AddWithNoise("03.png", new float[] { 1f, 0f, 1f }); //AddWithNoise("04.png", new float[] { 1f, 1f, 1f }); //AddWithNoise("05.png", new float[] { 0f, 0f, 0f }); //AddWithNoise("06.png", new float[] { 0f, 1f, 0f }); //AddWithNoise("07.png", new float[] { 0f, 0f, 1f }); //AddWithNoise("08.png", new float[] { 0f, 1f, 1f }); //AddWithNoise("09.png", new float[] { 0.5f, 0.5f, 0.5f }); //AddWithNoise("10.png", new float[] { 0.5f, 0f, 0.5f }); //AddWithNoise("11.png", new float[] { 0.5f, 1f, 0.5f }); // Character // 1. 여캐 - 남캐 // 2. 모자안씀 - 모자씀 // 3. 단발 - 포니테일 - 장발 AddWithNoise("00.png", new float[] { 0f, 1f, 0.5f }); AddWithNoise("01.png", new float[] { 0f, 0f, 1f }); AddWithNoise("02.png", new float[] { 0f, 0f, 0f }); AddWithNoise("03.png", new float[] { 0f, 1f, 0f }); AddWithNoise("04.png", new float[] { 0f, 0f, 1f }); AddWithNoise("05.png", new float[] { 0f, 0f, 0.5f }); AddWithNoise("06.png", new float[] { 0f, 0f, 0.5f }); AddWithNoise("07.png", new float[] { 0f, 0f, 1f }); AddWithNoise("08.png", new float[] { 0f, 1f, 0f }); AddWithNoise("09.png", new float[] { 0f, 1f, 0f }); AddWithNoise("10.png", new float[] { 0f, 1f, 1f }); AddWithNoise("11.png", new float[] { 1f, 1f, 0f }); AddWithNoise("12.png", new float[] { 1f, 1f, 0f }); AddWithNoise("13.png", new float[] { 1f, 1f, 0f }); AddWithNoise("14.png", new float[] { 1f, 0f, 0f }); AddWithNoise("15.png", new float[] { 1f, 0f, 1f }); AddWithNoise("16.png", new float[] { 1f, 0f, 1f }); AddWithNoise("17.png", new float[] { 1f, 1f, 1f }); return(datasetList.ToArray()); void AddWithNoise(string filename, float[] input) { for (int i = 0; i < 3; ++i) { datasetList.Add(FromFile(filename, DatasetUtility.GetNoiseArray(NoiseCount).Concat(input).ToArray(), input)); } } }
public async void TrainImageData(int epochs, int GanBatchSize = 1, int localEpochs = 1) { // Make Discriminator dataset ImageData[] sampleDatas = ImageData.GetSampleDatas(); for (int epochI = 0; epochI < epochs; ++epochI) { await Task.Delay(50); if (MainWindow.Instance.PauseTrainCheckBox.IsChecked.Value) { continue; } Console.WriteLine($"Epoch {epochI} / {epochs}."); if (epochI % 10 == 0) { WriteableBitmap checkpointBitmap = PredictImage(MainWindow.Instance.constantNoise.Concat(new float[] { 0f, 0f, 0f, }).ToArray()); try { string filename = $"PredictImage/Predict_{epochI}.png"; Directory.CreateDirectory(Path.GetDirectoryName(filename)); using (FileStream stream = new FileStream(filename, FileMode.Create)) { PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(checkpointBitmap)); encoder.Save(stream); } } catch (Exception ex) { Console.WriteLine($"Failed to save predict bitmap. {ex}"); } } // Add real data List <float[]> inputList = new List <float[]>(); List <float[]> outputList = new List <float[]>(); for (int i = 0; i < sampleDatas.Length; ++i) { ImageData sampleData = sampleDatas[i]; inputList.Add(sampleData.output.Concat(sampleData.manualInput).ToArray()); outputList.Add(new float[] { 1f }); } // Add fake data for (int i = 0; i < 20; ++i) { float[] fakePixels = PredictPixels(DatasetUtility.GetNoiseArray(ImageData.TotalInputShape), false); inputList.Add(fakePixels); outputList.Add(new float[] { 0f }); } float[,] inputs = inputList.GetMultiDim(); float[,] outputs = outputList.GetMultiDim(); // Train Discriminator discriminatorModel.SetTrainable(true); discriminatorModel.Fit(inputs, outputs, batch_size: inputs.GetLength(0), epochs: localEpochs, verbose: 1); // Make GAN dataset inputList.Clear(); outputList.Clear(); for (int batchI = 0; batchI < GanBatchSize; ++batchI) { inputList.Add(DatasetUtility.GetNoiseArray(ImageData.TotalInputShape)); outputList.Add(new float[] { 1f }); } inputs = inputList.GetMultiDim(); outputs = outputList.GetMultiDim(); // Train GAN discriminatorModel.SetTrainable(false); ganModel.Fit(inputs, outputs, batch_size: inputs.GetLength(0), epochs: localEpochs, verbose: 1); //SaveModel(); } Console.WriteLine($"Complete Train."); //float[] predicts = model.Predict(x).GetData<float>(); //Stopwatch watch = new Stopwatch(); //watch.Start(); //for (int i = 0; i < 1; ++i) { // predicts = model.Predict(x, verbose: 0).GetData<float>(); // //Debug.WriteLine($"Result: ({string.Join(",", predicts)})"); //} //watch.Stop(); //MainWindow.Instance.Dispatcher.BeginInvoke(new Action(() => { // MainWindow.Instance.DebugTextBox.Text = watch.GetElapsedMilliseconds().ToString(); //})); }