-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e8642ae
commit c09b89d
Showing
31 changed files
with
2,298 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
*.npy | ||
*.png | ||
*.jpg | ||
*.jpeg | ||
*.json | ||
|
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
{ | ||
"cells": [ | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"This code converts from `.csv` files with matching `filenames.txt` and re-orders them and saves to `.npy` files in canonical order." | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 1, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"import numpy as np\n", | ||
"import pandas as pd\n", | ||
"import os\n", | ||
"\n", | ||
"def get_id(fn):\n", | ||
" return os.path.splitext(os.path.basename(fn))[0]\n", | ||
"\n", | ||
"def read_csv(fn):\n", | ||
" return pd.read_csv(fn, header=None).as_matrix()\n", | ||
"\n", | ||
"def csv_to_canonical_npy(canonical_fn, filenames_fn, csv_fn, npy_fn):\n", | ||
" canonical_filenames = open(canonical_fn).read().splitlines()\n", | ||
" data_filenames = open(filenames_fn).read().splitlines()\n", | ||
" data = read_csv(csv_fn)\n", | ||
" canonical_ids = [get_id(e) for e in canonical_filenames]\n", | ||
" data_ids = [get_id(e) for e in data_filenames]\n", | ||
" data_index = {key:i for i,key in enumerate(data_ids)}\n", | ||
" data_argsort = [data_index[e] for e in canonical_ids]\n", | ||
" data_canonical = data[data_argsort]\n", | ||
" np.save(npy_fn, data_canonical)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 2, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"canonical_filenames_fn = '../data/analysis/canonical_filename_order.txt'\n", | ||
"inception_filenames_fn = '../data/dcnn/inceptionv3/filenames.txt'\n", | ||
"vgg_filenames_fn = '../data/dcnn/vgg/filenames.txt'\n", | ||
"\n", | ||
"csv_to_canonical_npy(canonical_filenames_fn, inception_filenames_fn,\n", | ||
" '../data/dcnn/inceptionv3/predictions.csv',\n", | ||
" '../data/dcnn/inceptionv3/predictions_canonical.npy')\n", | ||
"\n", | ||
"csv_to_canonical_npy(canonical_filenames_fn, inception_filenames_fn,\n", | ||
" '../data/dcnn/inceptionv3/features.csv',\n", | ||
" '../data/dcnn/inceptionv3/features_canonical.npy')\n", | ||
"\n", | ||
"csv_to_canonical_npy(canonical_filenames_fn, vgg_filenames_fn,\n", | ||
" '../data/dcnn/vgg/features.csv',\n", | ||
" '../data/dcnn/vgg/features_canonical.npy')" | ||
] | ||
} | ||
], | ||
"metadata": { | ||
"kernelspec": { | ||
"display_name": "Python 3", | ||
"language": "python", | ||
"name": "python3" | ||
}, | ||
"language_info": { | ||
"codemirror_mode": { | ||
"name": "ipython", | ||
"version": 3 | ||
}, | ||
"file_extension": ".py", | ||
"mimetype": "text/x-python", | ||
"name": "python", | ||
"nbconvert_exporter": "python", | ||
"pygments_lexer": "ipython3", | ||
"version": "3.6.8" | ||
} | ||
}, | ||
"nbformat": 4, | ||
"nbformat_minor": 2 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
{ | ||
"cells": [ | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"This code defines the canonical order for all the files.\n", | ||
"\n", | ||
"It ingests:\n", | ||
"\n", | ||
"- A folder of all the images\n", | ||
"\n", | ||
"And outputs:\n", | ||
"\n", | ||
"- `analysis/filename_order.txt` with lines that look like `Box_014/445.png`\n", | ||
"- `analysis/filename_order_box.txt` with lines that look like `Box_014`\n", | ||
"- `analysis/filename_order_id.txt` with lines that look like `445`" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 18, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"from utils.list_all_files import *\n", | ||
"import numpy as np\n", | ||
"import re\n", | ||
"\n", | ||
"input_dir = '../data/photos/png1600'\n", | ||
"output_dir = '../data/analysis'\n", | ||
"\n", | ||
"def natural_sort_key(s, _nsre=re.compile('([0-9]+)')):\n", | ||
" return [int(text) if text.isdigit() else text.lower()\n", | ||
" for text in _nsre.split(s)]\n", | ||
"\n", | ||
"def get_box(fn):\n", | ||
" return os.path.split(fn)[0]\n", | ||
"\n", | ||
"def get_id(fn):\n", | ||
" return os.path.splitext(os.path.basename(fn))[0]\n", | ||
"\n", | ||
"filenames = list(list_all_files(input_dir))\n", | ||
"filenames = [os.path.relpath(e, input_dir) for e in filenames]\n", | ||
"filenames.sort(key=lambda fn: natural_sort_key(get_id(fn)))\n", | ||
"\n", | ||
"np.savetxt(os.path.join(output_dir, 'filename_order.txt'), filenames, fmt='%s')\n", | ||
"np.savetxt(os.path.join(output_dir, 'filename_order_box.txt'), list(map(get_box, filenames)), fmt='%s')\n", | ||
"np.savetxt(os.path.join(output_dir, 'filename_order_id.txt'), list(map(get_id, filenames)), fmt='%s')" | ||
] | ||
} | ||
], | ||
"metadata": { | ||
"kernelspec": { | ||
"display_name": "Python 3", | ||
"language": "python", | ||
"name": "python3" | ||
}, | ||
"language_info": { | ||
"codemirror_mode": { | ||
"name": "ipython", | ||
"version": 3 | ||
}, | ||
"file_extension": ".py", | ||
"mimetype": "text/x-python", | ||
"name": "python", | ||
"nbconvert_exporter": "python", | ||
"pygments_lexer": "ipython3", | ||
"version": "3.6.8" | ||
} | ||
}, | ||
"nbformat": 4, | ||
"nbformat_minor": 2 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,198 @@ | ||
{ | ||
"cells": [ | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"This code ingests:\n", | ||
"\n", | ||
"- A folder of `.json` files generated by OpenFace.\n", | ||
"- A folder of images in `Teenie_Harris_PNG1600`\n", | ||
"\n", | ||
"And outputs:\n", | ||
"\n", | ||
"- `images.npy` the cropped imags\n", | ||
"- `indices.npy` the index of face within the photo\n", | ||
"- `descriptors.npy` the OpenFace descriptor for the face\n", | ||
"- `filenames.csv` the filename the face was taken from\n", | ||
"\n", | ||
"Each file has the same number of rows." | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 1, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"import os\n", | ||
"import re\n", | ||
"import json\n", | ||
"import matplotlib.pyplot as plt\n", | ||
"from utils.imutil import *\n", | ||
"from utils.list_all_files import *\n", | ||
"from utils.crop import *\n", | ||
"from utils.progress import *\n", | ||
"from utils.mosaic import *\n", | ||
"from utils.draw_shapes import *" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 2, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"input_dir = '../data/openface/json/'\n", | ||
"output_dir = '../data/openface/npy32/'\n", | ||
"output_side = 32\n", | ||
"output_dtype = np.uint8 # the png1600 images are uint16 for some reason" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 3, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"59278 0:03:25 288.77/s\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"def natural_sort_key(s, _nsre=re.compile('([0-9]+)')):\n", | ||
" return [int(text) if text.isdigit() else text.lower()\n", | ||
" for text in _nsre.split(s)]\n", | ||
"\n", | ||
"def get_id(fn):\n", | ||
" return os.path.splitext(os.path.basename(fn))[0]\n", | ||
"\n", | ||
"tasks = []\n", | ||
"for input_fn in list_all_files(input_dir):\n", | ||
" tasks.append(input_fn)\n", | ||
"\n", | ||
"tasks.sort(key=lambda x: natural_sort_key(get_id(x)))\n", | ||
"\n", | ||
"def job(task):\n", | ||
" try:\n", | ||
" metadata = json.load(open(task))\n", | ||
" out = []\n", | ||
" img = imread(fn)\n", | ||
" for i, face in enumerate(metadata['faces']):\n", | ||
" w,n,e,s = face['box']\n", | ||
" # force it square\n", | ||
" rows = s - n\n", | ||
" cols = e - w\n", | ||
" side = min(rows, cols)\n", | ||
" s = n + side\n", | ||
" e = w + side\n", | ||
" face_img = safe_crop(img, n, s, w, e, fill=0)\n", | ||
" face_img = imresize(face_img, max_side=output_side)\n", | ||
" if output_dtype is not None:\n", | ||
" face_img = face_img.astype(output_dtype)\n", | ||
" face_rep = np.asarray(face['rep'])\n", | ||
" out.append((task, i, face_img, face_rep))\n", | ||
" return out\n", | ||
" except:\n", | ||
" print(task, metadata['path'], face['box'])\n", | ||
" raise\n", | ||
"\n", | ||
"results = progress_parallel(job, tasks)\n", | ||
"results = [item for sublist in results for item in sublist] # flatten results" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 4, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"input_filenames, face_indices, face_images, face_descriptors = list(zip(*results))\n", | ||
"face_images = np.asarray(face_images)\n", | ||
"face_descriptors = np.asarray(face_descriptors)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 5, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"os.makedirs(output_dir, exist_ok=True)\n", | ||
"np.save(os.path.join(output_dir, 'images.npy'), face_images)\n", | ||
"np.save(os.path.join(output_dir, 'indices.npy'), face_indices)\n", | ||
"np.save(os.path.join(output_dir, 'descriptors.npy'), face_descriptors)\n", | ||
"np.savetxt(os.path.join(output_dir, 'filenames.csv'), input_filenames, fmt='%s')" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 15, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"# imshow(make_mosaic(face_images[:495*495]), fmt='jpg')" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 50, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"data": { | ||
"image/png": "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\n", | ||
"text/plain": [ | ||
"<Figure size 432x288 with 1 Axes>" | ||
] | ||
}, | ||
"metadata": {}, | ||
"output_type": "display_data" | ||
}, | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"0.88043982329\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"plt.hist(results, bins=100)\n", | ||
"plt.show()\n", | ||
"results.sort()\n", | ||
"\n", | ||
"# plt.plot(results)\n", | ||
"# plt.yscale('log')\n", | ||
"# plt.show()\n", | ||
"\n", | ||
"# 88% of faces are smaller than 128 pixels\n", | ||
"print(np.sum(np.asarray(results) < output_side) / len(results))" | ||
] | ||
} | ||
], | ||
"metadata": { | ||
"kernelspec": { | ||
"display_name": "Python 3", | ||
"language": "python", | ||
"name": "python3" | ||
}, | ||
"language_info": { | ||
"codemirror_mode": { | ||
"name": "ipython", | ||
"version": 3 | ||
}, | ||
"file_extension": ".py", | ||
"mimetype": "text/x-python", | ||
"name": "python", | ||
"nbconvert_exporter": "python", | ||
"pygments_lexer": "ipython3", | ||
"version": "3.6.8" | ||
} | ||
}, | ||
"nbformat": 4, | ||
"nbformat_minor": 2 | ||
} |
Oops, something went wrong.