[pypy-commit] extradoc extradoc: video analytics develoopment demo

hakanardo noreply at buildbot.pypy.org
Wed Sep 12 12:15:03 CEST 2012


Author: Hakan Ardo <hakan at debian.org>
Branch: extradoc
Changeset: r4795:985ea216ea2f
Date: 2012-09-12 12:14 +0200
http://bitbucket.org/pypy/extradoc/changeset/985ea216ea2f/

Log:	video analytics develoopment demo

diff --git a/talk/dls2012/demo/analytics.py b/talk/dls2012/demo/analytics.py
--- a/talk/dls2012/demo/analytics.py
+++ b/talk/dls2012/demo/analytics.py
@@ -1,3 +1,4 @@
+
 from reloader import ReloadHack
 from io import view
 from background import Background
@@ -10,4 +11,6 @@
     def update(self, frame):
         self.background.update(frame)
         fg = foreground(frame, self.background.image)
-        view(255*fg)
+        #view(self.background.image)
+        view(255 * fg)
+
diff --git a/talk/dls2012/demo/analytics_1.py b/talk/dls2012/demo/analytics_1.py
deleted file mode 100644
--- a/talk/dls2012/demo/analytics_1.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from reloader import ReloadHack
-from io import view
-
-class Tracker(ReloadHack):
-    def update(self, img):
-        view(img)
diff --git a/talk/dls2012/demo/analytics_2.py b/talk/dls2012/demo/analytics_2.py
deleted file mode 100644
--- a/talk/dls2012/demo/analytics_2.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from reloader import ReloadHack
-from io import view
-
-class Tracker(ReloadHack):
-    def update(self, img):
-        view(2 * img)
diff --git a/talk/dls2012/demo/analytics_3.py b/talk/dls2012/demo/analytics_3.py
deleted file mode 100644
--- a/talk/dls2012/demo/analytics_3.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from reloader import ReloadHack
-from io import view
-from background import Background
-
-class Tracker(ReloadHack):
-    def __init__(self):
-        self.bkg = Background()
-
-    def update(self, img):
-        background = self.bkg.update(img)
-        view(background)
diff --git a/talk/dls2012/demo/background.py b/talk/dls2012/demo/background.py
--- a/talk/dls2012/demo/background.py
+++ b/talk/dls2012/demo/background.py
@@ -1,10 +1,13 @@
+
 from reloader import ReloadHack
 
 class Background(ReloadHack):
     def __init__(self):
-        self.fcnt = self.image = 0
+        self.fcnt = 0
+        self.image = 0
 
     def update(self, frame):
-        self.image = (self.fcnt * self.image + frame) / (self.fcnt + 1)
         self.fcnt += 1
+        alfa = self.fcnt/(self.fcnt + 1.0)
+        self.image = alfa * self.image + (1 - alfa) * frame
 
