Blame view

mdata/ILSVRC.py 15.5 KB
2c2d57c7   Chunk   ILSVRC datapath h...
1
2
3
__author__ = 'chunk'

from . import *
84648488   Chunk   reverted.
4
from ..mfeat import HOG, IntraBlockDiff
2c2d57c7   Chunk   ILSVRC datapath h...
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from ..mspark import SC
from ..common import *

import os, sys
from PIL import Image
from hashlib import md5
import csv
import shutil
import json
import collections
import happybase

from ..mjpeg import *
from ..msteg import *
9ff70cf4   Chunk   capacity engeneer...
19
from ..msteg.steganography import LSB, F3, F4, F5
2c2d57c7   Chunk   ILSVRC datapath h...
20

d1042d03   Chunk   staged.
21
22
23
24
import numpy as np
from numpy.random import randn
import pandas as pd
from scipy import stats
ec755e37   Chunk   cropping.
25

d1042d03   Chunk   staged.
26
from subprocess import Popen, PIPE, STDOUT
080c30c2   Chunk   F5 lib updated. I...
27
28


84648488   Chunk   reverted.
29
np.random.seed(sum(map(ord, "whoami")))
d1042d03   Chunk   staged.
30
31

package_dir = os.path.dirname(os.path.abspath(__file__))
080c30c2   Chunk   F5 lib updated. I...
32
33


2c2d57c7   Chunk   ILSVRC datapath h...
34
35
class DataILSVRC(DataDumperBase):
    def __init__(self, base_dir='/media/chunk/Elements/D/data/ImageNet/img/ILSVRC2013_DET_val', category='Train'):
84648488   Chunk   reverted.
36
        DataDumperBase.__init__(self, base_dir, category)
2c2d57c7   Chunk   ILSVRC datapath h...
37
38
39
40
41
42
43
44
45
46
47
48
49
50

        self.base_dir = base_dir
        self.category = category
        self.data_dir = os.path.join(self.base_dir, self.category)

        self.dst_dir = os.path.join(self.base_dir, 'dst', self.category)
        self.list_file = os.path.join(self.dst_dir, 'file-tag.tsv')
        self.feat_dir = os.path.join(self.dst_dir, 'Feat')
        self.img_dir = os.path.join(self.dst_dir, 'Img')

        self.dict_data = {}

        self.table_name = self.base_dir.strip('/').split('/')[-1] + '-' + self.category
        self.sparkcontex = None
02528074   Chunk   staged.
51

2c2d57c7   Chunk   ILSVRC datapath h...
52
53
    def format(self):
        self.extract()
f1fa5b17   Chunk   review & streaming.
54

2c2d57c7   Chunk   ILSVRC datapath h...
55
56
57
58
59
    def _hash_copy(self, image):
        if not image.endswith('jpg'):
            img = Image.open(image)
            img.save('../res/tmp.jpg', format='JPEG')
            image = '../res/tmp.jpg'
080c30c2   Chunk   F5 lib updated. I...
60
61

        with open(image, 'rb') as f:
2c2d57c7   Chunk   ILSVRC datapath h...
62
63
64
65
66
            index = md5(f.read()).hexdigest()

        im = Jpeg(image, key=sample_key)
        self.dict_data[index] = [im.image_width, im.image_height, im.image_width * im.image_height, im.getCapacity(),
                                 im.getQuality()]
84648488   Chunk   reverted.
67

9ff70cf4   Chunk   capacity engeneer...
68
        # self.dict_data[index] = [im.image_width, im.image_height, os.path.getsize(image), im.getQuality()]
d0be60e7   Chunk   jpeg update.
69
70

        # origion:
2c2d57c7   Chunk   ILSVRC datapath h...
71
72
        # dir = base_dir + 'Img/Train/' + index[:3]
        dir = os.path.join(self.img_dir, index[:3])
1dc7c44b   Chunk   crawler-hbase-spa...
73
        if not os.path.exists(dir):
2c2d57c7   Chunk   ILSVRC datapath h...
74
75
76
77
78
79
80
81
82
83
84
            os.makedirs(dir)
        image_path = os.path.join(dir, index[3:] + '.jpg')
        # print image_path

        if not os.path.exists(image_path):
            shutil.copy(image, image_path)
        else:
            pass

    def _build_list(self, list_file=None):
        if list_file == None:
554a7b9a   Chunk   staged.
85
            list_file = self.list_file
84648488   Chunk   reverted.
86
87
88
89
90
        assert list_file != None

        ordict_img = collections.OrderedDict(sorted(self.dict_data.items(), key=lambda d: d[0]))

        with open(list_file, 'w') as f:
554a7b9a   Chunk   staged.
91
92
93
94
95
96
97
98
            tsvfile = csv.writer(f, delimiter='\t')
            for key, value in ordict_img.items():
                tsvfile.writerow([key] + value)

    def _anaylis(self, list_file=None):
        if list_file == None:
            list_file = self.list_file
        assert list_file != None
84648488   Chunk   reverted.
99

554a7b9a   Chunk   staged.
100
        df_ILS = pd.read_csv(list_file, names=['hash', 'width', 'height', 'size', 'capacity', 'quality'], sep='\t')
f1fa5b17   Chunk   review & streaming.
101
        length = df_ILS.shape[0]
84648488   Chunk   reverted.
102
103
104
        df_ILS = df_ILS.sort(['capacity', 'size', 'quality'], ascending=True)
        rand_class = stats.bernoulli.rvs(0.3, size=length)

554a7b9a   Chunk   staged.
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
        df_ILS['rate'] = np.zeros(df_ILS.shape[0], np.float64)
        df_ILS['chosen'] = rand_class
        df_ILS['class'] = np.zeros(length, np.int32)

        df_ILS.to_csv(list_file, header=False, index=False, sep='\t')

    def extract(self):
        for path, subdirs, files in os.walk(self.data_dir):
            for name in files:
                imagepath = os.path.join(path, name)
                # print imagepath
                try:
                    self._hash_copy(imagepath)
                except:
                    pass

        self._build_list()
        self._anaylis()


    def _embed_outer(self):
        self.dict_data = {}
        dict_embedresult = {}
        os.environ["CLASSPATH"] = os.path.join(package_dir, "../libs/F5/")
        cmd = 'java Embed %s %s -e %s  -p password -c "stegan by chunk  " -q %d'

080c30c2   Chunk   F5 lib updated. I...
131
132
133
134
        df_ILS = pd.read_csv(self.list_file,
                             names=['hash', 'width', 'height', 'size', 'capacity', 'quality', 'chosen', 'class'],
                             sep='\t')
        df_ILS_TARGET = df_ILS[df_ILS['chosen'] == 1]
2c2d57c7   Chunk   ILSVRC datapath h...
135
136
137

        for hash, size, quality in zip(df_ILS_TARGET['hash'], df_ILS_TARGET['size'], df_ILS_TARGET['quality']):
            path_img = os.path.join(self.img_dir, hash[:3], hash[3:] + '.jpg')
080c30c2   Chunk   F5 lib updated. I...
138
            if path_img:
2c2d57c7   Chunk   ILSVRC datapath h...
139
140
141
142
                print path_img
                p = Popen(cmd % (path_img, 'res/tmp.jpg', 'res/toembed', quality), shell=True, stdout=PIPE,
                          stderr=STDOUT)
                dict_embedresult[hash] = [line.strip('\n') for line in p.stdout.readlines()]
080c30c2   Chunk   F5 lib updated. I...
143
144
145
146
147
                try:
                    self._hash_copy('res/tmp.jpg')
                except:
                    pass

84648488   Chunk   reverted.
148
        with open(self.list_file + '.embed.log', 'wb') as f:
d1042d03   Chunk   staged.
149
            tsvfile = csv.writer(f, delimiter='\t')
9ff70cf4   Chunk   capacity engeneer...
150
            for key, value in dict_embedresult.items():
9371f8fa   Chunk   SVM param engenee...
151
                tsvfile.writerow([key] + value)
d1042d03   Chunk   staged.
152

9ff70cf4   Chunk   capacity engeneer...
153
        self._build_list(self.list_file + '.embed')
d0be60e7   Chunk   jpeg update.
154
155

        # merge
d1042d03   Chunk   staged.
156
        df_ILS_EMBED = pd.read_csv(self.list_file + '.embed', names=['hash', 'width', 'height', 'size', 'quality'],
d0be60e7   Chunk   jpeg update.
157
                                   sep='\t')
2c2d57c7   Chunk   ILSVRC datapath h...
158
159
        length = df_ILS_EMBED.shape[0]
        df_ILS_EMBED = df_ILS_EMBED.sort(['size', 'quality'], ascending=True)
f1fa5b17   Chunk   review & streaming.
160
        df_ILS_EMBED['chosen'] = np.zeros(length, np.int32)
2c2d57c7   Chunk   ILSVRC datapath h...
161
162
163
        df_ILS_EMBED['class'] = np.ones(length, np.int32)

        df_ILS = df_ILS.append(df_ILS_EMBED, ignore_index=True)
d1042d03   Chunk   staged.
164
165
166
167
168
        df_ILS.to_csv(self.list_file, header=False, index=False, sep='\t')

    def _embed_inner(self, rate=None):
        self.dict_data = {}
        f5 = F5.F5(sample_key, 1)
2c2d57c7   Chunk   ILSVRC datapath h...
169
        tmp_img = os.path.join(package_dir, '../res/tmp.jpg')
d1042d03   Chunk   staged.
170
171
        df_ILS = pd.read_csv(self.list_file,
                             names=['hash', 'width', 'height', 'size', 'capacity', 'quality', 'rate', 'chosen',
2c2d57c7   Chunk   ILSVRC datapath h...
172
                                    'class'],
84648488   Chunk   reverted.
173
                             sep='\t')
9ff70cf4   Chunk   capacity engeneer...
174
        df_ILS_TARGET = df_ILS[df_ILS['chosen'] == 1]
080c30c2   Chunk   F5 lib updated. I...
175
176
177

        for hash, capacity in zip(df_ILS_TARGET['hash'], df_ILS_TARGET['capacity']):
            path_img = os.path.join(self.img_dir, hash[:3], hash[3:] + '.jpg')
d0be60e7   Chunk   jpeg update.
178
            if path_img:
080c30c2   Chunk   F5 lib updated. I...
179
                print path_img
9ff70cf4   Chunk   capacity engeneer...
180
                if rate == None:
84648488   Chunk   reverted.
181
                    embed_rate = f5.embed_raw_data(path_img, os.path.join(package_dir, '../res/toembed'), tmp_img)
080c30c2   Chunk   F5 lib updated. I...
182
                else:
d0be60e7   Chunk   jpeg update.
183
                    assert (rate >= 0 and rate < 1)
9ff70cf4   Chunk   capacity engeneer...
184
                    print capacity
84648488   Chunk   reverted.
185
                    hidden = np.random.bytes(int(capacity * rate) / 8)
d0be60e7   Chunk   jpeg update.
186
                    embed_rate = f5.embed_raw_data(path_img, hidden, tmp_img, frommem=True)
080c30c2   Chunk   F5 lib updated. I...
187
188
                try:
                    with open(tmp_img, 'rb') as f:
84648488   Chunk   reverted.
189
                        index = md5(f.read()).hexdigest()
9ff70cf4   Chunk   capacity engeneer...
190
                    im = Jpeg(tmp_img, key=sample_key)
d0be60e7   Chunk   jpeg update.
191
                    self.dict_data[index] = [im.image_width, im.image_height, im.image_width * im.image_height,
080c30c2   Chunk   F5 lib updated. I...
192
193
194
195
                                             im.getCapacity(),
                                             im.getQuality(), embed_rate]

                    dir = os.path.join(self.img_dir, index[:3])
9ff70cf4   Chunk   capacity engeneer...
196
                    if not os.path.exists(dir):
080c30c2   Chunk   F5 lib updated. I...
197
198
199
200
201
                        os.makedirs(dir)
                    image_path = os.path.join(dir, index[3:] + '.jpg')
                    if not os.path.exists(image_path):
                        shutil.copy(tmp_img, image_path)
                    else:
080c30c2   Chunk   F5 lib updated. I...
202
203
                        pass
                except:
d0be60e7   Chunk   jpeg update.
204
                    pass
84648488   Chunk   reverted.
205

d0be60e7   Chunk   jpeg update.
206
207
208
209
210
211
212
213
        self._build_list(self.list_file + '.embed')

        # merge
        df_ILS_EMBED = pd.read_csv(self.list_file + '.embed',
                                   names=['hash', 'width', 'height', 'size', 'capacity', 'quality', 'rate'],
                                   sep='\t')

        df_ILS_EMBED = df_ILS_EMBED.sort(['rate', 'capacity', 'size', 'quality'], ascending=True)
080c30c2   Chunk   F5 lib updated. I...
214
        df_ILS_EMBED['chosen'] = np.zeros(df_ILS_EMBED.shape[0], np.int32)
9ff70cf4   Chunk   capacity engeneer...
215
216
217
218
219
        df_ILS_EMBED['class'] = np.ones(df_ILS_EMBED.shape[0], np.int32)

        # print df_ILS_EMBED.dtypes
        # print df_ILS.dtypes
        # Form the intersection of two Index objects. Sortedness of the result is not guaranteed
84648488   Chunk   reverted.
220
        df_ILS = df_ILS.append(df_ILS_EMBED, ignore_index=True)
9ff70cf4   Chunk   capacity engeneer...
221
222
223
224
225
226
227
228
229
        df_ILS.to_csv(self.list_file, header=False, index=False, sep='\t')

    def embed(self):
        self._embed_inner(rate=0.7)

    def get_table(self):
        if self.table != None:
            return self.table

84648488   Chunk   reverted.
230
        if self.connection is None:
9ff70cf4   Chunk   capacity engeneer...
231
232
            c = happybase.Connection('HPC-server')
            self.connection = c
9371f8fa   Chunk   SVM param engenee...
233

9ff70cf4   Chunk   capacity engeneer...
234
235
236
237
238
239
        tables = self.connection.tables()
        if self.table_name not in tables:
            families = {'cf_pic': dict(),
                        'cf_info': dict(max_versions=10),
                        'cf_tag': dict(),
                        'cf_feat': dict(),
84648488   Chunk   reverted.
240
                        }
9ff70cf4   Chunk   capacity engeneer...
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
            self.connection.create_table(name=self.table_name, families=families)

        table = self.connection.table(name=self.table_name)

        self.table = table

        return table


    def store_image(self):
        if self.table == None:
            self.table = self.get_table()

        dict_databuf = {}

        with open(self.list_file, 'rb') as tsvfile:
            tsvfile = csv.reader(tsvfile, delimiter='\t')
            for line in tsvfile:
84648488   Chunk   reverted.
259
                path_img = os.path.join(self.img_dir, line[0][:3], line[0][3:] + '.jpg')
9ff70cf4   Chunk   capacity engeneer...
260
261
262
263
264
265
266
267
268
269
270
271
                if path_img:
                    with open(path_img, 'rb') as fpic:
                        dict_databuf[line[0] + '.jpg'] = fpic.read()

        try:
            with self.table.batch(batch_size=5000) as b:
                for imgname, imgdata in dict_databuf.items():
                    b.put(imgname, {'cf_pic:data': imgdata})
        except ValueError:
            raise
            pass

554a7b9a   Chunk   staged.
272

f1fa5b17   Chunk   review & streaming.
273
    def store_info(self, infotype='all'):
9371f8fa   Chunk   SVM param engenee...
274
        if self.table == None:
9ff70cf4   Chunk   capacity engeneer...
275
            self.table = self.get_table()
84648488   Chunk   reverted.
276

ec755e37   Chunk   cropping.
277
        dict_infobuf = {}
e6be6b61   Chunk   import caffe.
278
279
280

        with open(self.list_file, 'rb') as tsvfile:
            tsvfile = csv.reader(tsvfile, delimiter='\t')
ec755e37   Chunk   cropping.
281
282
283
284
285
286
287
288
            for line in tsvfile:
                dict_infobuf[line[0] + '.jpg'] = line[1:-2]

        if infotype == 'all':
            try:
                with self.table.batch(batch_size=5000) as b:
                    for imgname, imginfo in dict_infobuf.items():
                        b.put(imgname,
b9990e77   Chunk   staged.
289
                              {'cf_info:width': imginfo[0], 'cf_info:height': imginfo[1], 'cf_info:size': imginfo[2],
ec755e37   Chunk   cropping.
290
291
292
293
294
                               'cf_info:quality': imginfo[3]})
            except ValueError:
                raise
                pass
        else:
e6be6b61   Chunk   import caffe.
295
            raise Exception("Unknown infotype!")
ec755e37   Chunk   cropping.
296
297
298
299
300
301


    def store_tag(self, tagtype='all'):
        if self.table == None:
            self.table = self.get_table()

b9990e77   Chunk   staged.
302
303
        dict_tagbuf = {}

25c0c9c9   Chunk   feat.ravel()[[i*3...
304
        with open(self.list_file, 'rb') as tsvfile:
e6be6b61   Chunk   import caffe.
305
            tsvfile = csv.reader(tsvfile, delimiter='\t')
bde8352b   Chunk   shuffling.
306
307
            for line in tsvfile:
                dict_tagbuf[line[0] + '.jpg'] = line[-2:]
ec755e37   Chunk   cropping.
308

bde8352b   Chunk   shuffling.
309
        if tagtype == 'all':
ec755e37   Chunk   cropping.
310
311
            try:
                with self.table.batch(batch_size=5000) as b:
84648488   Chunk   reverted.
312
                    for imgname, imgtag in dict_tagbuf.items():
2c2d57c7   Chunk   ILSVRC datapath h...
313
                        b.put(imgname, {'cf_tag:chosen': imgtag[0], 'cf_tag:class': imgtag[1]})
f1fa5b17   Chunk   review & streaming.
314
            except ValueError:
2c2d57c7   Chunk   ILSVRC datapath h...
315
316
317
318
319
320
321
322
323
                raise
                pass
        else:
            raise Exception("Unknown tagtype!")


    def get_feat(self, image, feattype='ibd', **kwargs):
        size = kwargs.get('size', (48, 48))

f4fb4381   Chunk   staged.
324
325
326
327
328
        if feattype == 'hog':
            feater = HOG.FeatHOG(size=size)
        elif feattype == 'ibd':
            feater = IntraBlockDiff.FeatIntraBlockDiff()
        else:
2c2d57c7   Chunk   ILSVRC datapath h...
329
330
331
332
333
            raise Exception("Unknown feature type!")

        desc = feater.feat(image)

        return desc
51708346   Chunk   final experiments...
334

2c2d57c7   Chunk   ILSVRC datapath h...
335
336
337
338
339
340
341

    def extract_feat(self, feattype='ibd'):
        if feattype == 'hog':
            feater = HOG.FeatHOG(size=(48, 48))
        elif feattype == 'ibd':
            feater = IntraBlockDiff.FeatIntraBlockDiff()
        else:
d47ae6ce   Chunk   staged.
342
            raise Exception("Unknown feature type!")
f1fa5b17   Chunk   review & streaming.
343

d47ae6ce   Chunk   staged.
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
        list_image = []
        with open(self.list_file, 'rb') as tsvfile:
            tsvfile = csv.reader(tsvfile, delimiter='\t')
            for line in tsvfile:
                list_image.append(line[0])

        dict_featbuf = {}
        for imgname in list_image:
            # if imgtag == 'True':
            image = os.path.join(self.img_dir, imgname[:3], imgname[3:] + '.jpg')
            desc = feater.feat(image)
            dict_featbuf[imgname] = desc

        for imgname, desc in dict_featbuf.items():
            # print imgname, desc
            dir = os.path.join(self.feat_dir, imgname[:3])
            if not os.path.exists(dir):
2c2d57c7   Chunk   ILSVRC datapath h...
361
                os.makedirs(dir)
ad70caf6   Chunk   staged.
362
            featpath = os.path.join(dir, imgname[3:].split('.')[0] + '.' + feattype)
2c2d57c7   Chunk   ILSVRC datapath h...
363
364
365
366
367
368
369
370
371
            with open(featpath, 'wb') as featfile:
                featfile.write(json.dumps(desc.tolist()))


    def store_feat(self, feattype='ibd'):
        if self.table == None:
            self.table = self.get_table()

        dict_featbuf = {}
24768a99   Chunk   mode 'hbase' fini...
372
        for path, subdirs, files in os.walk(self.feat_dir):
2c2d57c7   Chunk   ILSVRC datapath h...
373
374
375
376
            for name in files:
                featpath = os.path.join(path, name)
                # print featpath
                with open(featpath, 'rb') as featfile:
489c5608   Chunk   debugging...
377
                    imgname = path.split('/')[-1] + name.replace('.' + feattype, '.jpg')
2c2d57c7   Chunk   ILSVRC datapath h...
378
379
380
381
                    dict_featbuf[imgname] = featfile.read()

        try:
            with self.table.batch(batch_size=5000) as b:
2c2d57c7   Chunk   ILSVRC datapath h...
382
                for imgname, featdesc in dict_featbuf.items():
84648488   Chunk   reverted.
383
                    b.put(imgname, {'cf_feat:' + feattype: featdesc})
cb798a7f   Chunk   libs & scripts in...
384
385
386
387
388
389
390
391
392
        except ValueError:
            raise
            pass


    def load_data(self, mode='local', feattype='ibd', tagtype='class'):
        INDEX = []
        X = []
        Y = []
080c30c2   Chunk   F5 lib updated. I...
393

cb798a7f   Chunk   libs & scripts in...
394
395
396
397
398
399
        if mode == "local":

            dict_dataset = {}

            with open(self.list_file, 'rb') as tsvfile:
                tsvfile = csv.reader(tsvfile, delimiter='\t')
84648488   Chunk   reverted.
400
                for line in tsvfile:
554a7b9a   Chunk   staged.
401
402
                    hash = line[0]
                    tag = line[-1]
cb798a7f   Chunk   libs & scripts in...
403
404
                    path_feat = os.path.join(self.feat_dir, hash[:3], hash[3:] + '.' + feattype)
                    if path_feat:
cb798a7f   Chunk   libs & scripts in...
405
                        with open(path_feat, 'rb') as featfile:
080c30c2   Chunk   F5 lib updated. I...
406
                            dict_dataset[hash] = (tag, json.loads(featfile.read()))
cb798a7f   Chunk   libs & scripts in...
407

84648488   Chunk   reverted.
408
            for tag, feat in dict_dataset.values():
080c30c2   Chunk   F5 lib updated. I...
409
                X.append([item for sublist in feat for subsublist in sublist for item in subsublist])
2c2d57c7   Chunk   ILSVRC datapath h...
410
411
412
413
414
415
416
417
                Y.append(float(tag))

        elif mode == "remote" or mode == "hbase":
            if self.table == None:
                self.table = self.get_table()

            col_feat, col_tag = 'cf_feat:' + feattype, 'cf_tag:' + tagtype
            for key, data in self.table.scan(columns=[col_feat, col_tag]):
080c30c2   Chunk   F5 lib updated. I...
418
                X.append(json.loads(data[col_feat]))
2c2d57c7   Chunk   ILSVRC datapath h...
419
                Y.append(1 if data[col_tag] == 'True' else 0)
080c30c2   Chunk   F5 lib updated. I...
420
421
422
423
424
425
426

        elif mode == "spark" or mode == "cluster":
            if self.sparkcontex == None:
                self.sparkcontex = SC.Sparker(host='HPC-server', appname='ImageCV', master='spark://HPC-server:7077')

            result = self.sparkcontex.read_habase(self.table_name)  # result = {key:[feat,tag],...}
            for feat, tag in result:
080c30c2   Chunk   F5 lib updated. I...
427
428
                X.append(feat)
                Y.append(tag)
2c2d57c7   Chunk   ILSVRC datapath h...
429

84648488   Chunk   reverted.
430
        else:
2c2d57c7   Chunk   ILSVRC datapath h...
431
432
433
            raise Exception("Unknown mode!")

        return X, Y
84648488   Chunk   reverted.

bde8352b   Chunk   shuffling.

f1fa5b17   Chunk   review & streaming.

2c2d57c7   Chunk   ILSVRC datapath h...

d0be60e7   Chunk   jpeg update.

ec755e37   Chunk   cropping.

bbd2f705   Chunk   cropping.

ec755e37   Chunk   cropping.

b9990e77   Chunk   staged.

84648488   Chunk   reverted.

bde8352b   Chunk   shuffling.

e6be6b61   Chunk   import caffe.

b9990e77   Chunk   staged.

ec755e37   Chunk   cropping.

d0be60e7   Chunk   jpeg update.

b9990e77   Chunk   staged.

2c2d57c7   Chunk   ILSVRC datapath h...

ec755e37   Chunk   cropping.

2c2d57c7   Chunk   ILSVRC datapath h...

ec755e37   Chunk   cropping.

84648488   Chunk   reverted.

02528074   Chunk   staged.

2c2d57c7   Chunk   ILSVRC datapath h...

ec755e37   Chunk   cropping.

02528074   Chunk   staged.

84648488   Chunk   reverted.

2c2d57c7   Chunk   ILSVRC datapath h...

02528074   Chunk   staged.

2c2d57c7   Chunk   ILSVRC datapath h...

cb798a7f   Chunk   libs & scripts in...

2c2d57c7   Chunk   ILSVRC datapath h...

bde8352b   Chunk   shuffling.

2c2d57c7   Chunk   ILSVRC datapath h...

bde8352b   Chunk   shuffling.

84648488   Chunk   reverted.