From 8d9875cc7be253e2009ec8ea4515259e2ffc9c97 Mon Sep 17 00:00:00 2001 From: "marina.kolpakova" Date: Sat, 12 Jan 2013 03:16:11 +0400 Subject: [PATCH] add script for negatives extraction --- apps/sft/misk/detections2negatives.py | 81 +++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 apps/sft/misk/detections2negatives.py diff --git a/apps/sft/misk/detections2negatives.py b/apps/sft/misk/detections2negatives.py new file mode 100755 index 0000000..02b045f --- /dev/null +++ b/apps/sft/misk/detections2negatives.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python + +import sys, os, os.path, glob, math, cv2, string, random +from datetime import datetime +from optparse import OptionParser +import re +import numpy as np +from xml.dom import minidom + +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 det2negative(xmldoc, opath): + samples = xmldoc.getElementsByTagName('sample') + for sample in samples: + detections = sample.getElementsByTagName('detections') + detections = minidom.parseString(detections[0].toxml()) + detections = detections.getElementsByTagName("_") + if len(detections) is not 0: + path = sample.getElementsByTagName("path") + path = path[0].firstChild.nodeValue + mat = cv2.imread(path) + mat_h, mat_w, _ = mat.shape + + for detection in detections: + detection = detection.childNodes + for each in detection: + rect = eval(re.sub( r"\b\s\b", ",", re.sub(r"\n", "[", each.nodeValue )) + "]") + print rect + + ratio = 64.0 / rect[3] + + print rect, ratio + mat = resize(mat, int(round(mat_w * ratio)), int(round(mat_h * ratio))) + + rect[0] = int(round(ratio * rect[0])) - 10 + rect[1] = int(round(ratio * rect[1])) - 10 + rect[2] = rect[0] + 32 + 20 + rect[3] = rect[1] + 64 + 20 + try: + cropped = mat[rect[1]:(rect[3]), rect[0]:(rect[2]), :] + cv2.imshow("mat", cropped) + cv2.waitKey(10) + img = os.path.join(opath, ''.join(random.choice(string.lowercase) for i in range(8)) + ".png") + cv2.imwrite(img, cropped) + except: + pass + +if __name__ == "__main__": + + parser = OptionParser() + parser.add_option("-i", "--input", dest="input", metavar="DIRECTORY", type="string", + help="Path to the xml collection folder.") + + parser.add_option("-d", "--output-dir", dest="output", metavar="DIRECTORY", type="string", + help="Path to store data", default=".") + + (options, args) = parser.parse_args() + + if not options.input: + parser.error("Input folder is required.") + + opath = os.path.join(options.output, datetime.now().strftime("negatives" + "-%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].seq.xml")) + for f in gl: + print f + xmldoc = minidom.parse(f) + det2negative(xmldoc, opath) -- 2.7.4