...
 
Commits (13)
......@@ -16,33 +16,75 @@ if [ "$EUID" -ne 0 ]
exit
fi
echo "[PYNOVISAO INSTALLER] Updating apt-get..."
sudo apt-get -qq update
echo "[PYNOVISAO INSTALLER] Installing prerequisites..."
sudo apt-get -qq -y install libfreetype6-dev tk tk-dev python-pip openjdk-8-jre openjdk-8-jdk weka weka-doc python-tk python-matplotlib
source ~/.bashrc
echo "[PYNOVISAO INSTALLER] Upgrading pip..."
sudo pip install --upgrade pip --quiet
# Numpy must be installed before installing javabridge
echo "[PYNOVISAO INSTALLER] Installing numpy..."
sudo pip install numpy==1.14.5 --quiet
echo "[PYNOVISAO INSTALLER] Installing libraries..."
sudo pip install -r requeriments.txt --quiet
printf "${YELLOW} \n======== WARNING ========\n"
printf "The Keras is necessary so that it is possible to use CNN. It is recommended to install the version for GPU processing (if available) but it is also possible to use CPU processing.\n"
printf "To install the GPU version (tricky) follow the steps at: https://www.tensorflow.org/install/install_linux"
printf "${NC}\n"
read -p "Would you like to install keras CPU libraries? [y/n]" -n 1 -r
read -p "Would you like to install the requirements for python3 usage? [y/n]" -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
echo "[PYNOVISAO INSTALLER] Installing keras libraries..."
sudo pip install tensorflow
sudo pip install keras
echo "[PYNOVISAO INSTALLER] Updating apt-get..."
sudo apt-get -qq update
echo "[PYNOVISAO INSTALLER] Installing prerequisites..."
sudo apt-get -qq -y install libfreetype6-dev tk tk-dev python3-pip openjdk-8-jre openjdk-8-jdk weka weka-doc python3-tk
source ~/.bashrc
#echo "[PYNOVISAO INSTALLER] Upgrading pip3..."
#sudo pip3 install --upgrade pip --quiet
# Numpy must be installed before installing javabridge
echo "[PYNOVISAO INSTALLER] Installing numpy..."
sudo pip3 install numpy --quiet
echo "[PYNOVISAO INSTALLER] Installing libraries..."
sudo pip3 install -r requirements_pip3.txt --quiet
printf "${YELLOW} \n======== WARNING ========\n"
printf "The Keras is necessary so that it is possible to use CNN. It is recommended to install the version for GPU processing (if available) but it is also possible to use CPU processing.\n"
printf "To install the GPU version (tricky) follow the steps at: https://www.tensorflow.org/install/install_linux"
printf "${NC}\n"
read -p "Would you like to install keras CPU libraries? [y/n]" -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
echo "[PYNOVISAO INSTALLER] Installing keras libraries..."
sudo pip3 install tensorflow
sudo pip3 install keras
fi
echo
printf "${BLUE}[PYNOVISAO INSTALLER] Installation completed for Python 3!${NC}"
echo
fi
read -p "Would you like to install the requirements for python2 usage? [y/n]" -n 1 -r
echo
printf "${BLUE}[PYNOVISAO INSTALLER] Installation completed!${NC}"
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
echo "[PYNOVISAO INSTALLER] Updating apt-get..."
sudo apt-get -qq update
echo "[PYNOVISAO INSTALLER] Installing prerequisites..."
sudo apt-get -qq -y install libfreetype6-dev tk tk-dev python-pip openjdk-8-jre openjdk-8-jdk weka weka-doc python-tk
source ~/.bashrc
#echo "[PYNOVISAO INSTALLER] Upgrading pip3..."
#sudo pip install --upgrade pip --quiet
# Numpy must be installed before installing javabridge
echo "[PYNOVISAO INSTALLER] Installing numpy..."
sudo pip install numpy --quiet
echo "[PYNOVISAO INSTALLER] Installing libraries..."
sudo pip install -r requeriments.txt --quiet
printf "${YELLOW} \n======== WARNING ========\n"
printf "The Keras is necessary so that it is possible to use CNN. It is recommended to install the version for GPU processing (if available) but it is also possible to use CPU processing.\n"
printf "To install the GPU version (tricky) follow the steps at: https://www.tensorflow.org/install/install_linux"
printf "${NC}\n"
read -p "Would you like to install keras CPU libraries? [y/n]" -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
echo "[PYNOVISAO INSTALLER] Installing keras libraries..."
sudo pip install tensorflow
sudo pip install keras
fi
echo
printf "${BLUE}[PYNOVISAO INSTALLER] Installation completed for Python 2!${NC}"
echo
fi
# Título: Pynovisao
## Autores (ordem alfabética): Adair da Silva Oliveira Junior, Alessandro dos Santos Ferreira, Diego André Sant'Ana(diegoandresantana@gmail.com), Diogo Nunes Gonçalves(dnunesgoncalves@gmail.com), Everton Castelão Tetila(evertontetila@gmail.com), Felipe Silveira(eng.fe.silveira@gmail.com), Gabriel Kirsten Menezes(gabriel.kirsten@hotmail.com), Gilberto Astolfi(gilbertoastolfi@gmail.com), Hemerson Pistori (pistori@ucdb.br), Nícolas Alessandro de Souza Belete(nicolas.belete@gmail.com), Fabio Prestes (fpcrezende@gmail.com), Joao Porto (jvaporto@gmail.com).
## Resumo:
Pacote de Visão Computacional do Inovisão.
## Licença de Uso:
NPOSL-30 https://opensource.org/licenses/NPOSL-3.0 - Livre para uso apenas sem fins lucrativos (E.g.: ensino, pesquisa científica, etc). Entrar em contato com o coordenador do grupo Inovisão, Prof. Hemerson Pistori (pistori@ucdb.br), caso tenha interesse na exploração comercial do software.
## Como citar:
## __Title: Pynovisao__
#### Authors (email):
- Adair da Silva Oliveira Junior
- Alessandro dos Santos Ferreira
- Diego André Sant'Ana (diegoandresantana@gmail.com)
- Diogo Nunes Gonçalves (dnunesgoncalves@gmail.com)
- Everton Castelão Tetila (evertontetila@gmail.com)
- Fabio Prestes Cesar Rezende (fpcrezende@gmail.com)
- Felipe Silveira (eng.fe.silveira@gmail.com)
- Gabriel Kirsten Menezes (gabriel.kirsten@hotmail.com)
- Gilberto Astolfi (gilbertoastolfi@gmail.com)
- Hemerson Pistori (pistori@ucdb.br)
- Joao Vitor de Andrade Porto (jvaporto@gmail.com)
- Nícolas Alessandro de Souza Belete (nicolas.belete@gmail.com)
## Resume:
Computer Vision Tool Collection for Inovisão. This collection of tools allows the user to select an image (or folder) and realize numerous actions such as:
- Generate new Datasets and classes
- Segmentation of images
- Extract features from an image
- Extract frames from videos
- Train Machine Learning algorithms
- Classify using CNNs
- Experiment with data using Keras
- Create XML files from segments previously created.
## Open Software License:
NPOSL-30 https://opensource.org/licenses/NPOSL-3.0 - Free for non-profit use (E.g.: Education, scientific research, etc.). Contact Inovisão's Prof. Hemerson Pistori (pistori@ucdb.br), should any interest in commercial exploration of this software arise.
## How to cite:
[1] dos Santos Ferreira, A., Freitas, D. M., da Silva, G. G., Pistori, H., & Folhes, M. T. (2017). Weed detection in soybean crops using ConvNets. Computers and Electronics in Agriculture, 143, 314-324.
## Como Usar
- A partir da pasta raiz, execute os seguintes comandos:
```
$ cd src
```
```
$ python main.py
```
- Uma imagem como a mostrada abaixo deve ser apresentada:
## How to Install
![pynovisao](data/pynovisao.png)
## Outras Opções
- **Option 1, Linux-only Script**
- Mostra todas as opções disponíveis
You can easily install Pynovisão utilizing the automated installation script given with it, as seen by the following steps:
- From inside of this directory:
```
$ python main.py --help
[...]/pynovisao
```
- Executa o programa inicializando o banco de imagens em *../data/soja*
- Execute the following command:
```
$ python main.py --dataset ../data/soja
```
- Executa o programa definindo as classes e suas respectivas cores (X11 color names)
```
$ python main.py --classes "Solo Soja Gramineas FolhasLargas" --colors "Orange SpringGreen RebeccaPurple Snow"
```
- Existe também um script para Linux que ajuda a dividir o conjunto de imagens entre treinamento, validação e teste. Ainda não está integrado à interface. Para saber mais:
```
$ cd src/util
$ chmod 755 split_data.sh
$ ./split_data -h
$ sudo bash INSTALL.sh
```
**NOTE**: This script has been tested for Ubuntu versions 19.04 and 18.04
- **Option 2, without INSTALL.sh**
## Como instalar (opção 1, somente linux)
### Linux
Você pode instalar utilizando o script de instalação realizando os seguintes passos:
Besides it's dependencies, Python 2.7.6 or Python 3.6 is needed. (Latest tested versions for this software)
- Na pasta raiz do projeto, execute o comando abaixo para ceder a permissão de execução no script de instalação.
```
$ sudo chmod a+x INSTALL.sh
```
- Execute o script de instalação.
- Installing the necessary dependencies on Python 3.6:
```
$ sudo ./INSTALL.sh
$ sudo apt-get update
$ sudo apt-get install libfreetype6-dev tk tk-dev python3-pip openjdk-8-jre openjdk-8-jdk weka weka-doc python3-tk python3-matplotlib
$ source ~/.bashrc
$ sudo pip3 install numpy
$ sudo pip3 install -r requirements_pip3.txt
$ sudo pip3 install tensorflow
$ sudo pip3 install keras
```
O script de instalação foi testado na versão 16.04 do Ubuntu.
## Como instalar (opção 2, sem o script)
### Dependências
#### Linux
Será necessário instalar:
- Python 2.7.6
- Opencv 2.7
- tk/tk-dev
As bibliotecas necessárias podem ser encontradas no arquivo __requeriments.txt__ na raiz do projeto, utilize o comando __pip__ para instalar.
- Instalação do pip:
```
$ sudo apt-get install python-pip
```
- Instale o numpy:
- Installing the necessary dependencies on Python 2.7:
```
$ sudo apt-get update
$ sudo apt-get install libfreetype6-dev tk tk-dev python-pip openjdk-8-jre openjdk-8-jdk weka weka-doc python-tk python-matplotlib
$ source ~/.bashrc
$ sudo pip install numpy
$ sudo pip install -r requirements_pip3.txt
$ sudo pip install tensorflow
$ sudo pip install keras
```
- Instação das bibliotecas:
```
$ sudo pip install -r requeriments.txt
```
### Windows
- Instale o [Anaconda](http://continuum.io/downloads) que contém todas dependências, inclusive o Python. Basta fazer o download do arquivo .exe e executá-lo.
- Opencv 2.7
- python-weka-wrapper ( Classification )
## How to install Caffe ( Optional )
### Como instalar o OpenCV
#### Ubuntu / Windows
In order to use the CNNCaffe classifier, a ConvNet based on the AlexNet topology, it is necessary to install Caffe.
#### Linux (caso pip não funcione)
It's installation is more complex than the ones previously mentioned, and more detailed instructions can be found below:
- http://caffe.berkeleyvision.org/installation.html
Seguir as instruções disponíveis em [OpenCV-Linux](http://docs.opencv.org/doc/tutorials/introduction/linux_install/linux_install.html#linux-installation). Lí em algum lugar que dá para instalar com o comando abaixo, não testei mas pode funcionar:
```
$ sudo apt-get install python-opencv
```
After installing Caffe, in order to realize classification with it you will need to train it with Pynovisão using the command line, since there currently is no interface for ConvNet Training.
Pode ser que seja necessário instalar também uma versão mais antiga do opencv (2.4*) caso apareça um erro com o comando import cv (que sumiu na versão 3.0.0 do opencv). Neste caso, tente seguir estes passos: [Instalando opencv 2.4] (https://sites.google.com/a/computacao.ufcg.edu.br/lvc/aprendizado/opencv).
The tutorial for training can be found below:
- http://caffe.berkeleyvision.org/gathered/examples/imagenet.html
#### Windows
Finally, it is necessary to configure your CNNCaffe.
- For the fields *ModelDef, ModelWeights* and *MeanImage*, you must supply the relative paths to the traning done previously.
- For the field *LabelsFile* you must supply the path to a file that describes all the classes in order (0, 1, 2, ..., n-1; where n is the number of classes trained).
- A example file can be found in **[...]/pynovisao/examples/labels.txt**.
- [OpenCV-Python](https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_setup/py_setup_in_windows/py_setup_in_windows.html#install-opencv-python-in-windows).
1. Baixe o [Opencv](https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_setup/py_setup_in_windows/py_setup_in_windows.html#install-opencv-python-in-windows)
2. Extraia os arquivos no local desejado.
3. Vá para a pasta opencv/build/python/2.7.
4. Cipie o arquivo cv2.pyd para C:/Python27/lib/site-packeges.
5. Abra o terminal e digite python para executar o interpretador.
6. Digite:
```
>>> import cv2
>>> print cv2.__version__
```
## How to use:
### Como instalar scikit-image e arff (caso pip não funcione)
#### Opening the software
- In order to download Pynovisao, click the download button in the top right of the screen (Compressed folder), or type the following command in a terminal:
```
$ sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose python-pip python-networkx libfreetype6-dev
$ sudo pip install -U scikit-image
$ git clone http://git.inovisao.ucdb.br/inovisao/pynovisao
```
Em uma das máquinas em que tentei instalar deu um erro que resolvi rodando o comando abaixo antes de executar a linha acima:
- From inside of this directory:
```
$ sudo apt-get build-dep python-matplotlib
$ sudo pip install cycler
[...]/pynovisao
```
### Como instalar o tk/tk-dev
#### Ubuntu
```
$ sudo apt-get install tk tk-dev
```
Na ocorrência do erro 'cannot import name _tkagg', tentar os seguintes comandos:
- Enter the folder named **[...]/pynovisao/src** or type the following command in the terminal to do so:
```
$ sudo apt-get install tk tk-dev
$ sudo pip uninstall matplotlib
$ sudo pip install matplotlib
$ cd src
```
Se der erro na reinstalação do matplotlib (depois que desinstalar), tente desinstalar também pelo apt-get:
- Next, type the following command if you desire to run it using Python 2.7:
```
$ sudo apt-get remove python-matplotlib
$ python main.py
```
### Como instalar o tqdm
#### Ubuntu
- Or, should you want to run it using Python 3.6:
```
$ sudo pip3 install tqdm
$ python3 main.py
```
### Mais informações
Now you are able to run Pynovisão!
- http://www.tkdocs.com/tutorial/install.html
#### Other options:
### Como instalar o python-weka-wrapper ( Opcional )
#### Ubuntu (caso pip não funcione)
Primeiro você precisa compilar os código C/C+ e os módulos Python:
```
$ sudo apt-get install build-essential python-dev
```
Agora você pode instalar os vários pacotes que precisamos para instalar o python-weka-wrapper:
```
$ sudo apt-get install python-pip python-numpy
```
Os seguintes pacotes são opcionais mas necessários se você deseja uma representação gráfica:
```
$ sudo apt-get install python-imaging python-matplotlib python-pygraphviz
```
- Show All options available
Instale OpenJDK para obter todos os cabeçalhos que javabridge compila:
```
$ sudo apt-get install default-jdk
$ python main.py --help
```
No meu ubuntu 14.04 tive problemas com dependência, acabei instalando o java da oracle seguindo as orientações deste site: [instalando java da oracle](http://askubuntu.com/questions/521145/how-to-install-oracle-java-on-ubuntu-14-04)
- Executes the program, defining the wanted classes and it's respective colours (X11 colour names)
Finalmente você pode usar pip para instalar os pacotes Python que não estão disponíveis no repositório:
```
$ sudo pip install javabridge
$ sudo pip install python-weka-wrapper
$ python main.py --classes "Soil Soy Grass LargeLeaves" --colors "Orange SpringGreen RebeccaPurple Snow"
```
#### Windows
Por favor note: você precisa certificar-se que os bits do seu ambiente é consistente. Isto é, se você instalar uma versão de Python 32-bit você deve instalar um JDK 32-bit e numpy 32-bit ( ou então todos eles devem ser 64-bit ).
Realize os seguintes passos:
Instale Python, esteja certo que você checou Add python.exe to path durante a instalação.
Adicione os scripts Python eu sua variável de ambiente PATH, por exemplo, :\\Python27\\Scripts
Instale pip com os seguintes passos:
- baixe daqui https://bootstrap.pypa.io/get-pip.py
- instale usando python get-pip.py
- A Linux script exists in *[...]/pynovisao/src/util* to help divide images into training, validation and testing datasets. It has not been implemented to the main GUI. In order to use it, use the folowwing commands:
Instale numpy
- baixe numpy 1.9.x MKL ( ou superior ) para Python 2.7 (cp27) e sua configuração de bit (32 ou 64 bit)
- instale o arquivo .whl usando pip: pip install numpy-X.Y.Z.whl
Instale .Net 4.0 (se já não estiver instalado)
Instale Windows SDK 7.1
Abra o prompt de comando do Windows SDK (não o prompt de comando convencional!) e instale javabridge e python-weka-wrapper
```
> set MSSdk=1
> set DISTUTILS_USE_SDK=1
> pip install javabridge
> pip install python-weka-wrapper
$ cd src/util
$ chmod 755 split_data.sh
$ ./split_data -h
```
Agora você pode executar python-weka-wrapper usando o prompt de comando convencional também.
Se você deseja as funcionalidades gráficas você precisa instalar matplotlib também:
- baixe matplotlib para Python 2.7 (cp27) e sua configuração de bit (32 or 64 bit)
- instale o arquivo .whl usando pip: pip install matplotlib-X.Y.Z.whl
#### Mais informações
- http://pythonhosted.org/python-weka-wrapper/install.html
- http://pythonhosted.org/python-weka-wrapper/troubleshooting.html
### Como instalar o caffe ( Opcional )
#### Ubuntu / Windows
Para poder utilizar o classificador CNNCaffe, uma ConvNet baseada na topologia AlexNet, é necessário instalar o software Caffe.
A instalação do software Caffe é mais complexa que as instalações descritas anteriormente e pode ser encontrada detalhada no link abaixo:
- http://caffe.berkeleyvision.org/installation.html
Após realizar a instalação do software Caffe, para realizar a classificação, você precisa realizar o treinamento da sua rede no software, pois não há interface no Pynovisao para o treinamento da ConvNet.
O tutorial para o treinamento pode ser encontrado no link abaixo:
- http://caffe.berkeleyvision.org/gathered/examples/imagenet.html
Por fim será necessário configurar sua CNNCaffe.
- Para os campos ModelDef, ModelWeights e MeanImage, você deverá fornecer os caminhos relativos ao seu treinamento realizado no passo anterior.
- Para o campo LabelsFile você deve fornecer o caminho de um arquivo que descrava nominalmente as classes na ordem 0, 1, ..., n-1, onde n é o número de classes que você treinou.
- Um arquivo de exemplo pode ser encontrado em examples/labels.txt.
# Implementando um novo classificador no pynovisao
Nesta seção será usado como exemplo o classificador **Syntactic**, do tipo **KTESTABLE** e, como opção de hiperparâmetros, o tamanho do vocabulário.
Inicialmente, você deve criar uma classe onde estão, em um dicionário (chave, valor), todos os tipos do seu classificador. A classe deve ser criada no diretório src/classification/. Veja como exemplo a classe SyntacticAlias no arquivo src/classification/syntactic_alias.py.
O próximo passo é criar o arquivo (.py) do seu classificador no diretório src/classification/, por exemplo, syntactic.py. No arquivo recém-criado você deve implementar a classe de seu classificador estendendo a classe **Classifier**, que está implementada no arquivo src/classification/classifier.py. Veja exemplo abaixo.
# Features of this software:
## File
### Open Image (Shortcut: Ctrl + O)
Opens a file selection windows and allows the user to choose a desired image to work upon.
### Restore Image (Shortcut: Ctrl + R)
Restores the selected image to it's original state.
### Close Image (Shortcut: Ctrl + W)
Closes the currently selected image.
### Quit (Shortcut: Ctrl + Q)
Closes Pynovisão.
## View
### Show Image Axis (Shortcut: Not Defined)
Shows a X/Y axis on the Image.
### Show Image Toolbar (Shortcut: Not Defined)
Shows a list of all the images in the selected folder.
### Show Log (Shortcut: Not Defined)
Shows a log with information about the current processes and Traceback errors should they happen.
## Dataset
### Add new class (Shortcut: Ctrl + A)
Create a new class. This will create a new folder in the /data folder.
### Set Dataset Path (Shortcut: Ctrl + D)
Choose the folder with the desired images.
### Dataset Generator (Shortcut: Not Defined)
Creates a new dataset utilizing the selected folder.
## Segmentation
### Choose Segmenter (Shortcut: Not Defined)
Choose the desired segmentation method. Please research the desired method before segmenting. The Default option is SLIC.
### Configure (Shortcut: Ctrl + G)
Configure the parameters for the segmentation.
- Segments: Number of total segments the image should be split into.
- Sigma: How "square" the segment is.
- Compactness: How spread out across the image one segment will be. A higher compactness will result in more clearly separated borders.
- Border Color: The color of the created segments' borders. This is only visual, it will not affect the resulting segment.
- Border Outline: Will create a border for the segment borders.
### Execute (Shortcut: Ctrl + S)
Execute the chosen segmentation method with the desired parameters.
Once Segmented, the user can manually click on the desired segments and they will be saved in data/demo/**name-of-the-class**/**name-of-the-image**_**number-of-the-segment**.tif.
### Assign using labeled image (Shortcut: Ctrl + L)
Use a mask/bicolor image created using a labelling software (LabelMe/LabelImg) and applies it to the original/selected image, and generates all the correct segments inside such mask.
### Execute folder (Shortcut: Not Defined)
Same as the Execute command, however it realizes the segmentation on an entire folder at once.
### Create .XML File (Shortcut: Not Defined)
Will create a .xml file using the chosen segments. The .xml will be saved in data/XML/**name-of-the-image**.xml
## Feature Extraction
### Select Extractors (Shortcut: Ctrl + E)
Select the desired extractors to use. The currently available extractors are:
- Color Statistics;
- Gray-Level Co-Ocurrence Matrix;
- Histogram of Oriented Gradients;
- Hu Image Moments;
- Image Moments (Raw/Central);
- Local Binary Patterns;
- Gabor Filter Bank;
- K-Curvature Angles.
Please research what each extractor does, and choose accordingly. By default all extractors are chosen.
### Execute (Shortcut: Ctrl + F)
Execute the chosen Extractors. It will create a training.arff file in the data/demo folder.
### Extract Frames (Shortcut: Ctrl + V)
Will extract frames from a video. The user must choose the folder where the desired videos are, and the destination folder where the consequent frames will be extracted to.
## Training
### Choose Classifier (Shortcut: Not Defined)
Choose the desired classifier to use. Only one can be chosen at a time.
- CNNKeras
- CNNPseudoLabel
- SEGNETKeras
If the user is interested in implementing it's own classifiers into Pynovisão, please go to **Implementing a new classifier in Pynovisão**
### Configure (Shortcut: Not Defined)
Choose the desired parameters for the currently selected classifier.
Each classifier has it's own parameters and configurations, and therefore must be extensibly research should the desired result be achieved.
### Execute (Shortcut: Ctrl + T)
Train the selected classifier utilizing al the chosen parameters and the training.arff file created previously.
## Classification
### Load h5 weights (Shortcut: Not Defined)
*Only used for CNN classifiers* Take a previously created weight .h5 file and use it for this classification.
### Execute (Shortcut: Ctrl + C)
Execute the current classifier over the currently selected image.
### Execute folder (Shortcut: Not Defined)
Same as the previous command, however executes all the image files inside a selected folder at once.
## Experimenter
### Ground Truth (Shortcut: Not Defined)
Utilizes the currently selected image as the ground truth for the experimentations.
### Execute Graphical Confusion Matrix (Shortcut: Not Defined)
For each classifier, creates a graphic with it's confusion matrix for the choen dataset.
### Cross Validation (Shortcut: Ctrl + X)
Performs cross validation utilizing the previously experimented classifiers.
### Experimenter All (Shortcut: Ctrl + P)
Runs all Weka classifiers and experiments with them.
## XML
### Configure folders (Shortcut: Not Defined)
Choose the target folder for the original images and the other target folder for the segments to be searched and conevrted into a .xml file.
### Execute Conversion (Shortcut: Not Defined)
Executes the conversion using the two given folders. The file with the annotations will be saved in *[...]/pynovisao/data/XML*, with the name ***image** + .xml*.
# Implementing a new classifier in Pynovisão
In this section we shall show the steps needed to implement a new classifier into Pynovisão. As an example, we are using **Syntactic**, of type **KTESTABLE** and vocabulary size as an hyperparameter.
Inicially, you need to create a class where all the types of your classifier are in a dictionary (Key, Value). The class must be created inside *[...]/pynovisao/src/classification/*. As an example, look for the *SyntacticAlias* in *[...]/pynovisao/src/classification/syntactic_alias.py*.
The next step is creating the .py file for your classifier in your directory *[...]/pynovisao/src/classification/*, for example, *syntactic.py*.
In this newly-created file you must implement your classifier class extending the class **Classifier**, which is implemented in the file *[...]/pynovisao/src/classification/classifier.py*.
See the example below:
```python
#syntactic.py
#importações mínimas necessárias
#minimal required imports
from collections import OrderedDict
from util.config import Config
from util.utils import TimeUtils
......@@ -290,7 +268,7 @@ class Syntactic(Classifier):
"""Class for syntactic classifier"""
```
No construtor da classe você deve informar valores padrão para os parâmetros. No caso do exemplo abaixo, **classename** é o tipo do classificador e **options** é o tamanho do alfabeto. Além disso, alguns atributos devem ser inicializados: **self.classname** e **self.options**. O atributo **self.dataset** (opicional) é o path do conjunto de treinamento e teste que o usuário informa na interface gráfica. Ter esse atributo na classe é importante para ter acesso ao conjunto de imagens em qualquer um dos métodos, ele é inicializado no método **train** discutido posteriormente.
In the contructor class you must inform default values for the parameters. In the case fo the example below, **classname** is the type of classifier and **options** is the size of the alphabet. Besides, some attributes must be inicialized: **self.classname** and **self.options**. The attribute **self.dataset** (optional) is the path to the training and testing dataset which tells the user in the GUI. Having this attribute in the class is important to get access to the dataset in any of the methods and is initialized in the method **train** discussed later.
```python
def __init__(self, classname="KTESTABLE", options='32'):
......@@ -301,17 +279,17 @@ def __init__(self, classname="KTESTABLE", options='32'):
self.reset()
```
O métodos **get_name**, **get_config**, **set_config**, **get_summary_config** e **must_train** possuem implementações padrão. Veja exemplo de implementação em src/classification/classifier.py.
The methods **get_name**, **get_config**, **set_config**, **get_summary_config** and **must_train** have default implementations, as seen in example in *[..]/pynovisao/src/classification/classifier.py*.
O método train deve ser implementado para treinar o seu classificador. No parâmetro dataset é passado o diretório onde estão as imagens para treinamento. No corpo do método o valor do atributo self.dataset, declarado como opcional no construtor, é alterado com o atual diretório de treinamento.
The **train** method must be implemented in order to train your classifier. The **dataset** parameter is given the path to the training images. Within the method, the value of the attribute self.dataset, declared as optional in the constructor, is altered to the current training directory.
```python
def train(self, dataset, training_data, force = False):
dataset += '/'
# atributo que mantém o diretório do dataset.
# Attribute which retains the dataset path.
self.dataset = dataset
# os dois testes abaixo são padrão
# The two tests below are default.
if self.data is not None and not force:
return
......@@ -319,35 +297,36 @@ def train(self, dataset, training_data, force = False):
if self.data is not None:
self.reset()
# implemente aqui seu treinamento.
# Implement here your training.
```
O método **classify** deve ser implementado para que seu classificador faça a predição. No parâmetro **dataset** é passado o diretório onde estão as imagens para treinamento, no **test_dir** é passado a pasta temporária criada pelo pynovisao onde estão as imagens que serão usadas para o teste. A pasta temporária é criada dentro do diretório dataset. Então, para acessar o diretório de testes basta concatenar **dataset** e **test_dir**, como no exemplo no corpo do método abaixo. O parâmetro test_data é um arquivo arff que contém os dados para os testes.
The **classify** method must be implemented should you want your classifier to be able to predict classes for images. The **dataset** parameter is given the training images, and **test_dir** is given the temporary folder path created by Pynovisão, where the testing images are located. This folder is created within the **dataset** directory and, to acesss it, just concatenate **dataset** and **test_dir** as show in the example below. The parameter test_data is a .arff file with data for the testing images.
O método **classify** deve retornar uma lista contendo as classes preditas pelo seu classificador. Exemplo: [‘daninha’,’daninha’,’mancha_alvo’, ‘daninha’]
This method must return a list containing all the predicted classes by the classifier. E.g.: [‘weed’,’weed’,’target_stain’, ‘weed’]
```python
def classify(self, dataset, test_dir, test_data):
# diretório onde estão as imagens para testes.
# Directory retaining the testing images.
path_test = dataset + '/' + test_dir + '/'
# implemente aqui o preditor de seu classificador
# Implement heere the prediction algorithm for your classifier.
return # uma lista com as classes preditas
return # A list with the predicted classes
```
O método **cross_validate** deve ser implementado e o objetivo é implementar a validação cruzada. O método retorna uma string (info) com as métricas. Obs: o atributo **self.dataset** atualizado no método **train** pode ser utilizado no método cross-validate para acessar o diretório das imagens de treinamento.
The **cross_validate** must be implemented and return a string (info) with the metrics.
Obs.: The attribute **self.dataset**, updated in **train**, can be used in **cross_validate** to access the training images folder.
```python
def cross_validate(self, detail = True):
start_time = TimeUtils.get_time()
info = "Scheme:\t%s %s\n" % (str(self.classifier.classname) , "".join([str(option) for option in self.classifier.options]))
# implemente aqui a validação cruzada.
# Implement here the cross validation.
return info
```
O método **reset** deve ser implementado de forma padrão, como exemplo abaixo.
The **reset** method must also be implemented in default form, as seen below.
```python
def reset(self):
......@@ -355,25 +334,15 @@ def reset(self):
self.classifier = None
```
Após a implementação de seu classificador, você deve configurá-lo no pynovisao. A configuração deve ser realizada no arquivo src/classification/__init__.py.
Caso você necessite de classes utilitárias, os arquivos delas devem ser criados no diretório src/util/. Além disso, as classes utilitárias devem ser registradas como módulos no arquivo src/util/__init__.py
After implementing your classifier, you must configure it in Pynovisão by modifying **[...]/pynovisao/src/classification/__init__.py**.
Caso dê problema relacionado ao número de processos, adicione as duas váriaveis de ambiente,
sendo que deve adicionar no número de threads que o seu processador permite:
Should utility classes be necessary, they must be created in **[...]/pynovisao/src/util/**. They must also be registered as modules in **[...]/pynovisao/src/util/__init__.py**.
export OMP_NUM_THREADS=8
export KMP_AFFINITY="verbose,explicit,proclist=[0,3,5,9,12,15,18,21],granularity=core"
# Como utilizar as ferramentas de anotação XML
Should any problem related to the number of processes arise, add these two variables in your terminal:
Para aqueles que desejam criar arquivos XML durante o processo de segmentação, o Pynovisão agora é capaz de realizar tal tarefa.
Após selecionar sua imagem e segmenta-la, apenas selecione os segmentos desejados, a ferramenta ira automaticamente salvar as caixas com as regiões de interesse. Quando estiver satisfeito, clique novamente em *Segmentation -> Create .XML file* e o arquivo com as anotações em formato XML será criado na pasta *pynovisao/data/XML*, com o nome *imagem + .xml*.
```
export OMP_NUM_THREADS=**number of threads your cpu has**
export KMP_AFFINITY="verbose,explicit,proclist=[0,3,5,9,12,15,18,21],granularity=core"
```
Caso o usuário já tenha segmentos prontos e a imagem original, também há a opção de identificar automaticamente a posição de tal segmento e criar a caixa com a região de interesse correspondente. Para utilizar esta ferramenta:
- Selecione *XML -> Configure folders*
- Selecione a opção para mudar o diretório desejado.
- Na interface agora aberta, entre na pasta com as imagens originais e a pasta com todos os grupos de segmentos desejados respectivamente.
- Clique em *Save All Directories*
- Com os diretórios desejados agora salvos, clique em *XML -> Execute Conversion*
- Após o processo de criação de XML, é possivel encontrá-lo em [...]/pynovisao/data/XML com o nome *imagem + .xml*.
......@@ -7,10 +7,10 @@ sympy
nose
networkx
scikit-image
javabridge==1.0.18
javabridge==1.0.12
python-weka-wrapper
cycler==0.10
cython
Cython
h5py
scikit-learn==0.20.1
statistics
......
opencv-python
python-dateutil
matplotlib
scipy
pandas
sympy
nose
networkx
scikit-image
javabridge
python-weka-wrapper
cycler
Cython
h5py
scikit-learn
statistics
pandas_ml
pyxdg
opencv-contrib-python
python-interface
tqdm
sklearn
pyxdg
pascal-voc-writer
psutil
......@@ -1078,11 +1078,11 @@ class Act(object):
self.tk.write_log(message)
def create_xml(self):
'''
"""
Generate a .XML file, with the file having 'name of the image including its extension'.xml.
This file will take the current xml object from Pascal_Voc_Writer and finalize it,
creating the file in the current directory and moving it towards /pynovisao/data/XML.
'''
"""
self._xml_file.save("{}.xml".format(self._image_name))
current_path=os.getcwd()
current_path=current_path[-1::-1]
......@@ -1096,10 +1096,10 @@ class Act(object):
def run_xml_converter(self):
self.tk.write_log("Started mass annotation process, it may take a while...")
def moveXML(file): #Move the xml files into the 'data/XML' folder
'''
File: string
Name of the original image.
'''
"""
file: string
Name of the original image.
"""
current_path=os.getcwd()
current_path=current_path[-1::-1]
current_path=current_path[3::1]
......@@ -1110,20 +1110,20 @@ class Act(object):
shutil.move(os.getcwd()+"/{}.xml".format(file),current_path+"/{}.xml".format(file))
def arrasteSeg(imgog, imgseg, LinhaOg, ColunaOg, LinhaSeg, ColunaSeg):
'''
imgog: numpy array
Array of the original image.
imseg: numpy array
Array of the segment being searched for.
LinhaOg: int
Current position in the imgog (X axis).
LinhaSeg: int
Current position in the imseg (X axis).
ColunaOg: int
Current position in the imgog (Y axis).
ColunaSeg: int
Current position in the imseg (Y axis).
'''
"""
imgog: numpy array
Array of the original image.
imseg: numpy array
Array of the segment being searched for.
LinhaOg: int
Current position in the imgog (X axis).
LinhaSeg: int
Current position in the imseg (X axis).
ColunaOg: int
Current position in the imgog (Y axis).
ColunaSeg: int
Current position in the imseg (Y axis).
"""
#Drags the segment over the original image
l = 0
while(l <= (LinhaOg - LinhaSeg)):
......@@ -1148,16 +1148,16 @@ class Act(object):
l = l + 1
def achaSeg(self, pathS, file, pog, arquivos):
'''
pathS: string
Filepath to the segments folder.
file: string
Name of the original image.
Pog: string
Filepath to original image (file).
arquivos: string array
Segments alredy found in a image.
'''
"""
pathS: string
Filepath to the segments folder.
file: string
Name of the original image.
Pog: string
Filepath to original image (file).
arquivos: string array
Segments alredy found in a image.
"""
#Reads all segment files in the given folder (pathS)
tottime = 0
arquivo=os.path.join(pog, file)
......@@ -1198,12 +1198,12 @@ class Act(object):
moveXML(file)
def achaImg(self, pathS, pathIO):
'''
pathS: string
Filepath to the segments folder.
pathIO: string
Filepath to the Original Images folder.
'''
'''
pathS: string
Filepath to the segments folder.
pathIO: string
Filepath to the Original Images folder.
'''
arquivos = [] #Segments alredy found, starts empty
thread = [] #Threads created, starts empty.
#Verifies all original images (files) under the given folder (pathIO)
......