Display model title in overlay.

By default title is a model name or it can be customized via
command line.

Change-Id: Ib92e8365268b1377fe73d8d1ca6b89b5391b814e
diff --git a/edgetpuvision/classify.py b/edgetpuvision/classify.py
index 11f6d29..51119ad 100644
--- a/edgetpuvision/classify.py
+++ b/edgetpuvision/classify.py
@@ -14,8 +14,8 @@
 from edgetpu.classification.engine import ClassificationEngine
 
 from . import svg
+from . import utils
 from .apps import run_app
-from .utils import load_labels, input_image_size, same_input_image_sizes, avg_fps_counter
 
 
 CSS_STYLES = str(svg.CssStyle({'.back': svg.Style(fill='black',
@@ -94,17 +94,17 @@
     acc = accumulator(size=args.window, top_k=args.top_k)
     acc.send(None)  # Initialize.
 
-    fps_counter=avg_fps_counter(30)
+    fps_counter = utils.avg_fps_counter(30)
 
-    engines = [ClassificationEngine(m) for m in args.model.split(',')]
-    assert same_input_image_sizes(engines)
+    engines, titles = utils.make_engines(args.model, ClassificationEngine)
+    assert utils.same_input_image_sizes(engines)
     engines = itertools.cycle(engines)
     engine = next(engines)
 
-    labels = load_labels(args.labels)
+    labels = utils.load_labels(args.labels)
     draw_overlay = True
 
-    yield input_image_size(engine)
+    yield utils.input_image_size(engine)
 
     output = None
     while True:
@@ -121,7 +121,8 @@
             if args.print:
                 print_results(inference_rate, results)
 
-            output = overlay(None, results, inference_time, inference_rate, layout)
+            title = titles[engine]
+            output = overlay(title, results, inference_time, inference_rate, layout)
         else:
             output = None
 
diff --git a/edgetpuvision/detect.py b/edgetpuvision/detect.py
index c688729..b50f795 100644
--- a/edgetpuvision/detect.py
+++ b/edgetpuvision/detect.py
@@ -20,8 +20,8 @@
 from edgetpu.detection.engine import DetectionEngine
 
 from . import svg
+from . import utils
 from .apps import run_app
-from .utils import load_labels, input_image_size, same_input_image_sizes, avg_fps_counter
 
 CSS_STYLES = str(svg.CssStyle({'.back': svg.Style(fill='black',
                                                   stroke='black',
@@ -127,20 +127,20 @@
         print('    %d: %s, area=%.2f' % (i, obj, obj.bbox.area()))
 
 def render_gen(args):
-    fps_counter=avg_fps_counter(30)
+    fps_counter  = utils.avg_fps_counter(30)
 
-    engines = [DetectionEngine(m) for m in args.model.split(',')]
-    assert same_input_image_sizes(engines)
+    engines, titles = utils.make_engines(args.model, DetectionEngine)
+    assert utils.same_input_image_sizes(engines)
     engines = itertools.cycle(engines)
     engine = next(engines)
 
-    labels = load_labels(args.labels) if args.labels else None
+    labels = utils.load_labels(args.labels) if args.labels else None
     filtered_labels = set(l.strip() for l in args.filter.split(',')) if args.filter else None
     get_color = make_get_color(args.color, labels)
 
     draw_overlay = True
 
-    yield input_image_size(engine)
+    yield utils.input_image_size(engine)
 
     output = None
     while True:
@@ -149,7 +149,7 @@
         inference_rate = next(fps_counter)
         if draw_overlay:
             start = time.monotonic()
-            objs = engine.DetectWithInputTensor(tensor, threshold=args.threshold, top_k=args.top_k)
+            objs = engine .DetectWithInputTensor(tensor, threshold=args.threshold, top_k=args.top_k)
             inference_time = time.monotonic() - start
             objs = [convert(obj, labels) for obj in objs]
 
@@ -161,7 +161,8 @@
             if args.print:
                 print_results(inference_rate, objs)
 
-            output = overlay(None, objs, get_color, inference_time, inference_rate, layout)
+            title = titles[engine]
+            output = overlay(title, objs, get_color, inference_time, inference_rate, layout)
         else:
             output = None
 
diff --git a/edgetpuvision/utils.py b/edgetpuvision/utils.py
index 8de053e..c0e2e49 100644
--- a/edgetpuvision/utils.py
+++ b/edgetpuvision/utils.py
@@ -1,4 +1,5 @@
 import collections
+import os
 import re
 import time
 
@@ -27,3 +28,15 @@
         window.append(curr - prev)
         prev = curr
         yield len(window) / sum(window)
+
+def make_engines(models, engine_class):
+    engines, titles = [], {}
+    for model in models.split(','):
+        if '@' in model:
+            model_path, title = model.split('@')
+        else:
+            model_path, title = model, os.path.basename(os.path.normpath(model))
+        engine = engine_class(model_path)
+        engines.append(engine)
+        titles[engine] = title
+    return engines, titles