eval_bow.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. # Approach 3: Local features
  2. # This script is used for calculating BOW features of Motion images
  3. # using a BOW vocabulary.
  4. # See train_bow.py for training.
  5. import argparse
  6. import os
  7. import numpy as np
  8. from sklearn import svm
  9. from py.Dataset import Dataset
  10. from py.LocalFeatures import generate_bow_features
  11. def main():
  12. parser = argparse.ArgumentParser(description="BOW train script")
  13. parser.add_argument("dataset_dir", type=str, help="Directory of the dataset containing all session folders")
  14. parser.add_argument("session_name", type=str, help="Name of the session to use for Lapse images (e.g. marten_01)")
  15. parser.add_argument("--clusters", type=int, help="Number of clusters / BOW vocabulary size", default=1024)
  16. parser.add_argument("--step_size", type=int, help="DSIFT keypoint step size. Smaller step size = more keypoints.", default=30)
  17. parser.add_argument("--keypoint_size", type=int, help="DSIFT keypoint size. Should be >= step_size.", default=60)
  18. args = parser.parse_args()
  19. ds = Dataset(args.dataset_dir)
  20. session = ds.create_session(args.session_name)
  21. save_dir = f"./bow_train_NoBackup/{session.name}"
  22. # Lapse DSIFT descriptors
  23. dictionary_file = os.path.join(save_dir, f"bow_dict_{args.step_size}_{args.keypoint_size}_{args.clusters}.npy")
  24. train_feat_file = os.path.join(save_dir, f"bow_train_{args.step_size}_{args.keypoint_size}_{args.clusters}.npy")
  25. eval_file = os.path.join(save_dir, f"bow_eval_{args.step_size}_{args.keypoint_size}_{args.clusters}.csv")
  26. if not os.path.isfile(dictionary_file):
  27. print(f"ERROR: BOW dictionary missing! ({dictionary_file})")
  28. elif not os.path.isfile(train_feat_file):
  29. print(f"ERROR: Train data file missing! ({train_feat_file})")
  30. elif os.path.isfile(eval_file):
  31. print(f"ERROR: Eval file already exists! ({eval_file})")
  32. else:
  33. print(f"Loading dictionary from {dictionary_file}...")
  34. dictionary = np.load(dictionary_file)
  35. print(f"Loading training data from {train_feat_file}...")
  36. train_data = np.load(train_feat_file).squeeze()
  37. print(f"Fitting one-class SVM...")
  38. clf = svm.OneClassSVM().fit(train_data)
  39. print("Evaluating...")
  40. with open(eval_file, "a+") as f:
  41. for filename, feat in generate_bow_features(list(session.generate_motion_images()), dictionary, kp_step=args.step_size, kp_size=args.keypoint_size):
  42. y = clf.decision_function(feat)[0]
  43. f.write(f"{filename},{y}\n")
  44. f.flush()
  45. print("Complete!")
  46. if __name__ == "__main__":
  47. main()