اطلاعیه

Collapse
No announcement yet.

توصیف کننده ی SIFT

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    توصیف کننده ی SIFT

    با عرض سلام خدمت دوستان
    من دارم روی موضوع Real-time object recognition using local features برای پایان نامه ام کار می کنم. می خوام این کار رو با روش SIFT انجام بدم.
    کل کار را می توان به 3 بخش تقسیم کرد:
    1- پیدا کردن Interest Region
    2- درآوردن Descriptor ها
    3- انجام مرحله Matching and Vocabulary Trees
    برای قسمت اول می خواهم از
    Distinctive Image Features from Scale-Invariant Keypoints (David G. Lowe 2004) استفاده کنم و برای قسمت دوم از PCA-SIFT استفاده کنم و برای قسمت سوم از Vocabulary Tree
    (Scalable Recognition with a Vocabulary Tree_David Nist´er) استفاده کنم.
    من فعلا دارم روی قسمت اول کار می کنم . من در این مرحله به چند مشکل برخورد کردم اگه ممکن است من را راهنمایی کنید ؟
    1- همانطور که می دانید برای قسمت اول ما می آیم و تو چند مرحله (در هر اوکتاو) روی تصویر فیلتر گوسین اعمال می کنیم و سپس اونها رو 2 به 2 از هم کم می کنیم ( در اوکتاو بعدی ما تصویر رو نصف می کنیم و این مراحل رو انجام می دهیم) فرض کنیم ما 4 اکتاو داشته باشیم و در هر اکتاو هم 5 بار فیلتر گوسی را اعمال کنیم که با تفریق 2به 2، 4 تا DOG(Difference Of Gaussian) باقی می ماند. بعد از درآوردن این DOG ما باید کار Extrema Search را انجام دهیم. که این کار را باید در همسایگی 8 تای همان DOG و همسایگی 9 تایی DOG های همسایه انجام دهیم و یک اکسترمم و یک می نیمم پیدا کنیم. سوال؟ آیا باید این جستجو را برای همه پیکسل های هر DOG انجام دهیم یا نه ؟ یعنی از DOG اولی شروع کنیم و تا آخر ادامه دهیم؟ سوال بعدی ؟ بعد از پیدا کردن این می نیمم و اکسترمم باید یک threshold اعمال کنیم این threshold را بر چه اساسی اعمال می کنیم ؟
    2- نقاط بدست آمده از مرحله قبل پایداری خوبی ندارند جهت بهبود این کار 2 کار زیر را انجام می دهند
    • Reject Keypoint With Low Contrast
    که برای اینکار این رابطه را محاسبه می کنند
    [img]http://[/img]
    سوال ؟ این رابطه را چگونه باید انجام داد؟
    • استفاده از Hessian با سایز 2*2 . سوال این را هم چگونه محاسبه می کنند

    من دشمن تو و عقاید تو هستم ولی حاضرم در راه آزادی عقیده ات جانم را فدا کنم. (ولتر)

    #2
    پاسخ : توصیف کننده ی SIFT

    سلام ..................

    شرمنده اگه دو سه روزیه کمتر هستم ..

    خب .. من سوال شما رو کامل خوندم .. باید خدمتتون عرض کنم که ما هم یه جای کارامون از این تیپ Feature ها یا به قول شما SIFT Feature ها استفاده کردیم .. سوال شما رو من یک مقدار خلاصه تر مطرح میکنم .. شما در واقع میخواید از SIFT Feature ها به عنوان Descriptor برای Description آبجکت هاتون استفاده کنید .. حالا اون مطالبی که فرمودید هم همه شامل روال های خود SIFT میشن .. یه نکته ای که خیلی مهمه اینه که این Feature ها Descriptor های واقعا خوبی هستن مخصوصا که Scale Invariant هستن .. اون جاییکه ما از اینها استفاده میکردیم به ما در Feature Extraction خیلی کمک کرد امــا در آخر مجبور شدیم بریم سراغ Histogram of Oriented Gradient ها و از اونها استفاده کنیم .. کارای آقای Lowe توی این زمینه (SIFT..) واقعا خوبه و نوع Application هایی هم که در اونها این رو به کار برده خیلی جالبن .. بحث خیلی طولانیه و حقیقتش من هم خودم خیلی این مدته درگیر شدم .. اگه مطمئن بودم که با تلفن موضوع برطرف میشه شمارم رو براتون PM میکردم امــا ای کاش میشد یه وقتی بذاریم و همدیگه رو ببینیم .. به هر حال من سعی میکنم چند تا Reference کاربردی براتون بذارم .. منتهی باید اونها رو پیدا کنم .. احتمالا اونها خیلی کمکتون خواهد کرد .. دید اونها بیشتر جنبه ی Implementation داره .. بازهم میگم؛ کمبود وقتم رو به حساب مورد دیگه ای نذارید .. واقعا زمانم کمه وگرنه از انجام وظیفه لذت میبرم .. منابع رو براتون میذارم؛ اگه باز مطالب کافی نبود سعی میکنم برای این موضوع هم وقت خالی کنم.. بازم شرمنده .. موفق باشید ..
    دوستان! مدتی کمتر به سایت میام ..

    دیدگاه


      #3
      پاسخ : توصیف کننده ی SIFT

      سلام ..................

      لینک اول فایلیه که توی دانشگاه تورنتو برای SIFT ارائه شده .. امیدوارم بتونه مفید باشه ..

      http://www.cs.toronto.edu/~jepson/csc2503/tutSIFT04.pdf

      لینک بعدی هم SIFT توی خود متلب هست ..

      http://www.vlfeat.org/~vedaldi/code/sift.html

      لینک آخر هم در مورد همونمطلبی که فرمودید؛ PCA -- SIFT .. امیدوامر مطالب بتونه کمکتون کنه .. موفق بشید ..

      http://www.cs.cmu.edu/~yke/pcasift/
      دوستان! مدتی کمتر به سایت میام ..

      دیدگاه


        #4
        پاسخ : توصیف کننده ی SIFT

        سلام
        از کمکتون ممنون
        من قبلا این فایل ها رو پیدا کرده بودم. من در واقع قصد پیاده سازی این کار رو که گفتم دارم. من روی فایل های که از اینترنت گرفتم دارم کار می کنم. ولی همونطوری که می دونید بعضی از کدها تو C نوشته شده واز توی مطلب فراخونی میشه (تابع های اصلی) و باید کامپلیل بشه تا کار کنه اگه میشد فایل های C رو یکجوری خط به خط اجرا کرد تا فهمید که چطوری کار می کنه خوب بود.
        لطفا کمک کنید
        من دشمن تو و عقاید تو هستم ولی حاضرم در راه آزادی عقیده ات جانم را فدا کنم. (ولتر)

        دیدگاه


          #5
          پاسخ : توصیف کننده ی SIFT

          سلام ..................

          شرمنده که دیر پاسخ میدم ..

          سعی میکنم اول هفته ی دیگه روی این قضیه وقت بذارم .. موفق باشید ..
          دوستان! مدتی کمتر به سایت میام ..

          دیدگاه


            #6
            پاسخ : توصیف کننده ی SIFT

            سلام ................

            یه نمونه Source Code براتون فرستادم با این امید که بتونه کمکتون کنه .. موفق باشید ..
            دوستان! مدتی کمتر به سایت میام ..

            دیدگاه


              #7
              پاسخ : توصیف کننده ی SIFT

              حسام الدین ممنون میشم سورس کد رو پ کنید ما هم استفاده کنیم مرسی

              دیدگاه


                #8
                پاسخ : توصیف کننده ی SIFT

                نوشته اصلی توسط r.ghost
                حسام الدین ممنون میشم سورس کد رو پ کنید ما هم استفاده کنیم مرسی
                سلام ......................

                فایل رو ضمیمه ی پست کردم .. موفق باشید ..
                فایل های پیوست شده
                دوستان! مدتی کمتر به سایت میام ..

                دیدگاه


                  #9
                  پاسخ : توصیف کننده ی SIFT

                  سلام ...................

                  همنطور که قبلا هم با هم صحبت کردیم؛ توی مرحله ی Scale Space extrema روی تعریف ضریب K که برای هر لایه ی یک اوکتاو تعریف میشد یه نکته ای بود که قرار بود بازش کنیم .. من یه تصویر براتون میذارم . بعد حرف خود Lowe از Paper اش رو نقل میکنم .. امیدوارم مساله حل بشه ..



                  و این هم نقل قول خود Lowe در مورد تصویر بالا ..



                  راستی؛ من کدتون رو دیدم .. run اش هم کردم .. چرا این خروجی رو میداد؟ انگار اصلا برنامه کار نکرده باشه؛ یه همچین حالتی .. باید ریزش رو آنالیز کنم .. اگه یه کم در موردش توضیح بدید خیلی کارمون راحت تر میشه .. ممنونم .. موفق باشید ..
                  دوستان! مدتی کمتر به سایت میام ..

                  دیدگاه


                    #10
                    پاسخ : توصیف کننده ی SIFT

                    سلام از همکاری و کمک های موثرتون
                    برنامه که فرستاده بودم مشکل داشت.
                    من توی برنامه جدید اومدم ابتدا به تصویر در یک اکتاو خاص (کلا 3 تا اکتاو) در چند مرحله (کلا 5 مرحله (s از 1 تا 5)) با یک سیگمای k به توان 1 بر روی s بر روی تصویر یک فیلتر گوسی با تابع مطلب زدم (استفاده از تابع fspecial('gaussian',[3 3],K); برای ساختن فیلتر با یک سیگمای خاص (k) و استفاده از تابع conv2(Guss.octave{o}(:,:,s-1),h,'same' برای زدن فیلتر بر روی تصویر). در واقع در هر مرحله من روی تصویر حاصل از مرحله قبل فیلتر رو اعمال کردم.
                    نتایج رو هم نشون دادم. ولی در مرحله پیدا کردن ماکزییم و می نیمم محلی که من هر پیکسل رو با 26 همسایگی مقایسه می کنم که اگر از اونها بزرگتر بود و یا کوچکتر بود اون رو به عنوان ماکزیمم و می نیمم محلی انتخاب کنه (این کار رو با یک عالمه دستور if انجام دادم ( 26 تا if برای ماکزیمم و 26 تا if برای می نیمم )
                    در این مرحله برنامه من اصلا هیچی پیدا نمی کنه ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟/

                    http://d01.megashares.com/dl/43e07a5/P_keypoint.m


                    %------------------------------------ In The Name Of God --------
                    % Editor : Hossein Salimi 88/4/1
                    % edit Project P3_keypoint()
                    % edit based on matlab code SIFT_ UCLA Vision Lab
                    %------------------------------------------------------------------
                    function Guss = P_keypoint()

                    %--------------------------
                    clc;
                    clear
                    %-----------------------
                    row = 256;
                    column = 256;
                    K = 2^(1/2);
                    o_min = 1;
                    s_min = 1;
                    s_max = 5;
                    o_max = 3;

                    %-------------
                    I = imread('F:\Image Processing\Thesis\Image Processing\Matlab Code\cameraman.tif'
                    I = double(I)/255.0;
                    base_image = imresize(I, [row column]);

                    O = 3;
                    [M,N] = size(base_image) ;

                    Guss.O = O ;
                    Guss.omin = o_min ;
                    Guss.smin = s_min ;
                    Guss.smax = s_max ;

                    % --------------------------------------------------------------------
                    % Octaves
                    % --------------------------------------------------------------------
                    for o=o_min_max
                    base_image = imresize(base_image, [ceil(row/(2^(o-1))) ceil(column/(2^(o-1)))]);
                    h=fspecial('gaussian',[3 3],K);
                    Guss.octave{o}(:,:,1) = conv2(base_image,h,'same'
                    for s=s_min+1:s_max
                    h=fspecial('gaussian',[3 3],K ^ (1/s));
                    Guss.octave{o}(:,:,s) = conv2(Guss.octave{o}(:,:,s-1),h,'same'
                    end
                    %=======================
                    figure;
                    subplot(3,2,1);imshow(base_image);
                    title('Orginal Image&#039
                    subplot(3,2,2);imshow(Guss.octave{o}(:,:,1));
                    title('Step1=(K ^ 1/s),s=1&#039
                    subplot(3,2,3);imshow(Guss.octave{o}(:,:,2));
                    title('Step1=(K ^ 1/s),s=2&#039
                    subplot(3,2,4);imshow(Guss.octave{o}(:,:,3));
                    title('Step1=(K ^ 1/s),s=3&#039
                    subplot(3,2,5);imshow(Guss.octave{o}(:,:,4));
                    title('Step1=(K ^ 1/s),s=4&#039
                    subplot(3,2,6);imshow(Guss.octave{o}(:,:,5));
                    title('Step1=(K ^ 1/s),s=5&#039
                    %=======================
                    end

                    % --------------------------------------------------------------------
                    % DOG
                    % --------------------------------------------------------------------
                    for o=o_min_max
                    [M,N,S] = size(Guss.octave{o}) ;
                    dogss.octave{o} = zeros(M,N,S-1) ;
                    for s=1:s_max-1
                    dogss.octave{o}(:,:,s) = ...
                    Guss.octave{o}(:,:,s+1) - Guss.octave{o}(:,:,s) ;
                    end
                    figure;
                    subplot(2,2,1);imshow(dogss.octave{o}(:,:,1));
                    subplot(2,2,2);imshow(dogss.octave{o}(:,:,2));
                    subplot(2,2,3);imshow(dogss.octave{o}(:,:,3));
                    subplot(2,2,4);imshow(dogss.octave{o}(:,:,4));
                    end
                    % ----------------------------------------------------------
                    % Local Max
                    % ----------------------------------------------------------
                    k=0;
                    for o=1:1_max
                    [M,N,S] = size(dogss.octave{o}) ;
                    for s=2:1:S-1
                    for i=2:1:M-1
                    for j=2:1:N-1
                    if ((...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i-1,j-1,s)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i-1,j,s)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i-1,j+1,s)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i,j-1,s)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i,j+1,s)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i+1,j-1,s)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i+1,j,s)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i+1,j+1,s)) && ...
                    ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i-1,j-1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i-1,j,s-1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i-1,j+1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i,j-1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i,j,s-1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i,j+1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i+1,j-1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i+1,j-1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i+1,j+1,s-1)) && ...
                    ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i-1,j-1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i-1,j,s+1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i-1,j+1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i,j-1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i,j,s+1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i,j+1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i+1,j-1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i+1,j-1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) > dogss.octave{o}(i+1,j+1,s+1))) ...
                    ...
                    || ...
                    ...
                    (...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i-1,j-1,s)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i-1,j,s)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i-1,j+1,s)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i,j-1,s)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i,j+1,s)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i+1,j-1,s)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i+1,j,s)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i+1,j+1,s)) && ...
                    ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i-1,j-1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i-1,j,s-1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i-1,j+1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i,j-1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i,j,s-1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i,j+1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i+1,j-1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i+1,j-1,s-1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i+1,j+1,s-1)) && ...
                    ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i-1,j-1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i-1,j,s+1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i-1,j+1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i,j-1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i,j,s+1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i,j+1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i+1,j-1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i+1,j-1,s+1)) && ...
                    (dogss.octave{o}(i,j,s) < dogss.octave{o}(i+1,j+1,s+1))))

                    k=k+1;
                    ix(k)=i;
                    iy(k)=j;
                    is(k)=s;
                    end
                    end
                    end
                    end
                    end
                    %++++++++++++++++++++

                    من دشمن تو و عقاید تو هستم ولی حاضرم در راه آزادی عقیده ات جانم را فدا کنم. (ولتر)

                    دیدگاه


                      #11
                      پاسخ : توصیف کننده ی SIFT

                      سلام ..................

                      من کدتون رو Run کردم .. سه تا Figure آخریش چی بود ؟ باگ بود به نظرم .. یه کاری کنیم .. Part به Part برنامه رو باهم تحلیل کنیم .. اینجوری خیلی بهتره .. شروع کنید تا باهم بریم جلو .. بالاخره اشکال رو پیدا میکنیم .. فقط سعی کنید زود به زود بیاد انجمن که سریع به نتیجه برسیم .. :nerd: موفق باشید ..
                      دوستان! مدتی کمتر به سایت میام ..

                      دیدگاه


                        #12
                        پاسخ : توصیف کننده ی SIFT

                        سلام خسته نباشید
                        من برنامه رو مرحله به مرحله توضیح می دم
                        اوایل برنامه که یک سری تعریف متغیرهاست و خوندن تصویر و ریختن توی یک متغیر base_image . البته رنج این تصویر بین 0 تا یک قرار می گیرد.
                        در مرحله یک :
                        من میام در هر مرحله ابتدا سایز اون رو تنظیم می کنم (در هر مرحله (اکتاو) سایز نصف می شود) و بعد یک فیلتر گوسی با تابع مطلب می سازم و سپس روی تصویر اعمال می کنم (این کار برای مرحله اول هر اکتاو است (با s برابر s_min)) و سپس در یک حلقه می یام و بقیه فیلتر ها رو می زنم (برای s از s_min+1 تا s_max) این حلقه 4 تا تکرار دارد و با مرحله قبل از این حلقه کلا 5 تا تصویر می شه که فیلتر روی اون اعمال شده (تو تصویر نمایش داده شده یک تصویر اصلی است و 5 تا تصویر فیلتر شده با s های مختلف است (s از یک تا 5 و سیگما از k به توان 1 تا k به توان 5/1 (یک پنجم) است )) . k هم 2 به توان یک دوم یعنی رادیکال 2 است است. البته ذکر این نکته ضروری است که من این فیلتر رو در هر اکتاو بر روی تصویر مرحله قبلش اعمال می کنم یعنی مثلا من فیلتر با سیگمای k به توان 3/1 رو روی تصویر مرحله قبل که با سیگمای k به توان 2/1 فیلتر شده اعمال می کنم
                        پس من 3 تا اکتاو دارم و در هر اکتاو 5 مرحله. پس من سه گروه تصویر که در هر گروه 6 تا تصویر وجود داره (یکی تصویر اصلی که در هر مرحله سایزش نصف می شه و 5 تا تصویر فیلتر شده اون تصویر است).
                        تو مرحله دوم این تصویر ها رو از هم کم می کنم. پس من دوباره 3 گروه تصویر دارم که در هر گروه 4 تا تصویر وجود داره (این 4 تا تصویر از کم کردن 5 تا تصویر فیلتر شده مرحله قبل به دست اومده)
                        من از الان سعی می کن حتما سریع به انجمن سر بزنم
                        من دشمن تو و عقاید تو هستم ولی حاضرم در راه آزادی عقیده ات جانم را فدا کنم. (ولتر)

                        دیدگاه


                          #13
                          پاسخ : توصیف کننده ی SIFT

                          سلام ....................

                          خــب .. K قراره کم بشه (به ازای هر S..) .. در نتیجه تصاویر خروجی باید به ندرت Sharp بشن (یعنی از Blur زیاد بیان به Blur کم ..) .. امــا این اتفاق توی تصاویری که Subplot شده برعکسه .. چرا؟ باید از بالا به پایین که میایم تصاویر Sharp تر بشن .. این رو بفرمایید چرا بر حسب انتظار پیش نمیره؟ (باقی توضیحاتتون با کد میخونه ..) ..
                          دوستان! مدتی کمتر به سایت میام ..

                          دیدگاه


                            #14
                            پاسخ : توصیف کننده ی SIFT

                            سلام
                            در هر مرحله (اکتاو) تصاویر باید در هر دفعه بلور تر شند و نه شارپتر. تو برنامه من هم چون در هر دفعه من فیلتر رو روی تصویر مرحله قبل می زنم تصویر بلورتر میشه
                            این هم یه مثال که باید بلورتر بشه
                            من دشمن تو و عقاید تو هستم ولی حاضرم در راه آزادی عقیده ات جانم را فدا کنم. (ولتر)

                            دیدگاه


                              #15
                              پاسخ : توصیف کننده ی SIFT

                              سلام
                              من این روند بلورتر شدن رو تو برنامه ای که قبلا به عنوان مثال گذاشته بودید امتحان کردم (مثال siftDemoV4)دیدم که تو این برنامه هم تصاویر بلورتر میشه
                              من همونطور گفتم تو مرحله بعدی مشکل دارم که هیچ ماکزییم و می نیمم ای پیدا نمی کنه یا خیلی خیلی کم پیدا می کنه :sad: چکا باید کرد :angry:
                              من دشمن تو و عقاید تو هستم ولی حاضرم در راه آزادی عقیده ات جانم را فدا کنم. (ولتر)

                              دیدگاه

                              لطفا صبر کنید...
                              X