07e7d06bb4af51856472f3512d20d88b5571301a
[platform/upstream/opencv.git] / modules / softcascade / misc / scale_caltech.py
1 #!/usr/bin/env python
2
3 import sys, os, os.path, glob, math, cv2, sft
4 from datetime import datetime
5 from optparse import OptionParser
6 import re
7 import numpy as np
8
9 def extractPositive(f, path, opath, octave, min_possible):
10     newobj = re.compile("^lbl=\'(\w+)\'\s+str=(\d+)\s+end=(\d+)\s+hide=0$")
11     pos    = re.compile("^pos\s=(\[[((\d+\.+\d*)|\s+|\;)]*\])$")
12     occl   = re.compile("^occl\s*=(\[[0-1|\s]*\])$")
13
14     whole_mod_w = int(64  * octave) + 2 * int(20 * octave)
15     whole_mod_h = int(128 * octave) + 2 * int(20 * octave)
16
17     goNext = 0
18     start  = 0
19     end    = 0
20
21     person_id = -1;
22
23     boxes = []
24     occls = []
25
26     for l in f:
27         m = newobj.match(l)
28         if m is not None:
29             if m.group(1) == "person":
30                 goNext = 1
31                 start = int(m.group(2))
32                 end   = int(m.group(3))
33                 person_id = person_id + 1
34                 print m.group(1), person_id, start, end
35             else:
36                 goNext = 0
37         else:
38             m = pos.match(l)
39             if m is not None:
40                 if not goNext:
41                     continue
42                 strarr = re.sub(r"\s", ", ", re.sub(r"\;\s+(?=\])", "]", re.sub(r"\;\s+(?!\])", "],[", re.sub(r"(\[)(\d)", "\\1[\\2", m.group(1)))))
43                 boxes = eval(strarr)
44             else:
45                 m = occl.match(l)
46                 if m is not None:
47                     occls = eval(re.sub(r"\s+(?!\])", ",", m.group(1)))
48
49                     if len(boxes) > 0 and len(boxes) == len(occls):
50                         for idx, box in enumerate(boxes):
51                             if occls[idx] == 1:
52                                 continue
53
54                             x = box[0]
55                             y = box[1]
56                             w = box[2]
57                             h = box[3]
58
59                             id = int(start) - 1 + idx
60                             file = os.path.join(path, "I0%04d.jpg" % id)
61
62                             if (start + id) >= end or w < 10 or h < min_possible:
63                                 continue
64
65                             mat = cv2.imread(file)
66                             mat_h, mat_w, _ = mat.shape
67
68                             # let default height of person be 96.
69                             scale = h / float(96)
70                             rel_scale = scale / octave
71
72                             d_w = whole_mod_w * rel_scale
73                             d_h = whole_mod_h * rel_scale
74
75                             tb = (d_h - h) / 2.0
76                             lr = (d_w - w) / 2.0
77
78                             x = int(round(x - lr))
79                             y = int(round(y - tb))
80
81                             w = int(round(w + lr * 2.0))
82                             h = int(round(h + tb * 2.0))
83
84                             inner = [max(5, x), max(5, y), min(mat_w - 5, x + w), min(mat_h - 5, y + h) ]
85                             cropped = mat[inner[1]:inner[3], inner[0]:inner[2], :]
86
87                             top     = int(max(0, 0 - y))
88                             bottom  = int(max(0, y + h - mat_h))
89                             left    = int(max(0, 0 - x))
90                             right   = int(max(0, x + w - mat_w))
91
92                             if top < -d_h / 4.0 or bottom > d_h / 4.0 or left < -d_w / 4.0 or right > d_w / 4.0:
93                                 continue
94
95                             cropped = cv2.copyMakeBorder(cropped, top, bottom, left, right, cv2.BORDER_REPLICATE)
96                             resized = sft.resize_sample(cropped, whole_mod_w, whole_mod_h)
97                             flipped = cv2.flip(resized, 1)
98
99                             cv2.imshow("resized", resized)
100
101                             c = cv2.waitKey(20)
102                             if c == 27:
103                                 exit(0)
104
105                             fname = re.sub(r"^.*\/(set[0-1]\d)\/(V0\d\d)\.(seq)/(I\d+).jpg$", "\\1_\\2_\\4", file)
106                             fname = os.path.join(opath, fname + "_%04d." % person_id + "png")
107                             fname_fl = os.path.join(opath, fname + "_mirror_%04d." % person_id + "png")
108                             try:
109                                 cv2.imwrite(fname, resized)
110                                 cv2.imwrite(fname_fl, flipped)
111                             except:
112                                 print "something wrong... go next."
113                                 pass
114
115 if __name__ == "__main__":
116     parser = OptionParser()
117     parser.add_option("-i", "--input", dest="input", metavar="DIRECTORY", type="string",
118                        help="Path to the Caltech dataset folder.")
119
120     parser.add_option("-d", "--output-dir", dest="output", metavar="DIRECTORY", type="string",
121                        help="Path to store data", default=".")
122
123     parser.add_option("-o", "--octave", dest="octave", type="float",
124                        help="Octave for a dataset to be scaled", default="0.5")
125
126     parser.add_option("-m", "--min-possible", dest="min_possible", type="int",
127                        help="Minimum possible height for positive.", default="64")
128
129     (options, args) = parser.parse_args()
130
131     if not options.input:
132         parser.error("Caltech dataset folder is required.")
133
134     opath = os.path.join(options.output, datetime.now().strftime("raw_ge64_cr_mirr_ts" + "-%Y-%m-%d-%H-%M-%S"))
135     os.mkdir(opath)
136
137     gl = glob.iglob( os.path.join(options.input, "set[0][0]/V0[0-9][0-9].txt"))
138     for each in gl:
139         path, ext = os.path.splitext(each)
140         path = path + ".seq"
141         print path
142         extractPositive(open(each), path, opath, options.octave, options.min_possible)