OpenCV249WithCuda6LinuxUbuntu1404

Install OpenCV 2.4.9 with Cuda 6.0 support running on Ubuntu 14.04!
//**UPDATE**: Same process works perfectly on CUDA6.5, but keep in mind you need at least graphical driver 340.0 (included in CUDA installation)//

A link to help install qt 5.3 support: @http://www.wikihow.com/Install-Qt-SDK-on-Ubuntu-Linux

__Stap 1: Op naar de laatste 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 331.67 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. We maken hier gebruik van de momenteel meest recente video driver, dewelke ook meteen nodig is voor een goeie processing op Ubuntu 14.04.

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.

Tijd voor de driver installatie. Blader naar het script, geef het uitvoerrechten en voet het uit als root. Deze is meestal terug te vinden in je downloads folder onder je home directory.

chmod +x NVIDIA* sudo ./NVIDIA*

Geef op alle vragen een afirmatief antwoord (Accept conditions, OpenGL support, new X-config file, extra 32bit libraries,...) 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.

__Stap 2: Installeer cuda 6.0__
De volgende stap is de installatie van Cuda 6.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


 * OPGELET**: Cuda installatie zegt dat je een ongekende configuratie hebt. Dit komt omdat 14.04 nog niet officieel ondersteund wordt. Kies alsnog om de installatie uit te voeren.

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 locatie kan je standaard houden (/usr/local/cuda-6.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 6.0 op geinstalleerd. Je moet nu nog twee zaken op orde stellen. Eerst zorgen dat je PATH variabele goed staat en vervolgens zorgen dat ook je LD_PATH correct geconfigureerd is.

sudo gedit ~/.bashrc

Voeg onderstaande code toe op het eind van het bestand

PATH="$PATH:/usr/local/cuda-6.0/bin"
 * 1) edit PATH for CUDA purposes

Vervolgens moet je nog de ld path configuratie op orde zetten

sudo gedit /etc/ld.so.conf.d/cuda.conf

Hierin zet je het volgende: /usr/local/cuda-6.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. Indien je wil controleren of CUDA goed werkt, ga dan naar de samples folder, doe een make van alle projecten en ga vervolgens in de bin folder op zoek naar de ./deviceQuery sample. Als deze een oplijsting geeft van je GPU capable devices dan werkt deze installatie correct.

Stap 3: OpenCV 2.4.9
Nu komen we aan het echte werk. Gebruik je interne git client om de laatste stabiele 2.4 branch op te halen.

mkdir opencv_build cd opencv_build git clone https://github.com/Itseez/opencv.git ../opencv_build/ git checkout 2.4

Zorg dat je zeker uitcheckt op **branch 2.4**. Anders ga je de master branch compileren en krijg je de nieuwe openCV header structuur. Heel wat aanpassingswerk aan je projecten zal hier nodig zijn, aangezien de includes vanaf 3.0 per module staan.

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 libopencv-dev build-essential checkinstall cmake pkg-config yasm libtiff4-dev libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python-dev python-numpy libtbb-dev libqt4-dev libgtk2.0-dev

Let op: als je gebruik wil maken van CUDA moet je minimaal cmake versie 2.8.3 gebruiken. Als je nog een oudere versie hebt, moet je eerst de nieuwe versie van cmake compileren (bijvoorbeeld cmake 2.8.10). Welke versie je gebruikt zie je eenvoudig zo: cmake --help

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 **-D CUDA_ARCH_BIN="3.0"** ../opencv_build/


 * 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. Zorg echter dat je wel de juiste kernel kiest!

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 ;)