diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4d5f617 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +** +!*.py +!static/ +!config/ diff --git a/.gitignore b/.gitignore index b6e4761..9b7a254 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +data/ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..099caf3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8 + +RUN /usr/local/bin/python -m pip install --upgrade pip +RUN pip install --no-cache-dir \ + dash \ + plotly \ + scikit-image \ + pandas \ + gunicorn +RUN pip install --no-cache-dir requests + +RUN mkdir -p /app +RUN mkdir -p /app/static +WORKDIR /app + +ADD config/ /app/config +ADD *.py /app/ +ADD static/ /app/static/ + +ENTRYPOINT ["gunicorn", "-w", "1", "-b", "0.0.0.0:8050", "app:server"] \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app.py b/app.py index 241585a..a9131fa 100644 --- a/app.py +++ b/app.py @@ -1,213 +1,121 @@ +import flask import dash -import dash_core_components as dcc -import dash_html_components as html from dash.dependencies import Input, Output, State -import base64 import json -import os import matplotlib.cm -import matplotlib.colors as mcolors -import numpy as np -import random -import plotly.express as px -from skimage import data, transform - - -COLORMAP = 'plasma' -KEYPOINTS = ['Nose', 'L_Eye', 'R_Eye', 'L_Ear', 'R_Ear', 'Throat', - 'Withers', 'TailSet', 'L_F_Paw', 'R_F_Paw', 'L_F_Wrist', - 'R_F_Wrist', 'L_F_Elbow', 'R_F_Elbow', 'L_B_Paw', 'R_B_Paw', - 'L_B_Hock', 'R_B_Hock', 'L_B_Stiffle', 'R_B_Stiffle'] -N_SUBSET = 3 -IMAGE_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'full_dog.png') -encoded_image = base64.b64encode(open(IMAGE_PATH, 'rb').read()) - -img = data.chelsea() -img = img[::2, ::2] -images = [img, img[::-1], transform.rotate(img, 30)] -cmap = matplotlib.cm.get_cmap(COLORMAP, N_SUBSET) - - -def make_figure_image(i): - fig = px.imshow(images[i % len(images)]) - fig.layout.xaxis.showticklabels = False - fig.layout.yaxis.showticklabels = False - fig.update_traces(hoverinfo='none', hovertemplate='') - return fig - - -def draw_circle(center, radius, n_points=50): - pts = np.linspace(0, 2 * np.pi, n_points) - x = center[0] + radius * np.cos(pts) - y = center[1] + radius * np.sin(pts) - path = 'M ' + str(x[0]) + ',' + str(y[1]) - for k in range(1, x.shape[0]): - path += ' L ' + str(x[k]) + ',' + str(y[k]) - path += ' Z' - return path - - -def compute_circle_center(path): - """ - See Eqn 1 & 2 pp.12-13 in REGRESSIONS CONIQUES, QUADRIQUES - Régressions linéaires et apparentées, circulaire, sphérique - Jacquelin J., 2009. - """ - coords = [list(map(float, coords.split(','))) for coords in path.split(' ')[1::2]] - x, y = np.array(coords).T - n = len(x) - sum_x = np.sum(x) - sum_y = np.sum(y) - sum_x2 = np.sum(x * x) - sum_y2 = np.sum(y * y) - delta11 = n * np.dot(x, y) - sum_x * sum_y - delta20 = n * sum_x2 - sum_x ** 2 - delta02 = n * sum_y2 - sum_y ** 2 - delta30 = n * np.sum(x ** 3) - sum_x2 * sum_x - delta03 = n * np.sum(y ** 3) - sum_y * sum_y2 - delta21 = n * np.sum(x * x * y) - sum_x2 * sum_y - delta12 = n * np.sum(x * y * y) - sum_x * sum_y2 - - # Eqn 2, p.13 - num_a = (delta30 + delta12) * delta02 - (delta03 + delta21) * delta11 - num_b = (delta03 + delta21) * delta20 - (delta30 + delta12) * delta11 - den = 2 * (delta20 * delta02 - delta11 * delta11) - a = num_a / den - b = num_b / den - return a, b - - -def get_plotly_color(n): - return mcolors.to_hex(cmap(n)) - - -fig = make_figure_image(0) - -external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css'] - -app = dash.Dash(__name__, external_stylesheets=external_stylesheets) -server = app.server - -options = random.sample(KEYPOINTS, N_SUBSET) - -styles = { - 'pre': { - 'border': 'thin lightgrey solid', - 'overflowX': 'scroll' - } -} - -app.layout = html.Div([ - html.Div([ - dcc.Graph( - id='canvas', - config={'editable': True}, - figure=fig) - ], - className="six columns" - ), - html.Div([ - html.H2("Controls"), - dcc.RadioItems(id='radio', - options=[{'label': opt, 'value': opt} for opt in options], - value=options[0] - ), - html.Button('Previous', id='previous'), - html.Button('Next', id='next'), - html.Button('Clear', id='clear'), - html.Button('Save', id='save'), - dcc.Store(id='store', data=0), - html.P([ - html.Label('Keypoint label size'), - dcc.Slider(id='slider', - min=3, - max=36, - step=1, - value=12) - ], style={'width': '80%', - 'display': 'inline-block'}) - ], - className="six columns" - ), - html.Div([ - dcc.Markdown(""" - **Instructions**\n - Click on the image to add a keypoint. - """), - html.Pre(id='click-data', style=styles['pre']), - html.Img(src='data:image/png;charset=utf-8;base64,{}'.format(encoded_image)) - ], - className='six columns' - ), - html.Div(id='placeholder', style={'display': 'none'}), - html.Div(id='shapes', style={'display': 'none'}) -] -) +import utils, model, view +from config import Config + + +__version__ = "0.1" + +print(f"| Starting version {__version__}") + +config = Config('config/config.json') +db = model.AppModel(config=config) +cmap = matplotlib.cm.get_cmap('plasma', len(config.options)) +server = flask.Flask(__name__) +view = view.AppView(__name__, db=db, config=config, server=server) + + +@server.route('/csv/') +def fetch_csv(): + return db.to_csv() + + +@server.route('/overview/') +def fetch_html(): + return db.to_html() -@app.callback(Output('placeholder', 'children'), +@view.app.callback(Output('placeholder', 'children'), [Input('save', 'n_clicks')], [State('store', 'data')]) def save_data(click_s, ind_image): if click_s: - xy = {shape.name: compute_circle_center(shape.path) for shape in fig.layout.shapes} + xy = {shape.name: utils.compute_circle_center(shape.path) for shape in view.fig.layout.shapes} print(xy, ind_image) -@app.callback( +@view.app.callback( + Output('radio', 'options'), + [Input('next', 'n_clicks'), + Input('previous', 'n_clicks')] +) +def refresh_radio_buttons(click_n, click_p): + if not (click_n or click_p): + return dash.no_update + return view.refresh_radio_buttons() + + +def store_data(db, username, shapes): + for shape in shapes: + db.add_annotation( + name=shape.name, username=username, + xy=utils.compute_circle_center(shape.path) + ) + + +@view.app.callback( [Output('canvas', 'figure'), Output('radio', 'value'), Output('store', 'data'), - Output('shapes', 'children')], + Output('shapes', 'children'), + ], [Input('canvas', 'clickData'), Input('canvas', 'relayoutData'), Input('next', 'n_clicks'), Input('previous', 'n_clicks'), Input('clear', 'n_clicks'), - Input('slider', 'value')], + Input('slider', 'value'), + Input('input_name', 'value') + ], [State('canvas', 'figure'), State('radio', 'value'), State('store', 'data'), State('shapes', 'children')] ) -def update_image(clickData, relayoutData, click_n, click_p, click_c, slider_val, +def update_image(clickData, relayoutData, click_n, click_p, click_c, slider_val, username, figure, option, ind_image, shapes): + + # TODO Refactor: Remove if/else statements and instead write multiple + # callbacks. if not any(event for event in (clickData, click_n, click_p, click_c)): return dash.no_update, dash.no_update, dash.no_update, dash.no_update - - if ind_image is None: - ind_image = 0 - + + if ind_image is None: ind_image = 0 shapes = [] if shapes is None else json.loads(shapes) - n_bpt = options.index(option) ctx = dash.callback_context event = ctx.triggered[0]['prop_id'] button_id = event.split('.')[0] - if button_id == 'clear': - fig.layout.shapes = [] - fig.layout.xaxis.autorange = True - fig.layout.yaxis.autorange = 'reversed' - return make_figure_image(ind_image), options[0], ind_image, '[]' - elif button_id == 'next': - ind_image = (ind_image + 1) % len(images) - return make_figure_image(ind_image), options[0], ind_image, '[]' - elif button_id == 'previous': - ind_image = (ind_image - 1) % len(images) - return make_figure_image(ind_image), options[0], ind_image, '[]' - elif button_id == 'slider': + if button_id == 'slider': for i in range(len(shapes)): - center = compute_circle_center(shapes[i]['path']) - new_path = draw_circle(center, slider_val) + center = utils.compute_circle_center(shapes[i]['path']) + new_path = utils.draw_circle(center, slider_val) shapes[i]['path'] = new_path + elif button_id in ['clear', 'next', 'previous']: + if button_id == 'clear': + view.fig.layout.shapes = [] + view.fig.layout.xaxis.autorange = True + view.fig.layout.yaxis.autorange = 'reversed' + elif button_id == 'next': + ind_image = (ind_image + 1) % len(db.dataset) + store_data(db, username, view.fig.layout.shapes) + elif button_id == 'previous': + ind_image = (ind_image - 1) % len(db.dataset) + store_data(db, username, view.fig.layout.shapes) + return view.make_figure_image(ind_image), view.options[0], ind_image, '[]' already_labeled = [shape['name'] for shape in shapes] - key = list(relayoutData)[0] + keys = list(relayoutData) if relayoutData else [] + key = keys[0] if len(keys) > 0 else "" if option not in already_labeled and button_id != 'slider' and 'relayout' not in event: if clickData: x, y = clickData['points'][0]['x'], clickData['points'][0]['y'] - circle = draw_circle((x, y), slider_val) - color = get_plotly_color(n_bpt) + circle = utils.draw_circle((x, y), slider_val) + ind_bpt = config.options.index(option) + color = utils.get_plotly_color(cmap, ind_bpt) shape = dict(type='path', path=circle, line_color=color, @@ -216,29 +124,35 @@ def update_image(clickData, relayoutData, click_n, click_p, click_c, slider_val, opacity=0.8, name=option) shapes.append(shape) + #db.add_annotation( + # name=option, username=username, + # xy=utils.compute_circle_center(circle) + #) else: if 'path' in key and button_id != 'slider': ind_moving = int(key.split('[')[1].split(']')[0]) path = relayoutData.pop(key) shapes[ind_moving]['path'] = path - fig.update_layout(shapes=shapes) + view.fig.update_layout(shapes=shapes) + if 'range[' in key and 'clickData' not in event: xrange = relayoutData['xaxis.range[0]'], relayoutData['xaxis.range[1]'] yrange = sorted((relayoutData['yaxis.range[0]'], relayoutData['yaxis.range[1]']), reverse=True) - fig.update_xaxes(range=xrange, autorange=False) - fig.update_yaxes(range=yrange, autorange=False) + view.fig.update_xaxes(range=xrange, autorange=False) + view.fig.update_yaxes(range=yrange, autorange=False) elif 'autorange' in key: - fig.update_xaxes(autorange=True) - fig.update_yaxes(autorange='reversed') + view.fig.update_xaxes(autorange=True) + view.fig.update_yaxes(autorange='reversed') + n_bpt = view.options.index(option) if option in view.options else 0 if button_id != 'slider' and 'relayout' not in event: n_bpt += 1 - new_option = options[min(len(options) - 1, n_bpt)] - return ({'data': figure['data'], 'layout': fig['layout']}, + new_option = view.options[min(len(view.options) - 1, n_bpt)] + return ({'data': figure['data'], 'layout': view.fig['layout']}, new_option, ind_image, json.dumps(shapes)) if __name__ == '__main__': - app.run_server(debug=False, port=8051) + view.app.run_server(debug=False, port=8051) diff --git a/config.py b/config.py new file mode 100644 index 0000000..a04cd84 --- /dev/null +++ b/config.py @@ -0,0 +1,13 @@ +import json +import os.path as osp +import glob + + +class Config: + def __init__(self, config): + assert osp.exists(config) + + with open(config, "r") as fp: + for key, val in json.load(fp).items(): + setattr(self, key, val) + self.fnames = glob.glob('data/*.png') diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..537de18 --- /dev/null +++ b/config/config.json @@ -0,0 +1,53 @@ + { + "abbrv" : { + "L" : "Left", + "R" : "Right", + "F" : "Front", + "B" : "Back" + }, + "options" : [ + "Nose", + "L_Eye", + "R_Eye", + "L_Ear", + "R_Ear", + "Throat", + "Withers", + "TailSet", + "L_F_Paw", + "R_F_Paw", + "L_F_Wrist", + "R_F_Wrist", + "L_F_Elbow", + "R_F_Elbow", + "L_B_Paw", + "R_B_Paw", + "L_B_Hock", + "R_B_Hock", + "L_B_Stiffle", + "R_B_Stiffle" + ], + "cmap" : [ + "15188B", + "3B1C9D", + "591FA7", + "7C21AA", + "7822A9", + "9124A5", + "BD358A", + "CD4877", + "D9586C", + "EA7058", + "F89142", + "FDAA34", + "FDC727", + "FED525", + "1F948C", + "2CB17C", + "50C56A", + "97DA3D", + "BBDF27" + ], + "urls" : "config/filelist.lst", + "n2show" : 5 +} \ No newline at end of file diff --git a/config/filelist.lst b/config/filelist.lst new file mode 100644 index 0000000..4323823 --- /dev/null +++ b/config/filelist.lst @@ -0,0 +1,68 @@ +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/1de4a9e537_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/1f64955634_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/2feb30f208_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/4f824d3dcd_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/6b2261888d_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/6c9d29d509_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/52355da42f_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/a973f239cd_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/ad397527b2_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/aed4e0b4c4_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/ce25872021_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/de6a9382ca_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/de36b216da_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/ef0061a309_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/bear/fb5ba7ad6e_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/0a7a2514aa_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/3f3b15f083_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/5c7668855e_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/7e2f212fd3_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/8d4ab94e1c_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/8eb0d315c1_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/69f0af42a6_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/1187bbd0e3_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/ad573f7d31_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/b96c57d2c7_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/bf961167a6_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/cd47a23e31_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/d6c1b5749e_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/ec1299aee4_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/cat/eeed0c7d73_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/0d97fba242_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/6acc6049d9_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/6c99ea7c31_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/6ecad29e52_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/8a4a2fc105_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/8b518ee936_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/8e478e73f3_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/9b22b54ee4_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/9b473fc8fe_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/19e8bc6178_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/30dbdb2cd6_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/49fbf0c98a_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/65ab7e1d98_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/73c6ae7711_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/80c4a94706_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/86a8ae4223_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/247d729e36_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/823e7a86e8_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/868d6a0685_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/2465bf515d_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/47269e0499_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/49972c2d14_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/72690ef572_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/aa45f1caaf_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/b0df7c5c5c_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/b72ac6e10b_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/bb337f9830_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/bda224cb25_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/c0e8d4635c_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/c7a1a17308_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/c52bce43db_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/c2406ae462_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/caecf0a5db_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/d292a50c7f_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/dd9fe6c6ac_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/e23cca5244_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/ed8f814b2b_frame015.png +http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/dog/fcfd81727f_frame015.png \ No newline at end of file diff --git a/createfilelist.py b/createfilelist.py new file mode 100644 index 0000000..dafb1be --- /dev/null +++ b/createfilelist.py @@ -0,0 +1,51 @@ +from bs4 import BeautifulSoup +import requests + +url = 'http://deeplabcut.rowland.harvard.edu/datasets/animal_ytVOS_images/images_jpg/' +ext = 'iso' + +animals=['dog','cat','bear'] +def write(data,fn="filelist.lst"): + with open("filelist.lst", "w") as f: + for s in data: + f.write(str(s) +"\n") + +def read(fn="filelist.lst"): + with open("filelist.lst", "r") as f: + for line in f: + score.append(int(line.strip())) + +def listurl(url,animals=None, ext=''): + page = requests.get(url).text + soup = BeautifulSoup(page, 'html.parser') + all=[url + '/' + node.get('href') for node in soup.find_all('a') if node.get('href').endswith(ext)] + if animals is not None: #then filter + urls=[] + for a in all: + for animal in animals: + if animal in str(a): + urls.append(a) + else: + urls=all + return urls + +def listimgurl(url,imtype='.jpg', ext=''): + page = requests.get(url).text + soup = BeautifulSoup(page, 'html.parser') + all=[url + '/' + node.get('href') for node in soup.find_all('a') if node.get('href').endswith(ext)] + if animals is not None: #then filter + urls=[] + for a in all: + if imtype in str(a): + urls.append(a) + else: + urls=all + return urls + +allanimalurls=listurl(url,animals) + +imlist=[] +for allanimalurl in allanimalurls: + imlist.extend(listimgurl(allanimalurl)) + +write(imlist,fn="filelist.lst") diff --git a/custom_types.py b/custom_types.py new file mode 100644 index 0000000..d030b23 --- /dev/null +++ b/custom_types.py @@ -0,0 +1,4 @@ +from collections import namedtuple + + +Image = namedtuple("Image", ["fname", "image"]) diff --git a/exampleinterface.py b/exampleinterface.py deleted file mode 100644 index 28e9fbd..0000000 --- a/exampleinterface.py +++ /dev/null @@ -1,24 +0,0 @@ -#interface to dlc - -import deeplabcut, os -import pandas as pd -from pathlib import Path - -cfgpath='/home/alex/Hacking/DeepLabCut-WebApp/openfield-Pranav-2018-10-30/config.yaml' -deeplabcut.create_project.demo_data.load_demo_data(cfgpath,createtrainingset=False) - - -cfg = deeplabcut.auxiliaryfunctions.read_config(cfgpath) - - -videos = cfg['video_sets'].keys() -#video_names = [Path(i).stem for i in videos] -alldatafolders = [fn for fn in os.listdir(Path(cfgpath).parent / 'labeled-data') if '_labeled' not in fn] - -print("Bodyparts to label...", cfg['bodyparts']) -print("Labeled-data contains:", len(alldatafolders)) - -datafolder=alldatafolders[0] -#loading data -dataFrame = pd.read_hdf(os.path.join(cfg['project_path'],'labeled-data',datafolder,'CollectedData_'+cfg['scorer']+'.h5'),'df_with_missing') -print(dataFrame.head()) diff --git a/model.py b/model.py new file mode 100644 index 0000000..8de243e --- /dev/null +++ b/model.py @@ -0,0 +1,74 @@ +import custom_types +import pandas as pd +import random +import time +from skimage import io + + + +class User: + """ Each user has a separate view on the labels and can label each image once """ + + def __init__(self, name): + self.name = name + + def add_annotation(self): + pass + + def to_csv(self): + return None + + +class Dataset: + """ Handles async data fetching """ + + def __init__(self, fnames): + self.fnames = fnames + random.shuffle(self.fnames) + self.data = io.imread_collection(self.fnames) + + def __getitem__(self, index): + if index >= len(self): + raise StopIteration + + # TODO revert this at some point + img = self.data[index][::5, ::5] + return custom_types.Image(fname=self.fnames[index], image=img) + + def __len__(self): + return len(self.fnames) + + +class AppModel: + + def __init__(self, config): + + self.config = config + self.users = [] + self.dataset = Dataset(self.config.fnames) + self.annotations = [] + self.active_image = None + + def add_user(self, name): + print(f"| Added user: {name}") + self.users.append(User(name)) + + def add_annotation(self, name, username, xy): + self.annotations.append(dict( + name=self.active_image.fname, + label=name, + x=xy[0], + y=xy[1], + username=username, + timestamp=time.time()) + ) + + def fetch_image(self, index): + self.active_image = self.dataset[index] + return self.active_image + + def to_csv(self): + return pd.DataFrame(self.annotations).to_csv() + + def to_html(self): + return pd.DataFrame(self.annotations).to_html() \ No newline at end of file diff --git a/openfield-Pranav-2018-10-30/config.yaml b/openfield-Pranav-2018-10-30/config.yaml deleted file mode 100644 index 64c2ce1..0000000 --- a/openfield-Pranav-2018-10-30/config.yaml +++ /dev/null @@ -1,49 +0,0 @@ -# Project definitions (do not edit) -Task: openfield -scorer: Pranav -date: Oct30 - -# Project path (change when moving around) -project_path: WILL BE AUTOMATICALLY UPDATED BY DEMO CODE - -# Annotation data set configuration (and individual video cropping parameters) -video_sets: - WILL BE AUTOMATICALLY UPDATED BY DEMO CODE: - crop: 0, 640, 0, 480 -bodyparts: -- snout -- leftear -- rightear -- tailbase - -start: 0 -stop: 1 -numframes2pick: 20 - -# Plotting configuration -pcutoff: 0.4 -dotsize: 8 -alphavalue: 0.7 -colormap: jet - -# Training,Evaluation and Analysis configuration -TrainingFraction: -- 0.95 -iteration: 0 -default_net_type: resnet_50 -snapshotindex: -1 -batch_size: 4 - -# Cropping Parameters (for analysis and outlier frame detection) -cropping: false -#if cropping is true for analysis, then set the values here: -x1: 0 -x2: 640 -y1: 277 -y2: 624 - -# Refinement configuration (parameters from annotation dataset configuration also relevant in this stage) -corner2move2: -- 50 -- 50 -move2corner: true diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/.~lock.CollectedData_Pranav.csv# b/openfield-Pranav-2018-10-30/labeled-data/m4s1/.~lock.CollectedData_Pranav.csv# deleted file mode 100644 index 88d97b6..0000000 --- a/openfield-Pranav-2018-10-30/labeled-data/m4s1/.~lock.CollectedData_Pranav.csv# +++ /dev/null @@ -1 +0,0 @@ -,alex,T440s,26.02.2020 19:00,file:///home/alex/.config/libreoffice/4; \ No newline at end of file diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/CollectedData_Pranav.csv b/openfield-Pranav-2018-10-30/labeled-data/m4s1/CollectedData_Pranav.csv deleted file mode 100644 index d9d4f56..0000000 --- a/openfield-Pranav-2018-10-30/labeled-data/m4s1/CollectedData_Pranav.csv +++ /dev/null @@ -1,119 +0,0 @@ -scorer,Pranav,Pranav,Pranav,Pranav,Pranav,Pranav,Pranav,Pranav -bodyparts,snout,snout,leftear,leftear,rightear,rightear,tailbase,tailbase -coords,x,y,x,y,x,y,x,y -labeled-data/m4s1/img0000.png,21.521,265.428,33.819,265.941,19.984,250.05599999999998,87.11,152.69799999999998 -labeled-data/m4s1/img0001.png,10.248,288.487,19.984,297.198,12.298,281.313,95.821,221.361 -labeled-data/m4s1/img0002.png,24.596,354.075,38.431,354.075,23.058000000000003,337.166,99.40799999999999,256.205 -labeled-data/m4s1/img0003.png,73.78699999999999,374.57199999999995,78.911,366.37300000000005,57.39,361.76099999999997,106.581,270.04 -labeled-data/m4s1/img0004.png,38.431,333.066,50.729,341.777,39.968,323.33099999999996,131.17700000000002,273.627 -labeled-data/m4s1/img0005.png,23.570999999999998,327.43,30.745,339.215,28.183000000000003,321.793,131.17700000000002,318.719 -labeled-data/m4s1/img0006.png,42.53,332.042,48.167,337.67800000000005,46.629,323.33099999999996,147.57399999999998,316.157 -labeled-data/m4s1/img0007.png,63.026,333.066,70.71300000000001,341.265,67.638,324.868,173.707,316.66900000000004 -labeled-data/m4s1/img0008.png,95.821,334.60400000000004,104.01899999999999,343.827,100.432,326.405,209.063,317.694 -labeled-data/m4s1/img0009.png,113.755,318.207,120.416,332.042,122.978,313.082,235.709,320.256 -labeled-data/m4s1/img0010.png,54.828,339.728,64.051,348.439,59.44,329.48,177.294,326.405 -labeled-data/m4s1/img0011.png,32.282,383.795,40.993,388.407,30.745,370.472,134.764,331.017 -labeled-data/m4s1/img0012.png,28.183000000000003,440.16,39.968,441.69699999999995,27.67,426.837,109.14299999999999,358.175 -labeled-data/m4s1/img0013.png,92.74600000000001,460.657,93.771,449.384,73.78699999999999,445.284,125.54,358.68699999999995 -labeled-data/m4s1/img0014.png,24.083000000000002,423.251,35.356,431.449,28.695,412.49,130.665,390.45599999999996 -labeled-data/m4s1/img0015.png,24.083000000000002,395.06800000000004,32.282,406.341,29.206999999999997,386.35699999999997,136.30100000000002,405.316 -labeled-data/m4s1/img0016.png,28.183000000000003,430.42400000000004,37.918,439.648,30.232,422.226,137.838,418.639 -labeled-data/m4s1/img0017.png,49.191,430.93699999999995,57.39,440.673,50.216,425.81300000000005,156.797,413.515 -labeled-data/m4s1/img0018.png,66.101,433.499,74.29899999999999,444.772,68.15100000000001,425.81300000000005,176.78099999999998,415.05199999999996 -labeled-data/m4s1/img0019.png,86.085,435.036,95.821,444.772,89.15899999999999,426.837,200.352,417.102 -labeled-data/m4s1/img0020.png,103.507,446.82099999999997,115.292,451.94599999999997,106.581,436.061,218.287,417.61400000000003 -labeled-data/m4s1/img0021.png,53.803000000000004,437.086,64.564,448.35900000000004,58.927,428.375,175.24400000000003,425.3 -labeled-data/m4s1/img0022.png,26.645,435.548,36.381,448.871,32.794000000000004,428.375,147.062,441.69699999999995 -labeled-data/m4s1/img0023.png,29.206999999999997,407.87800000000004,34.330999999999996,424.275,39.968,405.829,146.037,448.35900000000004 -labeled-data/m4s1/img0024.png,22.546,419.151,29.206999999999997,427.35,26.645,410.44,136.813,437.086 -labeled-data/m4s1/img0025.png,18.959,425.3,26.645,437.086,23.570999999999998,416.077,135.276,431.962 -labeled-data/m4s1/img0026.png,25.108,443.235,31.769000000000002,448.871,28.695,430.93699999999995,135.789,438.62300000000005 -labeled-data/m4s1/img0027.png,41.505,413.515,45.092,432.474,49.70399999999999,415.05199999999996,159.359,442.722 -labeled-data/m4s1/img0028.png,17.422,399.167,26.645,415.05199999999996,29.72,398.655,133.739,437.086 -labeled-data/m4s1/img0029.png,30.745,428.88699999999994,37.406,438.62300000000005,34.844,419.664,142.96200000000002,430.42400000000004 -labeled-data/m4s1/img0030.png,55.853,434.524,61.489,444.259,57.39,428.88699999999994,166.533,430.42400000000004 -labeled-data/m4s1/img0031.png,81.986,437.598,89.15899999999999,445.284,84.035,429.912,195.22799999999998,430.93699999999995 -labeled-data/m4s1/img0032.png,98.895,448.35900000000004,109.656,452.97,100.945,437.598,217.262,429.912 -labeled-data/m4s1/img0033.png,43.555,442.21,51.753,449.384,47.653999999999996,432.474,162.434,442.722 -labeled-data/m4s1/img0034.png,25.62,437.086,33.306999999999995,446.309,30.745,428.88699999999994,144.5,438.62300000000005 -labeled-data/m4s1/img0035.png,40.993,419.664,38.943000000000005,445.79699999999997,41.505,425.81300000000005,149.624,446.309 -labeled-data/m4s1/img0036.png,57.902,421.20099999999996,57.902,446.309,57.39,428.375,172.17,447.846 -labeled-data/m4s1/img0037.png,78.911,420.176,79.936,446.82099999999997,79.936,428.375,196.765,447.334 -labeled-data/m4s1/img0038.png,105.044,424.275,109.656,448.871,115.805,427.35,229.047,449.89599999999996 -labeled-data/m4s1/img0039.png,77.88600000000001,428.88699999999994,87.62200000000001,445.284,87.62200000000001,427.86199999999997,209.576,450.408 -labeled-data/m4s1/img0040.png,50.216,381.233,50.216,405.316,64.051,384.30699999999996,159.872,448.35900000000004 -labeled-data/m4s1/img0041.png,71.737,307.95799999999997,51.753,333.066,71.225,329.48,119.904,426.325 -labeled-data/m4s1/img0042.png,73.78699999999999,203.42700000000002,56.878,223.923,74.29899999999999,220.33599999999998,92.74600000000001,341.265 -labeled-data/m4s1/img0043.png,96.333,104.01899999999999,74.29899999999999,118.367,95.30799999999999,116.829,100.432,234.171 -labeled-data/m4s1/img0044.png,71.737,89.15899999999999,70.71300000000001,102.48200000000001,83.523,88.135,111.705,198.815 -labeled-data/m4s1/img0045.png,38.431,72.25,41.505,81.986,48.167,66.101,129.127,140.4 -labeled-data/m4s1/img0046.png,17.422,66.613,22.034000000000002,80.44800000000001,28.183000000000003,60.977,120.929,106.581 -labeled-data/m4s1/img0047.png,24.083000000000002,64.051,29.206999999999997,78.911,34.844,59.44,128.102,97.35799999999999 -labeled-data/m4s1/img0048.png,19.984,73.78699999999999,21.521,85.572,31.256999999999998,65.07600000000001,125.02799999999999,89.67200000000001 -labeled-data/m4s1/img0049.png,23.058000000000003,78.399,28.183000000000003,89.67200000000001,34.330999999999996,71.225,134.251,90.697 -labeled-data/m4s1/img0050.png,24.596,92.234,31.256999999999998,102.994,32.794000000000004,79.936,146.549,83.01 -labeled-data/m4s1/img0051.png,19.472,79.42399999999999,27.158,91.721,29.206999999999997,72.25,132.714,82.49799999999999 -labeled-data/m4s1/img0052.png,18.959,73.275,26.133000000000003,84.035,33.306999999999995,63.538999999999994,134.764,84.035 -labeled-data/m4s1/img0053.png,27.158,73.78699999999999,29.206999999999997,85.06,34.844,69.175,143.475,88.135 -labeled-data/m4s1/img0054.png,57.902,73.78699999999999,59.952,83.523,65.07600000000001,67.638,177.294,84.54799999999999 -labeled-data/m4s1/img0055.png,84.54799999999999,70.71300000000001,88.135,81.473,93.771,63.026,207.014,84.54799999999999 -labeled-data/m4s1/img0056.png,92.234,73.275,97.87,80.44800000000001,100.945,63.538999999999994,210.6,85.06 -labeled-data/m4s1/img0057.png,58.415,72.762,63.026,83.01,68.15100000000001,63.026,174.732,76.861 -labeled-data/m4s1/img0058.png,81.473,116.829,90.697,112.21799999999999,77.88600000000001,93.771,182.93,83.01 -labeled-data/m4s1/img0059.png,40.993,140.91299999999998,52.778,143.475,45.092,126.565,153.72299999999998,83.523 -labeled-data/m4s1/img0060.png,32.282,207.014,43.555,202.91400000000002,27.158,187.542,109.14299999999999,112.73 -labeled-data/m4s1/img0061.png,30.745,293.611,41.505,286.437,24.083000000000002,274.652,75.837,168.583 -labeled-data/m4s1/img0062.png,51.753,354.075,65.58800000000001,349.464,45.092,336.653,87.11,228.02200000000002 -labeled-data/m4s1/img0063.png,43.555,387.38199999999995,54.828,386.869,38.431,376.621,94.796,281.825 -labeled-data/m4s1/img0064.png,117.34200000000001,407.87800000000004,111.705,398.655,91.721,405.829,100.945,294.123 -labeled-data/m4s1/img0065.png,87.11,429.912,97.35799999999999,427.86199999999997,81.986,418.639,125.02799999999999,306.934 -labeled-data/m4s1/img0066.png,29.206999999999997,422.226,39.455999999999996,426.837,31.769000000000002,411.465,130.665,373.54699999999997 -labeled-data/m4s1/img0067.png,50.216,318.207,37.918,344.339,55.853,330.504,135.276,408.903 -labeled-data/m4s1/img0068.png,59.44,217.262,47.141999999999996,238.271,62.001999999999995,228.535,92.74600000000001,348.439 -labeled-data/m4s1/img0069.png,52.778,107.094,39.455999999999996,126.565,54.315,116.829,78.399,234.171 -labeled-data/m4s1/img0070.png,76.34899999999999,71.225,62.001999999999995,83.523,80.961,76.34899999999999,100.945,180.368 -labeled-data/m4s1/img0071.png,91.721,65.58800000000001,82.49799999999999,75.837,99.40799999999999,70.71300000000001,117.854,176.269 -labeled-data/m4s1/img0072.png,108.631,64.564,100.432,75.837,119.39200000000001,69.688,136.30100000000002,175.757 -labeled-data/m4s1/img0073.png,132.714,61.489,121.954,72.25,143.987,66.613,161.409,175.24400000000003 -labeled-data/m4s1/img0074.png,163.459,62.513999999999996,150.136,71.225,171.145,67.638,186.517,174.732 -labeled-data/m4s1/img0075.png,152.69799999999998,62.513999999999996,149.111,76.861,167.046,64.564,214.7,164.484 -labeled-data/m4s1/img0076.png,113.243,60.977,116.829,76.34899999999999,128.615,56.365,215.725,121.441 -labeled-data/m4s1/img0077.png,54.828,74.812,60.977,83.01,67.126,66.101,171.145,91.721 -labeled-data/m4s1/img0078.png,23.058000000000003,94.796,29.72,102.48200000000001,30.232,84.035,136.813,85.572 -labeled-data/m4s1/img0079.png,18.447,80.961,23.570999999999998,91.721,27.158,71.225,126.053,85.06 -labeled-data/m4s1/img0080.png,26.133000000000003,143.475,36.894,139.376,26.645,120.416,125.02799999999999,80.961 -labeled-data/m4s1/img0081.png,25.108,194.71599999999998,36.894,195.74099999999999,25.62,176.269,112.21799999999999,104.01899999999999 -labeled-data/m4s1/img0082.png,15.372,177.294,29.206999999999997,186.005,23.058000000000003,163.459,120.929,131.689 -labeled-data/m4s1/img0083.png,35.869,177.294,43.555,183.955,39.968,166.021,143.475,133.739 -labeled-data/m4s1/img0084.png,57.902,175.757,68.15100000000001,183.955,64.564,162.946,169.095,134.764 -labeled-data/m4s1/img0085.png,81.986,176.269,90.184,182.418,87.62200000000001,163.459,196.765,134.251 -labeled-data/m4s1/img0086.png,126.053,193.179,134.251,189.592,119.904,173.707,223.41099999999997,135.276 -labeled-data/m4s1/img0087.png,95.821,184.468,105.044,192.15400000000002,102.48200000000001,171.657,221.361,153.211 -labeled-data/m4s1/img0088.png,49.191,166.533,52.778,175.24400000000003,56.878,157.31,173.195,167.046 -labeled-data/m4s1/img0089.png,23.570999999999998,113.755,29.206999999999997,122.978,33.819,106.581,133.227,158.335 -labeled-data/m4s1/img0090.png,23.570999999999998,161.922,30.232,165.50799999999998,29.206999999999997,145.524,134.764,137.326 -labeled-data/m4s1/img0091.png,21.009,259.79200000000003,35.869,255.69299999999998,16.91,241.345,87.62200000000001,151.161 -labeled-data/m4s1/img0092.png,24.596,346.902,36.894,343.827,19.472,331.017,72.25,229.56 -labeled-data/m4s1/img0093.png,19.472,390.969,32.282,393.01800000000003,19.472,380.208,81.473,295.661 -labeled-data/m4s1/img0094.png,28.183000000000003,410.44,36.381,412.49,27.67,400.705,105.556,339.215 -labeled-data/m4s1/img0095.png,22.546,426.837,35.869,429.912,23.570999999999998,418.639,105.556,356.125 -labeled-data/m4s1/img0096.png,47.141999999999996,446.82099999999997,57.902,447.334,45.604,435.036,129.127,385.845 -labeled-data/m4s1/img0097.png,49.191,406.341,55.853,436.57300000000004,56.365,413.00199999999995,150.649,394.556 -labeled-data/m4s1/img0098.png,23.058000000000003,386.869,29.72,411.465,33.819,389.43199999999996,134.764,424.275 -labeled-data/m4s1/img0099.png,42.018,388.91900000000004,44.58,406.853,49.191,387.38199999999995,149.624,425.81300000000005 -labeled-data/m4s1/img0100.png,72.25,391.481,72.25,409.416,86.085,387.894,179.343,424.788 -labeled-data/m4s1/img0101.png,94.796,388.91900000000004,96.333,408.903,103.507,391.994,204.96400000000003,425.81300000000005 -labeled-data/m4s1/img0102.png,95.30799999999999,406.341,104.01899999999999,399.167,105.044,419.151,219.31099999999998,426.837 -labeled-data/m4s1/img0103.png,86.59700000000001,333.579,75.837,362.274,88.135,346.902,176.269,413.515 -labeled-data/m4s1/img0104.png,44.067,259.79200000000003,42.018,278.751,53.291000000000004,261.329,122.978,360.73699999999997 -labeled-data/m4s1/img0105.png,59.44,170.12,41.505,191.641,57.902,180.368,96.333,293.098 -labeled-data/m4s1/img0106.png,79.42399999999999,90.184,58.415,100.945,79.42399999999999,97.35799999999999,80.44800000000001,212.65 -labeled-data/m4s1/img0107.png,145.524,90.184,117.854,94.28299999999999,139.376,99.40799999999999,108.118,208.551 -labeled-data/m4s1/img0108.png,232.63400000000001,75.324,204.96400000000003,81.473,225.46,97.87,143.987,187.542 -labeled-data/m4s1/img0109.png,139.376,84.035,138.863,97.87,154.748,85.572,180.88099999999997,192.15400000000002 -labeled-data/m4s1/img0110.png,76.34899999999999,75.837,81.473,91.721,91.721,73.78699999999999,189.592,132.714 -labeled-data/m4s1/img0111.png,30.745,65.58800000000001,35.356,79.42399999999999,42.53,60.977,138.863,97.87 -labeled-data/m4s1/img0112.png,29.206999999999997,104.53200000000001,36.894,109.14299999999999,36.894,89.67200000000001,143.987,89.15899999999999 -labeled-data/m4s1/img0113.png,30.232,188.567,39.968,181.393,27.67,167.046,112.21799999999999,96.845 -labeled-data/m4s1/img0114.png,26.645,262.35400000000004,38.431,262.35400000000004,24.596,248.519,84.54799999999999,155.773 -labeled-data/m4s1/img0115.png,65.58800000000001,321.281,72.25,312.058,52.778,306.934,92.74600000000001,192.15400000000002 diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/CollectedData_Pranav.h5 b/openfield-Pranav-2018-10-30/labeled-data/m4s1/CollectedData_Pranav.h5 deleted file mode 100644 index ddf9d4d..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/CollectedData_Pranav.h5 and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0000.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0000.png deleted file mode 100755 index a26a0f3..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0000.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0001.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0001.png deleted file mode 100755 index 31c900d..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0001.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0002.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0002.png deleted file mode 100755 index cb43d4b..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0002.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0003.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0003.png deleted file mode 100755 index e0cd63c..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0003.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0004.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0004.png deleted file mode 100755 index 6f840ce..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0004.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0005.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0005.png deleted file mode 100755 index 400cec1..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0005.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0006.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0006.png deleted file mode 100755 index e935232..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0006.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0007.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0007.png deleted file mode 100755 index 739e005..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0007.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0008.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0008.png deleted file mode 100755 index 804ce8b..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0008.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0009.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0009.png deleted file mode 100755 index 80ecc49..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0009.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0010.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0010.png deleted file mode 100755 index bf8fdfe..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0010.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0011.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0011.png deleted file mode 100755 index bffac9d..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0011.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0012.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0012.png deleted file mode 100755 index 8354201..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0012.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0013.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0013.png deleted file mode 100755 index e3894ea..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0013.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0014.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0014.png deleted file mode 100755 index c398245..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0014.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0015.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0015.png deleted file mode 100755 index 5f40f72..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0015.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0016.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0016.png deleted file mode 100755 index fb07b76..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0016.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0017.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0017.png deleted file mode 100755 index 827c223..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0017.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0018.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0018.png deleted file mode 100755 index 72a1d73..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0018.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0019.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0019.png deleted file mode 100755 index 1ad8c88..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0019.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0020.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0020.png deleted file mode 100755 index bd52397..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0020.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0021.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0021.png deleted file mode 100755 index ce7cbbd..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0021.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0022.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0022.png deleted file mode 100755 index e7a556d..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0022.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0023.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0023.png deleted file mode 100755 index 2a47272..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0023.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0024.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0024.png deleted file mode 100755 index 4d88b19..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0024.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0025.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0025.png deleted file mode 100755 index 7b42ed7..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0025.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0026.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0026.png deleted file mode 100755 index 7462f10..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0026.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0027.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0027.png deleted file mode 100755 index 13e4b76..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0027.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0028.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0028.png deleted file mode 100755 index c611128..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0028.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0029.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0029.png deleted file mode 100755 index 6b226fe..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0029.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0030.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0030.png deleted file mode 100755 index 58c2dac..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0030.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0031.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0031.png deleted file mode 100755 index 078f5bd..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0031.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0032.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0032.png deleted file mode 100755 index 9db75fc..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0032.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0033.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0033.png deleted file mode 100755 index 44db9bf..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0033.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0034.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0034.png deleted file mode 100755 index 1b542bd..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0034.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0035.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0035.png deleted file mode 100755 index 2b19830..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0035.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0036.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0036.png deleted file mode 100755 index 3dab10f..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0036.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0037.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0037.png deleted file mode 100755 index 8c0ef35..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0037.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0038.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0038.png deleted file mode 100755 index d869701..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0038.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0039.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0039.png deleted file mode 100755 index 8b2d4a6..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0039.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0040.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0040.png deleted file mode 100755 index 8663463..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0040.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0041.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0041.png deleted file mode 100755 index e51e845..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0041.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0042.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0042.png deleted file mode 100755 index e13142a..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0042.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0043.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0043.png deleted file mode 100755 index 35f5daf..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0043.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0044.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0044.png deleted file mode 100755 index ffeea85..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0044.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0045.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0045.png deleted file mode 100755 index adce191..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0045.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0046.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0046.png deleted file mode 100755 index 6817223..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0046.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0047.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0047.png deleted file mode 100755 index 13390ec..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0047.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0048.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0048.png deleted file mode 100755 index c4e1bf1..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0048.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0049.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0049.png deleted file mode 100755 index ab8bfa0..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0049.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0050.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0050.png deleted file mode 100755 index fde8efa..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0050.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0051.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0051.png deleted file mode 100755 index 37065d7..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0051.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0052.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0052.png deleted file mode 100755 index 64b3f31..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0052.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0053.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0053.png deleted file mode 100755 index 6039c21..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0053.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0054.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0054.png deleted file mode 100755 index ee722e7..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0054.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0055.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0055.png deleted file mode 100755 index 3433298..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0055.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0056.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0056.png deleted file mode 100755 index 7f26596..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0056.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0057.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0057.png deleted file mode 100755 index c583e6c..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0057.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0058.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0058.png deleted file mode 100755 index c21252e..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0058.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0059.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0059.png deleted file mode 100755 index d9c1da8..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0059.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0060.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0060.png deleted file mode 100755 index fc42db0..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0060.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0061.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0061.png deleted file mode 100755 index 893087e..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0061.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0062.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0062.png deleted file mode 100755 index 1156d65..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0062.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0063.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0063.png deleted file mode 100755 index d648fff..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0063.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0064.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0064.png deleted file mode 100755 index d88a043..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0064.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0065.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0065.png deleted file mode 100755 index 57bda39..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0065.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0066.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0066.png deleted file mode 100755 index 8f6c2f3..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0066.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0067.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0067.png deleted file mode 100755 index 895c40a..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0067.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0068.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0068.png deleted file mode 100755 index 09c222c..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0068.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0069.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0069.png deleted file mode 100755 index 925de68..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0069.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0070.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0070.png deleted file mode 100755 index 9400f47..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0070.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0071.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0071.png deleted file mode 100755 index de55ad1..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0071.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0072.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0072.png deleted file mode 100755 index eed402e..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0072.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0073.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0073.png deleted file mode 100755 index ab3b91e..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0073.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0074.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0074.png deleted file mode 100755 index f13e0bb..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0074.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0075.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0075.png deleted file mode 100755 index 8259f62..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0075.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0076.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0076.png deleted file mode 100755 index 3701ecb..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0076.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0077.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0077.png deleted file mode 100755 index 7f55e57..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0077.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0078.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0078.png deleted file mode 100755 index eecf103..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0078.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0079.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0079.png deleted file mode 100755 index 6c10a5b..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0079.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0080.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0080.png deleted file mode 100755 index b1df5cd..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0080.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0081.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0081.png deleted file mode 100755 index bb7ea62..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0081.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0082.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0082.png deleted file mode 100755 index 6378338..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0082.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0083.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0083.png deleted file mode 100755 index a21d8a0..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0083.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0084.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0084.png deleted file mode 100755 index 660f299..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0084.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0085.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0085.png deleted file mode 100755 index f153fef..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0085.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0086.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0086.png deleted file mode 100755 index b0ef031..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0086.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0087.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0087.png deleted file mode 100755 index 2a72665..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0087.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0088.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0088.png deleted file mode 100755 index 2052908..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0088.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0089.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0089.png deleted file mode 100755 index 9f2966e..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0089.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0090.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0090.png deleted file mode 100755 index 40d32a7..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0090.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0091.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0091.png deleted file mode 100755 index 4518908..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0091.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0092.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0092.png deleted file mode 100755 index 1481b8b..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0092.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0093.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0093.png deleted file mode 100755 index 1bae1e2..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0093.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0094.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0094.png deleted file mode 100755 index 874396d..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0094.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0095.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0095.png deleted file mode 100755 index a402d63..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0095.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0096.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0096.png deleted file mode 100755 index e857847..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0096.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0097.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0097.png deleted file mode 100755 index e7263e8..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0097.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0098.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0098.png deleted file mode 100755 index 28b2e0e..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0098.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0099.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0099.png deleted file mode 100755 index 40e4af4..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0099.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0100.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0100.png deleted file mode 100755 index e8c8090..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0100.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0101.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0101.png deleted file mode 100755 index 524346e..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0101.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0102.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0102.png deleted file mode 100755 index ddd49a2..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0102.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0103.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0103.png deleted file mode 100755 index d26c9fe..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0103.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0104.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0104.png deleted file mode 100755 index 74e9a32..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0104.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0105.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0105.png deleted file mode 100755 index 49b8eae..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0105.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0106.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0106.png deleted file mode 100755 index 4b56d77..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0106.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0107.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0107.png deleted file mode 100755 index bf1bba7..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0107.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0108.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0108.png deleted file mode 100755 index ac23eed..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0108.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0109.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0109.png deleted file mode 100755 index 720f154..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0109.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0110.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0110.png deleted file mode 100755 index 57ca815..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0110.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0111.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0111.png deleted file mode 100755 index 78a702a..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0111.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0112.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0112.png deleted file mode 100755 index fffddbc..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0112.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0113.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0113.png deleted file mode 100755 index f21d24c..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0113.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0114.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0114.png deleted file mode 100755 index d699d84..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0114.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0115.png b/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0115.png deleted file mode 100755 index fb5263d..0000000 Binary files a/openfield-Pranav-2018-10-30/labeled-data/m4s1/img0115.png and /dev/null differ diff --git a/openfield-Pranav-2018-10-30/videos/m3v1mp4.mp4 b/openfield-Pranav-2018-10-30/videos/m3v1mp4.mp4 deleted file mode 100644 index 8167303..0000000 Binary files a/openfield-Pranav-2018-10-30/videos/m3v1mp4.mp4 and /dev/null differ diff --git a/prepare_data.sh b/prepare_data.sh new file mode 100644 index 0000000..41966b9 --- /dev/null +++ b/prepare_data.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +mkdir -p data +parallel wget :::: config/filelist.lst +mv *.png data diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..bc6d480 --- /dev/null +++ b/run.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +sudo docker build -t dlcapp . +sudo docker run -p 8050:8050 \ + --mount type=bind,source=$(pwd)/data,destination=/app/data,readonly \ + --user nobody -it dlcapp \ No newline at end of file diff --git a/scripts/query_files.sh b/scripts/query_files.sh new file mode 100755 index 0000000..7763afc --- /dev/null +++ b/scripts/query_files.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# Generates a file list of possible images + +wget --spider -r --no-parent http://deeplabcut.rowland.harvard.edu/datasets/ \ +|& grep http \ +| grep png \ +| awk '{print $3}' diff --git a/static/img/example_labels.png b/static/img/example_labels.png new file mode 100644 index 0000000..019a011 Binary files /dev/null and b/static/img/example_labels.png differ diff --git a/update_app.sh b/update_app.sh new file mode 100755 index 0000000..da06adf --- /dev/null +++ b/update_app.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# check github and update app if needed +# run with watch + +update=$(git fetch --dry-run |& grep stes/webinar | wc -l) +if [[ $update -ne 0 ]]; then + git pull origin stes/webinar +fi + diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..35dfe80 --- /dev/null +++ b/utils.py @@ -0,0 +1,47 @@ +import matplotlib.colors as mcolors +import numpy as np + + +def draw_circle(center, radius, n_points=50): + pts = np.linspace(0, 2 * np.pi, n_points) + x = center[0] + radius * np.cos(pts) + y = center[1] + radius * np.sin(pts) + path = 'M ' + str(x[0]) + ',' + str(y[1]) + for k in range(1, x.shape[0]): + path += ' L ' + str(x[k]) + ',' + str(y[k]) + path += ' Z' + return path + + +def compute_circle_center(path): + """ + See Eqn 1 & 2 pp.12-13 in REGRESSIONS CONIQUES, QUADRIQUES + Régressions linéaires et apparentées, circulaire, sphérique + Jacquelin J., 2009. + """ + coords = [list(map(float, coords.split(','))) for coords in path.split(' ')[1::2]] + x, y = np.array(coords).T + n = len(x) + sum_x = np.sum(x) + sum_y = np.sum(y) + sum_x2 = np.sum(x * x) + sum_y2 = np.sum(y * y) + delta11 = n * np.dot(x, y) - sum_x * sum_y + delta20 = n * sum_x2 - sum_x ** 2 + delta02 = n * sum_y2 - sum_y ** 2 + delta30 = n * np.sum(x ** 3) - sum_x2 * sum_x + delta03 = n * np.sum(y ** 3) - sum_y * sum_y2 + delta21 = n * np.sum(x * x * y) - sum_x2 * sum_y + delta12 = n * np.sum(x * y * y) - sum_x * sum_y2 + + # Eqn 2, p.13 + num_a = (delta30 + delta12) * delta02 - (delta03 + delta21) * delta11 + num_b = (delta03 + delta21) * delta20 - (delta30 + delta12) * delta11 + den = 2 * (delta20 * delta02 - delta11 * delta11) + a = num_a / den + b = num_b / den + return a, b + + +def get_plotly_color(cmap, n): + return mcolors.to_hex(cmap(n)) diff --git a/view.py b/view.py new file mode 100644 index 0000000..0d6673f --- /dev/null +++ b/view.py @@ -0,0 +1,129 @@ +import dash +import dash_core_components as dcc +import dash_html_components as html +import plotly.express as px +import random +import uuid + + +class AppView: + + def __init__(self, name, db, config, server): + external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css'] + + self.app = dash.Dash(name, external_stylesheets=external_stylesheets, server=server) + self.db = db + self.current_idx = 0 + self.appconfig = config + self.pick_keypoint_subset() + self.make_figure_image(self.current_idx) + self.app.layout = self.make_layout() + + @property + def options(self): + return [self.appconfig.options[i] for i in self.subset] + + @property + def fig(self): + return self._fig + + def make_figure_image(self, i): + data = self.db.fetch_image(i % len(self.db.dataset)) + fig = px.imshow(data.image) + fig.layout.xaxis.showticklabels = False + fig.layout.yaxis.showticklabels = False + fig.update_traces(hoverinfo='none', hovertemplate='') + fig.update_layout( + title={ + 'text': data.fname, + 'y': 0.9, + 'x': 0.5, + 'xanchor': 'center', + 'yanchor': 'top'} + ) + self._fig = fig + return self._fig + + @property + def style(self): + return { + 'pre': { + 'border': 'thin lightgrey solid', + 'overflowX': 'scroll' + } + } + + def make_layout(self): + return html.Div([ + html.Div([ + dcc.Graph( + id='canvas', + config={ + 'editable': True, + 'doubleClick': False, + 'showTips': False, + 'showLink': False, + }, + figure=self.fig) + ], + className="six columns" + ), + html.Div([ + html.Div([ + html.H3("DeepLabCut Labeling App"), + html.Div([ + dcc.RadioItems(id='radio', + options=[{'label': opt, 'value': opt} for opt in + self.options], + value=self.options[0] + ), + ], style={"column-count": "4"}), + ]), + html.Div([ + dcc.Input( + id="input_name", + type='text', + placeholder="Please add username" + ), + html.Button('Previous', id='previous'), + html.Button('Next', id='next'), + html.Button('Clear', id='clear'), + html.Button('Save', id='save'), + dcc.Store(id='store', data=0), + ]), + html.Div([ + html.Label('Keypoint label size'), + dcc.Slider(id='slider', + min=1, + max=24, + step=1, + value=8) + ], style={'width': '80%', + 'display': 'inline-block'}) + ], + className="six columns" + ), + html.Div([ + dcc.Markdown(""" + **Instructions**\n + Left click on the image to add a keypoint. Please skip/do not label occluded points. If you make a mistake, click clear to start again. + + ![](/static/img/example_labels.png) + """), + html.Pre(id='click-data', style=self.style['pre']) + ], + className='six columns', + style={"overflow-x": "hidden"} + ), + html.Div(id='placeholder', style={'display': 'none'}), + html.Div(id='shapes', style={'display': 'none'}) + ] + ) + + def pick_keypoint_subset(self): + self.subset = [0, 1, 2, 8, 9] + #random.sample(range(len(self.appconfig.options)), self.appconfig.n2show) + + def refresh_radio_buttons(self): + self.pick_keypoint_subset() + return [{'label': opt, 'value': opt} for opt in self.options]