Ubuntu 16.04: OpenCV 4 DNN Modülü ile Darknet Modellerinin Kullanılması

Kemal Yağlı
KOUOSL
Published in
6 min readMar 28, 2020

Bu yazıda öncelikle açık kaynak kodlu görüntü işleme kütüphanesi olan OpenCV 4 + DNN (contrib) kurulumu, ardından gerçek zamanlı nesne tespiti alanında kullanılan YOLO Darknet kütüphanesinin Ubuntu 16.04 üzerine kurulum adımları anlatılmaktadır.

Ayrıca OpenCV DNN ile Darknet modellerinin kullanıldığı örnek bir nesne tespiti uygulaması verilecektir.

1. OpenCV 4 + DNN (contrib) Kurulumu

Ubuntu’da terminal(uçbirim) açılarak sırasıyla aşağıdaki adımlar uygulanmalıdır.

Adım 1: Kurulacak OpenCV versiyonunu seçilir. Dizinler temizlenir ve kurulum için dizin oluşturulur. Geçerli çalışma dizini kaydedilir.

#Kurulacak OpenCV versiyonunu seç
cvVersion="master"
#build dizinlerini temizle
rm -rf opencv/build
rm -rf opencv_contrib/build
#Kurulum için dizin oluştur
mkdir installation
mkdir installation/OpenCV-"$cvVersion"
#Geçerli çalışma dizinini kaydet
cwd=$(pwd)

Adım 2: Güncellemeler yapılır.

sudo apt -y update
sudo apt -y upgrade

Adım 3: İşletim sistemi kütüphaneleri yüklenir.

sudo apt -y remove x264 libx264-devsudo apt -y install build-essential checkinstall cmake pkg-config yasm
sudo apt -y install git gfortran
sudo apt -y install libjpeg8-dev libjasper-dev libpng12-dev

sudo apt -y install libtiff5-dev

sudo apt -y install libtiff-dev

sudo apt -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
sudo apt -y install libxine2-dev libv4l-dev
cd /usr/include/linux
sudo ln -s -f ../libv4l1-videodev.h videodev.h
cd $cwd

sudo apt -y install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
sudo apt -y install libgtk2.0-dev libtbb-dev qt5-default
sudo apt -y install libatlas-base-dev
sudo apt -y install libfaac-dev libmp3lame-dev libtheora-dev
sudo apt -y install libvorbis-dev libxvidcore-dev
sudo apt -y install libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt -y install libavresample-dev
sudo apt -y install x264 v4l-utils


sudo apt -y install libprotobuf-dev protobuf-compiler
sudo apt -y install libgoogle-glog-dev libgflags-dev
sudo apt -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen

Adım 4: opencv ve opencv_contrib indirilir.

git clone https://github.com/opencv/opencv.git
cd opencv
git checkout $cvVersion
cd ..

git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout $cvVersion
cd ..

Adım 5: Contrib modülleriyle opencv derlenir ve kurulur.

cd opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$cwd/installation/OpenCV-"$cvVersion" \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D WITH_TBB=ON \
-D WITH_V4L=ON \
-D OPENCV_PYTHON3_INSTALL_PATH=$cwd/OpenCV-$cvVersion-py3/lib/python3.5/site-packages \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D BUILD_EXAMPLES=ON ..
make -j4
make install

Bu adımların ardından OpenCV 4 kurulumu tamamlanmıştır.

Örnek bir program ile kurulum gözden geçirilebilir. Aşağıda OpenCV versiyonunu ekrana basan bir uygulama verilmiştir. Örnek program CMake ile derlenmiştir. Terminalde aşağıdaki adımlar uygulanmalıdır:

deneme adlı klasör oluşturup klasör dizinine gidilir.

mkdir deneme
cd deneme/

deneme dosyası içerisine deneme.cpp belgesi açmak için aşağıdaki kod parçası yazılır.

gedit deneme.cpp

Açılan deneme.cpp adlı belgenin içerisine aşağıdaki kod parçası yazılıp kaydedilir:

#include <stdio.h>#include <opencv2/opencv.hpp>using namespace cv;using namespace std;int main( int argc, char** argv ){cout << "OpenCV version : " << CV_VERSION << endl;cout << "Major version : " << CV_MAJOR_VERSION << endl;cout << "Minor version : " << CV_MINOR_VERSION << endl;cout << "Subminor version : " << CV_SUBMINOR_VERSION << endl;}

deneme dosyası içerisine CMakeLists.txt belgesi açmak için aşağıdaki kod parçası yazılır.

gedit CMakeLists.txt

Açılan CMakeLists.txt adlı belgenin içerisine aşağıdaki kod parçası yazılıp kaydedilir:

cmake_minimum_required(VERSION 3.1)# Enable C++11set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_STANDARD_REQUIRED TRUE)find_package( OpenCV REQUIRED )add_executable( deneme deneme.cpp )target_link_libraries( deneme ${OpenCV_LIBS} )

Ardından sırasıyla aşağıdaki komutlar yazılır.

cmake .
make
./deneme

Eğer kurulumda bir problem yoksa CMake ile derleyip çalıştırdığımız örnek program OpenCV versiyonunu yukarıdaki gibi terminalde gösterecektir.

2. YOLO Darknet Kurulumu ve Modeller

Ubuntu’da terminal(uçbirim) açılarak sırasıyla aşağıdaki adımlar uygulanmalıdır.

Adım 1: Github üzerinden darknet deposu klonlanır ve darknet klasörü dizinine gidilir. make komutu ile derleme işlemi başlatılır.

git clone https://github.com/pjreddie/darknet.git
cd darknet
make

