একটি 2 ডি অ্যারেতে পিক সনাক্তকরণ


873

আমি একটি কুকুর পাঞ্জার নীচে চাপ পরিমাপের একটি ভেটেরিনারি ক্লিনিকে সহায়তা করছি। আমি আমার ডেটা বিশ্লেষণের জন্য পাইথন ব্যবহার করি এবং এখন আমি পাঁজাগুলি (শারীরবৃত্তীয়) বিভাগগুলিতে বিভক্ত করার চেষ্টা করে আটকে রয়েছি।

আমি প্রতিটি পাঞ্জার একটি 2 ডি অ্যারে তৈরি করেছি, যা প্রতিটি সেন্সরের জন্য সর্বাধিক মানগুলি নিয়ে থাকে যা সময়ের সাথে সাথে পা দ্বারা লোড করা হয়েছে। এখানে একটি পানির উদাহরণ রয়েছে, যেখানে আমি 'ডিটেক্ট' করতে চাইলে অঞ্চলগুলি আঁকতে আমি এক্সেল ব্যবহার করেছি। এগুলি স্থানীয় ম্যাক্সিমার সাথে সেন্সরের চারপাশে 2 বাই 2 বাক্স যা একসাথে সবচেয়ে বড় যোগফল।

বিকল্প পাঠ

তাই আমি কিছু পরীক্ষার চেষ্টা করেছি এবং প্রতিটি কলাম এবং সারি সর্বাধিক সন্ধান করার সিদ্ধান্ত নিয়েছি (পাঞ্জার আকারের কারণে এক দিকে তাকাতে পারে না)। এটি পৃথক আঙ্গুলের অবস্থান মোটামুটি ভালভাবে সনাক্ত করতে বলে মনে হচ্ছে তবে এটি প্রতিবেশী সেন্সরগুলিও চিহ্নিত করে।

বিকল্প পাঠ

তাহলে পাইথনকে বলার সর্বোত্তম উপায়টি কী হতে পারে যে আমি সর্বোচ্চটি চাই?

দ্রষ্টব্য: 2x2 স্কোয়ারগুলি ওভারল্যাপ করতে পারে না, যেহেতু তাদের পৃথক অঙ্গুলি হতে হবে!

এছাড়াও আমি সুবিধার্থে 2x2 নিয়েছি, আরও উন্নত সমাধানটি স্বাগত, তবে আমি কেবল একজন মানব আন্দোলনের বিজ্ঞানী, তাই আমি প্রকৃত প্রোগ্রামার বা গণিতবিদ না, তাই দয়া করে এটি 'সরল' রাখুন।

এখানে এমন একটি সংস্করণ যা লোড করা যায়np.loadtxt


ফলাফল

তাই আমি @ জেক্সটির সমাধানটি চেষ্টা করেছি (নীচের ফলাফল দেখুন)। আপনি দেখতে পাচ্ছেন, এটি সামনের পাঞ্জায় খুব কাজ করে, তবে এটি পায়ের পায়ে কম ভাল কাজ করে।

আরও সুনির্দিষ্টভাবে বলা যায় যে এটি চতুর্থ অঙ্গুলির ছোট শিখরটিকে চিনতে পারে না। এটি স্পষ্টতই অন্তর্নিহিত যে লুপটি নীচে নীচের মানের দিকে দেখায়, এটি কোথায় তা বিবেচনা না করে।

@ জেক্সটির অ্যালগরিদম কীভাবে টুইট করা যায় তা কী কেউ জানতে পারবেন, যাতে এটি চতুর্থ পায়ের আঙ্গুলটিও খুঁজে পেতে পারে?

বিকল্প পাঠ

যেহেতু আমি এখনও অন্য কোনও ট্রায়াল প্রক্রিয়া করি নি, তাই আমি অন্য কোনও নমুনা সরবরাহ করতে পারি না। তবে আমি আগে যে ডেটা দিয়েছিলাম তা ছিল প্রতিটি পাটির গড়। এই ফাইলটি প্লেটের সাথে যোগাযোগ করার জন্য 9 পাঞ্জার সর্বাধিক ডেটা রয়েছে ray

এই চিত্রটি দেখায় যে কীভাবে তারা স্থানিকভাবে প্লেটের উপরে ছড়িয়ে পড়েছিল।

বিকল্প পাঠ

হালনাগাদ:

আমি আগ্রহী প্রত্যেকের জন্য একটি ব্লগ তৈরি করেছি এবং আমি সমস্ত কাঁচা পরিমাপের সাথে একটি স্কাইড্রাইভ সেটআপ করেছি। সুতরাং যে কেউ আরও ডেটা অনুরোধ করছে: আপনার কাছে আরও শক্তি!


নতুন আপডেট:

তাই পাঞ্জা সনাক্তকরণ এবং পাঞ্জা বাছাই সংক্রান্ত আমার প্রশ্নগুলির সাথে সহায়তা পাওয়ার পরে অবশেষে আমি প্রতিটি পাঞ্জার জন্য পায়ের আঙ্গুল সনাক্তকরণটি পরীক্ষা করতে সক্ষম হয়েছি! দেখা যাচ্ছে, এটি কোনও কিছুইতে এত ভাল কাজ করে না তবে আমার উদাহরণের মতো পাঞ্জা আকারের। অনিশ্চিতভাবে অবশ্যই, 2x2 এত নির্বিচারে বেছে নেওয়ার জন্য এটি আমার নিজের দোষ।

এটি যেখানে ভুল হয় তার একটি চমৎকার উদাহরণ এখানে: একটি পেরেক একটি পায়ের আঙ্গুল হিসাবে স্বীকৃত হচ্ছে এবং 'হিল' এত প্রশস্ত, এটি দু'বার স্বীকৃতি পেয়েছে!

বিকল্প পাঠ

পাঞ্জাটি খুব বড়, তাই কোনও ওভারল্যাপ ছাড়াই 2x2 আকার গ্রহণের ফলে কিছু পায়ের আঙ্গুলগুলি দু'বার সনাক্ত করা যায়। অন্য উপায়ে, ছোট কুকুরগুলিতে এটি প্রায়শই 5 তম অঙ্গুলি খুঁজে পেতে ব্যর্থ হয়, যা আমার সন্দেহ হয় 2x2 অঞ্চলটি অনেক বড় হওয়ার কারণে ঘটছে।

আমার সমস্ত পরিমাপের বর্তমান সমাধানের চেষ্টা করার পরে আমি হতবাক সিদ্ধান্তে পৌঁছেছি যে আমার প্রায় সমস্ত ছোট কুকুরের জন্য এটি একটি 5 তম অঙ্গুলি খুঁজে পায় নি এবং এটি 50% এরও বেশি বড় কুকুরের জন্য প্রভাবগুলি আরও খুঁজে পাবে!

সুতরাং পরিষ্কারভাবে আমার এটি পরিবর্তন করা প্রয়োজন। আমার নিজের অনুমান neighborhoodছোট কুকুরের জন্য ছোট এবং বৃহত্তর কুকুরের জন্য আরও বড় কিছুতে আকার পরিবর্তন করছিল । তবে generate_binary_structureআমাকে অ্যারের আকার পরিবর্তন করতে দেবে না।

অতএব, আমি আশা করছি যে অন্য কারও কাছে আঙ্গুলের অবস্থান চিহ্নিত করার জন্য আরও ভাল পরামর্শ থাকতে পারে, সম্ভবত পায়ের আকারের সাথে পায়ের আঙ্গুলের আয়তন থাকতে হবে?


আমি এটি নিয়েছিলাম যে কমাগুলি মান বিভাজকের পরিবর্তে দশমিক স্থান?
ম্যাথএইচ

হ্যাঁ, তারা কমা। এবং
@ খ্রিস্টিয়ান

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

2
@ রন: এই অধ্যয়নের অন্যতম লক্ষ্য হ'ল কুকুরের আকার / ওজন সিস্টেমটি উপযুক্ত কিনা তা দেখার জন্য, তাই হ্যাঁ এই কুকুরটি প্রায় 20 কেজি ছিল। আমার কাছে এমন কিছু রয়েছে যা যথেষ্ট ছোট (এবং আরও বড়) এবং আমি প্রত্যাশা করি যে আসল ছোটদের জন্য আমি এটি করতে সক্ষম হব না।
আইভো ফ্লিপস

