Jaringan Syaraf Tiruan untuk Identifikasi Jenis Bunga


Jaringan syaraf tiruan (neural network) merupakan algoritma yang mampu melakukan identifikasi suatu kelas berdasarkan ciri masukan yang diberikan. Algoritma ini akan melatihkan ciri masukan yang diberikan pada masing-masing kelas sehingga diperoleh suatu arsitektur jaringan dan bobot-bobot awal yang mampu memetakan ciri masukan ke dalam kelas keluaran.

Terdapat banyak jenis jaringan syaraf tiruan, di antaranya adalah backpropagation, perceptron, probablistik neural network, radial basis network, dll.

Berikut ini merupakan contoh pemrograman matlab (menggunakan matlab r2015b) untuk mengidentifikasi jenis bunga menggunakan algoritma jaringan syaraf tiruan radial basis function (rbfnn). Pada proses pelatihan jaringan digunakan 100 citra latih yang terdiri dari 50 citra bunga dengan jenis kansas state flower dan 50 citra bunga berjenis marguerite daisy. Sedangkan pada proses pengujian digunakan 60 citra uji yang terdiri dari 30 citra bunga kansas state flower dan 50 citra bunga marguerite daisy.

Citra bunga yang digunakan dalam pemrograman ini diunduh dari halaman website http://www.robots.ox.ac.uk/~vgg/data/flowers/17/. Contoh citra bunga yang digunakan ditunjukkan pada gambar berikut.

Ciri yang digunakan untuk membedakan kedua jenis bunga tersebut adalah ciri warna RGB berdasarkan nilai rata-rata R, G, dan B, dan ciri tekstur filter gabor berdasarkan nilai mean (rata-rata), entropy, dan varians dari citra magnitude.

Langkah-langkah pemrogramannya adalah:
1. Mempersiapkan data latih dan data uji
Data latih
data latih jst rbf

Data uji
data uji jst rbf

2. Melakukan ekstraksi ciri warna RGB dan ekstraksi ciri tekstur filter gabor


clc; clear; close all; warning off all;

image_folder = 'data latih';
filenames = dir(fullfile(image_folder, '*.jpg'));
total_images = numel(filenames);

data_latih = zeros(6,total_images);

for n = 1:total_images
    full_name= fullfile(image_folder, filenames(n).name);
    Img = imread(full_name);
    Img = im2double(Img);
    
    % Ekstraksi Ciri Warna RGB
    R = Img(:,:,1);
    G = Img(:,:,2);
    B = Img(:,:,3);
    
    CiriR = mean2(R);
    CiriG = mean2(G);
    CiriB = mean2(B);
    
    % Ekstraksi Ciri Tekstur Filter Gabor
    I = (rgb2gray(Img));
    wavelength = 4;
    orientation = 90;
    [mag,phase] = imgaborfilt(I,wavelength,orientation);
    
    H = imhist(mag)';
    H = H/sum(H);
    I = [0:255]/255;
    
    CiriMEAN = mean2(mag);
    CiriENT = -H*log2(H+eps)';
    CiriVAR = (I-CiriMEAN).^2*H';
    
    % Pembentukan data latih
    data_latih(1,n) = CiriR;
    data_latih(2,n) = CiriG;
    data_latih(3,n) = CiriB;
    data_latih(4,n) = CiriMEAN;
    data_latih(5,n) = CiriENT;
    data_latih(6,n) = CiriVAR;
end

sehingga diperoleh data ciri proses pelatihan seperti ditunjukkan pada gambar berikut
data ciri proses pelatihan

3. Melakukan pelatihan jaringan menggunakan data ciri tersebut


% Pembentukan target latih
target_latih = ones(1,total_images);
target_latih(1:total_images/2) = 0;

% performance goal (MSE)
error_goal = 1e-6;

% choose a spread constant
spread = 1;

% choose max number of neurons
K = 5;

% number of neurons to add between displays
Ki = 20;

% create a neural network
net = newrb(data_latih,target_latih,error_goal,spread,K,Ki);

% Proses training
net.trainFcn = 'traingdx';
[net_keluaran,tr,~,E] = train(net,data_latih,target_latih);

save net_keluaran net_keluaran

% Hasil identifikasi
hasil_latih = round(sim(net_keluaran,data_latih));
[m,n] = find(hasil_latih==target_latih);
akurasi = sum(m)/total_images*100

sehingga diperoleh tampilan proses pelatihan
proses pelatihan jaringan jst rbf

Pada hasil pelatihan diperoleh informasi bahwa dari 100 data latih terdapat 18 data yang diidentifikasi secara salah sehingga akurasi yang dihasilkan pada proses pelatihan adalah sebesar 92%. Jaringan yang telah dihasilkan kemudian disimpan agar dapat digunakan untuk proses pengujian.

4. Langkah berikutnya adalah melakukan pengujian jaringan menggunakan data uji. Sama seperti pada proses pelatihan, pada pengujian juga dilakukan ekstraksi ciri yang sama yaitu ekstraksi ciri warna dan ekstraksi ciri tekstur.
Data ciri proses pengujian yang diperoleh yaitu:
data ciri pengujian jst rbf

5. Melakukan pengujian jaringan menggunakan data ciri pengujian tersebut. Pengujian dilakukan terhadap jaringan telah dibentuk sebelumnya pada proses pelatihan.


clc; clear; close all;

image_folder = 'data uji';
filenames = dir(fullfile(image_folder, '*.jpg'));
total_images = numel(filenames);

data_uji = zeros(6,total_images);

for n = 1:total_images
    full_name= fullfile(image_folder, filenames(n).name);
    Img = imread(full_name);
    Img = im2double(Img);
    
    % Ekstraksi Ciri Warna RGB
    R = Img(:,:,1);
    G = Img(:,:,2);
    B = Img(:,:,3);
    
    CiriR = mean2(R);
    CiriG = mean2(G);
    CiriB = mean2(B);
    
    % Ekstraksi Ciri Tekstur Filter Gabor
    I = (rgb2gray(Img));
    wavelength = 4;
    orientation = 90;
    [mag,phase] = imgaborfilt(I,wavelength,orientation);
    
    H = imhist(mag)';
    H = H/sum(H);
    I = [0:255]/255;
    
    CiriMEAN = mean2(mag);
    CiriENT = -H*log2(H+eps)';
    CiriVAR = (I-CiriMEAN).^2*H';
    
    % Pembentukan data uji
    data_uji(1,n) = CiriR;
    data_uji(2,n) = CiriG;
    data_uji(3,n) = CiriB;
    data_uji(4,n) = CiriMEAN;
    data_uji(5,n) = CiriENT;
    data_uji(6,n) = CiriVAR;
end

% Pembentukan target uji
target_uji = ones(1,total_images);
target_uji(1:total_images/2) = 0;

load net_keluaran
hasil_uji = round(sim(net_keluaran,data_uji));

[m,n] = find(hasil_uji==target_uji);
akurasi = sum(m)/total_images*100

Dari hasil proses pengujian diperoleh informasi bahwa dari 60 data citra uji terdapat 16 data yang diidentifikasi secara salah sehingga akurasi yang dihasilkan pada proses pengujian adalah sebesar 73%.

Nilai akurasi pelatihan dan pengujian yang cukup tinggi menunjukkan bahwa jaringan syaraf tiruan radial basis yang dirancang mampu untuk mengidentifikasi jenis bunga dengan cukup baik.

6. Membuat tampilan GUI agar proses identifikasi jenis bunga dapat lebih interaktif. Tampilan awal GUI ditunjukkan pada gambar di bawah ini.

7. Membuka salah satu citra bunga berjenis Kansas state flower

8. Melakukan ekstraksi ciri warna dan ciri tektur

9. Melakukan identifikasi jenis bunga

10. Membuka salah satu citra bunga berjenis Marguerite daisy

11. Melakukan ekstraksi ciri warna dan ciri tektur

12. Melakukan identifikasi jenis bunga

Tampilan source code GUI nya adalah sebagai berikut:

