collect Caltech positives for 32x64 octave:
authormarina.kolpakova <marina.kolpakova@itseez.com>
Fri, 11 Jan 2013 16:55:58 +0000 (20:55 +0400)
committermarina.kolpakova <marina.kolpakova@itseez.com>
Fri, 1 Feb 2013 10:35:28 +0000 (14:35 +0400)
- resized
- cropped
- flipped around the x axis

apps/sft/misk/scale_caltech.py
apps/sft/misk/scale_inria.py

index d59f09b..02d93b4 100755 (executable)
@@ -6,11 +6,30 @@ from optparse import OptionParser
 import re
 import numpy as np
 
+def resize(image, d_w, d_h):
+    if (d_h < image.shape[0]) or (d_w < image.shape[1]):
+        ratio = min(d_h / float(image.shape[0]), d_w / float(image.shape[1]))
+
+        kernel_size = int( 5 / (2 * ratio))
+        sigma = 0.5 / ratio
+        image_to_resize = cv2.filter2D(image, cv2.CV_8UC3, cv2.getGaussianKernel(kernel_size, sigma))
+        interpolation_type = cv2.INTER_AREA
+    else:
+        image_to_resize = image
+        interpolation_type = cv2.INTER_CUBIC
+
+    return cv2.resize(image_to_resize,(d_w, d_h), None, 0, 0, interpolation_type)
+
 def showPeople(f, path, opath):
     newobj = re.compile("^lbl=\'(\w+)\'\s+str=(\d+)\s+end=(\d+)\s+hide=0$")
     pos    = re.compile("^pos\s=(\[[((\d+\.+\d*)|\s+|\;)]*\])$")
     occl   = re.compile("^occl\s*=(\[[0-1|\s]*\])$")
 
+    octave = 0.5
+
+    whole_mod_w = int(64 * octave) + 2 * int(20 * octave)
+    whole_mod_h = int(128 * octave) + 2 * int(20 * octave)
+
     goNext = 0
     start = 0
     end = 0
@@ -23,7 +42,6 @@ def showPeople(f, path, opath):
     for l in f:
         m = newobj.match(l)
         if m is not None:
-            print m.group(1)
             if m.group(1) == "person":
                 goNext = 1
                 start = int(m.group(2))
@@ -45,40 +63,70 @@ def showPeople(f, path, opath):
                     occls = eval(re.sub(r"\s+(?!\])", ",", m.group(1)))
 
                     if len(boxes) > 0 and len(boxes) == len(occls):
-                        print len(boxes)
                         for idx, box in enumerate(boxes):
                             color = (8, 107, 255)
                             if occls[idx] == 1:
                                 continue
-                                # color = (255, 107, 8)
+
                             x = box[0]
                             y = box[1]
                             w = box[2]
                             h = box[3]
+
                             id = int(start) - 1 + idx
                             file = os.path.join(path, "I0%04d.jpg" % id)
 
-                            print file
+                            if (start + id) >= end or w < 10 or h < 64:
+                                continue
+
+                            mat = cv2.imread(file)
+                            mat_h, mat_w, _ = mat.shape
+
+                            scale = h / float(96)
+                            rel_scale = scale / octave
+
+                            d_w = whole_mod_w * rel_scale
+                            d_h = whole_mod_h * rel_scale
+
+                            tb = (d_h - h) / 2.0
+                            lr = (d_w - w) / 2.0
+
+                            x = int(round(x - lr))
+                            y = int(round(y - tb))
+
+                            w = int(round(w + lr * 2.0))
+                            h = int(round(h + tb * 2.0))
+
+                            inner = [max(5, x), max(5, y), min(mat_w - 5, x + w), min(mat_h - 5, y + h) ]
+                            cropped = mat[inner[1]:inner[3], inner[0]:inner[2], :]
+
+                            top     = int(max(0, 0 - y))
+                            bottom  = int(max(0, y + h - mat_h))
+                            left    = int(max(0, 0 - x))
+                            right   = int(max(0, x + w - mat_w))
+
+                            if top < -d_h / 4.0 or bottom > d_h / 4.0 or left < -d_w / 4.0 or right > d_w / 4.0:
+                                continue
 
