fashion-eye / netdissect /aceplotablate.py
sidharthism's picture
Added app
e0c7c25
import os, sys, argparse, json, shutil
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
from matplotlib.ticker import MaxNLocator
import matplotlib
def main():
parser = argparse.ArgumentParser(description='ACE optimization utility',
prog='python -m netdissect.aceoptimize')
parser.add_argument('--classname', type=str, default=None,
help='intervention classname')
parser.add_argument('--layer', type=str, default='layer4',
help='layer name')
parser.add_argument('--outdir', type=str, default=None,
help='dissection directory')
parser.add_argument('--metric', type=str, default=None,
help='experiment variant')
args = parser.parse_args()
if args.metric is None:
args.metric = 'ace'
run_command(args)
def run_command(args):
fig = Figure(figsize=(4.5,3.5))
FigureCanvas(fig)
ax = fig.add_subplot(111)
for metric in [args.metric, 'iou']:
jsonname = os.path.join(args.outdir, args.layer, 'fullablation',
'%s-%s.json' % (args.classname, metric))
with open(jsonname) as f:
summary = json.load(f)
baseline = summary['baseline']
effects = summary['ablation_effects'][:26]
norm_effects = [0] + [1.0 - e / baseline for e in effects]
ax.plot(norm_effects, label=
'Units by ACE' if 'ace' in metric else 'Top units by IoU')
ax.set_title('Effect of ablating units for %s' % (args.classname))
ax.grid(True)
ax.legend()
ax.set_ylabel('Portion of %s pixels removed' % args.classname)
ax.set_xlabel('Number of units ablated')
ax.set_ylim(0, 1.0)
ax.set_xlim(0, 25)
fig.tight_layout()
dirname = os.path.join(args.outdir, args.layer, 'fullablation')
fig.savefig(os.path.join(dirname, 'effect-%s-%s.png' %
(args.classname, args.metric)))
fig.savefig(os.path.join(dirname, 'effect-%s-%s.pdf' %
(args.classname, args.metric)))
if __name__ == '__main__':
main()