function varargout = identifikasi_bunga(varargin)
% IDENTIFIKASI_BUNGA MATLAB code for identifikasi_bunga.fig
%      IDENTIFIKASI_BUNGA, by itself, creates a new IDENTIFIKASI_BUNGA or raises the existing
%      singleton*.
%
%      H = IDENTIFIKASI_BUNGA returns the handle to a new IDENTIFIKASI_BUNGA or the handle to
%      the existing singleton*.
%
%      IDENTIFIKASI_BUNGA('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in IDENTIFIKASI_BUNGA.M with the given input arguments.
%
%      IDENTIFIKASI_BUNGA('Property','Value',...) creates a new IDENTIFIKASI_BUNGA or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before identifikasi_bunga_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to identifikasi_bunga_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help identifikasi_bunga

% Last Modified by GUIDE v2.5 05-Jun-2017 01:28:31

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
    'gui_Singleton',  gui_Singleton, ...
    'gui_OpeningFcn', @identifikasi_bunga_OpeningFcn, ...
    'gui_OutputFcn',  @identifikasi_bunga_OutputFcn, ...
    'gui_LayoutFcn',  [] , ...
    'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before identifikasi_bunga is made visible.
function identifikasi_bunga_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to identifikasi_bunga (see VARARGIN)

% Choose default command line output for identifikasi_bunga
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);
movegui(hObject,'center');

% UIWAIT makes identifikasi_bunga wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = identifikasi_bunga_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
try
    [nama_file,nama_path] = uigetfile({'*.*'});
    
    if ~isequal(nama_file,0)
        Img = imread(fullfile(nama_path,nama_file));
        axes(handles.axes1)
        imshow(Img)
        handles.Img = Img;
        guidata(hObject,handles)
        
        axes(handles.axes2)
        cla reset
        set(gca,'XTick',[])
        set(gca,'YTick',[])
        
        axes(handles.axes3)
        cla reset
        set(gca,'XTick',[])
        set(gca,'YTick',[])
        
        axes(handles.axes4)
        cla reset
        set(gca,'XTick',[])
        set(gca,'YTick',[])
        
        axes(handles.axes5)
        cla reset
        set(gca,'XTick',[])
        set(gca,'YTick',[])
        
        set(handles.uitable1,'Data',[])
        set(handles.edit1,'String','')
    else
        return
    end
catch
end

% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
try
    Img = im2double(handles.Img);
    
    % Ekstraksi Ciri Warna RGB
    R = Img(:,:,1);
    G = Img(:,:,2);
    B = Img(:,:,3);
    
    Red = cat(3,R,G*0,B*0);
    Green = cat(3,R*0,G,B*0);
    Blue = cat(3,R*0,G*0,B);
    
    axes(handles.axes2)
    imshow(Red)
    title('Red')
    
    axes(handles.axes3)
    imshow(Green)
    title('Green')
    
    axes(handles.axes4)
    imshow(Blue)
    title('Blue')
    
    CiriR = mean2(R);
    CiriG = mean2(G);
    CiriB = mean2(B);
    
    % Ekstraksi Ciri Tekstur Filter Gabor
    I = (rgb2gray(Img));
    wavelength = 4;
    orientation = 90;
    [mag,~] = imgaborfilt(I,wavelength,orientation);
    
    axes(handles.axes5)
    imshow(mag,[])
    title('Magnitude')
    
    H = imhist(mag)';
    H = H/sum(H);
    I = [0:255]/255;
    
    CiriMEAN = mean2(mag);
    CiriENT = -H*log2(H+eps)';
    CiriVAR = (I-CiriMEAN).^2*H';
    
    
    data2 = cell(6,2);
    data2{1,1} = 'Red';
    data2{2,1} = 'Green';
    data2{3,1} = 'Blue';
    data2{4,1} = 'Mean';
    data2{5,1} = 'Entropy';
    data2{6,1} = 'Varians';
    data2{1,2} = CiriR;
    data2{2,2} = CiriG;
    data2{3,2} = CiriB;
    data2{4,2} = CiriMEAN;
    data2{5,2} = CiriENT;
    data2{6,2} = CiriVAR;
    
    set(handles.uitable1,'Data',data2,'ForegroundColor',[0 0 0])
    
    ciri_bunga = [CiriR; CiriG; CiriB; CiriMEAN; CiriENT; CiriVAR];
    
    handles.ciri_bunga = ciri_bunga;
    guidata(hObject, handles)
    
    set(handles.edit1,'String','')
catch
end

% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
try
    ciri_bunga = handles.ciri_bunga;
    load net_keluaran
    
    hasil_uji = round(sim(net_keluaran,ciri_bunga));
    
    if hasil_uji == 0
        kelas = 'Kansas state flower';
    elseif hasil_uji == 1
        kelas = 'Marguerite daisy';
    else
        kelas = 'Unknown';
    end
    
    set(handles.edit1,'String',kelas);