2
@ ফ্র্যাঙ্ক পাঞ্জা সময়ের সাথে পরিমাপ করা হয়, তাই তৃতীয় মাত্রা। যাইহোক, তারা তাদের স্পট থেকে সরেনি (তুলনামূলকভাবে কথা বলতে) তাই আমি বেশিরভাগ আগ্রহী যেখানে পায়ের আঙ্গুলগুলি 2D তে অবস্থিত। 3 ডি দিকটি এর পরে বিনামূল্যে আসবে
আইভো ফ্লিপস

উত্তর:


331

স্থানীয় সর্বাধিক ফিল্টার ব্যবহার করে শিখরগুলি সনাক্ত করেছি । আপনার প্রথম 4 টি পাঞ্জার ডেটাসেটের ফলাফল এখানে রয়েছে: শিখর সনাক্তকরণের ফলাফল

আমি এটি 9 পাউজের দ্বিতীয় ডেটাसेटেও চালিয়েছি এবং এটি কাজ করে

কিভাবে আপনি এটা করবেন এখানে:

import numpy as np
from scipy.ndimage.filters import maximum_filter
from scipy.ndimage.morphology import generate_binary_structure, binary_erosion
import matplotlib.pyplot as pp

#for some reason I had to reshape. Numpy ignored the shape header.
paws_data = np.loadtxt("paws.txt").reshape(4,11,14)

#getting a list of images
paws = [p.squeeze() for p in np.vsplit(paws_data,4)]


def detect_peaks(image):
    """
    Takes an image and detect the peaks usingthe local maximum filter.
    Returns a boolean mask of the peaks (i.e. 1 when
    the pixel's value is the neighborhood maximum, 0 otherwise)
    """

    # define an 8-connected neighborhood
    neighborhood = generate_binary_structure(2,2)

    #apply the local maximum filter; all pixel of maximal value 
    #in their neighborhood are set to 1
    local_max = maximum_filter(image, footprint=neighborhood)==image
    #local_max is a mask that contains the peaks we are 
    #looking for, but also the background.
    #In order to isolate the peaks we must remove the background from the mask.

    #we create the mask of the background
    background = (image==0)

    #a little technicality: we must erode the background in order to 
    #successfully subtract it form local_max, otherwise a line will 
    #appear along the background border (artifact of the local maximum filter)
    eroded_background = binary_erosion(background, structure=neighborhood, border_value=1)

    #we obtain the final mask, containing only peaks, 
    #by removing the background from the local_max mask (xor operation)
    detected_peaks = local_max ^ eroded_background

    return detected_peaks


#applying the detection and plotting results
for i, paw in enumerate(paws):
    detected_peaks = detect_peaks(paw)
    pp.subplot(4,2,(2*i+1))
    pp.imshow(paw)
    pp.subplot(4,2,(2*i+2) )
    pp.imshow(detected_peaks)

pp.show()

এর পরে আপনাকে যা করতে হবে তা হ'ল scipy.ndimage.measurements.labelসমস্ত স্বতন্ত্র বস্তুর লেবেল দেওয়ার জন্য মুখোশটি ব্যবহার করা। তারপরে আপনি স্বতন্ত্রভাবে তাদের সাথে খেলতে সক্ষম হবেন।

নোট করুন যে পদ্ধতিটি ভালভাবে কাজ করে কারণ পটভূমি গোলমাল নয়। যদি এটি হয় তবে আপনি পটভূমিতে অন্যান্য অযাচিত পর্বতগুলির একটি গুচ্ছ সনাক্ত করতে পারবেন। আর একটি গুরুত্বপূর্ণ বিষয় হ'ল পাড়ার আকার । পিকের আকার পরিবর্তন হলে (এটি প্রায় সমানুপাতিক হওয়া উচিত) আপনার এটিকে সামঞ্জস্য করতে হবে।


1
(Eroded_background ^ লোকাল_পিক্স) এর চেয়ে সহজ সমাধান রয়েছে। কেবল (অগ্রভাগ এবং স্থানীয় শিখর) করুন
রায়ান সোকলস্কি

53

সমাধান

ডেটা ফাইল: paw.txt । সোর্স কোড:

from scipy import *
from operator import itemgetter

n = 5  # how many fingers are we looking for

d = loadtxt("paw.txt")
width, height = d.shape

# Create an array where every element is a sum of 2x2 squares.

fourSums = d[:-1,:-1] + d[1:,:-1] + d[1:,1:] + d[:-1,1:]

# Find positions of the fingers.

# Pair each sum with its position number (from 0 to width*height-1),

pairs = zip(arange(width*height), fourSums.flatten())

# Sort by descending sum value, filter overlapping squares

def drop_overlapping(pairs):
    no_overlaps = []
    def does_not_overlap(p1, p2):
        i1, i2 = p1[0], p2[0]
        r1, col1 = i1 / (width-1), i1 % (width-1)
        r2, col2 = i2 / (width-1), i2 % (width-1)
        return (max(abs(r1-r2),abs(col1-col2)) >= 2)
    for p in pairs:
        if all(map(lambda prev: does_not_overlap(p,prev), no_overlaps)):
            no_overlaps.append(p)
    return no_overlaps

pairs2 = drop_overlapping(sorted(pairs, key=itemgetter(1), reverse=True))

# Take the first n with the heighest values

positions = pairs2[:n]

# Print results

print d, "\n"

for i, val in positions:
    row = i / (width-1)
    column = i % (width-1)
    print "sum = %f @ %d,%d (%d)" % (val, row, column, i)
    print d[row:row+2,column:column+2], "\n"

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

কিছু মন্তব্য

জটিল অংশটি হ'ল সমস্ত 2x2 স্কোয়ারের অঙ্কগুলি গণনা করা। আমি ধরে নিয়েছি আপনার এই সমস্তের প্রয়োজন, তাই কিছুটা ওভারল্যাপিং হতে পারে। মূল 2D অ্যারে থেকে প্রথম / শেষ কলাম এবং সারিগুলি কাটতে আমি টুকরোগুলি ব্যবহার করেছি এবং তারপরে সেগুলি একসাথে ওভারল্যাপিং করে এবং অঙ্কগুলি গণনা করছি।

এটি আরও ভালভাবে বুঝতে, একটি 3x3 অ্যারে চিত্রায়ন করা:

>>> a = arange(9).reshape(3,3) ; a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

তারপরে আপনি এর স্লাইসগুলি নিতে পারেন:

>>> a[:-1,:-1]
array([[0, 1],
       [3, 4]])
>>> a[1:,:-1]
array([[3, 4],
       [6, 7]])
>>> a[:-1,1:]
array([[1, 2],
       [4, 5]])
>>> a[1:,1:]
array([[4, 5],
       [7, 8]])

এখন কল্পনা করুন যে আপনি এগুলি একে অপরের উপরে রেখেছেন এবং একই অবস্থানগুলিতে উপাদানগুলি যোগ করুন। এই অঙ্কগুলি একই অবস্থানে উপরের-বাম কোণার সাথে 2x2 স্কোয়ারের সমান সমষ্টি হবে:

>>> sums = a[:-1,:-1] + a[1:,:-1] + a[:-1,1:] + a[1:,1:]; sums
array([[ 8, 12],
       [20, 24]])

আপনার যখন 2x2 স্কোয়ারের চেয়ে বেশি পরিমাণ থাকে তখন আপনি maxসর্বাধিক, বা sort, বা sortedশিখর সন্ধান করতে পারেন।

পীক আমি দম্পতি যে মান (সমষ্টি) একটি তার পূরণবাচক অবস্থানের সঙ্গে অ্যারে চ্যাপ্টা (দেখুন অবস্থানের মনে রাখা zip)। তারপরে আমি ফলাফলগুলি মুদ্রণ করার পরে আবার সারি / কলামের অবস্থান গণনা করি।

মন্তব্য

আমি 2x2 স্কোয়ারের ওভারল্যাপ করার অনুমতি দিয়েছি। সম্পাদিত সংস্করণ তাদের মধ্যে এমন কিছু ফিল্টার করে যা ফলাফলগুলিতে কেবল অ-ওভারল্যাপিং স্কোয়ারগুলি উপস্থিত হয়।

আঙুল নির্বাচন করা (একটি ধারণা)

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

আমি লক্ষ্য করেছি যে সামনের আঙ্গুলগুলি যদি প্রায় নিখুঁত বৃত্তে থাকে তবে পিছনের আঙুলটি সেই বৃত্তের অভ্যন্তরে থাকা উচিত। এছাড়াও, সামনের আঙ্গুলগুলি কমবেশি সমান দূরত্বযুক্ত। আমরা আঙ্গুলগুলি সনাক্ত করতে এই ধর্মীয় বৈশিষ্ট্যগুলি ব্যবহার করার চেষ্টা করতে পারি।

সুডোকোড:

select the top N finger candidates (not too many, 10 or 12)
consider all possible combinations of 5 out of N (use itertools.combinations)
for each combination of 5 fingers:
    for each finger out of 5:
        fit the best circle to the remaining 4
        => position of the center, radius
        check if the selected finger is inside of the circle
        check if the remaining four are evenly spread
        (for example, consider angles from the center of the circle)
        assign some cost (penalty) to this selection of 4 peaks + a rear finger
        (consider, probably weighted:
             circle fitting error,
             if the rear finger is inside,
             variance in the spreading of the front fingers,
             total intensity of 5 peaks)
choose a combination of 4 peaks + a rear peak with the lowest penalty

এটি একটি নিষ্ঠুর শক্তি পদ্ধতির। যদি এন তুলনামূলকভাবে ছোট হয় তবে আমি মনে করি এটি করণীয়। এন = 12 এর জন্য রয়েছে সি_12 ^ 5 = 792 সংমিশ্রণ, পিছনের আঙুলটি নির্বাচন করার 5 বার উপায়, সুতরাং প্রতিটি পাটির জন্য 3960 কেস মূল্যায়ন করার জন্য।


আপনার ফলাফলের তালিকা দিয়ে তাকে পাঞ্জা নিজেই ফিল্টার করে ফেলতে হবে ... চারটি শীর্ষস্থানীয় ফলাফল বাছাইয়ের ফলে সর্বাধিক মান 6.8 সহ একটি 2x2 বর্গক্ষেত্র নির্মাণের চারটি সম্ভাবনা থাকবে
জোহানেস চর

2x2 বাক্সগুলি ওভারল্যাপ করতে পারে না, যেহেতু যদি আমি পরিসংখ্যান করতে চাই, আমি একই অঞ্চলটি ব্যবহার করতে চাই না, অঞ্চলগুলি তুলনা করতে চাই :-)
আইভো ফ্লিপস

আমি উত্তর সম্পাদনা করেছি। ফলাফলগুলিতে এখন কোনও ওভারল্যাপিং স্কোয়ার নেই।
সস্তানিন

1
আমি এটি চেষ্টা করে দেখলাম এবং মনে হয় সামনের পাঞ্জার জন্য কাজ করা হয়েছে, তবে পিছনের লোকদের পক্ষে কম। অনুমান করুন আমাদের এমন কিছু চেষ্টা করতে হবে যা জানে কোথায় তা জানে
Ivo ফ্লিপস

1
আমি আমার ধারণাটি ব্যাখ্যা করেছি যে কীভাবে সিউডো কোডে আঙ্গুলগুলি সনাক্ত করা যায়। আপনি যদি এটি পছন্দ করেন তবে আমি কাল সন্ধ্যায় এটি প্রয়োগের চেষ্টা করতে পারি।
সাস্টানিন

34

এটি একটি চিত্র নিবন্ধকরণ সমস্যা । সাধারণ কৌশলটি হ'ল:

  • একটি পরিচিত উদাহরণ, বা ডেটা আগে কিছু ধরণের আছে ।
  • আপনার ডেটা উদাহরণের সাথে ফিট করুন বা উদাহরণটিকে আপনার ডেটাতে ফিট করুন।
  • আপনার ডেটা মোটামুটি প্রথম স্থানে সারিবদ্ধ করা থাকলে এটি সহায়তা করে ।

এখানে একটি রুক্ষ এবং প্রস্তুত পদ্ধতি , "সম্ভবত যে কাজ করতে পারে এমন বোবা জিনিস":

  • আপনার প্রত্যাশার জায়গায় প্রায় পাঁচটি পদাঙ্গুলি স্থানাঙ্ক দিয়ে শুরু করুন।
  • প্রত্যেকটির সাথে পুনরাবৃত্তভাবে পাহাড়ের শীর্ষে উঠুন। যেমন প্রদত্ত বর্তমান অবস্থান, সর্বাধিক প্রতিবেশী পিক্সেল এ সরান, যদি এর মান বর্তমান পিক্সেলের চেয়ে বেশি হয়। আপনার পায়ের আঙুলের স্থানাঙ্কগুলি চলন্ত বন্ধ হয়ে গেলে বন্ধ করুন।

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

সামান্য আরও জটিল ধারণা: (ওজনযুক্ত) কে-মানে ক্লাস্টারিং। এটা যে খারাপ না.

  • পাঁচটি পদাঙ্গুলি স্থানাঙ্ক দিয়ে শুরু করুন তবে এখন এটি "ক্লাস্টার সেন্টার"।

তারপরে একীকরণ পর্যন্ত পুনরাবৃত্তি করুন:

  • প্রতিটি পিক্সেল নিকটতম ক্লাস্টারে বরাদ্দ করুন (প্রতিটি ক্লাস্টারের জন্য কেবল একটি তালিকা তৈরি করুন)।
  • প্রতিটি ক্লাস্টারের ভর কেন্দ্রের গণনা করুন। প্রতিটি ক্লাস্টারের জন্য, এটি হ'ল: সমষ্টি (তাত্পর্য * তীব্রতা মান) / যোগফল (সমন্বয়)
  • প্রতিটি ক্লাস্টারকে ভরের নতুন কেন্দ্রে সরান।

এই পদ্ধতিটি প্রায় অবশ্যই আরও ভাল ফলাফল দেবে এবং আপনি প্রতিটি ক্লাস্টারের ভর পাবেন যা পায়ের আঙ্গুলগুলি সনাক্ত করতে সহায়তা করতে পারে।

(আবারও, আপনি সামনে ক্লাস্টারের সংখ্যা নির্দিষ্ট করেছেন cl ক্লাস্টারিংয়ের সাথে আপনাকে ঘনত্বকে এক উপায় বা অন্যভাবে নির্দিষ্ট করতে হবে: হয় এই ক্ষেত্রে উপযুক্ত ক্লাস্টারের সংখ্যা চয়ন করুন, বা একটি ক্লাস্টার ব্যাসার্ধ চয়ন করুন এবং দেখুন আপনি কতগুলি শেষ করেছেন সাথে আপ। পরবর্তীকালের উদাহরণটির অর্থ হ'ল শিফট )

বাস্তবায়ন বিশদ বা অন্যান্য নির্দিষ্টকরণের অভাব সম্পর্কে দুঃখিত। আমি এটি কোড করব তবে আমার একটি সময়সীমা আছে। যদি পরের সপ্তাহের মধ্যে অন্য কোনও কাজ না করে তবে আমাকে জানান এবং আমি একটি শট দেব।


1
সমস্যাটি হ'ল পাঞ্জাগুলি তাদের দৃষ্টিভঙ্গি পরিবর্তন করে এবং শুরু করার জন্য আমার কাছে কোনও সঠিক পাটির কোনও ক্রমাঙ্কন / বেসলাইন নেই। এছাড়াও আমি আশঙ্কা করি যে অনেকগুলি চিত্রের স্বীকৃতি অ্যালগরিদমগুলি আমার লীগ থেকে কিছুটা দূরে।
আইভো ফ্লিপস

"রুক্ষ এবং প্রস্তুত" পদ্ধতিটি বেশ সহজ - সম্ভবত আমি ধারণাটি ভাল করিনি। আমি উদাহরণস্বরূপ কিছু সিউডোকোড রাখব।
কেকমাস্টার

আমার অনুভূতি আছে যে আপনার পরামর্শটি
হ'ল পাঞ্জাবীদের

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

1
আমি কেবল একটি সহজ ওয়ার্ডপ্রেস ব্লগে আমার ডেটা প্রসেসিং লিখে রাখার কথা ভাবছিলাম, অন্যের পক্ষে সহজভাবে ব্যবহার করার জন্য এবং আমাকে যেভাবেই লিখতে হবে। আমি আপনার সমস্ত পরামর্শ পছন্দ করি তবে আমি আশঙ্কা করি যে আমার কোনও সময়সীমা ছাড়াই অপেক্ষা করতে হবে ;-)
আইভো ফ্লিপস

18

আপনার ডেটা সেটটি বিশ্লেষণ করতে অবিরাম হোমোলোজি ব্যবহার করে আমি নিম্নলিখিত ফলাফল পেয়েছি (বিস্তৃত করতে ক্লিক করুন):

ফলাফল

এটি এই এসও উত্তরে বর্ণিত পিক সনাক্তকরণ পদ্ধতির 2D- সংস্করণ । উপরের চিত্রটি কেবল অধ্যবসায় অনুসারে সাজানো 0-মাত্রিক স্থায়ী হোমোলোজি ক্লাস দেখায়।

আমি scipy.misc.imresize () ব্যবহার করে 2 এর একটি ফ্যাক্টর দ্বারা মূল ডেটাসেট আপস্কেল করেছি। তবে, নোট করুন যে আমি চারটি পাটিকে একটি ডেটাसेट হিসাবে বিবেচনা করেছি; এটিকে চার ভাগে ভাগ করা সমস্যাটিকে আরও সহজ করে দেবে।

পদ্ধতি। এটি বেশ সহজ পিছনে ধারণা: প্রতিটি পিক্সেল এর স্তর নির্ধারণ করে ফাংশন ফাংশন গ্রাফ বিবেচনা করুন। দেখে মনে হচ্ছে:

3 ডি ফাংশন গ্রাফ

এখন 255 উচ্চতায় এমন একটি জলের স্তর বিবেচনা করুন যা ধারাবাহিকভাবে নিম্ন স্তরে নেমে আসে। স্থানীয় ম্যাক্সিমা দ্বীপে পপ আপ (জন্ম)। স্যাডল পয়েন্টে দুটি দ্বীপ একত্রিত হয়; আমরা নিম্ন দ্বীপটিকে উচ্চ দ্বীপে (মৃত্যু) একীভূত হিসাবে বিবেচনা করি। তথাকথিত অধ্যবসায় ডায়াগ্রাম (০-ত্রিমাত্রিক হোমোলজি শ্রেণীর, আমাদের দ্বীপপুঞ্জ) সমস্ত দ্বীপের জন্ম-মূল্যকে চিত্রিত করে:

দৃistence়তা চিত্র

অধ্যবসায় একটি দ্বীপ তত্কালীন birth- ও মৃত্যু-স্তরের মধ্যে পার্থক্য; ধূসর প্রধান তির্যক একটি বিন্দুর উল্লম্ব দূরত্ব। চিত্রটি অধ্যবসায় হ্রাস করে দ্বীপপুঞ্জকে লেবেল করে।

প্রথম ছবিটিতে দ্বীপপুঞ্জের জন্মের অবস্থানগুলি দেখানো হয়েছে। এই পদ্ধতিটি কেবল স্থানীয় ম্যাক্সিমাকেই দেয় না তবে উপরোক্ত অধ্যবসায়ের দ্বারা তাদের "তাত্পর্য" পরিমাণেও প্রমান করে। এর পরে খুব কম অধ্যবসায়ের সাথে সমস্ত দ্বীপগুলি ফিল্টার করে দেওয়া হবে। তবে, আপনার উদাহরণে প্রতিটি দ্বীপ (অর্থাত্ প্রতি স্থানীয় সর্বাধিক) আপনার সন্ধানের শীর্ষ।

পাইথন কোডটি এখানে পাওয়া যাবে


16

পদার্থবিজ্ঞানীরা এই সমস্যাটি কিছু গভীরতার সাথে অধ্যয়ন করেছেন। আরওটিতে একটি ভাল বাস্তবায়ন রয়েছে । এ TSpectrum শ্রেণীর (বিশেষ করে TSpectrum2 আপনার ক্ষেত্রে জন্য) এবং তাদের জন্যে ডকুমেন্টেশন।

তথ্যসূত্র:

  1. এম.মোরহাক এবং অন্যান্য .: বহুমাত্রিক কাকতালীয় গামা-রে বর্ণালী জন্য পটভূমি নির্মূল পদ্ধতি। পদার্থবিজ্ঞান গবেষণা এ পারমাণবিক সরঞ্জাম এবং পদ্ধতি A 401 (1997) 113-132।
  2. এম। মোরহাক এট আল: দক্ষ এক- এবং দ্বি-মাত্রিক গোল্ড ডিকনভোলিউশন এবং গামা-রে স্পেকট্রা পচে যাওয়ার জন্য এটির প্রয়োগ। পদার্থবিজ্ঞান গবেষণা এ পারমাণবিক সরঞ্জাম এবং পদ্ধতি A 401 (1997) 385-408।
  3. এম.মোরহাক এট আল: বহুমাত্রিক কাকতালীয় গামা-রে বর্ণালীতে শৃঙ্গগুলির সনাক্তকরণ। গবেষণা পদার্থবিদ্যায় পারমাণবিক সরঞ্জাম এবং পদ্ধতি A 443 (2000), 108-125।

... এবং যাদের নিমের সাবস্ক্রিপশন অ্যাক্সেস নেই তাদের জন্য:


নিবন্ধটি এক নজরে দেখার জন্য মনে হচ্ছে যে আমি এখানে যা চেষ্টা করছি তার মতো একই ডেটা প্রসেসিংয়ের বর্ণনা দেওয়া হচ্ছে, তবে আমি আশঙ্কা করি এটি আমার প্রোগ্রামিং দক্ষতাকে ছাড়িয়ে গেছে :(
আইভো ফ্লিপস

@ আইভো: আমি নিজেই এটি প্রয়োগ করার চেষ্টা করি নি। আমি কেবল মূল ব্যবহার করি। অজগর বাইন্ডিং রয়েছে, কোনওটিই কম নয়, তবে সচেতন থাকুন যে রুট একটি ভারী ভারী প্যাকেজ।
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

@ আইভো ফ্লিপস: আমি ডেমকির সাথে একমত অন্যান্য উত্তরগুলিতে আপনার কাছে প্রচুর প্রতিশ্রুতিবদ্ধ শীর্ষস্থান রয়েছে। যদি সেগুলি সমস্ত ব্যর্থ হয় এবং আপনি কিছুটা সময় বিনিয়োগের মতো অনুভব করেন, আপনি রুটটি আবিষ্কার করতে পারেন এবং এটি (সম্ভবত) আপনার যা প্রয়োজন তা করবে। পাইথন বাইন্ডিংয়ের (যেটি প্রাকৃতিক সি ++ এর চেয়ে বেশি নয়) এর মাধ্যমে রুট শিখার চেষ্টা করেছে এমন কাউকে আমি কখনও জানি না, তাই আমি আপনার ভাগ্য কামনা করি।
পদার্থবিজ্ঞান

13

এখানে একটি ধারণা দেওয়া হয়েছে: আপনি চিত্রটির (বিযুক্ত) ল্যাপ্লেসিয়ান গণনা করুন। আমি ম্যাক্সিমায় এটিকে (নেতিবাচক এবং) বড় হতে আশা করব, এমনভাবে যা মূল চিত্রগুলির চেয়ে বেশি নাটকীয়। সুতরাং, ম্যাক্সিমা খুঁজে পাওয়া সহজ হতে পারে।

এখানে আরও একটি ধারণা দেওয়া হয়েছে: যদি আপনি উচ্চ-চাপের দাগগুলির বৈশিষ্ট্যযুক্ত আকারটি জানেন তবে আপনি প্রথমে একই চিত্রের গাউসিয়ান দিয়ে নিজের চিত্রটি মসৃণ করতে পারেন। এটি আপনাকে প্রক্রিয়া করার জন্য আরও সহজ চিত্র দেয়।


11

আমার মাথার উপরের দিক থেকে কেবল কয়েকটা ধারণা ideas

  • স্ক্যানের গ্রেডিয়েন্ট (ডেরাইভেটিভ) নিন, দেখুন এটি মিথ্যা কলগুলি দূর করে কিনা
  • সর্বাধিক স্থানীয় ম্যাক্সিমা নিন

আপনি ওপেনসিভিতেও নজর রাখতে চাইতে পারেন , এটি মোটামুটি শালীন পাইথন এপিআই পেয়েছে এবং আপনাকে দরকারী মনে হতে পারে এমন কিছু ফাংশন থাকতে পারে।


গ্রেডিয়েন্টের সাথে, আপনার অর্থ হ'ল আমার theালুগুলির খাড়া হওয়া গণনা করা উচিত, এটি একবারে একটি নির্দিষ্ট মানের উপরে উঠলে আমি জানি 'শিখর' আছে? আমি এটি চেষ্টা করেছিলাম, তবে কয়েকটি অঙ্গুলের অন্যদের তুলনায় (8 এন / সেমি) খুব কম শিখর (1.2 এন / সেমি) থাকে have সুতরাং আমি কীভাবে খুব কম গ্রেডিয়েন্ট দিয়ে পিকগুলি পরিচালনা করব?
আইভো ফ্লিপস

2
অতীতে আমার জন্য কী কাজ করা হয়েছে যদি আমি গ্রেডিয়েন্টটি সরাসরি ব্যবহার না করতে পারি তবে গ্রেডিয়েন্ট এবং ম্যাক্সিমার দিকে নজর দেওয়া ছিল, যেমন গ্রেডিয়েন্টটি যদি স্থানীয় এক্সট্রামা হয় এবং আমি স্থানীয় ম্যাক্সিমায় থাকি তবে আমি এর এক পর্যায়ে আছি স্বার্থ.
ক্রিসি

11

আমি নিশ্চিত যে এখনই আপনার পক্ষে যথেষ্ট পরিমাণে পদক্ষেপ আছে তবে আমি সাহায্য করতে পারি না তবে কে-ই মানে ক্লাস্টারিং পদ্ধতিটি ব্যবহার করার পরামর্শ দিচ্ছি। কে-অর্থ হ'ল একটি নিরীক্ষণযোগ্য ক্লাস্টারিং অ্যালগরিদম যা আপনাকে ডেটা নেবে (যে পরিমাণে কোনও সংখ্যায় - আমি এটি 3 ডি তে করতে পারি) এবং এটি কে আলাদা আলাদা সীমানা সহ গুচ্ছগুলিতে সাজিয়ে রাখি। এটি এখানে দুর্দান্ত কারণ আপনি জানেন যে এই ক্যানাইনগুলির (কতগুলি) পায়ের আঙ্গুল রয়েছে exactly

অতিরিক্তভাবে, এটি স্কিপিতে বাস্তবায়িত হয়েছে যা সত্যই সুন্দর ( http://docs.scipy.org/doc/scipy/references/cluster.vq.html )।

3D ক্লাস্টারগুলির স্থানিকভাবে সমাধান করতে এটি কী করতে পারে তার একটি উদাহরণ এখানে রয়েছে: এখানে চিত্র বর্ণনা লিখুন

আপনি যা করতে চান তা কিছুটা আলাদা (2 ডি এবং এতে চাপের মানগুলি অন্তর্ভুক্ত) তবে আমি এখনও মনে করি আপনি এটি একটি শট দিতে পারেন।


10

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

আমি মনে করি একটি ভাল পদ্ধতি স্কেল এবং আবর্তন আক্রমণকারী হবে এবং আমার পরবর্তী পদক্ষেপটি হবে গাউসিয়ানদের মিশ্রণগুলি অনুসন্ধান করা। (প্রতিটি পা প্যাড একটি গাউসের কেন্দ্রস্থল)।

    <html>
<head>
    <script type="text/javascript" src="http://vis.stanford.edu/protovis/protovis-r3.2.js"></script> 
    <script type="text/javascript">
    var heatmap = [[[0,0,0,0,0,0,0,4,4,0,0,0,0],
[0,0,0,0,0,7,14,22,18,7,0,0,0],
[0,0,0,0,11,40,65,43,18,7,0,0,0],
[0,0,0,0,14,61,72,32,7,4,11,14,4],
[0,7,14,11,7,22,25,11,4,14,65,72,14],
[4,29,79,54,14,7,4,11,18,29,79,83,18],
[0,18,54,32,18,43,36,29,61,76,25,18,4],
[0,4,7,7,25,90,79,36,79,90,22,0,0],
[0,0,0,0,11,47,40,14,29,36,7,0,0],
[0,0,0,0,4,7,7,4,4,4,0,0,0]
],[
[0,0,0,4,4,0,0,0,0,0,0,0,0],
[0,0,11,18,18,7,0,0,0,0,0,0,0],
[0,4,29,47,29,7,0,4,4,0,0,0,0],
[0,0,11,29,29,7,7,22,25,7,0,0,0],
[0,0,0,4,4,4,14,61,83,22,0,0,0],
[4,7,4,4,4,4,14,32,25,7,0,0,0],
[4,11,7,14,25,25,47,79,32,4,0,0,0],
[0,4,4,22,58,40,29,86,36,4,0,0,0],
[0,0,0,7,18,14,7,18,7,0,0,0,0],
[0,0,0,0,4,4,0,0,0,0,0,0,0],
],[
[0,0,0,4,11,11,7,4,0,0,0,0,0],
[0,0,0,4,22,36,32,22,11,4,0,0,0],
[4,11,7,4,11,29,54,50,22,4,0,0,0],
[11,58,43,11,4,11,25,22,11,11,18,7,0],
[11,50,43,18,11,4,4,7,18,61,86,29,4],
[0,11,18,54,58,25,32,50,32,47,54,14,0],
[0,0,14,72,76,40,86,101,32,11,7,4,0],
[0,0,4,22,22,18,47,65,18,0,0,0,0],
[0,0,0,0,4,4,7,11,4,0,0,0,0],
],[
[0,0,0,0,4,4,4,0,0,0,0,0,0],
[0,0,0,4,14,14,18,7,0,0,0,0,0],
[0,0,0,4,14,40,54,22,4,0,0,0,0],
[0,7,11,4,11,32,36,11,0,0,0,0,0],
[4,29,36,11,4,7,7,4,4,0,0,0,0],
[4,25,32,18,7,4,4,4,14,7,0,0,0],
[0,7,36,58,29,14,22,14,18,11,0,0,0],
[0,11,50,68,32,40,61,18,4,4,0,0,0],
[0,4,11,18,18,43,32,7,0,0,0,0,0],
[0,0,0,0,4,7,4,0,0,0,0,0,0],
],[
[0,0,0,0,0,0,4,7,4,0,0,0,0],
[0,0,0,0,4,18,25,32,25,7,0,0,0],
[0,0,0,4,18,65,68,29,11,0,0,0,0],
[0,4,4,4,18,65,54,18,4,7,14,11,0],
[4,22,36,14,4,14,11,7,7,29,79,47,7],
[7,54,76,36,18,14,11,36,40,32,72,36,4],
[4,11,18,18,61,79,36,54,97,40,14,7,0],
[0,0,0,11,58,101,40,47,108,50,7,0,0],
[0,0,0,4,11,25,7,11,22,11,0,0,0],
[0,0,0,0,0,4,0,0,0,0,0,0,0],
],[
[0,0,4,7,4,0,0,0,0,0,0,0,0],
[0,0,11,22,14,4,0,4,0,0,0,0,0],
[0,0,7,18,14,4,4,14,18,4,0,0,0],
[0,4,0,4,4,0,4,32,54,18,0,0,0],
[4,11,7,4,7,7,18,29,22,4,0,0,0],
[7,18,7,22,40,25,50,76,25,4,0,0,0],
[0,4,4,22,61,32,25,54,18,0,0,0,0],
[0,0,0,4,11,7,4,11,4,0,0,0,0],
],[
[0,0,0,0,7,14,11,4,0,0,0,0,0],
[0,0,0,4,18,43,50,32,14,4,0,0,0],
[0,4,11,4,7,29,61,65,43,11,0,0,0],
[4,18,54,25,7,11,32,40,25,7,11,4,0],
[4,36,86,40,11,7,7,7,7,25,58,25,4],
[0,7,18,25,65,40,18,25,22,22,47,18,0],
[0,0,4,32,79,47,43,86,54,11,7,4,0],
[0,0,0,14,32,14,25,61,40,7,0,0,0],
[0,0,0,0,4,4,4,11,7,0,0,0,0],
],[
[0,0,0,0,4,7,11,4,0,0,0,0,0],
[0,4,4,0,4,11,18,11,0,0,0,0,0],
[4,11,11,4,0,4,4,4,0,0,0,0,0],
[4,18,14,7,4,0,0,4,7,7,0,0,0],
[0,7,18,29,14,11,11,7,18,18,4,0,0],
[0,11,43,50,29,43,40,11,4,4,0,0,0],
[0,4,18,25,22,54,40,7,0,0,0,0,0],
[0,0,4,4,4,11,7,0,0,0,0,0,0],
],[
[0,0,0,0,0,7,7,7,7,0,0,0,0],
[0,0,0,0,7,32,32,18,4,0,0,0,0],
[0,0,0,0,11,54,40,14,4,4,22,11,0],
[0,7,14,11,4,14,11,4,4,25,94,50,7],
[4,25,65,43,11,7,4,7,22,25,54,36,7],
[0,7,25,22,29,58,32,25,72,61,14,7,0],
[0,0,4,4,40,115,68,29,83,72,11,0,0],
[0,0,0,0,11,29,18,7,18,14,4,0,0],
[0,0,0,0,0,4,0,0,0,0,0,0,0],
]
];
</script>
</head>
<body>
    <script type="text/javascript+protovis">    
    for (var a=0; a < heatmap.length; a++) {
    var w = heatmap[a][0].length,
    h = heatmap[a].length;
var vis = new pv.Panel()
    .width(w * 6)
    .height(h * 6)
    .strokeStyle("#aaa")
    .lineWidth(4)
    .antialias(true);
vis.add(pv.Image)
    .imageWidth(w)
    .imageHeight(h)
    .image(pv.Scale.linear()
        .domain(0, 99, 100)
        .range("#000", "#fff", '#ff0a0a')
        .by(function(i, j) heatmap[a][j][i]));
vis.render();
}
</script>
  </body>
</html>

বিকল্প পাঠ


1
আমি বিবেচনা করি এটি ধারণার প্রমাণ যে প্রস্তাবিত গাউসিয়ান কৌশলগুলি কাজ করতে পারে, এখন যদি কেউ পাইথন দিয়ে এটি প্রমাণ করতে পারে ;-)
আইভো ফ্লিপস

8

পদার্থবিজ্ঞানের সমাধান:
তাদের পজিশনের দ্বারা চিহ্নিত পাঁচ পা-চিহ্নিতকারীকে সংজ্ঞা দিন X_iএবং এলোমেলো অবস্থানের সাথে দীক্ষা দিন। পাঞ্জারদের অবস্থানগুলিতে চিহ্নিতকারীদের চিহ্নিতকরণের জন্য কিছু পুরষ্কারের সংমিশ্রণে কিছু শক্তি ফাংশন সংজ্ঞায়িত করে মার্কারের ওভারল্যাপের জন্য কিছু শাস্তি; চল বলি:

E(X_i;S)=-Sum_i(S(X_i))+alfa*Sum_ij (|X_i-Xj|<=2*sqrt(2)?1:0)

( S(X_i)চারপাশে 2x2 বর্গক্ষেত্রের গড় শক্তি X_i, alfaপরীক্ষামূলকভাবে শীর্ষে ফেলা হবে এটি একটি প্যারামিটার)

এখন কিছু মেট্রোপলিস-হেস্টিংস যাদু করার সময়:
1. র্যান্ডম মার্কার নির্বাচন করুন এবং এলোমেলোভাবে এক পিক্সেল দ্বারা এলোমেলো করুন।
2. ডিই গণনা করুন, এই পদক্ষেপের ফলে শক্তির পার্থক্য রয়েছে।
3. 0-1 থেকে অভিন্ন র্যান্ডম নম্বর পান এবং এটিকে কল করুন।
4. যদি dE<0বা exp(-beta*dE)>r, সরানোটি গ্রহণ করুন এবং 1 এ যান; যদি তা না হয় তবে সরানোটি পূর্বাবস্থায় ফিরে যান এবং ১
এ যান the বিটা ট্রেড অফকে অনুকূল করতে স্ক্যানিং নিয়ন্ত্রণ করে, তাই এটি পরীক্ষামূলকভাবেও অনুকূলিত হওয়া উচিত; সিমুলেশন (সিমুলেটেড অ্যানিলিং) এর সাথে এটি ক্রমাগত বাড়ানো যেতে পারে।


এটি কীভাবে আমার উদাহরণটিতে কাজ করবে তা দেখানোর জন্য যত্নশীল? যেহেতু আমি সত্যিই উচ্চ স্তরের গণিতে নেই, তাই ইতিমধ্যে আপনার প্রস্তাবিত সূত্রটি বের করতে আমার বেশ কষ্ট হয়েছে :(
আইভো ফ্লিপস

1
এটি উচ্চ বিদ্যালয়ের গণিত, সম্ভবত আমার স্বরলিপিটি কেবল আবদ্ধ। আমার এটি যাচাই করার পরিকল্পনা রয়েছে, তাই থাকুন।
এমবিকিউ

4
আমি কণা পদার্থবিদ। দীর্ঘদিন ধরে আমাদের নিয়মানুবর্তীতে যাওয়া সফটওয়্যার সরঞ্জামটিকে পিএডাব্লু বলা হত এবং এটির "গ্রাহক" নামক গ্রাফের সাথে সম্পর্কিত একটি সত্ত্বা ছিল। আপনি কল্পনা করতে পারেন যে আমি এই উত্তরটি প্রায়
দু'বারের

6

বৃহত্তর টেলিস্কোপের জন্য অনুরূপ কিছু করার সময় আমি ব্যবহার করেছি এমন অন্য পদ্ধতি:

1) সর্বাধিক পিক্সেল জন্য অনুসন্ধান করুন। এটি একবার হয়ে গেলে, 2x2 (সম্ভবত 2x2 যোগফলকে সর্বাধিক করে তোলার জন্য) সেরা ফিটের জন্য এটির সন্ধান করুন বা সর্বোচ্চ পিক্সেলকে কেন্দ্র করে 4x4 বলার উপ অঞ্চলে 2 ডি গাউসিয়ান ফিট করুন।

তারপরে শিখর কেন্দ্রের চারপাশে শূন্যের (বা সম্ভবত 3x3) পাওয়া গিয়েছে এমন 2x2 পিক্সেল সেট করুন

1 এ ফিরে যান) এবং সর্বোচ্চ শিখর একটি শব্দদ্বার প্রান্তের নীচে না আসা পর্যন্ত পুনরাবৃত্তি করুন বা আপনার প্রয়োজনীয় সমস্ত আঙ্গুলগুলি রয়েছে


এমন একটি কোড উদাহরণ ভাগ করে নেওয়ার জন্য যত্নশীল? আপনি যা করতে চাইছেন তা আমি অনুসরণ করতে পারি, তবে কীভাবে এটি কোড করা যায় তার কোনও ধারণা নেই
আইভো ফ্লিপস

আমি আসলে মতলবের সাথে কাজ করে এসেছি, তাই হ্যাঁ এটি ইতিমধ্যে সহায়তা করবে। তবে আপনি যদি সত্যিই বিদেশী ফাংশন ব্যবহার করেন তবে পাইথনের সাথে এটির প্রতিলিপি করা আমার পক্ষে কঠিন হতে পারে
আইভো ফ্লিপস

6

আপনি যদি কিছু প্রশিক্ষণ ডেটা তৈরি করতে সক্ষম হন তবে নিউরাল নেটওয়ার্কগুলি দিয়ে চেষ্টা করার পক্ষে এটি সম্ভবত মূল্যবান ... তবে এটি হাত দ্বারা টীকাযুক্ত অনেকগুলি নমুনার প্রয়োজন।


সমস্যাটি যদি মূল্যহীন হয় তবে আমি বড় আকারের নমুনাটি হাতে করে মন্তব্য করতে কিছু মনে করব না। আমার সমস্যাটি হবে: আমি কীভাবে এটি বাস্তবায়ন করব, যেহেতু আমি প্রোগ্রামিং নিউরাল নেটওয়ার্কগুলি সম্পর্কে কিছুই জানি না
আইভো ফ্লিপস

6

মোটামুটি রূপরেখা ...

আপনি প্রতিটি পাঞ্জা অঞ্চল বিচ্ছিন্ন করার জন্য সম্ভবত কোনও সংযুক্ত উপাদানগুলির অ্যালগরিদম ব্যবহার করতে চান। উইকির এখানে একটি সুনির্দিষ্ট বর্ণনা রয়েছে (কিছু কোড সহ): http://en.wikedia.org/wiki/Cnnected_Comp घटक_ Labeling

