Commit 8d9875cc authored by marina.kolpakova's avatar marina.kolpakova

add script for negatives extraction

parent c073138d
#!/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)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment