def loadviz(directory, blob): ed = expdir.ExperimentDirectory(directory) html_fn = ed.filename(['html', '%s.html' % expdir.fn_safe(blob)]) with open(html_fn) as f: lines = f.readlines() result = OrderedDict() for line in lines: if 'unit ' in line: u, v = line.split(':', 1) unit = int(re.search(r'unit (\d+)', u).group(1)) - 1 u_result = [] for w in v.split(';'): m = re.search(r'(\w.*\w)? \((\w+), ([.\d]+)\)', w) if not m: print 'On line', v print 'Error with', w label = m.group(1) category = m.group(2) score = float(m.group(3)) u_result.append((label, category, score)) result[unit] = u_result return result
def generate_html_summary(ed, ds, layer, imsize=None, imcount=50, imscale=None, tally_stats=None, gridwidth=None, gap=3, limit=None, force=False, include_hist=False, threshold=0.04, verbose=False): print 'Generating html summary', (ed.filename('html/%s.html' % expdir.fn_safe(layer))) # Grab tally stats # bestcat_pciou, name_pciou, score_pciou, _, _, _, _ = (tally_stats) if verbose: print 'Sorting units by score.' sys.stdout.flush() layerprobe = LayerProbe(ed, ds, layer) if imsize is None: imsize = layerprobe.input_dim[0] if imscale is None: imscale = imsize top = max_act_indexes(layerprobe, count=imcount) ed.ensure_dir('html', 'image') html = [html_prefix] rendered_order = [] barfn = 'image/%s-bargraph.svg' % (expdir.fn_safe(layer)) bargraph.bar_graph_svg(ed, layer, barheight=100, barwidth=12, threshold=threshold, rendered_order=rendered_order, save=ed.filename('html/' + barfn)) html.extend([ '<div class="histogram">', '<img class="img-fluid" src="%s" title="Summary of %s %s">' % (barfn, ed.basename(), layer), '</div>' ]) html.append('<div class="gridheader">') html.append('<div class="layerinfo">') html.append( '%d/%d units covering %d concepts with IoU ≥ %.2f' % (len([ record for record in rendered_order if float(record['score']) >= threshold ]), len(rendered_order), len( set(record['label'] for record in rendered_order if float(record['score']) >= threshold)), threshold)) html.append('</div>') html.append(html_sortheader) html.append('</div>') if gridwidth is None: gridname = '' gridwidth = imcount gridheight = 1 else: gridname = '-%d' % gridwidth gridheight = (imcount + gridwidth - 1) // gridwidth html.append('<div class="unitgrid"') # Leave off > to eat spaces if limit is not None: rendered_order = rendered_order[:limit] for i, record in enumerate( sorted(rendered_order, key=lambda record: -float(record['score']))): record['score-order'] = i for label_order, record in enumerate(rendered_order): unit = int(record['unit']) - 1 # zero-based unit indexing imfn = 'image/%s%s-%04d.jpg' % (expdir.fn_safe(layer), gridname, unit) if force or not ed.has('html/%s' % imfn): if verbose: print 'Visualizing %s unit %d' % (layer, unit) sys.stdout.flush() # Generate the top-patch image tiled = numpy.full(((imsize + gap) * gridheight - gap, (imsize + gap) * gridwidth - gap, 3), 255, dtype='uint8') for x, index in enumerate(top[unit]): row = x // gridwidth col = x % gridwidth vis = activation_visualization(ds, layerprobe, unit, index) if vis.shape[:2] != (imsize, imsize): vis = imresize(vis, (imsize, imsize)) tiled[row * (imsize + gap):row * (imsize + gap) + imsize, col * (imsize + gap):col * (imsize + gap) + imsize, :] = vis imsave(ed.filename('html/' + imfn), tiled) # Generate the wrapper HTML graytext = ' lowscore' if float(record['score']) < threshold else '' html.append('><div class="unit%s" data-order="%d %d %d">' % (graytext, label_order, record['score-order'], unit + 1)) html.append('<div class="unitlabel">%s</div>' % fix(record['label'])) html.append( '<div class="info">' + '<span class="layername">%s</span> ' % layer + '<span class="unitnum">unit %d</span> ' % (unit + 1) + '<span class="category">(%s)</span> ' % record['category'] + '<span class="iou">IoU %.2f</span>' % float(record['score']) + '</div>') html.append('<div class="thumbcrop"><img src="%s" height="%d"></div>' % (imfn, imscale)) html.append('</div') # Leave off > to eat spaces html.append('></div>') html.extend([html_suffix]) with open(ed.filename('html/%s.html' % expdir.fn_safe(layer)), 'w') as f: f.write('\n'.join(html))
def generate_html_summary(self, layer, imsize=64, imcount=16, imscale=None, tally_stats=None, gridwidth=None, verbose=False): print 'Generating html summary', (self.ed.filename( ['html', '%s.html' % expdir.fn_safe(layer)])) # Grab tally stats bestcat_pciou, name_pciou, score_pciou, _, _, _, _ = (tally_stats) if verbose: print 'Sorting units by score.' sys.stdout.flush() if imscale is None: imscale = imsize categories = self.ds.category_names() ordering = score_pciou.max(axis=0).argsort()[::-1] top = self.max_act_indexes(layer, count=imcount) self.ed.ensure_dir('html', 'image') css = ('https://maxcdn.bootstrapcdn.com/bootstrap/latest' + '/css/bootstrap.min.css') html = [ '<!doctype html>', '<html>', '<head>', '<link rel="stylesheet" href="%s">' % css, '</head>', '<body>', '<div class="container-fluid">' ] if gridwidth is None: gridname = '' gridwidth = imcount gridheight = 1 else: gridname = '-%d' % gridwidth gridheight = (imcount + gridwidth - 1) // gridwidth for unit in ordering: if verbose: print 'Visualizing %s unit %d' % (layer, unit) sys.stdout.flush() tiled = numpy.full(((imsize + 1) * gridheight - 1, (imsize + 1) * gridwidth - 1, 3), 255, dtype='uint8') for x, index in enumerate(top[unit]): row = x // gridwidth col = x % gridwidth vis = self.activation_visualization(layer, unit, index) if vis.shape[:2] != (imsize, imsize): vis = imresize(vis, (imsize, imsize)) tiled[row * (imsize + 1):row * (imsize + 1) + imsize, col * (imsize + 1):col * (imsize + 1) + imsize, :] = vis imfn = 'image/%s%s-%04d.jpg' % (expdir.fn_safe(layer), gridname, unit) imsave(self.ed.filename(['html', imfn]), tiled) labels = '; '.join([ '%s (%s, %f)' % (name_pciou[c][unit], categories[c], score_pciou[c, unit]) for c in bestcat_pciou[:, unit] ]) html.extend([ '<h6>%s unit %d: %s</h6>' % (layer, unit + 1, labels), '<img src="%s" height="%d">' % (imfn, imscale) ]) html.extend(['</div>', '</body>', '</html>', '']) with open( self.ed.filename(['html', '%s.html' % expdir.fn_safe(layer)]), 'w') as f: f.write('\n'.join(html))
args = parser.parse_args() np = NetworkProbe(args.directory, blobs=args.blobs) for blob in args.blobs: formats = args.format.split(',') if 'imgmax' in formats: np.generate_imgmax(blob) if 'html' in formats or 'csv' in formats: tally_stats = np.score_tally_stats(blob, verbose=True) if 'html' in formats: np.generate_html_summary(blob, imsize=args.imsize, imscale=args.imscale, imcount=args.imcount, tally_stats=tally_stats, gridwidth=args.gridwidth, verbose=True) if 'csv' in formats: filename = os.path.join(args.directory, '%s-result.csv' % expdir.fn_safe(blob)) np.generate_csv_summary(blob, filename, tally_stats, order=(args.csvorder.split(',') if args.csvorder else None), verbose=True) if 'quantmat' in formats: np.generate_quantmat(blob, verbose=True) except: traceback.print_exc(file=sys.stdout) sys.exit(1)