All the programs listed in this page are distributed under the GPL 3.0-only, with the exception of the emacs scripts which are under GPL 3.0-or-later.
You can browse all the projects on their git repository.
Here are a few programs directly related to my research.
This is an implementation of the Multi-Tracked Paths, a variant of KSP for multi-target tracking that we have developed for multi-camera pedestrian tracking (Berclaz et al. 2011). You can get more information and the reference implementation from the CVLab's web page about multi-camera tracking.
My implementation is very light, and requires no library. You can get it from the repository with
git clone http://fleuret.org/git/mtp/
and try it on a toy problem with
cd mtp make ./mtp_example ./mtp --verbose --trajectory-file result.trj --graph-file graph.dot tracker.dat
If you have Graphviz installed, you can visualize the underlying graph and computed trajectories with
dot < graph.dot -T pdf -o graph.pdf
Have a look at the README.txt file for a more detailed information.
This procedure is a variant of k-mean using labelled samples, which enforces in every cluster the same proportion of samples from every class. This ensures that the resulting clusters are totally non-informative about the class, while maximally informative about the signal.
You can get the source code from the repository with
git clone http://fleuret.org/git/clueless-kmean/
Then, execute
./test.sh
to compile the source, run the algorithm on a 2d toy example, and produce two images result-standard.png and result-clueless.png if you have gnuplot installed.
Don Geman and I developed a series of synthetic image recognition problems which require to go beyond local descriptors and simple statistics of the image to be solved properly, and that we used to compare humans and machine-learning (Fleuret et al. 2011b).
You can get the source code from the repository with
git clone http://fleuret.org/git/svrt/
This is a detection algorithm we have developed for cat detection (Fleuret & Geman 2008). You can get the source code with
git clone http://fleuret.org/git/folded-ctf/
And the full data archive rmk-v1.0.tgz.
Have a look at the README.txt file for a more detailed information.
The Probabilistic Occupancy Map is an algorithm to estimate an approximation of the marginal posterior probabilities of presence of individuals at different locations of an area of interest, given the result of a background subtraction procedure in different views. The camera calibrations are indirectly provided through a family of rectangles which approximate the silhouettes of individuals located at the considered locations. You can download the source code with
git clone http://fleuret.org/git/pom/
You can find detailed information in the section V and Appendix A of Fleuret al. 2008.
The Conditional Mutual Information Maximization is a feature-selection technique for two-class classification with binary features (Fleuret 2004). It is extremely fast (a few tens of a second learning for typical tasks), and when combined with a naive Bayesian learner it is very robust to over-fitting. Error rates are similar to those obtained with state of the art methods such as SVM or boosting.
You can download an implementation under the GPL v3.0 with
git clone http://fleuret.org/git/cmim/
To use it, just execute test.sh. It will create a training and test sets for a toy problem, run the various classifiers and display the error rates.
This is a small application to do very standard operations on data-sets, mainly as pre-processing for gnuplot. It can compute an histogram from a list of values, compute mean, variance, standard deviation, maximum and minimum values, compute the ROC curve or the ROC surface. This is not rocket science, but I use it often and it may be useful to others, too.
git clone http://fleuret.org/git/data-tool/
I wrote, as a part of a larger project, a multi-layer perceptron in C++. On the MNIST data set, with the raw pixels in input, 200 hidden neurons, 10 output neurons with a winner-take-all rule and 40,000 examples for training, it achieves 3.42% error rate on the test set.
git clone http://fleuret.org/git/mlp/
This mapping class allows to manipulate formal expressions easily as if they were numerical values (i.e. operators and standard mathematical functions are defined).
git clone http://fleuret.org/git/mappings/
Here are a few application for Linux and other unices written in plain C.
You can install them easily by putting the source and compiling wherever you want, creating symbolic links in ${HOME}/local/bin/ and ${HOME}/local/man/man1/ to the executables and man-pages, and adding these directories to your $PATH and $MANPATH respectively.
The selector command is a real-time interactive pattern matcher in console. It can be used to visit efficiently files in general, and shell history in particular. For the latter, contrary to what the readline C-r does, it does not show only one entry at a time, but restricts in real time the display to all the entries matching the pattern. You can at any time select one, which will be injected in the input buffer of the current tty.
Its aims are somehow similar to those of dmenu, but it is a pure tty command that can be used in console.
You can get the source code and man page with
git clone http://fleuret.org/git/selector/
It is general enough to be used with any shell, but was written for and tested with bash, and it has a short-cut option --bash, which is just equivalent to a bunch of other flags.
A bash-specific script is provided, so you just have to add to your ~/.bashrc
source bash-selector.sh --hist --cd
This will install a key-bindings M-r for a super history search, and it will redefine the cd command to keep an history of the directories you visit, and install a key-bindings M-c to search it.
As far as I know, this software works on Linux amd64, Linux i386, Linux ARM, MacOS, and FreeBSD 8.0. The -v option is broken on the latter, since TIOCSTI is.
The modern way of dealing with mails consists of keeping everything, and using search tools to retrieve rapidly mails from a certain sender, or related to a certain subject, etc. Multiple tools such as notmuch, or mu follow this philosophy.
My mymail command is similar in spirit, but simpler. It can visit directories recursively and create index files from all the mboxes it finds, or retrieve mails listed in such index files, whose senders, recipients, subject, etc. match specified regexps. The index files are flat text, with a bunch of lines for each mail.
The indexing takes into account fields which are usually ignored. For instance, the sender is defined by aggregating not only the From: field, but also Reply-to: and the leading "From " line of each mail.
The following command will index all the mbox files present in the directories ~/archives/mails/2010 and ~/archives/mails/2011 (recursively) and create an index file /tmp/mymail/2010-2011/mymail.db
mymail --db-file /tmp/mymail/2010-2011/mymail.db \
--index \
~/archives/mails/2010 ~/archives/mails/2011
and the following one will search in all the database files *.db located (recursively) in /tmp/mymail, for all the mails having "bob.something" as sender or recipient, without "spam" in the subject, received over the last 31 days, and create an mbox file /tmp/mymail/mbox.
mymail --db-pattern '\.db$' --db-root /tmp/mymail \
--output /tmp/mymail.mbox \
--search 'p bob.something' \
--search '!s spam' \
--search 'month'
Despite not using a fancy database, both indexing and search are pretty fast. On my laptop (i7, ssd), it takes 20s to index 6.5Gb of mails, and 2s to retrieve 4150 mails and create the corresponding mbox. A standard search request takes less than a second.
You can get the source code, the man page, and a wrapper for the emacs email reader vm from the git repository with
git clone http://fleuret.org/git/mymail/
It should compile under any reasonable POSIX system.
To use it under emacs, I have in my .emacs.el
(load "~/sources/gpl/mymail/mymail-vm.el")
(define-key vm-summary-mode-map "\\" 'mymail/vm-visit-folder)
(setq mymail/default-search-request "today"
mymail/default-additional-search-requests "!s ^\\[SPAM\\]")
(add-to-list 'recentf-exclude "/tmp/mymail-vm-.*\.mbox")
and I modified the script I use to retrieve mails so that it automatically updates the mymail indexes each time.
The dus command computes the size of files and directories recursively and displays them sorted accordingly. You can get the source code and man page from the repository with
git clone http://fleuret.org/git/dus/
It compiles and works on Linux amd64, Linux i386, Linux ARM, and FreeBSD 8.0.
The finddup command can find duplicated files in a given directory, files from one directory which exist also in another one, or files which exist in a directory and not in another one. It scan directories recursively, ignore symlinks and compares file sizes before checking their contents.
git clone http://fleuret.org/git/finddup/
It compiles and works on Linux amd64, Linux i386, Linux ARM, and FreeBSD 8.0.
This is a very simple daemon to control the fan speed. I used it on a Lenovo X61s for three years, and am now using it on a T420s without problem. However, there were no extensive test on other machines, nor by other people, so please use with care.
git clone http://fleuret.org/git/breezed/
Here are some of the numerous scripts I wrote over the years for Emacs. You can get them with
git clone http://fleuret.org/git/elisp/
In particular, you will get my heavy emacs.el and vm configuration file.
The function defined in alarm-vc.el checks if the file loaded in the current buffer is under cvs, subversion or git and adds an alarm in the modeline if it is not while some files in the directory are. You just need to load the source file to activate the thing.
The function selector/select in selector.el is a dynamic regexp-matching interface. While you type, the buffer dynamically refreshes its content to show only the strings matching the regexp you have typed so far. It is very useful for instance to find files among those recently opened. You just have to add to your ~/.emacs.el
(require 'recentf) (recentf-mode 1) (when (load "selector" t t) (define-key global-map [(control x) (control r)] 'selector/quick-pick-recent) (define-key global-map [(control c) (control s)] 'selector/quick-move-in-buffer) (define-key global-map [(control x) (control b)] 'selector/switch-buffer) )
If you often write things in English and need to lookup words, the lookup-dict.el command can be handy. It calls the dict command with either the content of the selected region or the word at point and displays the result in a new buffer. Just add
(load "lookup-dict.el") (define-key global-map [(control \?)] 'lookup-dict)
in your ~/.emacs.el to associate that command to the C-? key.
Since I am an intensive Emacs user, I wrote this major mode front-end to mplayer to avoid all those fancy GUIs young kids love those days. It displays your list of mp3 and web radios in a buffer and allows you both to control mplayer and organize sequences to play. You can check this impressive screenshot.
I have the following in my ~/.emacs.el:
(when (load "media.el" nil t)
(setq media/expert t
media/history-size 1000
media/playlist-file "~/private/media-playlists"
media/mplayer-args '("-softvol" "-framedrop")
media/url-list '("~/mp3"
("http://72.20.6.90:8156/listen.pls" . "bsp.org")
("http://www.radioswissjazz.ch/live/mp3.m3u" . "Swiss Jazz")
))
(define-key global-map [(meta \\)] 'media)
)
Press `?' to get a very short help, or look for the media/* in the binding list given by C-h b.
To remember rendez-vous, dead-lines and important things in general I wrote enotes.el, which can store notes, each associated to a date and a warning time. An alert pops up at the warning time, and a new warning time is automatically set. The whole stuff is simple and light to use. Here is a screenshot. Read the comments in the source to see how to use it.
I have the following in my ~/.emacs.el:
(when (load "enotes" nil t) (setq enotes/file "~/private/enotes") (enotes/init) (define-key global-map [(control x) (control n)] 'enotes/show-all-notes))
Here are my various handy shell scripts. Some were written ages ago are not relevant anymore.
This bashrc for bash mainly sets the window title according to the current working directory, and do a few others things.
The DNS-323 is a cheap NAS under Linux. After some Googling, I could not find a simple recipe to shut it down from the command line. Hence here is a short script called dns323-op.sh to get the current status (temperature, RAID, etc.), restart it or shut it down. Use the -h flag to get the (concise) help.
Here is a short bash script kill-unused-xterms.sh to kill all open xterms which have only one bash as children and nothing else.
These are things I wrote a long time ago, some in my young age, which means in the 1990s. When no license is specified, consider the code to be distributed under the GPL 3.0.
This is an extremely simple window class to make graphical output under X11. It needs no library beside libX11.
git clone http://fleuret.org/git/simple-window/
This applet is an interactive cross-words grid for web pages. Its source code Words.java is under the GPL 3.0.
To use it, first get the file crosswords.zip and uncompress it in your public_html directory or equivalent (directory that contains your public files). You will obtain three class files (Words.class, Grid.class and Square.class). Then, you have to add an <applet> tag and the appropriate <param> in your HTML file.
The distort program corrects the "fish-eye" effect of the QuickCam. If you already tried to take pictures of scenes with lines, or just close-up portraits, you must have seen how the QuickCam distorts the image. For example, a homogeneous gride will be deformed like the top-row pictures.
To handle this, I wrote a small soft that distorts the image in such a way that the gride shown above gets back its homogeneous aspect. This soft is called distort and, given the a list of a distorted gride intersection coordinates, it distorts a picture to straight it out. Here are two examples of pictures before and after a correction.
The second program is supposed to help you improve the shade of gray. Maybe have you noticed that when you zoom on a quickcam picture, you can see a terrible pixel noise such as on the left picture. One can see on such picture two problems: First there is a random noise on the grey-scale levels, which can be corrected with a simple averaging on a few pictures. Second, there is a more structured noise. No idea if this phenomenon is standard on all QuickCam or not, but as you can see on this detail, odd columns are ligther than even ones. The program I propose here, called smooth, can perform both corrections. The picture on the right is an example of what can be done, using 32 pictures to compute the averaging, and using for reference picture a picture of a white wall, also smoothed with 32 pictures.
You can download both distort and smooth and the files they need in distort.tgz.
As all people doing computer-science, I made a ray-tracer when I was young (as Frédo did). It was written in Modula-2, on an Amiga 500, and it was very slow. The objects were described as intersections of quadrics, and there wasn't any optimization. You can download the source file petitracer.tgz, or have a look at a few images it generated.
A turmite is a kind of 2D Turing machine. It has an internal state, and at each step, depending on its internal state and the color of the cell it is on, it puts a new color in the cell, moves in one direction (ahead, right, left), and picks a new internal state. The idea comes from the French version of "Scientific American", and I made a program on Amiga to simulate a bunch of them, with some reproduction and mutation rules.
You can download the source and the binary files (which runs fine on Amiga emulators), you can look at a turmite written in Java below, or just look at what a bunch of them looks like.
You can also have a look at an applet demonstrating a live turmite. Its behavioral parameters are initially generated randomly, and you can then click on them to change their values. The Clear button clear the screen and the Random button generates a new random turmite.