private static XMLAnnotation createBoxLabelFileFromJson(JsonFile jsonFile, Bitmap bitmap)
        {
            XMLAnnotation annot   = new XMLAnnotation(jsonFile.getFilename(), bitmap.Width, bitmap.Height, 1);
            List <Region> regions = jsonFile.getRegions();

            foreach (Region r in regions)
            {
                int xMin = bitmap.Width, yMin = bitmap.Height, xMax = 0, yMax = 0;

                foreach (Point p in r.getPoints())
                {
                    if (p.X < xMin)
                    {
                        xMin = p.X;
                    }

                    if (p.X > xMax)
                    {
                        xMax = p.X;
                    }

                    if (p.Y < yMin)
                    {
                        yMin = p.Y;
                    }

                    if (p.Y > yMax)
                    {
                        yMax = p.Y;
                    }
                }

                annot.addBox(r.getKlasse(), xMin, yMin, xMax, yMax);
            }


            return(annot);
        }
        public static void createBoxesFromJson(string sourceImagePath, string sourceLabelFileDirectory, string targetImageDirectory, string targetAnnotationDirectory,
                                               double maxRot = 360, int maxShiftHor = -1, int maxShiftVer = -1, int sampleCount = 30)
        {
            JSON_Reader labelFile = new JSON_Reader(Directory.GetFiles(sourceLabelFileDirectory)[0]);

            string[] filePaths = Directory.GetFiles(sourceImagePath);

            int    currentImageCount  = 0;
            Image  currentImage       = Image.FromFile(filePaths[currentImageCount]);
            String targetXMLDirectory = Path.Combine(targetAnnotationDirectory, "xmls");

            List <String> labels        = new List <string>();
            StreamWriter  trainvalFile  = new StreamWriter(Path.Combine(targetAnnotationDirectory, "trainval.txt"), false);
            StreamWriter  label_mapFile = new StreamWriter(Path.Combine(targetAnnotationDirectory, "label_map.pbtxt"), false);

            foreach (JsonFile file in labelFile.getFiles())
            {
                foreach (Region r in file.getRegions())
                {
                    labels.Add(r.getKlasse());
                }

                Console.Write(file.getFilename() + ": ");
                Random rnd           = new Random();
                Bitmap currentBitmap = (Bitmap)Bitmap.FromFile(Path.Combine(sourceImagePath, file.getFilename()));

                //currentBitmap.Save(Path.Combine(targetImageDirectory, file.getFilename()), ImageFormat.Jpeg);

                for (int i = 0; i < sampleCount; i++)
                {
                    float angle   = (float)(rnd.Next(-50, 50) * maxRot / 100.0);
                    int   shift_x = (int)(rnd.Next(-50, 50) * maxShiftVer / 100);
                    int   shift_y = (int)(rnd.Next(-50, 50) * maxShiftHor / 100);

                    Bitmap changed = changeImage(currentBitmap, angle, shift_x, shift_y);


                    string fileName    = generateFileName(file.getFilename(), i);
                    String newFilePath = Path.Combine(targetImageDirectory, fileName);
                    changed.Save(newFilePath, ImageFormat.Jpeg);

                    JsonFile changedFile = file.getChanged(newFilePath, angle, shift_x, shift_y);

                    XMLAnnotation changedLabelFile = createBoxLabelFileFromJson(changedFile, changed);
                    changedLabelFile.save(targetXMLDirectory);
                    trainvalFile.WriteLine(Path.GetFileNameWithoutExtension(fileName));
                    changed.Dispose();
                    Console.Write("#");
                }

                Console.WriteLine();
                currentBitmap.Dispose();
            }

            int id = 1;

            foreach (String label in labels.Distinct())
            {
                label_mapFile.WriteLine("item {");
                label_mapFile.WriteLine("    id: " + id);
                label_mapFile.WriteLine("    name: \'" + label + "\'");
                label_mapFile.WriteLine("}");
                label_mapFile.WriteLine("");
                id++;
            }

            trainvalFile.Dispose();
            label_mapFile.Dispose();
        }