Adım 2: Önceden eğitilmiş modelin ağırlık dosyalarını indirmek için aşağıdaki komut çalıştırılır.

wget https://pjreddie.com/media/files/yolov3.weights

darknet klasörü içerisindeki data klasörü altında örnek .jpg uzantılı görseller bulunmaktadır. Bu görseller üzerinden nesne tanıma uygulaması yapmak için, aşağıdaki şekilde cfg klasörü içerisindeki ağ dosyası (yolov3.cfg), darknet klasörü içerisine indirilen ağırlık dosyası (yolov3.weights) ve görselin yolu parametre olarak belirtilerek detect komutu ile çalıştırılır.

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

Aşağıdaki gibi bir çıktı alınacaktır:

Sınıf ve güvenirlik oranları

Görselin dog: 100%, truck: 92%, bicycle: 99% güvenirlik oranlarında nesneleri içerdiği görülmektedir. Ayrıca nesne konumları darknet klasörü içerisindeki predictions.jpg görselinde sınırlayıcı kutu içerisine alınmıştır.

3. OpenCV DNN ile Darknet Modellerinin Kullanımı

Bu uygulama ile Darknet modellerinin OpenCV DNN ile çalışması sağlanacaktır.

C++ dilinde yazılmış nesne tespiti uygulaması için kodu buradan görebilirsiniz.

Kodu CMake ile derleme işlemi için terminalde aşağıdaki adımlar uygulanmalıdır:

nesnetanima adlı klasör oluşturup klasör dizinine gidilir.

mkdir nesnetanima
cd nesnetanima/

nesnetanima dosyası içerisine nesnetanima.cpp belgesi açmak için aşağıdaki kod parçası yazılır.

gedit nesnetanima.cpp

Açılan nesnetanima.cpp adlı belgenin içerisine yukarıda bahsedilen nesne tespiti uygulaması kodu kopyalanıp kaydedilmelidir.

nesnetanima dosyası içerisine CMakeLists.txt belgesi açmak için aşağıdaki kod parçası yazılır.

gedit CMakeLists.txt

Açılan CMakeLists.txt adlı belgenin içerisine aşağıdaki kod parçası yazılıp kaydedilir:

cmake_minimum_required(VERSION 3.1)# Enable C++11set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_STANDARD_REQUIRED TRUE)SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")find_package( OpenCV REQUIRED )add_executable( nesnetanima nesnetanima.cpp )target_link_libraries( nesnetanima ${OpenCV_LIBS} )

Derleme işlemini yapmadan önce nesnetanima klasörü içerisine aşağıdaki common.hpp models.yml ve object_detection_classes_pascal_voc.txt dosyaları indirilip kaydedilmelidir.

object_detection_classes_pascal_voc.txt adlı metin dosyası nesne tespiti yapılacak sınıf etiketlerini içermektedir. İndirilen dosyanın sınıf etiketi içeriği güncellenmelidir.

nesnetanima klasörü içerisindeki object_detection_classes_pascal_voc.txt adlı metin dosyası açılır ve içindekiler silinerek yerine aşağıdaki etiketler yazılır ve kaydedilir.

person
bicycle
car
motorbike
aeroplane
bus
train
truck
boat
traffic light
fire hydrant
stop sign
parking meter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
backpack
umbrella
handbag
tie
suitcase
frisbee
skis
snowboard
sports ball
kite
baseball bat
baseball glove
skateboard
surfboard
tennis racket
bottle
wine glass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hot dog
pizza
donut
cake
chair
sofa
pottedplant
bed
diningtable
toilet
tvmonitor
laptop
mouse
remote
keyboard
cell phone
microwave
oven
toaster
sink
refrigerator
book
clock
vase
scissors
teddy bear
hair drier
toothbrush

Ardından sırasıyla aşağıdaki komutlar yazılır ve kod derlenir.

cmake .
make

Kod derlendikten sonra uygulama terminalde aşağıdaki komutlarla çalıştırılır.

./nesnetanima --config=[PATH-TO-DARKNET]/cfg/yolov3.cfg --model=[PATH-TO-DARKNET]/yolov3.weights --classes=object_detection_classes_pascal_voc.txt --width=416 --height=416 --scale=0.00392 --input=[PATH-TO-IMAGE-OR-VIDEO-FILE] --rgb --thr_0.6

Bu komutlarda [PATH-TO-DARKNET] yazan kısmı silip kendi darknet klasörünüzün dizinini yazmalısınız ve [PATH-TO-IMAGE-OR-VIDEO-FILE] yazan kısmı silip nesne tespiti yapılacak görüntü dizini yazmalısınız. Ayrıca nesnetanima klasörü içerisinde değilseniz cd nesnetanima komutunu yazmayı unutmayın.

thr değeri güvenirlik oranı için eşik değeri belirler. Değeri değiştirerek oluşturduğu etkiyi gözlemleyebilirsiniz.

Ayrıca nesnetanima.cpp içerisinde küçük değişiklikler yaparak uygulamanın geliştirilmesine katkıda bulunabiliriz. Örneğin aşağıdaki kod parçasını yerleştirerek kodu çalıştırdığımızda bulunan nesnelerin sınıfını, koordinatlarını ve güvenirlik oranlarını terminalde görebiliriz.

printf("\"Class\":\"%s\",\"Coordinate\":\"(%d,%d)\",\"Confidence\":\"%.2f\"\n",classes[classId].c_str(),(left+right)/2, (top+bottom)/2, conf);

nesnetanima.cpp dosyasındaki değişiklikler kaydedildikten sonra aşağıdaki gibi derleme işlemi tekrar yapılmalıdır.

Sonuç olarak, tespit edilen nesneler ve bilgileri terminalden sunulmaktadır.

--

--