Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 5 additions & 0 deletions prep_twitter.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# WITHOUT SEEDS
#python tagless/prep.py --inpath twitter.feats --outpath ./target_dir/data/twitter

# WITH SEEDS
python tagless/prep.py --inpath twitter.feats --outpath ./target_dir/data/twitter --inseed twitter_seeds.txt --outseed ./target_dir/data/twitter_seeds
4 changes: 3 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
requests
pillow
h5py
pandas
numpy
PIL
flask
Cython
git+https://github.com/bkj/libact
git+https://github.com/bkj/simple_las
5 changes: 5 additions & 0 deletions run_twitter.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# WITHOUT SEEDS
# python -m tagless --outpath ./target_dir/results/my-twitter-labels --inpath ./target_dir/data/twitter --img-dir "" --n-return 1

# WITH SEEDS
python -m tagless --outpath ./target_dir/results/my-twitter-labels --inpath ./target_dir/data/twitter --img-dir "" --n-return 1 --seeds ./target_dir/data/twitter_seeds
48 changes: 46 additions & 2 deletions tagless/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import os
import re
import requests
import sys
import h5py
import json
Expand Down Expand Up @@ -40,6 +41,7 @@ def parse_args():
parser.add_argument('--mode', type=str, default='las')
parser.add_argument('--n-las', type=int, default=float('inf'))
parser.add_argument('--no-permute', action="store_true")
parser.add_argument('--n-return', type=int, default=10)

return parser.parse_args()

Expand Down Expand Up @@ -77,7 +79,7 @@ def __init__(self, args, max_outstanding=64):
preds, labs, y = f['preds'].value, f['labs'].value, f['y'].value
sampler = ValidationSampler(preds=preds, labs=labs, y=y, no_permute=args.no_permute)
elif self.mode == 'las':
sampler = SimpleLASSampler(crow=args.inpath, seeds=args.seeds if args.seeds else None, prefix=args.img_dir)
sampler = SimpleLASSampler(crow=args.inpath, seeds=args.seeds if args.seeds else None, prefix=args.img_dir,n=args.n_return)
elif self.mode == 'random':
sampler = RandomSampler(crow=args.inpath, prefix=args.img_dir)
elif self.mode == 'uncertainty':
Expand All @@ -92,6 +94,7 @@ def __init__(self, args, max_outstanding=64):
self.app.add_url_rule('/', 'view_1', self.index)
self.app.add_url_rule('/<path:x>', 'view_2', lambda x: send_file('/' + x))
self.app.add_url_rule('/label', 'view_3', self.label, methods=['POST'])
self.app.add_url_rule('/twitter_tag', 'view_4', self.twitter_tag, methods=['POST'])

self.n_las = args.n_las
self.outpath = args.outpath
Expand All @@ -116,7 +119,48 @@ def index(self):

print('self.outstanding', self.outstanding)
return render_template('index.html', **{'images': images})


def get_handle(self,nid):
resp = requests.get("https://twitter.com/intent/user?user_id=" + nid)
handle = resp.text.split("<title>")[1].split(")")[0].split("@")[1]
return handle

def twitter_tag(self):
self.outstanding -= 1
print('self.outstanding', self.outstanding)
req = request.get_json()
filename = req['image_path']
# Record annotation (if not already annotated)
idx = np.where(self.sampler.labs == filename)[0][0]
out = []
if not self.sampler.is_labeled(idx):
self.sampler.set_label(idx, req['label'])

# Next image for annotation
if self.outstanding < self.max_outstanding:
idxs = self.sampler.get_next()
for idx in idxs:
if idx not in self.sent:
out.append(self.sampler.labs[idx])
self.sent.add(idx)
self.outstanding += 1

req.update({
'n_hits' : self.sampler.n_hits(),
'n_labeled' : self.sampler.n_labeled(),
'mode' : self.mode,
})
print(json.dumps(req))
sys.stdout.flush()

if (req['n_hits'] > self.n_las) and (self.mode == 'las'):
if req['n_labeled'] > req['n_hits']:
self._switch_sampler()

print('self.outstanding', self.outstanding)
out_ids = map(self.get_handle,out)
return(jsonify(out_ids))

def label(self):
self.outstanding -= 1
print('self.outstanding', self.outstanding)
Expand Down
15 changes: 14 additions & 1 deletion tagless/prep.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ def parse_args():
parser.add_argument('--inpath', type=str)
parser.add_argument('--outpath', type=str)
parser.add_argument('--max-records', type=int, default=-1)
parser.add_argument('--inseed', type=str, default=None)
parser.add_argument('--outseed', type=str, default=None)
return parser.parse_args()

if __name__ == "__main__":
Expand All @@ -41,4 +43,15 @@ def parse_args():
outfile['labs'] = labs.astype(str)
outfile.close()

print >> sys.stderr, 'written to %s' % args.outpath
print >> sys.stderr, 'written to %s' % args.outpath

if args.inseed:
seeds = set(map(lambda x: x.strip(),open(args.inseed).readlines()))
seed_df = df[df[0].isin(seeds)]
seed_feats = np.array(seed_df[range(1, seed_df.shape[1])])
seed_feats /= np.sqrt((seed_feats ** 2).sum(axis=1, keepdims=True))
seed_labs = np.array(seed_df[0])
seedfile = h5py.File(args.outseed)
seedfile['feats'] = seed_feats
seedfile['labs'] = seed_labs.astype(str)
seedfile.close()