Entries tagged “gorfou”

Prise de vue photo automatisée pour animations et 3D Relief !

written by ccomb, on Nov 3, 2010 9:20:00 PM.

Voici quelques photos de l'outil de prise de vue automatisée sur lequel je travaille depuis pas mal de temps. Toute la partie matérielle est réalisée par Alain Brevard, et je m'occupe de la partie logicielle, pilotage moteur et appareil photo, le tout avec les conseils de Mathieu Levaslot de la société Luxrelief, premier utilisateur du système.

/static/rail/rail6.jpg

L'objectif est multiple, il s'agit d'abord de permettre des prises de vue de haute qualité pour écrans Alioscopy (3D relief sans lunettes sur 8 points de vue), avec des appareils photos reflex haut de gamme (Canon 5D, 1D, Nikon D300, D700, etc.). Le principe de base de ces écrans est qu'ils diffusent simultanément 8 images selon 8 angles différents. Chaque oeil reçoit donc une image différente, ce qui reproduit l'impression de relief. Il faut donc faire 8 photos équidistantes.

Sans ce dispositif, il faut prendre une photo, puis déplacer manuellement l'appareil de quelques centimètres, puis reprendre une photo et ainsi de suite, en espérant que le sujet et l'éclairage n'ont pas bougé. Tout ceci prend pas mal de temps et comporte des risques d'erreur.

Grâce à ce rail de prise de vue automatisé, le tout se fait en quelques secondes, et est entièrement réglable et reproductible. On peut tester rapidement plusieurs paramètres et choisir le meilleur résultat. Le dispositif est composé d'un rail équipé d'un moteur pas à pas, un contrôleur et son alimentation, et un mini PC autonome sans écran ni clavier. L'utilisation est extrêmement simple et ne nécessite strictement aucune installation : il suffit de brancher son ordi portable (sous Mac, Windows ou Linux) au mini PC grâce à un câble réseau, puis d'ouvrir son navigateur web. Ensuite une interface ressemblant à un site web permet d'effectuer une calibration, des déplacement précis de l'appareil photo et lancer des prises de vue ou des vidéos en travelling.

Le deuxième appareil est un plateau mobile permettant de créer des animations rotatives de très haute précision. On peut l'utiliser par exemple pour faire une animation sur 360 degrés en mode continu, pour de la vidéo, mais aussi en mode photo, en choisissant de faire par exemple 360 photos espacées d'1 degré. Le plateau va alors s'arrêter après chaque déplacement pour laisser le temps à l'appareil de prendre la photo et aux flash de se recharger. Ce plateau peut aussi être utilisé aussi bien pour des animations classiques en 2D ou pour de la 3D relief. On peut reproduire le même mouvement plusieurs fois au centième de millimètre près. Et la solidité de la construction autorise même d'y poser un lave-linge, si vous êtes amateur d'animations de lave-linge...

Le système est aujourd'hui suffisamment fiable et est déjà utilisé en studio photo professionnel pour Dior, Clinique, Longchamps et Decléor, et pour une expo à la Cité de la Dentelle à Calais. Si vous connaissez quelqu'un intéressé, contactez-moi directement, il est possible de le louer à la journée, et également de fournir de l'assistance ou du conseil sur la 3d Relief et ses spécificités.

Le système fonctionne sous Linux (Debian) et est fabriqué entièrement avec le langage Python qui, grâce à sa polyvalence, permet de réaliser aussi bien le contrôle moteur que l'interface web (ici en Pylons) ou le traitement d'image. À ce sujet, l'étape suivante sera d'assembler les images automatiquement et d'être capable d'afficher l'image relief sur l'écran Alioscopy juste après la prise de vue car le mini PC comporte une sortie DVI. Keep in touch !!

/static/rail/rail5.jpg /static/rail/rail4.jpg /static/rail/rail3.jpg /static/rail/rail7.jpg /static/rail/rail2.jpg
/static/rail/rail1.jpg

