datalabel.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package main
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "os"
  9. "strconv"
  10. "strings"
  11. )
  12. type ImageSet struct {
  13. Name string
  14. Images []string
  15. }
  16. func moveFile(source, dest string) {
  17. sourceFile, err := os.Open(source)
  18. if err != nil {
  19. panic(err)
  20. }
  21. defer sourceFile.Close()
  22. newFile, err := os.Create(dest)
  23. if err != nil {
  24. panic(err)
  25. }
  26. defer newFile.Close()
  27. _, err = io.Copy(newFile, sourceFile)
  28. if err != nil {
  29. panic(err)
  30. }
  31. }
  32. type Config struct {
  33. DataFile string
  34. ImagePrefix string
  35. DefaultPrefix string
  36. SecondaryPrefix string
  37. SecondaryPredicate string
  38. IgnorePredicate string
  39. Outfile string
  40. }
  41. func main() {
  42. combineString := "%s/%s"
  43. configBytes, err := ioutil.ReadFile("config.json")
  44. if err != nil {
  45. panic(err)
  46. }
  47. config := Config{}
  48. err = json.Unmarshal(configBytes, &config)
  49. if err != nil {
  50. panic(err)
  51. }
  52. if len(config.Outfile) == 0 {
  53. panic(errors.New("No output file name defined `classes`"))
  54. }
  55. if len(config.ImagePrefix) == 0 {
  56. panic(errors.New("No image directory defined `imagefolder`"))
  57. }
  58. if len(config.DataFile) == 0 {
  59. panic(errors.New("No data file defined `myinput.json`"))
  60. }
  61. if len(config.DefaultPrefix) == 0 {
  62. panic(errors.New("No default directory defined `my_data_set`"))
  63. }
  64. if len(config.SecondaryPredicate) > 0 && len(config.SecondaryPrefix) == 0 {
  65. panic(errors.New("No secondary directory defined with a predicate defined:" + config.SecondaryPredicate))
  66. }
  67. if _, err := os.Stat(config.DefaultPrefix); os.IsNotExist(err) {
  68. err = os.Mkdir(config.DefaultPrefix, os.FileMode(0777))
  69. if err != nil {
  70. panic(err)
  71. }
  72. }
  73. if len(config.SecondaryPredicate) > 0 {
  74. if _, err := os.Stat(config.SecondaryPrefix); os.IsNotExist(err) {
  75. err = os.Mkdir(config.SecondaryPrefix, os.FileMode(0777))
  76. if err != nil {
  77. panic(err)
  78. }
  79. }
  80. }
  81. data, err := ioutil.ReadFile(config.DataFile)
  82. if err != nil {
  83. panic(err)
  84. }
  85. imageSets := []ImageSet{}
  86. err = json.Unmarshal(data, &imageSets)
  87. if err != nil {
  88. panic(err)
  89. }
  90. classes := map[int]string{}
  91. for idx, b := range imageSets {
  92. classes[idx] = b.Name
  93. for _, img := range b.Images {
  94. if strings.Contains(img, config.IgnorePredicate) {
  95. continue
  96. }
  97. dir := fmt.Sprintf(combineString, config.DefaultPrefix, strconv.Itoa(idx))
  98. containsPredicate := strings.Contains(strings.ToLower(img), strings.ToLower(config.SecondaryPredicate))
  99. if len(config.SecondaryPredicate) > 0 && containsPredicate {
  100. dir = fmt.Sprintf(combineString, config.SecondaryPrefix, strconv.Itoa(idx))
  101. }
  102. if _, err := os.Stat(dir); os.IsNotExist(err) {
  103. err = os.Mkdir(dir, os.FileMode(0777))
  104. if err != nil {
  105. panic(err)
  106. }
  107. }
  108. moveFile(fmt.Sprintf(combineString, config.ImagePrefix, img), fmt.Sprintf(combineString, dir, img))
  109. }
  110. }
  111. classBytes, err := json.Marshal(classes)
  112. if err != nil {
  113. panic(err)
  114. }
  115. err = ioutil.WriteFile(config.Outfile+".json", classBytes, os.FileMode(0777))
  116. if err != nil {
  117. panic(err)
  118. }
  119. }