gabri14el's picture
Upload with huggingface_hub
e6b3e35
## Protótipo para uso dos modelos
Neste diretório pode-se encontrar a implementação de um protótipo para a classificação de imagens de uva. Note que o _requeriments.txt_ é provido de modo que a instação dos requerimentos para executar o código seja feita rapidamente.
O código está estuturado em uma forma model-view.
Sobre os arquivos:
* **App.py:** Arquivo principal do aplicativo, representando o view. A implementação doi feita utilizando PyQT5.
* **Relatorio.py:** Arquivo secundário da view que representa o relatório de uma classificação. Utilizado para melhor organização do código.
* **explicador.py:** módulo que controla os explicadores disponíveis. Para adiconar um novo explicador ao software, deve criar uma classe, herdando de "base\_explainer.py" e implementar o método abstrato "_get\_explanation_". O método está feito de modo que elementos inerentes a cada explicador possam ser passsados através da variável props. O retorno desse método deve ser obrigatoriamente uma Imagem PIL. Pode-se utilizar o método "_keras.preprocessing.image.array\_to\_img_" do keras que automaticamente transforma um array numpy numa imagem deste tipo.
* **model\_manager.py**: módulo responsável por gerenciar os modelos. Para se adicionar um novo modelo, deve-se adicioná-lo ao arquivo _config.json_, indicanto a pasta onde o modelo está (a pasta deve ser extraída com formato [SavedModel do tensorflow](https://www.tensorflow.org/tutorials/keras/save_and_load#savedmodel_format)). Além disso um nome ("name"), o tamanho ("size"), um tipo do modelo ("type") devem ser providos. Note que caso pretenda-se utilizar métodos baseados em ativação por classe deve-se também fornecer o nome da camada convolucional que será utilizada para se obter os mapas de ativação ("last\_conv"). O tipo do modelo é utilizado para aplicar o preprocessamento. Caso algum tipo que não seja efficientnetb3, resnet101, ou xception seja setado, nenhum pre-processamento será aplicado às imagens na inferência e consequentemente, na hora de obter explicações com o LIME. É importante ressaltar que as classes e suas siglas devem ser fornecidas na mesma ordem em que o treinamento foi realizado. Caso tenha-se utilizado o ImageGenerator do keras, por padrão a ordem é alfabética. As classes devem ser fornecidas do mesmo formato em que está o arquivo _config.json_ fornecido.
* **util.py:** módulo com métodos de comum utilização entre diferentes classes.
Os arquivos restantes são implementações dos explicadores de modo que estes possam ser gerenciados pelo módulo "explainer". É importante observar como eles fucionam caso se pretenda adicionar um novo explicador ao programa.
### Adicionando um novo modelo ao programa
1. Adiciona-se o modelo ao arquivo _config.json_, fornecendo um nome, diretório (a pasta deve ser extraída com formato [SavedModel do tensorflow](https://www.tensorflow.org/tutorials/keras/save_and_load#savedmodel_format)), tamanho no formato "altura, largura", tipo e nome da camada convolucional que será usada pelo grad-cam.
```javascript
{
"name": "Xception",
"directory":"C:\\Users\\Gabriel\\Xception",
"size":"300, 300",
"type":"xception",
"last_conv": "block14_sepconv2_act"
}
```
2. Caso pretenda-se adiconar um novo tipo de modelo deve-se adicionar ao _model\_manager.py_ no método _add\_model()_ o tipo do modelo (mesma string especifica em **type** no _config.json_) e os métodos de pré processamento e de desfazer o pré processamento. Caso não seja adicionado, nenhum método vai ser aplicado, retornando a própria imagem em ambos os casos.
```python
elif type_model == $STRING_TYPE_DEFINIDA_EM_CONFIG:
#método de pré proecessamento
container["preprocessing"] = keras.applications.efficientnet.preprocess_input
#método de desfazer préprocessamento
container["undo_changes"] = self.efficientnet_undo_changes
```
3. Os elementos de interface gráfica são automáticamente preenchidos com os novos modelos providos, caso a descrição esteja correta.
### Adicionando um novo explicador ao programa
1. Cria-se uma nova classe herdando de **BaseExplainer** localizada no módulo "base\_explainer.py". A assinatura do método pode ser vista abaixo. O método deve retornar uma imagem PIL para que a interface gráfica funcione corretamente. Pode-se utilizar o método "_keras.preprocessing.image.array\_to\_img_()" para conveter uma array numpy para uma imagem PIL.
```python
@abstractmethod
def get_explanation(self, img, model, img_size, props, preprocess_input = None, index=None):
pass
```
2. Deve-se adicionar à constante __explainers__ da classe Explicador no localizada no módulo "_explicador.py_" o nome do explicador e um objeto referente a ele. Três exemplos podem ser observados abaixo.
```python
class Explicador:
explainers = {"LIME": LIMEExplainer(),
"Grad-CAM": GradCAMExplainer(),
"Grad-CAM++":GradCAMPPExplainer()}
...
```
3. A interface gráfica é automaticamente preenchida com os nomes especificados na constante __explainers__.
Shield: [![CC BY-NC-SA 4.0][cc-by-nc-sa-shield]][cc-by-nc-sa]
This work is licensed under a
[Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License][cc-by-nc-sa].
[![CC BY-NC-SA 4.0][cc-by-nc-sa-image]][cc-by-nc-sa]
[cc-by-nc-sa]: http://creativecommons.org/licenses/by-nc-sa/4.0/
[cc-by-nc-sa-image]: https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png
[cc-by-nc-sa-shield]: https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg