Skip to content
This repository was archived by the owner on Sep 5, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
0214caf
Initial commit of collect_images
ZPBerg Jul 2, 2020
bf33903
Initial collect_images commit. Deleted login.json from Git
ZPBerg Jul 7, 2020
bafd011
Add prepare_images. Refactoring.
ZPBerg Jul 10, 2020
3872d31
Minor fixes to work with database querying.
ZPBerg Jul 13, 2020
55e6f8f
Initial commit. Renaming variables and understanding evaluator.py
ZPBerg Jul 13, 2020
0e2d495
Progress
ZPBerg Jul 14, 2020
dc6203d
Update evaluator branch with master changes (#4)
ZPBerg Jul 14, 2020
5eb307c
Update evaluator branch with master changes (#4)
ZPBerg Jul 14, 2020
75abbfe
Update files, fix face_extractor getting files
ZPBerg Jul 15, 2020
9d0da8f
Merge branch 'master' of https://github.com/ZPBerg/Embedded2
ZPBerg Jul 15, 2020
3df4b67
Merge remote-tracking branch 'upstream/master'
ZPBerg Jul 15, 2020
3a0887f
Merge branch 'evaluator' of https://github.com/ZPBerg/Embedded2 into …
ZPBerg Jul 15, 2020
bbd0e54
Add scripts/utils for misc. helper functions. Auto-rotate videos.
ZPBerg Jul 16, 2020
b372438
Improve results.json output, fix load_anchors not finding anchors.npy
ZPBerg Jul 18, 2020
778c9a2
Documenting and refactoring
ZPBerg Jul 21, 2020
3e4aafa
Merge remote-tracking branch 'upstream/master'
ZPBerg Jul 21, 2020
275dea4
Finish annotator saving to csv. check_rotation only rotates .MOV files
ZPBerg Jul 22, 2020
899cd1c
Change csv storage format
ZPBerg Jul 23, 2020
0f5ded3
Add IoU calculation
ZPBerg Jul 23, 2020
90ebc49
Merge remote-tracking branch 'upstream/master'
ZPBerg Jul 23, 2020
76d6242
Merge branch 'evaluator'
ZPBerg Jul 23, 2020
1f0f2a5
Update imports
ZPBerg Jul 23, 2020
2170dfb
Update video_capturer device
ZPBerg Jul 23, 2020
1205013
Fix .mov mistake
ZPBerg Jul 28, 2020
188e8f5
Merge branch 'master' into collect_images
ZPBerg Jul 28, 2020
f125312
Updates
ZPBerg Jul 28, 2020
99a0499
Merge remote-tracking branch 'upstream/master'
ZPBerg Jul 30, 2020
865dba9
Split evaluation script and Evaluator class
ZPBerg Aug 3, 2020
57d7878
Merge remote-tracking branch 'upstream/master'
ZPBerg Aug 3, 2020
f400f76
Add constants file
ZPBerg Aug 3, 2020
d208d73
Merge remote-tracking branch 'upstream/master'
ZPBerg Aug 4, 2020
8bbc8e0
Merge remote-tracking branch 'upstream/master'
ZPBerg Aug 4, 2020
bbb652a
Merge branch 'master' into collect_images
ZPBerg Aug 4, 2020
eca9ab4
Update ftb transfer location. Make rclone to Drive work on remote ser…
ZPBerg Aug 6, 2020
310b747
Made rclone path to be fixed. Renamed to decrypt_images (that's all i…
ZPBerg Aug 12, 2020
f8ef93b
Remove testing date
ZPBerg Aug 12, 2020
2e233e4
Merge remote-tracking branch 'upstream/master'
ZPBerg Aug 12, 2020
55187cd
Merge branch 'collect_images'
ZPBerg Aug 12, 2020
50c10c9
Changed rclone instructions.
ZPBerg Aug 13, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions scripts/collect_images.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
import argparse
import datetime
import json
import os
import subprocess

from src.db.db_connection import sql_cursor

"""
This script should be set up with a cron job to run daily.
Each user will have to set up their rclone config, in our case pointing to a Google Drive folder: https://rclone.org/drive/
This can be done with /local/b/embedvis/rclone-v1.52.2-linux-amd64/rclone config

Collect images of non-goggle detections from the database.
Upload images and metadata to Google Drive.
"""

METADATA_FILE = 'metadata.json'


def get_metadata():
"""
Get image filenames and other relevant metadata from the database.
Save metadata to a file for future decryption.
@return: A list of dictionaries with the metadata for each image

Example list: [
{'image_name': "0.jpg", 'x_min': 0.0, 'y_min': 0.0, 'x_max': 100.0, 'y_max': 100.0, 'init_vector': "example"}
{'image_name': "1.jpg", 'x_min': 25.0, 'y_min': 25.0, 'x_max': 120.0, 'y_max': 140.0, 'init_vector': "example2"}]
"""

metadata = []
current_date = (datetime.date.today(),)

# make sql connection
# execute query
with sql_cursor() as cursor:
try:
cursor.execute('USE goggles')
cursor.execute('SELECT b.image_name, b.X_Min, b.Y_Min, b.X_Max, b.Y_Max, '
'b.init_vector, b.goggles from BBOX AS b, IMAGE as i where '
'b.image_name=i.image_name and i.image_date=%s and b.goggles=False', current_date)

for (image_name, x_min, y_min, x_max, y_max, init_vector, goggles) in cursor:
metadata.append({'image_name': image_name,
'x_min': float(x_min),
'y_min': float(y_min),
'x_max': float(x_max),
'y_max': float(y_max),
'init_vector': init_vector
})
except Exception as e:
print(e)

with open(METADATA_FILE, 'w') as meta_file:
json.dump(metadata, meta_file)
return metadata


def upload_files(metadata, dir, rclone_path, remote_name):
"""
For each filename returned by get_metadata, upload image
to Drive. Upload the day's metadata file.
@param metadata: the list of dictionaries returned by get_metadata
@param dir: the folder containing the images to upload
@param remote_name: name of remote location in rclone
"""

images = []
today = datetime.datetime.today().strftime('%Y-%m-%d')

# send images to the Drive
for image in metadata:
# prevent sending the same image twice (if two faces are detected)
if image not in images:
images.append(image)
image_path = os.path.join(dir, image['image_name'])
subprocess.run([rclone_path, 'copy', image_path, '{}:{}'.format(remote_name, today)])

# upload metadata.json to the Drive
subprocess.run([rclone_path, 'copy', METADATA_FILE, '{}:{}'.format(remote_name, today)])
os.remove(METADATA_FILE)


if __name__ == "__main__":
parser = argparse.ArgumentParser('Collect images.')
parser.add_argument('--directory', '-d', type=str, required=True, help='Folder containing images to upload')
parser.add_argument('--rclone_path', '-r', type=str, default='/local/b/embedvis/rclone-v1.52.2-linux-amd64/rclone',
help='Location of rclone binary. Default version on ee220clnx1 doesn\'t support copying to '
'shared folders.')
parser.add_argument('--remote_name', type=str, help='Name of remote location according to rclone config. You must '
'create your own config.')
args = parser.parse_args()

metadata = get_metadata()
upload_files(metadata, args.directory, args.rclone_path, args.remote_name)

exit(0)
42 changes: 42 additions & 0 deletions scripts/decrypt_images.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import argparse
import getpass
import json
import os

from src.jetson.AES import Encryption

"""
After having collect_images has run and the output folder has been downloaded,
decrypt the associated images.
This file is assumed to be on the end user's machine.
"""

# the metadata file generated by collect_images
METADATA_FILE = 'metadata.json'


def decrypt_images(dir):
# ask for decryption key
decrypt_key = getpass.getpass('Decryption password: ')

# convert to PKBDF2 or whatever

# make decryptor; probably changes once Jason finishes
decryptor = Encryption

with open(os.path.join(dir, METADATA_FILE)) as meta_file:
metadata = json.load(meta_file)
# use face coords to find where to decrypt in video frame
for image in metadata:
# TODO handle multiple faces in one frame. append to coords list
coords = [(image['x_min'], image['y_min'], image['x_max'], image['y_max'])]
init_vector = image['init_vector']
# overwrite encrypted image


if __name__ == "__main__":
parser = argparse.ArgumentParser('Decrypt images.')
parser.add_argument('--directory', '-d', type=str, required=True, help='Folder of images to be decrypted.')
args = parser.parse_args()

decrypt_images(args.directory)
7 changes: 5 additions & 2 deletions src/db/data_insertion.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
from decimal import Decimal
import datetime

# location where the images will be stored (on the HELPS machine)
IMAGE_DIR = '/local/b/embedvis/Nano_Images'


def data_insert(image_name: str, image_date: datetime, image_time: datetime, init_vecs: list, bboxes: list, input_dir: str, labels: list):
"""Transfer image to remote storage then inserts image metadata and bounding boxes data in database
Expand All @@ -18,8 +21,8 @@ def data_insert(image_name: str, image_date: datetime, image_time: datetime, ini
"""

# Below ftp transfer has been commented out for testing purposes
#with ftp_transfer() as transfer:
#transfer(input_dir, './Documents', image_name)
with ftp_transfer() as transfer:
transfer(input_dir, IMAGE_DIR, image_name)

sql_insert(IMAGE(image_name, image_date, image_time))

Expand Down
1 change: 0 additions & 1 deletion src/db/db_connection.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import mysql.connector
import datetime

from src.db.config import get_config
from contextlib import contextmanager, closing
Expand Down
6 changes: 4 additions & 2 deletions src/jetson/face_detector.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import os

import numpy as np
import torch

Expand Down Expand Up @@ -41,7 +43,7 @@ def __init__(self, detector: str, detector_type: str, detection_threshold=0.7, c

self.net = BlazeFace(self.device == torch.device("cuda:0"))
self.net.load_weights(detector)
self.net.load_anchors("models/BlazeFace/anchors.npy")
self.net.load_anchors(os.path.join(os.path.dirname(__file__), 'models/BlazeFace/anchors.npy'))
self.model_name = 'blazeface'
self.net.min_score_thresh = 0.75
self.net.min_suppression_threshold = 0.3
Expand Down Expand Up @@ -110,7 +112,7 @@ def detect(self,
xmax = detections[i, 3] * frame.shape[1]
conf = detections[i, 16]

transformed_frame = img / 127.5 - 1.0
transformed_frame = transformed_frame / 127.5 - 1.0

for k in range(6):
kp_x = detections[i, 4 + k * 2] * transformed_frame.shape[1]
Expand Down