catch
end

% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
axes(handles.axes1)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

axes(handles.axes2)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

axes(handles.axes3)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

axes(handles.axes4)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

axes(handles.axes5)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

set(handles.uitable1,'Data',[])
set(handles.edit1,'String','')

function edit1_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a double


% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

Source code dan citra pada pemrograman di atas dapat diperoleh melalui halaman berikut ini: Source Code

Posted on June 5, 2017, in Data mining, Pengenalan Pola, Pengolahan Citra and tagged , , , , , , , , , , , , , , , , , , , , , , , . Bookmark the permalink. 46 Comments.

  1. Itu pake fungsi aktivasinya apa ya mas untuk pelatihan ? Atau di rbf ga perlu fungsi aktivasi ? Thx

  2. mas mau tanyak, kan diketahui ada 18 data yang diidentifikasi salah dari 100 data latih, cara melahtnya itu gimana mas,. . .

  3. file net_keluaran itu fungsinya untuk apa gan? thx

  4. mas saat saya coba mengganti data latihnya, nilai hasilnya jadi gak beraturan gitu gimana yaa mas?

  5. mas ini knp ya??
    Undefined function or method ‘imgaborfilt’ for input arguments of type ‘double’.

  6. Mas adi, saya mau bertanya,
    Apakah bisa menggunakan metode JST untuk sistem yang bersifat REALTIME dan sistem yang bersifat REALTIME, apakah harus membuat Data Latih dan Data Uji dahulu ?

    Contohnya : Saya akan membuat sistem identifikasi penyakit lidah dengan metode RGB, apakah saya harus membuat Data latih dan Data Uji atau ciri-cici RGB objek1 dan objek2 saya masukkan melalui Syntax tanpa membuat Data latih dan Data Uji?

    Apakah menurut mas adi, sistem yang bersifat realtime yang dapat mengidentifikasi, dapat dilakukan tanpa harus membuat Data latih dan Data Uji ?
    Dan kalau mau menghitung tingkat KETEPATAN prediksi, berarti saya harus membuat Data Latih dan Data Uji ?

    Maaf sekali mas, jika saya banyak pertanyaan.

    Mohon bimbingan serta masukkan dari mas adi.

    • jst dapat diimplementasikan secara real time dengan terlebih dahulu melakukan pelatihan dan pengujian secara offline kemudian baru dapat diimplementasikan secara real time dengan memanggil arsitektur jaringan yang sebelumnya telah dibangun

    • Terima kasih untuk masukkan dari mas.
      Pertanyaan terakhir mas,

      Cara untuk memanggil Arsitektur bagaimana mas ?
      Boleh share referensi dari mas.
      Atau ada kasus-kasus pada Web Internal ini, yang bisa saya pelajari ?

    • untuk memanggil arsitektur jaringan yang sudah dibangun bisa menggunakan perintah load net

    • Mas adi,
      wavelength = 4;
      orientation = 90;

      4 dan 90 itu didapat darimana mas pada syntax di atas ?

    • Nilai-nilai tersebut merupakan salah satu contoh, abed
      Bisa divariasikan dengan nilai-nilai yang lain

    • Ok..ok mas adi.. terima kasih banyak mas.

      Saya pikir, angka 4 tersebut, merupakan jumlah Bunga / Objek.

      Sekali lagi terima kasih mas buat masukkan nya mas..

  7. mas adi.

    syntax di atas : target_latih(1:total_images/2) = 0;

    total image / 2 karena citra mempunyai 2 jenis ya mas ?

    kalau citra hanya 1 jenis saja gimana mas ?
    mohon masukkan nya mas adi.

  8. siap mas. mas satu pertanyaan lagi mas.
    Pada jaringan syaraf tiruan,
    Adakah hal yang dapat dilakukan untuk meningkatkan nilai akurasi tahap pengujian mas ?
    Atau menambah Karakateristik citra dapat menambah nilai akurasi ya mas ?
    Mohon bimbingannya mas adi.

    • banyak faktor yg menyebabkan tingkat akurasi pengujian rendah
      di antaranya adalah
      adanya perbedaan kondisi proses akusisi citra saat pelatihan dan pengujian
      fitur yg digunakan kurang cocok untuk membedakan antar kelas
      algoritma segmentasi, pemilihan fitur, dan algoritma identifikasi yg kurang cocok

  9. Mas saya mau nanya nentuin ” 0 = Kansas state flower”, ” 1 = Marguerite daisy” itu dari mana ya?
    Terus hasil nya itu apakan di tentukan dari jarak nilai terdekat ?
    Terima Kasih

  10. % performance goal (MSE)
    error_goal = 1e-6;

    % choose a spread constant
    spread = 1;

    % choose max number of neurons
    K = 5;

    % number of neurons to add between displays
    Ki = 20;

    Mas bisa jelasin maksud bagian diatas?
    Maaf saya kurang paham

  11. mas adi, salam kenal, maaf saya mau tanya jika yang identifikasi ada 5 jenis buka, apakah dengan mengubah

    target_latih(1:total_images/2) = 0;

    menjadi

    target_latih(1:total_images/5) = 0;

    mohon pencerahan nya terimakasih

  12. mas untuk jaring syaraf tiruan untuk identifikasi jenis bunga ada beberapa pertanyaan mohon bantuannya mas
    1. file sudah saya coba sudah sukses tapi pada identifikasi saya tekan tidak sesuai harapan, saya masukkan file gambar ‘Kansas state flower’ dan saya ganti “Marguerite daisy” hasilnya tetap salah satunya alias tidak terubah saya menggunakan matlab 2017a.
    2. jika saya ingin menambahkan/mengganti dengan variabel yang lain seperti apa mas mohon pencerahannya.. Makasih mas

  13. maaf mas mau tanya, saya kan sudah melakukan klasifikasi citra menggunakan metode rbf. untuk citra latihnya saya ambil dari citra uji yang di crop per kelasnya. outputnya sudah keluar tapi pada saat dilakukan uji akurasi (confusion matrix) nilai akurasi hanya menghasilkan sekitar 40 %.nan itu kira-kira knp mas

  14. selamat malam mas adi, salam kenal. saya ingin bertanya, jika sata menggunakan objeknya jenis hewan apakah saya juga bisa menggunakan ciri warna RGB berdasarkan nilai rata-rata R, G, dan B, dan ciri tekstur filter gabor dll. untuk membedakan jenis hewan tersebut seperti membedakan jenis bunga seperti contoh program diatas? mohon penjelasannya mas, terima kasih

    • Selamat malam angel
      Bisa diterapkan, bisa dianalisis terlebih dahulu ciri apakah yg membedakan antara hewan yg satu dg hewan lainnya, apakah warnanya, apakah bentuknya, apakah tekstur kulitnya
      Setelah itu bisa dicoba diimplementasikan metode yg cocok utk mengekstrak ciri pada masing2 hewan

  15. selamat siang mas adi saya mau tanya saya ingin membuat menjadi 3 klasifikasi dengan mengubah
    target_latih(1:total_images/2) = 0;
    menjadi
    target_latih(1:total_images/3) = 0;

    namun saya masih bingung dengan hasil latihnya hanya bernilai 1 dan 0. tidak terbagi jadi 3 bagian, itu bagaimana ya ya mas

    • Selamat siang wisnu
      Bisa dibuat nilai target utk kelas yg pertama dengan nilai 1
      Nilai target utk kelas yg kedua dengan nilai 2
      Nilai target utk kelas yg ketiga dengan nilai 3

    • ok baik mas adi.

      oh iya mas kalau untuk nilai Maximum number of neurons dan Number of neurons to add between displays fungsinya untuk apa ya mas pada neural network radial basic ?

    • Nilai tsb merupakan jumlah neuron maksimum dan jumlah kelipatan neuron yg ditambahkan saat ditampilkan

  16. maaf mas saya mau tanya, ini metode pencocokkannya pakai apa ya? lalu tahap pengujian itu memang harus ada ya? terima kasih

  17. Assalamu’alaikum mas saya mau tanya
    Apakah ada ekstraksi ciri lain yg cocok untuk identifikasi jenis bunga ini selain ekstraksi ciri diatas?
    Bagaimana dengan ekstraksi ciri rgb dgn glcm untuk identifikasi jenis bunga ini apakah cocok?
    Kelebihan glcm dibandingkan yg ciri tekstur lain apa ya?
    Maaf kalo saya banyak tanya

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

%d bloggers like this: