স্কেল এবং আবর্তন আক্রমণকারী টেম্পলেট মেলানো M


12

আমি স্কেল এবং ঘূর্ণন ইনভেরিয়েন্ট টেম্পলেট মিলের জন্য একটি পদ্ধতি খুঁজছি। আমি ইতিমধ্যে কিছু চেষ্টা করেছি, তবে তারা আমার উদাহরণগুলির পক্ষে এত ভাল কাজ করে নি বা কার্যকর করার জন্য কখনও নেয় নি। SIFT এবং SURF বৈশিষ্ট্য সনাক্তকরণ পুরোপুরি ব্যর্থ হয়েছে। আমি লগ-পোলার টেম্পলেট ম্যাচিং ফাংশনটিও বাস্তবায়নের চেষ্টা করেছি, কিন্তু আমি কখনই শেষ করিনি (ঠিক কীভাবে করব তা জানতাম না)।

এই নিবন্ধগুলিতে (প্রথমটি জার্মান ভাষায় রয়েছে)

http://cvpr.uni-muenster.de/teaching/ss08/seminarSS08/downloads/Wentker-Vortrag.pdf

http://www.jprr.org/index.php/jprr/article/viewFile/355/148

আমি সেই পদ্ধতি সম্পর্কে পড়েছি। মেরু স্থানাঙ্ক ম্যাপিং কাজ করেছে, তবে জানি না এটি সঠিক কিনা। চিত্রগুলি দেখতে এইরকম।

উত্স_লগ_পোলার.পি.এন.টি.এন.এন.এইং http://www.shareimages.com/images/pics/0/0/3/62394-pZSfl5WenZysnpyVnKg-s Source_log_polar.png

template_log_polar.png

এবং এই 2 টি চিত্র ওপেনসিভির টেমপ্লেট মিলের ক্রিয়াকলাপের সাথে মিলে যাওয়ার পরে আমি সেই ফলাফল পেয়েছি

match_log_polar.png

এখন আমি কীভাবে যেতে পারি না।

আমার টেমপ্লেটগুলি সর্বদা ব্লুপ্রিন্ট এবং ব্লুপ্রিন্টগুলি তৈরিতে সাধারণ প্রতীক। প্রতীকগুলি আকার এবং দিকনির্দেশনায় পৃথক হতে পারে।

উদাহরণস্বরূপ আমার সাধারণ নীলনকশা:

এখানে চিত্র বর্ণনা লিখুন

এবং আমার টেম্পলেট

এখানে চিত্র বর্ণনা লিখুন

এই উদাহরণে কেবলমাত্র একটি টেম্পলেট রয়েছে তবে ব্লুপ্রিন্টগুলিতে এটি সমস্ত উপস্থিতি খুঁজে পাওয়া উচিত, এমনকি আকার এবং / অথবা অভিমুখীকরণগুলিও।

আমি কীভাবে এটি সমাধান করতে পারি তার কি কারও কাছে দৃষ্টিভঙ্গি রয়েছে?

সম্পাদনা:

অ্যান্ড্রে এর পদ্ধতির জন্য একটি সংযোজন। একটি রেডিয়াল প্রোফাইলের জন্য দূরত্ব ক্যাপচারিং অ্যালগরিদম। (এমগুসিভি ব্যবহার করে)

private float[] getRadialProfile( Image<Gray, byte> image, Point center, int resolution )
 {

 var roi = image.ROI;

 if ( !roi.Contains( center ) )
  {
   return null;
  }

 var steps = resolution;
 var degreeSteps = 360 / (double)resolution;
 var data = image.Data;
 var peak = 0.0f;
 var bottom = double.MaxValue;
 var bottomIndex = 0;
 var width = roi.Width;
 var height = roi.Height;
 var minX = roi.X;
 var minY = roi.Y;

 float[] distances = new float[resolution];
 for ( var i = 0; i < steps; i++ )
  {
   var degree = i * degreeSteps;
   var radial = degree * Math.PI / 180.0;
   var dy = Math.Sin( radial );
   var dx = Math.Cos( radial );

   var x = (double)center.X;
   var y = (double)center.Y;

   while ( true )
    {
    x += dx;
    y += dy;
    if ( x >= minX + width || y >= minY + height || x <= minX || y <= minY )
     {
      x = -1;
      y = -1;
      break;
     }
    var pixel = data[(int)y, (int)x, 0];
    if ( pixel == 0 )
     {
      break;
     }
    }

    float distance = 0.0f;
    if ( x != -1 && y != -1 )
    {
      distance = (float)Math.Sqrt( Math.Pow( (center.X - x), 2 ) + Math.Pow( (center.Y - y), 2 ) );
    }

    distances[i] = distance;
    if ( distance > peak )
    {
      peak = distance;
    }
    if ( distance < bottom )
    {
      bottom = distance;
      bottomIndex = i;
    }
   }

    // Scale invariance. Divide by peak
   for ( var i = 0; i < distances.Length; i++ )
   {
     distances[i] /= peak;
   }

    // rotation invariance, shift to lowest value
   for ( var i = 0; i < bottomIndex; i++ )
   {
     distances.ShiftLeft(); // Just rotates the array nothing special
   }

   return distances;
}