Benchmark filesystem dedibox v1, v2, v3, sur Ubuntu et Debian

written by ccomb, on Aug 14, 2010 11:00:00 PM.

Debian

update : voir aussi la 2ème partie de cet article

J'ai commandé récemment trois dedibox v3 : deux pour l'AFPY, une pour Gorfou, afin de remplacer les anciennes. Cette dedibox v3 est sortie il y a peu, et semble à première vue être intéressante : pour deux fois moins cher, on a plus de mémoire vive, plus d'espace disque, un CPU plus rapide, avec 64bits et virtualisation, et plus de bande passante. J'ai réalisé que j'avais accès aux trois générations de dedibox : les deux serveurs principaux AFPY et Gorfou sont des dedibox v1, et le serveur secondaire de l'AFPY, qui servait pour les buildbots, est une dedibox v2 (mise à disposition par Toonux).

J'en ai profité pour lancer un test de filesystem en utilisant iozone.

Voici les machines utilisées :

nom génération système archi syst. fichiers
py dedibox v1 Debian Lenny 5.0 32 buts ext3
cody dedibox v1 Ubuntu 10.04 Lucid 32 bits ext3
boa dedibox v2 Debian 5.0 Lenny 32 bits ext3
nouvelle cody dedibox v3 Ubuntu 10.04 Lucid 64 bits ext3
nouvelle boa dedibox v3 Ubuntu 10.04 Lucid 64 bits ext3
nouvelle py dedibox v3 Debian 6.0 Squeeze 64 bits ext3

J'ai juste lancé « iozone -a » (mode automatique) deux fois sur chaque serveur (1 seule fois sur cody).

Le résultat de iozone est un grand tableau de nombres illisible. Plutôt que d'ouvrir le résultat dans OpenOffice, j'ai trouvé que c'était une bonne occasion de jouer avec NumPy et Matplotlib pour extraire les données et tracer des résultats comparatifs en 3D.

Je tiens à signaler que les mesures n'ont pas été faites dans des conditions idéales, et que je n'ai pas cherché à modifier les options d'iozone. Si vous voulez comprendre les valeurs, reportez-vous à la doc d'iozone.

Voici les résultats :

Comparatif Dedibox V1 / V2 / V3

Lecture

En lecture, la dedibox v3 est la plus rapide des trois, il n'y a aucun doute.

/static/bench1/read.png /static/bench1/reread.png /static/bench1/random_read.png /static/bench1/bkwd_read.png /static/bench1/stride_read.png /static/bench1/fread.png
/static/bench1/freread.png

Écriture

En écriture, c'est un peu moins clair : la dedibox v3 est plus rapide dans 4 tests sur 6.

/static/bench1/write.png /static/bench1/rewrite.png /static/bench1/random_write.png /static/bench1/record_rewrite.png /static/bench1/fwrite.png
/static/bench1/frewrite.png

Comparatif Ubuntu / Debian

Voyons maintenant la différence entre Debian et Ubuntu. Ici les machines sont censées être les mêmes, sont toutes les deux vides et non utilisées, et sont installées avec les dernières versions de Debian 6.0 et Ubuntu 10.04. Les noyaux sont tous les deux des 2.6.32.

On note une très forte différence entre les deux : la machine sous Debian est beaucoup plus rapide.

Lecture

/static/bench2/read.png /static/bench2/reread.png /static/bench2/random_read.png /static/bench2/bkwd_read.png /static/bench2/stride_read.png /static/bench2/fread.png
/static/bench2/freread.png

Écriture

Bizzare, mais même constat, la dedibox sous Debian est en moyenne une fois et demi plus rapide que celle avec Ubuntu.

/static/bench2/write.png /static/bench2/rewrite.png /static/bench2/random_write.png /static/bench2/record_rewrite.png /static/bench2/fwrite.png
/static/bench2/frewrite.png

Je me garderai de faire des commentaires, vu les conditions dans lesquelles ces tests ont été réalisés, mais ça mériterait de creuser un peu...

Script d'extraction

Si vous voulez reproduire les grahiques, voici comment faire.

Il faut récupérer la sortie de « iozone -a » en ne gardant que le tableau, puis changer l'en-tête du tableau pour qu'il tienne sur une seule ligne, et sauver ça dans un fichier texte. Ensuite il faut installer Matplotlib 1.0. La version 0.99 fournie avec Ubuntu 10.04 ne convient pas, il faut compiler la version 1.0. Je vous laisse le doux plaisir de découvrir les dépendances à installer

$ virtualenv sandbox
$ sandbox/bin/pip install  install http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0/matplotlib-1.0.0.tar.gz/download

Ensuite voici le script qui a permis d'extraire et tracer les données, que j'appelle bench.py :

#!/usr/bin/env python
# coding: utf-8
import sys
import pylab, numpy as np
from numpy import log2
from mpl_toolkits.mplot3d import axes3d

tests = {}

files = sys.argv[1:]
pylab_colors = ('r', 'g', 'b', 'y', 'm', 'y', 'k')
assert len(files) <= len(pylab_colors)
colors = dict([(f, pylab_colors[i]) for i, f in enumerate(files)])

for k, filename in enumerate(files):
    with open(filename) as f:
        tests[filename] = {}
        tests[filename]['titles'] = f.readline().split()[2:]
    tests[filename]['raw'] = np.loadtxt(filename, dtype=int, skiprows=1)
    for i, testname in enumerate(tests[filename]['titles']):
        tests[filename][testname] = {}
        data = tests[filename][testname]['data'] = np.zeros((20, 15))
        data[:] = np.nan
        raw = tests[filename]['raw']
        data[log2(raw[:,0]).astype(int), log2(raw[:,1]).astype(int)] = raw[:, i+2]
        data /= 1024.0
        tests[filename][testname]['mean'] = data[-np.isnan(data)].mean()
        tests[filename][testname]['max'] = data[-np.isnan(data)].max()


axes = {}
X, Y = np.mgrid[0:20,0:15]
for testname in tests.values()[0]['titles']:
    ax = axes3d.Axes3D(pylab.figure())
    ax.w_xaxis.set_ticks(range(3,21,2))
    ax.w_yaxis.set_ticks(range(2,15,2))
    ax.w_xaxis.set_ticklabels(2**np.arange(3,21,2))
    ax.w_yaxis.set_ticklabels(2**np.arange(2,15,2))
    ax.set_xlabel('kB')
    ax.set_ylabel('reclen')
    ax.set_zlabel('MB/s')
    means = dict([(filename, tests[filename][testname]['mean']) for filename in files])
    maxs = max([tests[filename][testname]['max'] for filename in files])
    ax.text(X.min(), 15, maxs, 'test: ' + testname, color='k')
    for i, filename in enumerate(sorted(means, key=lambda x:-means[x])):
        i+=1
        Z = tests[filename][testname]['data']
        c = colors[filename]
        ax.plot_wireframe(X, Y, Z, color=c)
        ax.text(X.min(), 15, maxs*(1-0.07*i),
                str(int(means[filename])) + " MB/s : " + filename, color=c)
    #pylab.gcf().set_size_inches(6,4)
    pylab.savefig(testname + '.png')

pylab.show()

Pour le lancer avec la nouvelle version de matplotlib, il suffit d'utiliser le Python de la sandbox. Le script prend en paramètres les fichiers contenant les résultats iozone

$ ./sandbox/bin/python bench.py resultat1.txt resultat2.txt resultat3.txt

Il est possible d'écrire un script beaucoup plus propre, mais je voulais juste m'obliger à le faire avec Numpy et Matplotlib et sans y passer trop de temps non plus. Notez qu'une des lignes du script utilise une affectation grâce au Fancy Indexing de Numpy:

data[log2(raw[:,0]).astype(int), log2(raw[:,1]).astype(int)] = raw[:, i+2]

test