Java API JAI

Boa noite. irei me formar daqui a 1 ano e meio no curso de analise e desenvolvimento de sistemas e estava pensando em fazer o meu tcc em java, mas porem não tenho conhecimento da linguagem ainda. Pensei em fazer um sistema de identificação de placas de veiculos que englobará o estudo de reconhecimento de caracteres, processamento de imagem digital e redes neurais artificiais. Como não tenho conhecimento sobre java, gostaria de saber se pelo tempo de faculdade que ainda tenho seria possivel aprender não somente a API JAI mas como também processamento de imagem e redes neurais?

Obrigado desde já.

Depende… quanto tempo você tem livre para estudo?
E o quão fundo você quer ir em cada tecnologia? Para você está ok só usar um RNA, ou você quer implementar uma?

E quais linguagens você já conhece? Há excelentes alternativas para essas tecnologias em C também.

Eu tenho mais ou menos 3 horas livre para estudar. Quanto as tecnologias não sei exatamente o quão fundo terei que ir em cada uma delas pois começei a dar uma olhada neste assunto esta semana e essas tecnologias são desconhecidas por mim ainda, além de que (se nada mudar na grade curricular do curso)terei que aprendê-las estudando sozinho. Por isso é que estou receoso, pelo fato de ter que aprender tantas coisas e não saber se conseguirei dar conta até o fim do curso.
Quanto as linguagens de programação, aprendi C , estou aprendendo PHP na faculdade e no meu estágio estou aprendendo Ruby on Rails. Mas ainda na faculdade iremos aprender JAVA e c#.

Sei que foge do escopo do blog um pouco, mas se voce tiver alguma experiência em reconhecimento de caracteres ou souber de de alguma outra pessoa que fez esse tipo de sistema, por favor gostaria de saber como foi a experiência.

Eu tenho alguma experiência na área sim.

Existem vários desafios no reconhecimento de caracteres de placas de carro, são eles:

  1. Encontrar a placa na foto e segmenta-la;
  2. Segmentar cada caractere da foto;
  3. Identificar o caractere.

Eu já tratei o desafio um através de algorítmos genéticos, e acabei montando uma API para tratar com genéticos no geral:

Se você quer lidar com reconhecimento, sugiro que você monte uma base com placas perfeitamente alinhadas, e fotografadas com uma luminosidade padrão. Ou mesmo com imagens geradas por você. Assim, você elimina a necessidade de lidar com o desafio 1, e concentra-se somente no 3 (e de leve no 2, embora segmentar nessas condições seja muito fácil).

Uma vez segmentadas as letras, existem diversos algoritmos de classificação que podem ser explorados, como o svm, kmm, kmeans, cadeias de markov e, claro, as redes neurais. Dê uma olhada em especial no svm, pois seus bons resultados tem tornado ele um bom algorítmo hoje em dia.

Se você quiser concentrar-se no problema 1, esqueça a parte de identificação dos caracteres da placa (ou baixe uma API de OCR pronta). Concentre-se então somente em localizar a placa na foto. Para isso, você pode utilizar-se de algoritmos genéticos, ou técnicas de segmentação como limiar múltiplo ou técnicas baseadas em polígonos.

Finalmente, há a possiblidade de não implementar nada disso, e baixar algorítmos prontos da internet e tentar combina-los. Assim, você poderia ter as duas etapas do processo, e elaborar apenas comparativos. De todos, acho que esse é o trabalho mais fácil, porém um dos mais braçais. Entretanto, artigos de comparações geralmente são muito populares, e facilmente aceitos em feiras e congressos. Se feito direitinho, pode ser uma ótima experiência.

É importante também escolher com cuidado sua base de testes, seria interessante que você obtivesse em torno de 500 placas, sendo que parte seriam separadas para sua base de treinamento, e parte seria usada na sua base de testes. Não misture as placas da base de teste com as de treinamento. Procure também fazer a classificação manual de todas as placas, para conseguir medir a qualidade dos seus algorítmos.

Considere a possibildade de usar C principalmente por existir a opencv, apis gratuitas para o svm, o pacote boost::math e diversas implementações de redes neurais.

Ok Vinicius. Achei interessante o fato de poder utilizar C no projeto pois eu gosto de trabalhar com essa linguagem. Sei que depende de varios fatores, mas C é a melhor linguagem para trabalhar nesse projeto? Além das caracteristicas que voce citou da linguagem, quais outras fazem dela uma linguagem a ser pensada como uma alternativa para o projeto?

Eu colocaria três fatores importantes:

  1. A opencv: http://opencv.willowgarage.com/wiki/
  2. O svm light: http://svmlight.joachims.org/
  3. O pacote de estatística da boost::math: http://www.boost.org/doc/libs/1_46_1/libs/math/doc/sf_and_dist/html/index.html

A opencv contém centenas de funções úteis para processamento de imagem, todas com altíssima performance: linearização, filtros, morfologia matemática, segmentação e até alguma coisa de classificação. Creio que a opencv seja a principal API para tratamento de vídeo hoje em dia. Também já inclui funções para leitura de dados da webcam, e codecs para dezenas de formatos de vídeo. Tudo isso numa API muito fácil de usar.
O svm é um dos principais classificadores da atualidade, e o pacote svm light já foi amplamente testado.
Finalmente, para demonstrar a precisão dos seus resultados pode ser interessante usar um bocado de estatística. Nesse caso, o pacote da boost vem bem a calhar.

Primeiramente gostaria de te agradecer Vinicius pela paciència em explicar sobre o assunto.
Por tudo que você explicou , vou utilizar a linguagem C no projeto. Dentre aqueles três desafios que voce disse eu optei por começar pelo primeiro (identificar a placa do veículo na imagem). Mas agora surge uma dúvida crucial: Por onde começar? Devo começar a estudar conceitos de processamento de imagem digital? E também gostaria de saber o nivel de complexidade que envolve identificar a placa na imagem (que pelo que percebi enquanto estava pesquisando sobre o assunto existe alguns problemas como ângulo da imagem, luminosidade, condições climáticas)?
OBS: Eu estava pensando em utilizar uma máquina fotográfica para obter as imagems dos veiculos.

Você não tem nenhum orientador em sua faculdade que possa te ajudar?

Comece estudando o opencv.

Veja como você pode ler uma imagem pixel-a-pixel, e estude os filtros disponíveis.