ডিএসপিএসই তে স্বাগতম আমরা আপনাকে সাহায্য করার চেষ্টা করব, তবে আরও সুনির্দিষ্ট তথ্য সরবরাহ করা ভাল। SIFT এবং SURF "সম্পূর্ণরূপে ব্যর্থ" বলতে কী বোঝ? তারা কী সনাক্ত করেছে / ম্যাচ করেছে? এছাড়াও, আমি ব্যক্তিগতভাবে লগ-পোলার টেম্পলেট ম্যাচিং সম্পর্কে জানি না, তবে, যদি আপনি চেষ্টা করে থাকেন তবে সমস্যাটি ঠিক কোথায় ছিল?
পেনেলোপ

SIFT এবং SURF বৈশিষ্ট্য সনাক্তকরণ টেম্পলেট চিত্রটিতে কোনও বৈশিষ্ট্য খুঁজে পায়নি। এটি টেমপ্লেটটিতে খুব কম তথ্য রয়েছে বলে মনে হয়েছিল (ঠিক সেই ছোট ধনুক এবং একটি লাইন)। লগ-পোলার মিলের জন্য আমি একটি কাগজ পেয়েছি যেখানে এটি বর্ণিত হয়েছে তবে এর পিছনে সঠিক গণিত নেই। আমি এটি অনুসন্ধান করব এবং এটি যুক্ত করব।
আর্যান্ড্ট বিবারস্টাইন

এখানে আমরা এখানে যান: cvpr.uni-muenster.de/teaching/ss08/seminarSS08/downloads/... (জার্মান ধারা) এবং এই এক jprr.org/index.php/jprr/article/viewFile/355/148
Arndt Bieberstein

আরে, এখানে প্রচুর লোক জার্মান বুঝতে পারে না, আমি মনে করি: ডি তবে অন্য কিছুর জন্য: মন্তব্যগুলির পরিবর্তে কোনও নতুন তথ্য সঠিক জায়গায় যুক্ত করতে আপনি নিজের পোস্ট সম্পাদনা করতে পারেন can এবং, এছাড়াও, আপনি ঠিক কী সমস্যায় পড়েছিলেন তা এখনও বলেননি।
পেনেলোপ

3
"জার্মান নিবন্ধ" এর লেখকের ইংরেজিতে নিবন্ধ রয়েছে - www-cs.engr.ccny.cuny.edu/~wolberg/pub/icip00.pdf ( গুগলকে ধন্যবাদ)
সার্জভি

উত্তর:


6

আমি মনে করি আপনি খুব সহজ উপায়ে আপনার সমস্যার সমাধান করতে পারবেন। আপনি যে ব্লুপ্রিন্টগুলির সাথে কাজ করছেন তা বিবেচনা করে, আপনি প্রান্ত সংযোগ, শব্দ এবং অন্যান্য অনেকগুলি জিনিস যা সিফট এবং এসআরএফের জন্য উপযুক্ত হয়েছিল তা নিয়ে উদ্বিগ্ন হওয়া উচিত নয়। আপনার টেমপ্লেটটি নির্দিষ্ট প্রান্তের আকারযুক্ত ফাঁকা আকার।

