Install OpenCV 2.4.3 with Cuda support

OpenCV biedt sinds versie 2.2 een module aan om gebruikt te maken van de GPU als processing platform. Sinds dan is het aantal geimplementeerde functies sterk uitbereid, en dus is het nuttig om hier gebruikt van te kunnen maken.
We maken gebruik van de meest recente versie van cuda op dit moment, zijnde cuda5.0 en de nieuste versie van OpenCV (zijnde OpenCV 2.4.3).

Stap 1: Op naar een nieuwe driver

Voor de installatie van cuda is het nodig een recente driver te hebben, iets dat trouwens zelden kwaad kan om support te hebben. De installer van cuda heeft ook een development driver aan boord, maar hier maken we gebruik van release 310.19 welke gewoon via de NVIDIA-site is te vinden. Dit is een script dat uitgevoerd dient te worden, maar eerst is het belangrijk dat al wat hiermee kan conflicteren te verwijderen en enkele nodige pakketten te installeren. Download dit script alvast.

Install:
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev libdc1394-22-dev libgstreamer0.10-dev ffmpeg


Remove:
sudo apt-get remove --purge nvidia*

Om er ook voor te zorgen dat er geen modules meer geladen zijn die kunnen conflicteren met de nieuwe nvidia-driver module voegen we enkele regels toe onderaan het bestand
/etc/modprobe.d/blacklist.conf . Gezien dit een systeem-configuratie-bestand is moet je dit via sudo-rechten doen.

sudo vi /etc/modprobe.d/blacklist.conf
Add:
blacklist amd76x_edac
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv

Het blacklisten van de nouveau module volstaat niet altijd om ervoor te zorgen dat deze niet meer geladen zal worden. Het is dus best dat je een nieuw initramfs-bestand aanmaakt:

sudo update-initramfs -u

Nu heropstarten maar. Je merkt meestal direct als er geen goede driver geladen is (verry crappy grafische weergave). Om de nieuwe driver te installeren mag er geen grafische omgeving draaiende zijn, dus begin met deze weer af te zetten. Met behulp van Ctrl+Alt+F1 ga je naar 1 van de niet grafische tty terminals. Hier log je in en stop je lightdm (als dit je window-manager is natuurlijk ...)
sudo service lightdm stop
Nu wijzigt meestal ook de crappy grafische weergave naar een iets degelijkere en bevind je je in een terminal (Hoezee).

Tijd voor de driver installatie. Blader naar het script, geef het uitvoerrechten en voet het uit als root
chmod +x NVIDIA*
sudo ./NVIDIA*

Geef op alle vragen een afirmatief antwoord (Accept conditions, OpenGL support, new X-config file,...) en even later is de installer weeral gedaan en herstart je best eens. Na heropstart ziet je grafische omgeving er weer hoogstaand uit en kan je inloggen om de rest van het proces grafisch uit te voeren (kanje toch wat surfen tijdens de compilatie-stappen die zullen volgen).

Stap 2: Installeer cuda 5.0


De volgende stap is de installatie van Cuda 5.0. Deze is te downloaden via de NVIDIA-site als een toolkit (bevat ook debuggers, wat extra libraries, ...). Download deze dus maar.
Geef deze uitvoerrechten en voer deze uit als root
chmod +x cuda*.run
sudo ./cuda*.run

De installer geef de mogelijkheid om zelf een driver te installeren. Gezien we dat eerder gedaan hebben hoeven we dit hier niet meer te doen. De tookit willen we uiteraard wel installeren, dus hier geef je "yes" als antwoord. De lokatie kan je standaard houden (/usr/local/cuda-5.0). De sample-programma's zijn altijd leuk om ook eens te compileren en eens te bekijken,dus deze installeer je dan ook maar.
Als op het einde de waarschuwing komt dat de samples niet geinstalleerd konden worden door een missing library (libglut), probeer dan dit uit te voeren:

sudo ln -s /usr/lib/x86_64-linux-gnu/libglut.so /usr/lib/libglut.so

De installer gaat dan vannalles compileren en even later (als de installer netjes is afgesloten) ben je in het bezit van een systeem met cuda 5.0 op geinstalleerd. Er bestaat een kans dat de samples installeren een probleem vormt omdat er een library niet wordt gevonden. Meestal is deze library wel aanwezig en volstaat het om een symbolische link te leggen naar een plaats die wel gebruikt wordt. Dit gaat vaak als volgt:

Maak een bestand aan in /etc/ld.so.config.d/:
sudo gedit /etc/ld.so.conf.d/cuda.conf

Hierin zet je het volgende:
/usr/local/cuda-5.0/lib64

Save en herlaadt:
sudo ldconfig

Om de samples hierna afzonderlijk te installeren kan je de installer uiteraard opnieuw uitvoeren en geef je aan dat zowel de driver als de toolkit niet meer geinstalleerd moeten worden.

Stap 3: OpenCV 2.4.3

Nu komen we aan het echte werk. Je donwload OpenCV2.4.3(.tar.bz2), verplaats het naar een map die je leuk vindt (~/Desktop/OpenCV2.4.3 ofzo) en pakhet daar uit. Maar naast de aangemaakte map (OpenCV-2.4.3) een nieuwe map die gebruikt zal worden voor de resultaten van het compilatie-proces in te bewaren.
mkdir BuildDir
cd BuildDir

Eventueel kan je ook volgende libraries mee installeren, voor een volledige installatie:
sudo apt-get install libtbb-dev libeigen2-dev libqt4-dev libqt4-opengl-dev
sudo apt-get install libopencv-dev
sudo apt-get install build-essential checkinstall cmake pkg-config yasm
sudo apt-get install libtiff4-dev libjpeg-dev libjasper-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install libdc1394-22-dev libxine-dev
sudo apt-get install libgstreamer0.10-dev
sudo apt-get install libgstreamer-plugins-base0.10-dev
sudo apt-get install libv4l-dev
sudo apt-get install python-dev python-numpy
sudo apt-get install libtbb-dev
sudo apt-get install libqt4-dev libgtk2.0-dev

Let op: als je gebruik wil maken van CUDA moet je minimaal cmake versie 2.8.3 gebruiken. Welke versie je gebruikt zie je eenvoudig zo:
cmake --help

Als je nog een oudere versie hebt, moet je eerst de nieuwe versie van cmake compileren (bijvoorbeeld cmake 2.8.10).

Nu gaan we aan de hand van cmake aangeven van wat we onze OpenCV-installatie graag zouden voorzien.
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUBLAS=ON -D WITH_CUFFT=ON -D WITH_EIGEN=ON -D WITH_OPENGL=ON -D WITH_QT=ON -D WITH_TBB=ON -D BUILD_DOCS=ON -D BUILD_EXAMPLES=ON -D BUILD_TESTS=ON ../OpenCV-2.4.3/

OPMERKING: wil je openCV builden enkel voor jou GPU kaart, dan zoek je de architectuur op van je kaart en geef je dit mee in de CMAKE opties via de volgende optie. Het zorgt ervoor dat de compilatietijd inkrimpt aangezien slechts 1 reeks CUDA kernels gemaakt moet worden.

-D CUDA_ARCH_BIN="2.0" (2.0 voor Fermi, 3.0 voor Kepler)

Het staat je uiteraard vrij hier eigen opties mee te geven. Na wat tekst over het scherm te laten rollen krijg je een overzicht van welke pakketten er allemaal in je installatie zullen zitten. De belangrijkste is hier uiteraard Cuda.
Cmake heeft nu eigenlijk een Makefile voor je gegenereerd die al de nodige files zal compileren en linken zoals aangegeven in de configuratie (wat is cmake toch knap). Nu kan het eigenlijke compileren dus beginnen:
make -j 8
de -j optie geeft aan dat we multithreaded willen compileren (bestanden die niet van elkaar afhankelijk zijn worden parallel gecompileerd), gezien er vrij veel files zijn is het redelijk belangrijk om ook een nummer mee te geven om het maximum aantal parallele threads te limiteren of heel je systeem loopt binnen de kortste keren volledig vast (vol geheugen, swapping, ... miserie alom).

Dit process duurt wel even, dus tijd voor chocomelk.
Na de compilatie kan je de bestanden nog naar de juiste installatie-map laten kopieren
sudo make install
en onze installatie is voltooid. Time to do some crazy computer vision ;)