4 বা 8 সংযোগ ব্যবহার করবেন কিনা সে সম্পর্কে আপনাকে সিদ্ধান্ত নিতে হবে। ব্যক্তিগতভাবে, বেশিরভাগ সমস্যার জন্য আমি 6-সংযুক্তি পছন্দ করি। যাইহোক, একবার আপনি প্রতিটি "পা প্রিন্ট" সংযুক্ত অঞ্চল হিসাবে আলাদা করে ফেললে অঞ্চলটির মধ্য দিয়ে পুনরাবৃত্তি হওয়া এবং ম্যাক্সিমার সন্ধান করা যথেষ্ট সহজ হওয়া উচিত। আপনি যখন ম্যাক্সিমাটি পেয়ে গেছেন, আপনি প্রদত্ত "পায়ের আঙ্গুল" হিসাবে চিহ্নিত করার জন্য পূর্বনির্ধারিত প্রান্তিক স্থানে পৌঁছানো পর্যন্ত আপনি পুনরাবৃত্তভাবে অঞ্চলটি বড় করতে পারেন।

এখানে একটি সূক্ষ্ম সমস্যা হ'ল কম্পিউটারের দৃষ্টি কৌশলগুলি ডান / বাম / সামনের / পিছনের পা হিসাবে চিহ্নিত করার সাথে সাথে আপনি পৃথক পায়ের আঙ্গুলের দিকে তাকাতে শুরু করার সাথে সাথে আপনাকে ঘূর্ণন, স্কিউ এবং অনুবাদগুলি অ্যাকাউন্টে নেওয়া শুরু করতে হবে। এটি তথাকথিত "মুহুর্তগুলি" বিশ্লেষণের মাধ্যমে সম্পন্ন হয়। দৃষ্টি অ্যাপ্লিকেশনগুলিতে বিবেচনা করার জন্য কয়েকটি আলাদা মুহুর্ত রয়েছে:

কেন্দ্রীয় মুহূর্তসমূহ: অনুবাদ অদলীয় স্বাভাবিক মুহুর্তগুলি: স্কেলিং এবং অনুবাদ আক্রমণকারী হু মুহুর্তগুলি: অনুবাদ, স্কেল এবং আবর্তন আক্রমণকারী

মুহুর্তগুলি সম্পর্কে আরও তথ্য উইকিতে "চিত্রের মুহুর্তগুলি" অনুসন্ধান করে পাওয়া যাবে।



4

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


4

আকর্ষণীয় সমস্যা। সমাধানটি আমি চেষ্টা করব নিম্নলিখিতটি।

  1. একটি নিম্ন পাস ফিল্টার প্রয়োগ করুন, যেমন 2 ডি গাউসিয়ান মাস্কের সাথে সমাবর্তন। এটি আপনাকে একটি মান (সম্ভবত, তবে অবিচ্ছিন্নভাবে ভাসমান পয়েন্ট নয়) দেবে।

  2. প্রতিটি পা প্যাড (বা পদাঙ্গুলি) এর আনুমানিক ব্যাসার্ধ ব্যবহার করে একটি 2 ডি অ-সর্বাধিক দমন সম্পাদন করুন।

একসাথে থাকা একাধিক প্রার্থী না থাকলে এটি আপনাকে সর্বোচ্চ পজিশন দেয়। কেবল স্পষ্ট করে বলতে গেলে, পদক্ষেপ 1-এ মাস্কের ব্যাসার্ধটি 2 ধাপে ব্যবহৃত ব্যাসার্ধের মতো হওয়া উচিত This

প্রস্তাবিত কয়েকটি সমাধান (মানে শিফট, নিউরাল নেট এবং আরও অনেকগুলি) সম্ভবত কিছুটা কাজ করবে তবে মাত্রাতিরিক্ত জটিল এবং সম্ভবত আদর্শ নয়।


কনভলিউশন ম্যাট্রিক্স এবং গাউসিয়ান ফিল্টারগুলির সাথে আমার 0 অভিজ্ঞতা আছে, তাই আপনি কী এটি দেখিয়ে দিতে চান যে এটি আমার উদাহরণে কীভাবে কাজ করবে?
আইভো ফ্লিপস

3

ভাল, এখানে কিছু সহজ এবং মারাত্মকভাবে কার্যকর কোড নয়, তবে একটি ডেটা সেট আকারের জন্য এটি ঠিক আছে।

import numpy as np
grid = np.array([[0,0,0,0,0,0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0.4,0.4,0.4,0,0,0],
              [0,0,0,0,0.4,1.4,1.4,1.8,0.7,0,0,0,0,0],
              [0,0,0,0,0.4,1.4,4,5.4,2.2,0.4,0,0,0,0],
              [0,0,0.7,1.1,0.4,1.1,3.2,3.6,1.1,0,0,0,0,0],
              [0,0.4,2.9,3.6,1.1,0.4,0.7,0.7,0.4,0.4,0,0,0,0],
              [0,0.4,2.5,3.2,1.8,0.7,0.4,0.4,0.4,1.4,0.7,0,0,0],
              [0,0,0.7,3.6,5.8,2.9,1.4,2.2,1.4,1.8,1.1,0,0,0],
              [0,0,1.1,5,6.8,3.2,4,6.1,1.8,0.4,0.4,0,0,0],
              [0,0,0.4,1.1,1.8,1.8,4.3,3.2,0.7,0,0,0,0,0],
              [0,0,0,0,0,0.4,0.7,0.4,0,0,0,0,0,0]])

arr = []
for i in xrange(grid.shape[0] - 1):
    for j in xrange(grid.shape[1] - 1):
        tot = grid[i][j] + grid[i+1][j] + grid[i][j+1] + grid[i+1][j+1]
        arr.append([(i,j),tot])

best = []

arr.sort(key = lambda x: x[1])

for i in xrange(5):
    best.append(arr.pop())
    badpos = set([(best[-1][0][0]+x,best[-1][0][1]+y)
                  for x in [-1,0,1] for y in [-1,0,1] if x != 0 or y != 0])
    for j in xrange(len(arr)-1,-1,-1):
        if arr[j][0] in badpos:
            arr.pop(j)


for item in best:
    print grid[item[0][0]:item[0][0]+2,item[0][1]:item[0][1]+2]

আমি মূলত কেবল উপরের বামের অবস্থান এবং প্রতিটি 2x2 বর্গের যোগফলের সাথে একটি অ্যারে তৈরি করি এবং এটি যোগফল অনুসারে বাছাই করি। এরপরে আমি 2x2 বর্গক্ষেত্রটি বিতর্ক থেকে সর্বাধিক যোগফলের সাথে নিয়েছি, bestঅ্যারেতে রেখেছি এবং অন্য 2x2 স্কোয়ারগুলি সরিয়েছি যা এই সরিয়ে নেওয়া 2x2 বর্গের যে কোনও অংশ ব্যবহার করেছে।

এটি শেষ পাঞ্জা (আপনার প্রথম ছবিতে ডানদিকে সবচেয়ে ছোট যোগফল সহ) ব্যতীত সূক্ষ্মভাবে কাজ করে বলে মনে হয়, আরও দুটি বৃহত পরিমাণের সাথে আরও 2 টি যোগ্য স্কয়ার রয়েছে (এবং তাদের সমান যোগফল রয়েছে) একে অপরকে). এর মধ্যে একটি এখনও আপনার 2x2 বর্গ থেকে একটি বর্গ নির্বাচন করে তবে অন্যটি বাম দিকে বন্ধ রয়েছে। সৌভাগ্যক্রমে, ভাগ্যক্রমে আমরা দেখতে চাই যে আরও একটি বেছে নেব, তবে আপনি প্রকৃত সময়ের যা চান তা পেতে এটির জন্য কিছু অন্যান্য ধারণা ব্যবহারের প্রয়োজন হতে পারে।


আমি মনে করি আপনার ফলাফলগুলি @ জেক্সটির উত্তরের মত একই। বা কমপক্ষে তাই এটির পরীক্ষাটি আমার কাছ থেকে মনে হয়।
আইভো ফ্লিপস

3

maximaঅজগর সহ চিত্রগুলিতে স্থানীয় সন্ধানের জন্য একটি দুর্দান্ত বিকল্প রয়েছে বলে আপনাকে কেবল বলুনই:

from skimage.feature import peak_local_max

বা স্কাইমেজের জন্য 0.8.0:

from skimage.feature.peak import peak_local_max

http://scikit-image.org/docs/0.8.0/api/skimage.feature.peak.html


1

সম্ভবত এখানে একটি নির্বোধ দৃষ্টিভঙ্গি যথেষ্ট: আপনার প্লেনে সমস্ত 2x2 বর্গক্ষেত্রের একটি তালিকা তৈরি করুন, তাদের যোগফল দিয়ে তাদের ক্রম করুন (উতরিত ক্রমে)।

প্রথমে আপনার "পাঞ্জা তালিকার" মধ্যে সর্বাধিক মূল্যবান বর্গ নির্বাচন করুন। তারপরে, পুনঃনির্বাচিতভাবে পরবর্তী সেরা স্কোয়ারগুলির মধ্যে 4 বেছে নিন যা পূর্বে পাওয়া স্কোয়ারগুলির সাথে ছেদ না করে।


আমি আসলে সমস্ত 2x2 রাশি দিয়ে একটি তালিকা তৈরি করেছি, কিন্তু যখন আমি তাদের আদেশ দিয়েছিলাম তখন কীভাবে পুনরাবৃত্তির সাথে তাদের তুলনা করব তা সম্পর্কে আমার কোনও ধারণা ছিল না। আমার সমস্যাটি ছিল যখন আমি এটি বাছাই করার সময় স্থানাঙ্কগুলির ট্র্যাক হারিয়েছিলাম track সম্ভবত আমি এগুলি একটি অভিধানে আটকে রাখতে পারি, কী হিসাবে স্থানাঙ্কগুলি রেখেছি।
আইভো ফ্লিপস

হ্যাঁ, কোনও ধরণের অভিধানের প্রয়োজন হবে। আমি ধরে নিয়েছি যে আপনার গ্রিডের প্রতিনিধিত্ব ইতিমধ্যে কিছু প্রকারের অভিধান is
জোহানেস চারারা

আচ্ছা উপরে আপনি যে চিত্রটি দেখছেন তা একটি অদ্ভুত অ্যারে। বাকীটি বর্তমানে বহুমাত্রিক তালিকায় সঞ্চিত রয়েছে। এটি করা বন্ধ করে দেওয়া আরও ভাল হবে, যদিও আমি
অভিধানগুলিতে

1

জ্যোতির্বিজ্ঞান এবং মহাজাগতিক সম্প্রদায় থেকে বেশ কয়েকটি এবং বিস্তৃত সফ্টওয়্যার উপলব্ধ রয়েছে - এটি historতিহাসিকভাবে এবং বর্তমানে উভয় ক্ষেত্রেই গবেষণার একটি উল্লেখযোগ্য ক্ষেত্র।

আপনি যদি কোনও জ্যোতির্বিদ না হন তবে ভয় পাবেন না - কিছু ক্ষেত্রের বাইরে ব্যবহার করা সহজ use উদাহরণস্বরূপ, আপনি জ্যোতির্বিজ্ঞান / Photutils ব্যবহার করতে পারেন:

https://photutils.readthedocs.io/en/stable/detection.html#local-peak-detection

[এখানে তাদের সংক্ষিপ্ত নমুনা কোডটি পুনরাবৃত্তি করতে কিছুটা অভদ্র মনে হচ্ছে]]

কৌশল / প্যাকেজ / লিঙ্কগুলির একটি অপূর্ণ এবং সামান্য পক্ষপাতযুক্ত তালিকা যা আগ্রহী হতে পারে নীচে দেওয়া হল - মন্তব্যে আরও যুক্ত করুন এবং আমি এই উত্তরটি প্রয়োজনীয় হিসাবে আপডেট করব। অবশ্যই নির্ভুলতা বনাম গণনা সংস্থানসমূহের একটি বাণিজ্য রয়েছে। [সত্যি বলতে, এরকম একক উত্তরে কোডের উদাহরণ দেওয়ার মতো অনেকগুলি রয়েছে সুতরাং এই উত্তরটি উড়বে কিনা তা আমি নিশ্চিত নই]]

উত্স এক্সট্রাক্টর https://www.astromat.net/software/sextractor

মাল্টিনেস্ট https://github.com/farhanferoz/ মাল্টিনেস্ট [+ পাইমুল্টিনেস্ট]

ASKAP / EMU উত্স-সন্ধানের চ্যালেঞ্জ: https://arxiv.org/abs/1509.03931

আপনি প্ল্যাঙ্ক এবং / অথবা ডাব্লুএমএপি উত্স-নিষ্কাশন চ্যালেঞ্জগুলিও অনুসন্ধান করতে পারেন।

...


0

আপনি যদি ধাপে ধাপে এগিয়ে যান তবে কী হবে: আপনি প্রথমে বিশ্বব্যাপী সর্বাধিক সন্ধান করুন, আশেপাশের পয়েন্টগুলির মান দেওয়া হলে প্রক্রিয়াটি করুন, তারপরে পাওয়া অঞ্চলটি শূন্যে সেট করুন এবং পরবর্তীটির জন্য পুনরাবৃত্তি করুন।


হুমম যে শূন্যে সেট করা কমপক্ষে এটি আরও কোনও গণনা থেকে সরিয়ে ফেলবে, এটি কার্যকর হবে।
আইভো ফ্লিপস

শূন্যে সেট করার পরিবর্তে, আপনি হাতে বাছাই করা প্যারামিটারগুলি দিয়ে একটি গাউসিয় ফাংশন গণনা করতে পারেন এবং মূল চাপের পাঠ থেকে প্রাপ্ত মানগুলি বিয়োগ করতে পারেন। সুতরাং যদি পদাঙ্গুলি আপনার সেন্সরগুলি টিপছে, তবে সর্বাধিক টিপুনিং পয়েন্টটি সন্ধান করে আপনি সেন্সরগুলিতে সেই পায়ের আঙ্গুলের প্রভাব হ্রাস করতে ব্যবহার করেন, এইভাবে উচ্চ চাপের মান সহ প্রতিবেশী কক্ষগুলি অপসারণ করে। en.wikedia.org/wiki/File:Gauss_2d.png
দানিয়ার

আমার দানিয়ারের নমুনা তথ্যের উপর ভিত্তি করে একটি উদাহরণ দেখানোর জন্য যত্নশীল? যেহেতু আমি এই জাতীয় ডেটা প্রসেসিংয়ের সাথে সত্যই পরিচিত নই
আইভো ফ্লিপস

0

আমি নিশ্চিত না যে এই প্রশ্নের জবাব দিয়েছে, তবে মনে হচ্ছে আপনি কেবল এন সর্বোচ্চ পর্বতগুলির সন্ধান করতে পারেন যার প্রতিবেশী নেই।

এখানে আক্ষেপ মনে রাখবেন এটি রুবিতে রয়েছে তবে ধারণাটি পরিষ্কার হওয়া উচিত।

require 'pp'

NUM_PEAKS = 5
NEIGHBOR_DISTANCE = 1

data = [[1,2,3,4,5],
        [2,6,4,4,6],
        [3,6,7,4,3],
       ]

def tuples(matrix)
  tuples = []
  matrix.each_with_index { |row, ri|
    row.each_with_index { |value, ci|
      tuples << [value, ri, ci]
    }
  }
  tuples
end

def neighbor?(t1, t2, distance = 1)
  [1,2].each { |axis|
    return false if (t1[axis] - t2[axis]).abs > distance
  }
  true
end

# convert the matrix into a sorted list of tuples (value, row, col), highest peaks first
sorted = tuples(data).sort_by { |tuple| tuple.first }.reverse

# the list of peaks that don't have neighbors
non_neighboring_peaks = []

sorted.each { |candidate|
  # always take the highest peak
  if non_neighboring_peaks.empty?
    non_neighboring_peaks << candidate
    puts "took the first peak: #{candidate}"
  else
    # check that this candidate doesn't have any accepted neighbors
    is_ok = true
    non_neighboring_peaks.each { |accepted|
      if neighbor?(candidate, accepted, NEIGHBOR_DISTANCE)
        is_ok = false
        break
      end
    }
    if is_ok
      non_neighboring_peaks << candidate
      puts "took #{candidate}"
    else
      puts "denied #{candidate}"
    end
  end
}

pp non_neighboring_peaks

আমি চেষ্টা করে দেখতে যাচ্ছি এবং আমি এটি পাইথন কোডে রূপান্তর করতে পারি কিনা তা দেখতে যাচ্ছি :-)
আইভো ফ্লিপস

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