সুতরাং, আমার সুপারিশটি হ'ল:

  • ঘেরের চারপাশে হাঁটুন এবং টেমপ্লেটের কেন্দ্রের চারপাশে প্রান্তগুলির দূরত্বগুলির একটি প্রোফাইল সন্ধান করুন। এটি টেমপ্লেটের রেডিয়াল প্রোফাইল। সবচেয়ে বড় দূরত্ব দ্বারা বিভক্ত, স্কেল অদম্য হতে। ভেক্টরটি ঘোরান যাতে ক্ষুদ্রতম দূরত্বটি প্রথম হয়, ঘূর্ণন অদৃশ্য হয়ে যায়। (যদি আপনার টেমপ্লেটের কোনও প্রভাবশালী দূরত্ব না থাকে তবে আপনি পরে ২ য় ধাপ পরিবর্তন করতে পারেন)

এখানে চিত্র বর্ণনা লিখুন

  • ছবিতে ব্লবগুলি সন্ধান করুন। অংশ (1) এ বর্ণিত র‌্যাডিয়াল প্রোফাইলটি গুনুন এবং দুটি ভেক্টরকে স্বাভাবিক সংযোগের সাথে তুলনা করুন। যদি আপনার টেমপ্লেটের কোনও প্রভাবশালী দূরত্ব না থাকে তবে পারস্পরিক সম্পর্কটি ক্রম-সম্পর্ককে নরমালাইজড হয়ে যায় এবং সর্বাধিক নির্বাচন করে)। যারা কিছুটা দোরগোড়ায় পাস করেন তাদের ম্যাচ হিসাবে বিবেচনা করা হয়।

আপনার সাথে শুরু করার জন্য এখানে কিছু মতলব কোড রয়েছে - আমি সেই অংশটি লিখেছিলাম যা কোনও নির্দিষ্ট ব্লবের জন্য দূরত্বের প্রোফাইল খুঁজে পায় এবং এটি টেমপ্লেটের জন্য গণনা করে:

function Doors
    im = imread('http://i.stack.imgur.com/Tf8EV.png');
    im = im(:,:,1);
    template = imread('http://i.stack.imgur.com/PlP4i.png');
    template = template(:,:,1);

    blobs = regionprops(template>0,'Area','Image');
    largestBlob = GetLargestBlob(blobs);
    [prof,edgeImage] = GetBlobRadialProfile(largestBlob);

    figure;
    subplot(1,2,1);plot(prof); title('Radial profile')
    subplot(1,2,2);imshow(edgeImage); title('Template');

end

function [prof,edgeImage] = GetBlobRadialProfile(blob)
    paddedImage = padarray( blob.Image,[8 8]);
    erodedImage = imerode(paddedImage,strel('disk',1));
    edgeImage = xor(erodedImage,paddedImage);

    c = regionprops(paddedImage,'Centroid');
    cx  = c.Centroid(1);
    cy  = c.Centroid(2);

    [y,x] = find(edgeImage);
    rad = (x(:)-cx).^2 + (y(:)-cy).^2;
    [~,minIndex] = min(rad);
    contour = bwtraceboundary(edgeImage, [y(minIndex), x(minIndex)],'N');
    prof = (contour(:,2)-cx).^2 + (contour(:,1)-cy).^2;
    prof = prof./max(prof);
end

function largestBlob = GetLargestBlob(blobs)    
    area = [blobs.Area];
    [~,index] = max(area);
    largestBlob = blobs(index);
end

আমার ধারণা এটি নন-বদ্ধ আকারের সাথে কাজ করছে না? অথবা আমি কি এই "গর্তগুলি" আকারে রেখেছি?
আরেন্ড্ট বিবারস্টাইন

অ্যারেন্ডট বিবারস্টাইন, হ্যাঁ এটি কেবল বন্ধ আকারের জন্য কাজ করে। আমার ধারণা এটি প্রসারিত করার জন্য কিছু পদ্ধতি থাকা উচিত।
আন্দ্রে রুবস্টেইন

যেহেতু ওপেনসিভিতে bwtraceboundary ফাংশন নেই আমি নিজের লেখা এবং কেবল গর্তগুলি "এড়িয়ে গেছি" এবং জিরো দিয়ে ভরা করেছি। ফলাফলগুলি এখন কেমন দেখাচ্ছে তা এখানে একটি সামান্য উদাহরণ। প্রতিটি টেম্পলেট জন্য 5 প্লট। লাল বিন্দু হ'ল সূচনা পয়েন্ট। নমুনা প্লট
আর্যান্ড্ট বিবারস্টাইন

