|
@@ -9,56 +9,28 @@ import matplotlib.pyplot as plt
|
|
|
|
|
|
from argparse import ArgumentParser
|
|
from argparse import ArgumentParser
|
|
|
|
|
|
-from nabirds import NAB_Annotations, CUB_Annotations
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-def init_logger(args):
|
|
|
|
- fmt = "%(levelname)s - [%(asctime)s] %(filename)s:%(lineno)d [%(funcName)s]: %(message)s"
|
|
|
|
- logging.basicConfig(
|
|
|
|
- format=fmt,
|
|
|
|
- level=getattr(logging, args.loglevel.upper(), logging.DEBUG),
|
|
|
|
- filename=args.logfile or None,
|
|
|
|
- filemode="w")
|
|
|
|
-
|
|
|
|
-def plot_crops(crops, title, scatter_mid=False, names=None):
|
|
|
|
-
|
|
|
|
- n_crops = crops.shape[0]
|
|
|
|
- rows = int(np.ceil(np.sqrt(n_crops)))
|
|
|
|
- cols = int(np.ceil(n_crops / rows))
|
|
|
|
-
|
|
|
|
- fig, axs = plt.subplots(rows, cols, figsize=(16,9))
|
|
|
|
- fig.suptitle(title, fontsize=16)
|
|
|
|
- for i, crop in enumerate(crops):
|
|
|
|
- ax = axs[np.unravel_index(i, axs.shape)]
|
|
|
|
- if names is not None:
|
|
|
|
- ax.set_title(names[i])
|
|
|
|
- ax.imshow(crop)
|
|
|
|
- ax.axis("off")
|
|
|
|
- if scatter_mid:
|
|
|
|
- middle_h, middle_w = crop.shape[0] / 2, crop.shape[1] / 2
|
|
|
|
- ax.scatter(middle_w, middle_h, marker="x")
|
|
|
|
|
|
+from nabirds.annotations import AnnotationType
|
|
|
|
+from utils import parser, plot_crops
|
|
|
|
|
|
def main(args):
|
|
def main(args):
|
|
- init_logger(args)
|
|
|
|
|
|
|
|
- annotation_cls = dict(
|
|
|
|
- nab=NAB_Annotations,
|
|
|
|
- cub=CUB_Annotations)
|
|
|
|
|
|
+ annotation_cls = AnnotationType.get(args.dataset).value
|
|
|
|
|
|
logging.info("Loading \"{}\" annnotations from \"{}\"".format(args.dataset, args.data))
|
|
logging.info("Loading \"{}\" annnotations from \"{}\"".format(args.dataset, args.data))
|
|
- annot = annotation_cls.get(args.dataset.lower())(args.data)
|
|
|
|
-
|
|
|
|
- subset = args.subset
|
|
|
|
-
|
|
|
|
- uuids = getattr(annot, "{}_uuids".format(subset))
|
|
|
|
- features = args.features[0 if subset == "train" else 1]
|
|
|
|
|
|
+ annot = annotation_cls(args.data, args.parts, args.feature_model)
|
|
|
|
+
|
|
|
|
+ kwargs = {}
|
|
|
|
+ if annot.info is None:
|
|
|
|
+ # features = args.features[0 if args.subset == "train" else 1]
|
|
|
|
+ kwargs = dict(
|
|
|
|
+ part_rescale_size=args.rescale_size,
|
|
|
|
+ # features=features,
|
|
|
|
+ uniform_parts=args.uniform_parts,
|
|
|
|
+ ratio=args.ratio,
|
|
|
|
+ )
|
|
|
|
|
|
data = annot.new_dataset(
|
|
data = annot.new_dataset(
|
|
- subset,
|
|
|
|
- part_rescale_size=args.rescale_size,
|
|
|
|
- # features=features,
|
|
|
|
-
|
|
|
|
- uniform_parts=args.uniform_parts,
|
|
|
|
|
|
+ args.subset,
|
|
|
|
|
|
crop_to_bb=args.crop_to_bb,
|
|
crop_to_bb=args.crop_to_bb,
|
|
crop_uniform=args.crop_uniform,
|
|
crop_uniform=args.crop_uniform,
|
|
@@ -66,12 +38,12 @@ def main(args):
|
|
parts_in_bb=args.parts_in_bb,
|
|
parts_in_bb=args.parts_in_bb,
|
|
|
|
|
|
rnd_select=args.rnd,
|
|
rnd_select=args.rnd,
|
|
- ratio=args.ratio,
|
|
|
|
- seed=args.seed
|
|
|
|
|
|
+ seed=args.seed,
|
|
|
|
|
|
|
|
+ **kwargs
|
|
)
|
|
)
|
|
|
|
|
|
- logging.info("Loaded {} {} images".format(len(data), subset))
|
|
|
|
|
|
+ logging.info("Loaded {} {} images".format(len(data), args.subset))
|
|
|
|
|
|
start = max(args.start, 0)
|
|
start = max(args.start, 0)
|
|
n_images = min(args.n_images, len(data) - start)
|
|
n_images = min(args.n_images, len(data) - start)
|
|
@@ -110,80 +82,4 @@ def main(args):
|
|
plt.show()
|
|
plt.show()
|
|
plt.close()
|
|
plt.close()
|
|
|
|
|
|
-parser = ArgumentParser()
|
|
|
|
-
|
|
|
|
-parser.add_argument("data",
|
|
|
|
- help="Folder containing the dataset with images and annotation files",
|
|
|
|
- type=str)
|
|
|
|
-
|
|
|
|
-parser.add_argument("--dataset",
|
|
|
|
- help="Possible datasets: NAB, CUB",
|
|
|
|
- choices=["cub", "nab"],
|
|
|
|
- default="cub", type=str
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-parser.add_argument("--subset", "-sub",
|
|
|
|
- help="Possible subsets: train, test",
|
|
|
|
- choices=["train", "test"],
|
|
|
|
- default="train", type=str)
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-parser.add_argument("--start", "-s",
|
|
|
|
- help="Image id to start with",
|
|
|
|
- type=int, default=0)
|
|
|
|
-
|
|
|
|
-parser.add_argument("--n_images", "-n",
|
|
|
|
- help="Number of images to display",
|
|
|
|
- type=int, default=10)
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-parser.add_argument("--features",
|
|
|
|
- help="pre-extracted train and test features",
|
|
|
|
- default=[None, None],
|
|
|
|
- nargs=2, type=str)
|
|
|
|
-
|
|
|
|
-parser.add_argument("--ratio",
|
|
|
|
- help="Part extraction ratio",
|
|
|
|
- type=float, default=.2)
|
|
|
|
-
|
|
|
|
-parser.add_argument("--rescale_size",
|
|
|
|
- help="rescales the part positions from this size to original image size",
|
|
|
|
- type=int, default=-1)
|
|
|
|
-
|
|
|
|
-parser.add_argument("--uniform_parts", "-u",
|
|
|
|
- help="Do not use GT parts, but sample parts uniformly from the image",
|
|
|
|
- action="store_true")
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-parser.add_argument("--rnd",
|
|
|
|
- help="select random subset of present parts",
|
|
|
|
- action="store_true")
|
|
|
|
-
|
|
|
|
-parser.add_argument("--crop_to_bb",
|
|
|
|
- help="Crop image to the bounding box",
|
|
|
|
- action="store_true")
|
|
|
|
-
|
|
|
|
-parser.add_argument("--crop_uniform",
|
|
|
|
- help="Try to extend the bounding box to same height and width",
|
|
|
|
- action="store_true")
|
|
|
|
-
|
|
|
|
-parser.add_argument("--parts_in_bb",
|
|
|
|
- help="Only display parts, that are inside the bounding box",
|
|
|
|
- action="store_true")
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-parser.add_argument(
|
|
|
|
- '--logfile', type=str, default='',
|
|
|
|
- help='File for logging output')
|
|
|
|
-
|
|
|
|
-parser.add_argument(
|
|
|
|
- '--loglevel', type=str, default='INFO',
|
|
|
|
- help='logging level. see logging module for more information')
|
|
|
|
-
|
|
|
|
-parser.add_argument(
|
|
|
|
- '--seed', type=int, default=12311123,
|
|
|
|
- help='random seed')
|
|
|
|
-
|
|
|
|
main(parser.parse_args())
|
|
main(parser.parse_args())
|