Como usar classify para separar linhas e círculos

Oct 19 2020

Eu gerei linhas e círculos:

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 colocá-los em um classificador

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

o treinamento foi bem sucedido sem erros, mas ao tentar testar o classificador com:

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

Recebo o erro:

ClassifierFunction :: mlbddataev: Os dados sendo avaliados não estão formatados corretamente.

E eu não entendo qual é o problema. Alguém pode me dizer como formatar corretamente os dados?

Respostas

6 VitaliyKaurov Oct 19 2020 at 13:02

É assim que eu faria.

  • Os dados precisam ser Association, não uma lista, quando você rotula por lotes inteiros e não por objetos individuais.
  • Um bom conjunto de treinamento possui dados variáveis, não quase idênticos. Portanto, projete com cuidado Graphicspara que os círculos e as linhas tenham tamanhos e lugares diferentes. Você também pode adicionar ruído (como pontos aleatórios), mas não fiz isso por simplicidade.
  • Experimente conjuntos de treinamento maiores para ver uma melhora na precisão.
  • PerformanceGoal->"Quality" é recomendado para resultados mais precisos.
  • Neste caso funciona bem com Graphics, mas em casos mais complexos que você pode sempre considerar a conversão Graphicspara Imagecom Rasterizee usando Redes Neurais .

Conjunto de treinamento:

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}];

Aqui está um exemplo (os quadros são apenas para enfatizar diversos locais de linhas e círculos dentro do Graphics):

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

Trem:

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

Information[c]

Conjunto de teste:

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}];

Medir o desempenho:

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

cm["ConfusionMatrixPlot"]