@ আরেন্ডট বিবারস্টাইন, খুব সুন্দর! আপনার কাজ শেষ হয়ে গেলে আপনি আমাদের সাথে ফলাফলগুলি ভাগ করে নিতে পারেন।
আন্দ্রে রুবস্টেইন

অবশ্যই, কোডটি খুব সুন্দর বা পারফরম্যান্ট নয়, তবে এটি কার্যকর। আমি আমার প্রশ্নের নীচে এটি সংযুক্ত করব। এটা তোলে C # এর লেখা (আমি EmguCV ব্যবহার করছি)
Arndt Bieberstein

3

আইআইটি মাদ্রাজের অধ্যাপক অনুরাগ মিত্তালের একটি আলাপের ভিত্তিতে আমি যা জানি, তার মূল ধারণাটি এখানে দেওয়া যেতে পারে।

ধারণাটি আকৃতি ভিত্তিক অবজেক্ট সনাক্তকরণের, তবে স্পষ্টতই অন্যত্রও প্রসারিত হতে পারে।

  1. বার্কলে প্রান্ত সনাক্তকারী ব্যবহার করে গণনা প্রান্তগুলি।
  2. প্রান্তগুলি সংযুক্ত করুন। "গ্লোবাল অবজেক্ট বাউন্ডারি ডিটেকশন"।
  3. চ্যাম্পার দূরত্ব বা হিউস্টফ দূরত্ব ব্যবহার করে আকারের মিল।

একই বিষয়ে তার কাগজটি এখানে পাওয়া যায়: মাল্টি-স্টেজ কনট্যুর ভিত্তিক ডিটেকশন অব ডিফর্মিয়েবল অবজেক্টস।

অন্যদিকে আমি মনে করি যে এসআইএফটি-র কর্নার সনাক্তকরণ অ্যালগরিদমগুলি যেমন আপনার সেখানে থাকা টেম্পলেট বৈশিষ্ট্যে কাজ করবে।

দ্রষ্টব্য: SIFT সম্পূর্ণরূপে আবর্তনকারী নয়। এটি 60 degrees ডিগ্রি বা তার সাথে আবর্তনগুলির সাথে মানিয়ে নিতে সক্ষম নয়। সুতরাং একাধিক টেম্পলেট গঠন করা ভাল ধারণা।

লগ-পোলার ভিত্তিক ফুরিয়ার-মেলিন ট্রান্সফ্রমস হিসাবে: কীভাবে রূপান্তরগুলির জন্য স্যাম্পলিং সঞ্চালিত হয় তার কারণে তারা তথ্যের ক্ষয়ক্ষতি ঘটায়।


এই পদ্ধতিটি সত্যিই আশাব্যঞ্জক! আমি আপনার লিঙ্কটি খুলতে পারি না, তবে আমি আপনার পদ্ধতির উপর নজর রেখেছি oo আমি জানতাম না যে সিফটটি পুরো ঘূর্ণন আইভরিয়েন্ট নয়! খুব ভাল উত্তর! +1
আর্েন্ড্ট বিবারস্টাইন

1
চ্যাম্পার দূরত্ব এবং এটি কীভাবে কাজ করে সে সম্পর্কে খুব কমই আমি খুঁজে পেয়েছি, যারা এই সন্ধান করছেন তাদের জন্য এই লিঙ্কটি চেষ্টা করুন।
আর্যান্ড্ট বিবারস্টাইন

@ নারেশ SIFT বিমানের বাইরে বড় আবর্তনের জন্য আবর্তন-আক্রমণকারী নয় । একই বিমানে নয়।
এ-জয়েস

1

আমি এটিকে তেমন চিন্তাভাবনা করি নি, তবে আমি নিশ্চিত যে ক্লাসিক ফুরিয়ার ডেস্ক্রিপটারগুলি (এফডি) ব্যবহার করে খুব বেশি সমস্যা ছাড়াই শক্তিশালী সমাধান হতে পারে। আমি মনে করি আপনার সমস্যা এটির জন্য খুব ভাল প্রার্থী হতে পারে। আপনার কাছে ব্ল্যাক লাইনের অঙ্কন রয়েছে এমন প্রান্ত সনাক্তকরণ খ / সি করতে হবে বলে মনে করবেন না। আপনি কোনও পিক্সেল না মেরে কেবল রাস্টার স্ক্যান শুরু করুন, তারপরে নিম্নলিখিতটি করুন:

কেবলমাত্র আপনার ঘরের ঘেরগুলি এমনভাবে ব্যবহার করুন যেন তারা 1 ডি সংকেত হয়, যেখানে সংকেত প্রশস্ততা কোনও স্থির হারে নমুনাযুক্ত বস্তুর সেন্ট্রয়েড থেকে স্বাভাবিক দূরত্ব। সুতরাং, দরজার জন্য একটি সাধারণ এফডি মডেল করুন। তারপরে, প্রতিটি ঘরের প্যারামিটারটি ক্রমবর্ধমান প্রান্ত, শীর্ষ এবং পতনের জন্য এক ধরণের উত্তল ফিল্টার দিয়ে স্ক্যান করুন, যা ক্যাপচারের জন্য "সংকেত" এর একটি স্টার্ট / স্টপ উইন্ডো সেট করে sets যে ক্যাপচারিত "সংকেত" তে একটি এফএফটি বা অনুরূপ এফডি আলগো করুন এবং এফডি টেম্পলেটটির সাথে তুলনা করুন। ম্যাচটি ট্রিগার করার জন্য টেমপ্লেট তুলনা ধাপটি একটি প্রান্তিকের সাথে একটি সহজ সম্পর্ক হতে পারে। যেহেতু শুধুমাত্র আপনার দরজাগুলিতে গোল প্রান্ত রয়েছে যা একটি খুব সহজ এফডি মেলানোর সমস্যা হওয়া উচিত।

এফডি-র করা চিত্র বা ডেটাবেস থেকে সংগীত পুনরুদ্ধার ব্যবহার করার মতো এটি ভাবুন। যে উপর প্রচুর সাদা কাগজপত্র।

এটি আনুমানিক আকারগুলিতে এফডি ব্যবহারের জন্য একটি ভাল টিউটোরিয়াল: আমার সন্দেহ হয় আপনার এটির প্রয়োজন হবে তবে এই কাগজে প্রস্তাবিত মত ঘূর্ণন মোকাবেলা করার জন্য আপনি প্রথমে আপনার চিত্রগুলি একটি মেরু সমন্বয় কাঠামোতে রূপান্তর করতে পারেন: শেপ-ভিত্তিক চিত্র পুনরুদ্ধার ব্যবহার করে জেনেরিক ফুরিয়ার বর্ণনাকারী

তারা কীভাবে অ্যাপলের ঘের সনাক্তকরণের এফডি প্যারামিটারাইজ করবে? আপনার দরজার মত একই ধারণা।

বিটিডাব্লু, আমি নিশ্চিত যে পুরো পরিকল্পনাটি মেরু স্থানাঙ্কগুলিতে ম্যাপিং করা ঘোরানো আক্রমণকে সাহায্য করবে না - আপনার প্রতিটি দরজার সেন্ট্রয়েড সম্পর্কে এটি করা দরকার যা আপনার সমস্যাটি ঠিক যা শুরু করা উচিত। সে কারণেই আমি মনে করি আপনি কেবল দরজার প্রার্থীদের ক্যাপচার করতে চান, এবং সম্ভবত এফডি দরজা টেম্পলেটটির সাথে মিলের জন্য পোলার স্থানাঙ্কগুলিতে ম্যাপ করুন, যেমন উপরের লিঙ্কে থাকা কাগজটিতে সম্পন্ন হয়েছে।

আপনি যদি এই পদ্ধতির চেষ্টা করেন তবে আমাকে কীভাবে তা জানাতে দিন।


0

সম্ভবত আপনি এই মাতলাব কোডটি দরকারী লিখেছেন তা খুঁজে পেতে পারেন: ফ্র্যাক্টাল মোজাইক

এটি একটি শৈল্পিক অ্যাপ্লিকেশনে "রবস্ট ইমেজ রেজিস্ট্রেশন লগ-পোলার ট্রান্সফর্ম ব্যবহার করে" ( পিডিএফ ) প্রয়োগ করে যা আমার দেখা traditionalতিহ্যগত পদ্ধতিগুলির চেয়ে বেশি দৃ rob়তার প্রয়োজন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.