Veri Bilimi: Matplotlib Kullanarak Veri Görselleştirme

Bu makale, Kaggle Dataset’ ten bir veri seti kullanılarak gerçekleştirilmiştir. Matplotlib kullanarak veri setini keşfederken daha ayrıntılı olarak açıklayacağız. Matplotlib eğitimi yeni başlayanlar için umarım çok faydalı olur.

Matplotlib, veri görselleştirme konusunda popüler Python kütüphanelerinden biridir. Dizilerdeki verileri 2B, 3D grafiklere dönüştürmeye yarayan platformlar arası bir kütüphanedir. Python kullanılarak yazılmıştır. Python ile yazılmış olsa da büyük dizilerde bile iyi performans sağlamak için Python ‘un sayısal matematik kütüphanesi olan Numpy’ ı kullanır. Python GUI araç setlerini kullanan uygulamalara grafik yerleştirmeye yardımcı olan bir API sağlar.

Matplotlib yalnızca birkaç komutla veya yalnızca bir komutla harika grafikler oluşturabilmeniz gerektiği felsefesiyle tasarlanmış.

Veri Görselleştirme neden bu kadar önemli? Çünkü Veri Bilimciler çok fazla veri miktarı ile çalışırlar ve verileri görselleştirerek daha da derine inebilirler bu sayede verileri anlamak daha kolay hal alır. Verilerden bilgi çıkarmanın oldukça basit ve etkileşimli olduğu Matplotlib kütüphanesini kullanmaya Veri setini indirerek başlayabiliriz.

Veri setini şuradan indirebilirsiniz : https://www.kaggle.com/datasets/andrewmvd/dog-and-cat-detection

Veri seti görsellerden ve görsellere ait xml dosyalarından oluşuyor. Biz bu veri setini csv formatında kullanarak tek bir dosya haline geitereceğiz. Bu şekilde işlemlerimiz hızlı gerçekleşecektir. xmltocsv.ipynb isimli yeni bir dosya açalım.

import xml.etree.ElementTree as xet
import pandas as pd
from glob import glob

Görüntülere ait xml dosyalarını döndürmek için global kütüphanesini kullanıyoruz ve path değişkenine atıyoruz.

path = glob('./dataset/annotations/*.xml')
path

Yukarıdaki komutu çalıştırdığımızda çıktımız şu şekilde olacaktır.

path output

Bir xml dosyasının içeriğine baktığımızda veriler bize; dosya tipi, dosya yolu, görüntünün yüksekliği (height), görüntünün genişliği (width), görüntünün derinliği (depth), sınıf ismi (cat/dog) ve son olarak konum bilgileri hakkında bilgi veriyor. Konum bilgileri xml dosyasında xmin, ymin, xmax, ymax olarak ifade edilir, bunlar start_point (başlangıç noktaları) ve end_point (bitiş noktaları) değerleri olarak belirtilir.

<annotation>
    <folder>images</folder>
    <filename>Cats_Test0.png</filename>
    <size>
        <width>233</width>
        <height>350</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>cat</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <occluded>0</occluded>
        <difficult>0</difficult>
        <bndbox>
            <xmin>83</xmin>
            <ymin>29</ymin>
            <xmax>197</xmax>
            <ymax>142</ymax>
        </bndbox>
    </object>
</annotation>

Yukarıdaki xml dosyasına ait Cats_Test0.png görseli :

Cats_Test01.png

Seçilen kediye ait resim üzerinde xml dosyasında belirtilen konum bilgileri gösterilmiştir :

Cats_Test0.png rectangle

Süreçte kullanılabilmesi için veri formatını değiştirmeye devamö ediyoruz. Sırasıyla sınırlayıcı kutu köşegen noktaları ve dosya yolu bilgilerini alıyoruz (filepath, xmin, xmax, ymin, ymax). Dictionary(dict) ile boş listeler oluşturuyoruz labels_dict değişkenine atıyoruz. xml verilerini ayrıştırmak (parse) için Etree kütüphanesini kullanıyoruz. Bilgileri çıkararak uygun bir biçimde kaydetmemiz gerekiyor, buradan çıkarılan bilgiler csv ‘ye sınırlanarak eklenecek ve kaydedilecek.

labels_dictionary = dict(filepath=[], xmin=[], xmax=[], ymin=[], ymax=[])

for filename in path: 

    info = xet.parse(filename)
    root = info.getroot()
    member_object = root.find('object')
    labels_info = member_object.find('bndbox')
    xmin = int(labels_info.find('xmin').text)
    ymin = int(labels_info.find('ymin').text)
    xmax = int(labels_info.find('xmax').text)
    ymax = int(labels_info.find('ymax').text)
    # print(xmin, ymin, xmax, ymax)
    labels_dict['filepath'].append(filename)
    labels_dict['xmin'].append(xmin)
    labels_dict['ymin'].append(ymin)
    labels_dict['xmax'].append(xmax)
    labels_dict['ymax'].append(ymax)

dataFrame nesnesine pandas kütüphanesi kullanarak DataFrame ile işlemler hem satır hem sütun etiketlerinde hizalandırılıyor.

dataFrame = pd.DataFrame(labels_dictionary)
dataFrame

Çıktısı aşağıdaki gibi olacaktır.

Son olarak, diziler csv dosyasına yazdırılıyor ve kaydediliyor. Dosyanın içeriği görseldeki gibi olacaktır.

dataFrame.to_csv('kedikopekdataset.csv', index=False)

Şimdi verileri csv’ den çekerek görselleştirelim. animal_detect.ipynb isimli yeni bir dosya açalım. Gerekli kütüphaneleri import edelim ve dataseti, df nesnesine atalım. Dataset’ i baş kısımlarını görüntüleyelim.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import cv2
import xml.etree.ElementTree as xet
import os
df = pd.read_csv('kedikopekdataset.csv')
df.head()

Dosya yolu listesinden ilk görüntüye ait xml dosya yolunun ne olduğunu öğrenelim. Çıktı : ‘./dataset/annotations\\Cats_Test0.xml’

filename = df['filepath'][0]
filename

Daha hızlı bir kullanım sağlamak amacıyla çok fazla görüntü yolu için yukarıdaki kodu bir fonksiyona yazdırıyoruz. Fonksiyon dosya yolundan görüntüleri çekmemize yardımcı olacak.

Çıktı : ‘./dataset/images\\Cats_Test0.png’

def getFilename(filename):
    filename_image = xet.parse(filename).getroot().find('filename').text
    filepath_image = os.path.join('./dataset/images', filename_image)
    return filepath_image

getFilename(filename)

image_path dizisine bütün görüntüleri atıyoruz. Çıktısı aşağıdaki görselde verilmiştir.

image_path = list(df['filepath'].apply(getFilename))
image_path

image_path dizisinden ilk görüntü elemanını file_path nesnesine atıyoruz. Çıktı: ‘./dataset/images\\Cats_Test0.png’

file_path = image_path[0]
file_path

Görüntünün sınırlayıcı kutu köşegen noktalarını belirtiyoruz ve rectangle çizdiriyoruz.

img = cv2.imread(file_path)
ractimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
rectimg = cv2.rectangle(ractimg, (83, 29), (197, 142), (0, 255, 0), 2)
plt.imshow(rectimg)
plt.show()

Çıktı :

Yorum yapın