Come usare classify per separare linee e cerchi

Oct 19 2020

Ho generato linee e cerchi:

lines = Table[
   Graphics[
    Line[{{RandomInteger[{0, 10}], 
       RandomInteger[{0, 10}]}, {RandomInteger[{0, 10}], 
       RandomInteger[{0, 10}]}}], ImageSize -> 10], {x, 1, 20}];
circles = 
  Table[Graphics[
    Circle[{RandomInteger[{0, 10}], RandomInteger[{0, 10}]}, 
     RandomInteger[{0, 20}]], ImageSize -> 10], {x, 1, 20}];

e inseriscili in un classificatore

c = Classify[{lines -> "lines", circles -> "circles"}]

la formazione ha avuto successo senza errori, ma durante il tentativo di testare il classificatore con:

test = Graphics[Line[{{0, 1}, {0, 2}}], ImageSize -> 10]
c[test]

Ottengo l'errore:

ClassifierFunction :: mlbddataev: i dati valutati non sono formattati correttamente.

E non capisco quale sia il problema. Qualcuno può dirmi come formattare correttamente i dati?

Risposte

6 VitaliyKaurov Oct 19 2020 at 13:02

Questo è il modo in cui lo farei.

  • I dati devono essere Association, non un elenco, quando si etichetta in base a interi batch e non singoli oggetti.
  • Un buon set di allenamento ha dati variabili, non quasi identici. Quindi, progetta attentamente in Graphicsmodo che cerchi e linee siano di dimensioni diverse e in luoghi diversi. Puoi anche aggiungere rumore (come punti casuali), ma non l'ho fatto per semplicità.
  • Sperimenta con set di allenamento più grandi per vedere un miglioramento della precisione.
  • PerformanceGoal->"Quality" è consigliato per risultati più accurati.
  • Questo caso funziona bene con Graphics, ma nei casi più complessi si può sempre prendere in considerazione la conversione Graphicsa Imagecon Rasterizee l'utilizzo di reti neurali .

Set di allenamento:

lines = ParallelTable[Graphics[{Thick,Line[RandomReal[10,{2,2}]]}, 
ImageSize -> 50,PlotRange->{{0,10},{0,10}}], {x, 1, 100}];

circles = ParallelTable[Graphics[{Thick,Circle[RandomReal[{3,7},2], RandomReal[{1,3}]]},
ImageSize -> 50,PlotRange->{{0,10},{0,10}}], {x, 1, 100}];

Ecco un esempio (i fotogrammi servono solo a sottolineare le diverse posizioni di linee e cerchi all'interno di Graphics):

Framed /@ RandomSample[lines~Join~circles, 10]

Treno:

c=Classify[<|"lines"->lines,"circles"->circles|>,PerformanceGoal->"Quality"]

Information[c]

Set di prova:

linesTEST=ParallelTable[Graphics[{Thick,Line[RandomReal[10,{2,2}]]}, 
ImageSize -> 100,PlotRange->{{0,10},{0,10}}], {x, 1, 20}];

circlesTEST = ParallelTable[Graphics[{Thick,Circle[RandomReal[{3,7},2], RandomReal[{1,3}]]},
ImageSize -> 50,PlotRange->{{0,10},{0,10}}], {x, 1, 20}];

Misura le prestazioni:

cm=ClassifierMeasurements[c,<|"lines"->linesTEST,"circles"->circlesTEST|>]

cm["ConfusionMatrixPlot"]