diff --git a/talk/dls2012/demo/demo.py b/talk/dls2012/demo/demo.py
new file mode 100644
--- /dev/null
+++ b/talk/dls2012/demo/demo.py
@@ -0,0 +1,111 @@
+from subprocess import call, Popen
+import os, time, re
+
+class Vim(object):
+    def __init__(self, *args):
+        self.servername = 'DEMO_%d_%d' % (os.getpid(), id(self))
+        call(['gvim', '--servername', self.servername] + list(args))
+
+    def send(self, cmd):
+        call(['gvim', '--servername', self.servername, '--remote-send', cmd])
+
+    def type(self, cmd, delay=0.05):
+        for c in re.findall('[^<>]|<.*?>', cmd):
+            self.send(c)
+            time.sleep(delay)
+
+    def __del__(self):
+        self.send('<ESC>:q!<CR>')
+
+def pause(msg=''):
+    print
+    print msg
+    raw_input('Press ENTER')
+
+def demo():
+    with open('analytics.py', 'w') as fd:
+        print >>fd, """
+from reloader import ReloadHack
+from io import view
+
+class Tracker(ReloadHack):
+    def update(self, frame):
+        view(frame)
+"""
+    runner = Popen(['pypy', 'run.py', 'demo.mpg'])
+    vim = Vim('analytics.py')
+
+    pause("We'r looking at the input and output of this Tracker object that\n" + 
+          "currently simply returns it input. Let's modify it to make some\n" +
+          "simple contrast adjustment.")
+    vim.send('7gg$')
+    vim.type('i * 2<ESC>:w<CR>', 0.2)
+
+    pause("Now let's create a new class that estimetae a background image\n" +
+          "using a sliding mean.")
+    with open('background.py', 'w') as fd:
+        print >>fd, """
+from reloader import ReloadHack
+
+class Background(ReloadHack):
+    def __init__(self):
+        self.image = 0
+
+    def update(self, frame):
+        alfa = 0.9
+        self.image = alfa * self.image + (1 - alfa) * frame
+"""    
+    vim.send(':e background.py<CR>')
+
+    pause("Then, update Tracker to using the background estimater.")
+    vim.send(':e analytics.py<CR>')
+    vim.type('4ggifrom background import Background<CR><ESC>')
+    vim.type('7ggOdef __init__(self):<CR>self.background = Background()<CR><ESC>')
+    vim.type('11ggddOself.background.update(frame)<CR>view(self.background.image)<ESC>:w<CR>')
+
+    pause("The moving objects are turned into ghosts. We need to increase the\n" +
+          "window size to get a better estimate.")
+    vim.send(':e background.py<CR>9gg')
+    vim.type('A9<ESC>:w<CR>', 0.2)
+
+    pause("We'r still getting ghost. Let's try to increase it even more.")
+    vim.type('A9<ESC>:w<CR>', 0.2)
+
+    pause("Now it's taking forever to converge. Let's make the window size\n" + 
+          "depend on the number of frames observed.")
+    vim.type('6ggOself.fcnt = 0<ESC>')
+    vim.type('10ggOself.fcnt += 1<ESC>')
+    vim.type('11ggA<BS><BS><BS><BS><BS>self.fcnt/(self.fcnt + 1.0)<ESC>:w<CR>')
+
+    pause("That's better. Now, let's create a new function performing\n" + 
+          "background subtraction,")
+    with open('foreground.py', 'w') as fd:
+        print >>fd, """
+from reloader import autoreload
+
+ at autoreload
+def foreground(img, bkg):
+    return ((bkg - img) ** 2) > 40
+"""
+    vim.send(':e foreground.py<CR>')
+
+    pause("and update Tracker to call it using the estimated background.")
+    vim.send(':e analytics.py<CR>')
+    vim.type('4ggofrom foreground import foreground<ESC>')
+    vim.type('12ggofg = foreground(frame, self.background.image)<ESC>')
+    vim.type('jI#<ESC>oview(255 * fg)<ESC>:w<CR>')
+
+    pause("Wait a bit for the background to converge.")
+
+    pause("That's a bit noisy. We'll have to increase the threashold a bit.")
+    vim.send(':e foreground.py<CR>')
+    vim.type('6ggA<BS><BS>100<ESC>:w<CR>', 0.2)
+
+    pause("Still a bit noisy, let's increase it even more.")
+    vim.type('6ggA<BS><BS><BS>200<ESC>:w<CR>', 0.2)
+
+    pause("That's all!")
+
+    runner.kill()
+if __name__ == '__main__':
+    demo()
diff --git a/talk/dls2012/demo/foreground.py b/talk/dls2012/demo/foreground.py
--- a/talk/dls2012/demo/foreground.py
+++ b/talk/dls2012/demo/foreground.py
@@ -1,6 +1,7 @@
+
 from reloader import autoreload
 
 @autoreload
 def foreground(img, bkg):
-    return ((bkg - img) ** 2) > 100
+    return ((bkg - img) ** 2) > 200
 
diff --git a/talk/dls2012/demo/foreground_1.py b/talk/dls2012/demo/foreground_1.py
deleted file mode 100644
--- a/talk/dls2012/demo/foreground_1.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from reloader import ReloadHack
-
-class Foreground(ReloadHack):
-    def update(self, img, bkg):
-        return ((bkg - img) ** 2) > 50
-
diff --git a/talk/dls2012/demo/reloader.py b/talk/dls2012/demo/reloader.py
--- a/talk/dls2012/demo/reloader.py
+++ b/talk/dls2012/demo/reloader.py
@@ -29,6 +29,7 @@
                             except Exception as e:
                                 print
                                 traceback.print_exc()
+                                self.halted = True
                             else:
                                 if not self.halted:
                                     break


More information about the pypy-commit mailing list