-                            if (start + id) < end and w > 5 and h > 47:
-                                img = cv2.imread(file)
+                            cropped = cv2.copyMakeBorder(cropped, top, bottom, left, right, cv2.BORDER_REPLICATE)
+                            resized = resize(cropped, whole_mod_w, whole_mod_h)
+                            flipped = cv2.flip(resized, 1)
 
-                                fname = re.sub(r"^.*\/(set[0-1]\d)\/(V0\d\d)\.(seq)/(I\d+).jpg$", "\\1_\\2_\\4", file)#os.path.basename(file)
-                                fname = os.path.join(opath, fname + "_%04d." % person_id + "png")
-                                try:
-                                    print "->", fname
-                                    submat = img[int(y):int(y + h), int(x):int(x + w),:]
-                                    cv2.imwrite(fname, submat)
-                                except:
-                                    print "something wrong... go next."
-                                    pass
-                                cv2.rectangle(img, (int(x), int(y)), (int(x + w), int(y + h)), color, 1)
-                                cv2.imshow("person", img)
+                            cv2.imshow("resized", resized)
 
-                                c = cv2.waitKey(10)
-                                if c == 27:
-                                    exit(0)
+                            c = cv2.waitKey(20)
+                            if c == 27:
+                                exit(0)
 
+                            fname = re.sub(r"^.*\/(set[0-1]\d)\/(V0\d\d)\.(seq)/(I\d+).jpg$", "\\1_\\2_\\4", file)
+                            fname = os.path.join(opath, fname + "_%04d." % person_id + "png")
+                            fname_fl = os.path.join(opath, fname + "_mirror_%04d." % person_id + "png")
+                            try:
+                                cv2.imwrite(fname, resized)
+                                cv2.imwrite(fname_fl, flipped)
+                            except:
+                                print "something wrong... go next."
+                                pass
 
 if __name__ == "__main__":
     parser = OptionParser()
@@ -93,10 +141,10 @@ if __name__ == "__main__":
     if not options.input:
         parser.error("Caltech dataset folder is required.")
 
-    opath = os.path.join(options.output, datetime.now().strftime("raw_ge48-" + "-%Y-%m-%d-%H-%M-%S"))
+    opath = os.path.join(options.output, datetime.now().strftime("raw_ge64_cr_mirr_ts" + "-%Y-%m-%d-%H-%M-%S"))
     os.mkdir(opath)
 
-    gl = glob.iglob( os.path.join(options.input, "set[0-1][0-9]/V0[0-9][0-9].txt"))
+    gl = glob.iglob( os.path.join(options.input, "set[0-1][0-5]/V0[0-9][0-9].txt"))
     for each in gl:
         path, ext = os.path.splitext(each)
         path = path + ".seq"
index b81cfe4..4fc6b8b 100755 (executable)
@@ -105,10 +105,10 @@ if __name__ == "__main__":
 
                 cropped = mat[inner[1]:inner[3], inner[0]:inner[2], :]
 
-                top = int(max(0, 0 - box[1]))
-                bottom = int(max(0, box[3] - mat_h))
-                left = int(max(0, 0 - box[0]))
-                right = int(max(0, box[2] - mat_w))
+                top     = int(max(0, 0 - box[1]))
+                bottom  = int(max(0, box[3] - mat_h))
+                left    = int(max(0, 0 - box[0]))
+                right   = int(max(0, box[2] - mat_w))
                 cropped = cv2.copyMakeBorder(cropped, top, bottom, left, right, cv2.BORDER_REPLICATE)
                 resized = resize(cropped, whole_mod_w, whole_mod_h)