Você está na página 1de 157

ESCOLA DE ENGENHARIA

DEPARTAMENTO DE ENGENHARIA AGRÍCOLA E MEIO AMBIENTE


ENGENHARIA DE RECURSOS HÍDRICOS E DO MEIO AMBIENTE

LEANDRO PEREIRA BERNARDO

MONITORAMENTO DE INCÊNDIO EM SISTEMAS


AMBIENTAIS COM
REDES NEURAIS CONVOLUCIONAIS

NITERÓI
2022
LEANDRO PEREIRA BERNARDO

Trabalho de conclusão de curso


apresentado ao Curso de Engenharia
de Recursos Hídricos e do Meio
Ambiente, da Universidade Federal
Fluminense, como requisito parcial à
obtenção do título de Bacharel em
Engenharia de Recursos Hídricos e do
Meio Ambiente.

Orientador (a):
Prof. D.Sc. Ivanovich Lache Salcedo

Niterói
2022
LEANDRO PEREIRA BERNARDO

MONITORAMENTO DE INCÊNDIO EM SISTEMAS AMBIENTAIS


COM REDES NEURAIS CONVOLUCIONAIS

Trabalho de conclusão de curso


apresentado ao Curso de Engenharia
de Recursos Hídricos e do Meio
Ambiente, da Universidade Federal
Fluminense, como requisito parcial à
obtenção do título de Bacharel em
Engenharia de Recursos Hídricos e do
Meio Ambiente.

Aprovada em 16 de Dezembro de 2022.

BANCA EXAMINADORA
DEDICATÓRIA

Dedico esse presente trabalho à pessoa mais importante da minha vida,


que me gerou, me educou, zelou por mim e me fez ser o ser humano que sou
hoje; minha eternamente memorada e amada mãe, Christiane Lopes Pereira.

I refuse to sink.
AGRADECIMENTO

Primeiramente ao Universo e à Espiritualidade por sempre me acompanhar,


me ensinar e me auxiliar nos momentos mais difíceis.

Ao querido amigo e orientador DSc Ivanovich Lache Salcedo por toda a


dedicação, carinho, apoio e, principalmente, dedicação à arte de lecionar.
Por me inspirar a fazer Ciência.

À minha família Nelson, Isabella, Patrícia, Denise, Luiz Carlos, Jurema e


Michelle; por terem me ajudado a me construir como pessoa, com ideais e
princípios certos e por terem me dado apoio para chegar até aqui, neste
momento. Mesmo eu sendo uma pessoa complexa e explosiva, eu sei que posso
contar com o amor e apoio de vocês por toda a vida.

Aos meus diversos amigos que eu fiz ao longo da vida; que me proporcionaram
bons momentos juntos, de troca e de risos; de conselho e de aprendizado; de
força e de afeto. Mesmo não sendo possível nomear todos aqui, eu gostaria de
agradecer à Isabella Bernardo, Vinicius Gomes, Carolina Vianna, Lilyane Fuzii,
Caroline Mantovani, Thiago Napoli, Jóice Azeredo, Raiane Lima por tudo. Em
especial, Luiz Felippe, por me ajudar a ser uma pessoa melhor a cada dia e por
me mostrar que irmandade está além dos laços sanguíneos; e sim ligado aos
elos de apoio, afinidade e sinceridade.

Ao Departamento de Engenharia Agrícola e Ambiental, Izabela do Couto,


Franciele Zanandrea e Christina Huther; por me receberem e apoiarem na
construção de momentos acadêmicos, atuais e futuros.

Ao João Vitor Bessa Ventura, por ter me feito crescer como indivíduo, por ter me
ensinado o que é verdadeiramente amar alguém e por ter me mostrado que a
maior prova de amor não é segurar, mas sim deixar partir.
Mesmo não estando mais presente, você será sempre lembrado com carinho.

Por fim, agradecimento especial, com todo o meu coração, para minha avó,
Maria de Lourdes Alves Bernardo e minha mãe, Christiane Lopes Pereira.
Mesmo não estando mais presentes nesse plano, eu sei que vocês irão continuar
me amando e cuidando de mim do outro lado. Eu, Leandro, sempre serei o
querido e amado filho e neto; nessa vida ou na próxima; para todo o sempre.
Por amor a vocês, eu me recusei a afundar.
“ Here is a child; … See it raising itself for the first
time, fearfully and bravely, to a vertical dignity; why should
it long so to stand and walk? Why should it tremble with
perpetual curiosity, with perilous and insatiable ambition,
touching and tasting, watching and listening, manipulating
and experimenting, observing and pondering, growing—till
it weighs the Earth and charts and measures the stars?…”

Will Durant - Is Man a Machine?


RESUMO

Os avanços na tecnologia foram de significativa importância para a humanidade,


contudo, provocaram também mudanças nas dinâmicas ambientais: uma série de erros e
decisões tomadas no passado afetam, até os dias de hoje, os ecossistemas do planeta. Com
a preocupação do aquecimento global em alta, a preservação florestal é catastróficamente
importante no momento. Desde os primórdios, a principal ameaça às florestas é o fogo e,
portanto, o monitoramento de incêndio é de extrema necessidade. Avanços recentes nas
áreas de Deep Learning e Computer Vision permitem o monitoramento inteligente por
meio de tecnologias de ponta. Um sistema de detecção de incêndio e fumaça requer
mecanismos de resposta precisos, rápidos e executados em tempo real para a tomada de
decisões certas e o envio do imediato alerta. A proposta apresentada por este trabalho é
um sistema de monitoramento utilizando Neural Networks e Computer Vision. A Rede
Neural é um sistema adaptativo e dinâmico, onde os computadores aprendem com os
erros e se aprimoram continuamente. Com isso, a Rede Neural foi treinada para identificar
princípios de fumaça e incêndio em alguns cenários. O modelo utiliza Convolutional
Neural Network (CNN) e tem como hiperparâmetros: 27 epochs, learning rate 0.001, 4
convolutional layers, 2 fully connected layers (sendo uma hidden layer e uma output
layer) e apresentou uma média de 94.6 % de Accuracy no treinamento; podendo portanto
ser expandido para uma gama maior de cenários, com um banco de dados suficientemente
diverso.

PALAVRAS – CHAVE: Prevenção de Incêndio, Inteligência Artificial, Visão


Computacional.
ABSTRACT

Advances in technology were of significant importance to humanity, however,


they also caused changes in environmental dynamics: several mistakes and decisions
wrongly taken in the past affects, to this day, the planet's ecosystems. With concerns about
global warming on the rise, forest preservation is catastrophically important right now.
Since the beginning, the main threat to forests is fire and, therefore, fire monitoring is
extremely necessary. Recent advances in Deep Learning and Computer Vision fields
allowed intelligent monitoring through edge technologies. Fire and smoke monitoring and
detection systems require accurate, fast and real-time response mechanisms to make the
right decision and send immediate alerts. The proposal presented by this work is a
monitoring system using Neural Networks and Computer Vision. The Neural Network is
an adaptive and dynamic system, whereby computers learn from mistakes and continually
improve. With that being said, the Neural Network was trained to identify smoke and fire
at beginning level in a specific forest. This present article demonstrates, quantitatively,
the first results of the study about the developed Neural Network and how we can use
them to prevent environmental disasters. The models were created using Convolutional
Neural Network (CNN) and the one with the best results had the following
hyperparameters: 16 epochs, learning rate 0.001 , 4 convolutional layers, 2 fully
connected layers (one hidden layer and one output layer) and presented an average of
94.6% Accuracy in training; therefore it could be expanded to a wider range of scenarios,
with a diverse dataset .

KEY WORDS: Fire prevention, Computer Vision, Artificial Intelligence.


LISTA DE ILUSTRAÇÕES

Figura 1: Diferenças entre Programação Clássica e o Machine Learning 26


Figura 2: Principais formas de aprendizado no Machine Learning 28
Figura 3: Representação do neurônio biológico 30
Figura 4: Modelo de McCulloch- Pitts 32
Figura 5: Tipos de Topologias 33
Figura 6: Representação esquemática das ilimitadas conexões em um Perceptron simples 35
Figura 7: Diagrama Venn do mesmo modelo Perceptron 35
Figura 8: Função de Ativação Sigmoid 38
Figura 9: Função de Ativação ReLU 39
Figura 10 : Estrutura da CNN 41
Figura 11: Convolução aplicada nas CNNs 42
Figura 12: Diferença entre filtros 43
Figura 13: Diferença entre filtros 43
Figura 14: Max Pool em uma vizinhança (2x2) 44
Figura 15: Gráfico da função Log Loss 49
Figura 16: Fluxograma da Metodologia 51
Figura 17: Resultados dos Modelos na Primeira Etapa 59
Figura 18: Gráfico Accuracy x Epoch do Modelo 1 60
Figura 19: Gráfico Accuracy x Epoch do Modelo 2 60
Figura 20: Resultado do Modelo 3 61
Figura 21: Gráfico Accuracy x Epoch do Modelo 4 62
Figura 22: Histograma da última Epoch do Modelo 4 62
Figura 23: Gráfico Accuracy x Epoch do Modelo 5 63
Figura 24: Histograma da última Epoch do Modelo 5 64
Figura 25: Gráfico Accuracy x Epoch do Modelo 6 64
Figura 26: Histograma da última Epoch do Modelo 6 65
Figura 27: Gráfico Accuracy x Epoch do Modelo 7 65
Figura 28: Histograma da última Epoch do Modelo 7 66
Figura 29: Gráfico Accuracy x Epoch do Modelo 8 67
Figura 30: Histograma da última Epoch do Modelo 8 67
Figura 31: Gráfico Accuracy x Epoch 68
Figura 32: Gráfico Accuracy x Epoch dos Modelos 7 e 8 69
Figura 33: Gráfico Accuracy x Epoch dos 9 e 10 69
Figura 34: Gráfico Accuracy x Epoch 70
Figura 35: Gráfico Accuracy x Epoch do modelo 8 71
Figura 36: Gráfico Accuracy x Epoch 71
Figura 37: Gráfico Accuracy x Epoch 72
Figura 38: Gráfico Accuracy x Epoch 72
Figura 39 Nono Modelo 73
Figura 40: Décimo Modelo 73
Figura 41 a: Amostras de imagens de Fumaça do Treinamento 76
Figura 41 a: Amostras de imagens de Não Fumaça do Treinamento 76
Figura 42 a: Amostras de imagens de Fumaça da Validação e Teste 77
Figura 42 b: Amostras de imagens de Não Fumaça da Validação e Teste 77
Figura 43 a: Amostras de imagens de Fumaça do Teste 78
Figura 43 b: Amostras de imagens de Não Fumaça do Teste 78
LISTA DE TABELAS

Tabela 1: Vídeos de Toreyin utilizados 51


Tabela 2: Quantidade de imagens em cada diretório 52
Tabela 3: Convolutional Layers (ConvNet) 53
Tabela 4: Dense Layers (Fully Connected Layer) 54
Tabela 5: Hiperparâmetros do Treinamento 54
Tabela 6: Resultados com o banco de dados “Validação” 73
Tabela 7: Resultados com o banco de dados “Teste” 73
LISTA DE ABREVIATURAS E SIGLAS

CNN - Convolutional neural network


MCP - Model McCuloch-Pitts
RNA – Redes Neurais Artificiais
ReLU - Rectified Linear Unit
SUMÁRIO

1. INTRODUÇÃO 14
2. OBJETIVOS 17
3. FUNDAMENTAÇÃO TEÓRICA E REVISÃO DA LITERATURA 18
3.1. DESASTRES AMBIENTAIS 18
3.2. INCÊNDIO 19
3.3. SISTEMAS AMBIENTAIS 20
3.4. PYTHON 22
3.5. CIÊNCIA DE DADOS 24
3.6. MACHINE LEARNING 26
3.7. REDES NEURAIS 29
3.8. REDE NEURAL CONVOLUCIONAL (CNN) 39
3.9. REDE NEURAL CONVOLUCIONAL APLICADA À DETECÇÃO DE INCÊNDIO 44
3.10. TENSORFLOW 46
4. METODOLOGIA 50
4.1. ESTUDO INICIAL 51
4.2. BANCO DE DADOS 51
4.2.1. BANCO DE DADOS DO TREINAMENTO 51
4.2.2. BANCO DE DADOS DOS TESTES DE VALIDAÇÃO E TESTE 52
4.3. MODELOS 53
4.3.1. ANÁLISES PROPOSTAS 54
4.3.2. HIPERPARÂMETROS 54
4.4. ETAPAS 56
4.4.1. PRIMEIRA ETAPA 56
4.4.2. SEGUNDA ETAPA 56
4.4.3. VALIDAÇÃO 57
4.4.4. TESTE Error! Bookmark not defined.
5. RESULTADOS 58
5.1. PRIMEIRA ETAPA 58
5.2. SEGUNDA ETAPA 68
5.3. VALIDAÇÃO 73
5.4. TESTE 74
6. CONCLUSÃO 79
7. REFERÊNCIAS BIBLIOGRÁFICAS 80
8. ANEXOS 85
1. INTRODUÇÃO

Detectar fogo em estágio inicial, antes que ele se transforme em um


evento catastrófico, é crucial para evitar desastres, salvar vidas e propriedades.
Dentro desse aspecto prevencionista, a proteção florestal é uma parte
fundamental no assunto ambiental, pois o incêndio mostra-se como o principal
agente causador de danos às florestas ao redor do mundo (SOARES, 1972). De
acordo com o Greenpeace, o aumento das queimadas é uma "tragédia
anunciada". Somente na Amazônia brasileira, o número de focos de incêndio
cresceu em 75% em comparação à década anterior.
Sendo o fogo umas das principais fonte de danos às florestas, é natural
que os ambientalistas dediquem atenção especial a esse problema (SOARES,
1972). Muito se tem estudado e pesquisado sobre o comportamento e medidas
de controle dos incêndios. Contudo, no passado, a atenção era quase que
totalmente dirigida para se estimar as atividades de supressão do fogo,
procurando estabelecer a extensão dos aperfeiçoamentos aplicados na
supressão dos incêndios (VINES, 1969). A tendência moderna, no entanto, é
dedicar maior atenção às etapas de prevenção e pré supressão.
Uma das formas mais utilizadas para a prevenção de incêndio é a
utilização de sensores. Embora os sensores de detecção de incêndio e fumaça
sejam amplamente instalados em ambientes internos, eles geralmente exigem
que o fogo queime por um tempo para produzir uma grande quantidade de
fumaça e, em seguida, acionar o alarme. Além disso, esses dispositivos não
podem ser implantados em ambientes externos, de grande escala (por exemplo,
uma floresta) (ZHANG, 2016). Portanto, devemos procurar por tecnologias
alternativas que supram o déficit que sensores apresentam para o
monitoramento de ambientes externos.

Recentemente, após grandes avanços nas estruturas de programação e


no Machine Learning, os sistemas computacionais foram aprimorados para
serem capazes de monitorar em tempo real. Os modelos de Machine Learning
são usados para encontrar uma relação entre os dados não convencionais e
seus componentes usando funções não lineares (SCARDAPANE, 2020); são
capazes de aprender relações implícitas e, assim, tomar decisões sem exigir
instruções explícitas (KHAN et al, 2020).
Quando Alan Turing, em 1959, perguntou “Can machines think?” ele
introduziu o início de uma mudança nos paradigmas de máquinas, dando início
à Inteligência Artificial (e, por trás, a programação). A programação é o ponto
de impacto, o ponto de apoio e a alavancagem significativa em uma sociedade
digital. Se não aprendermos a programar, arriscamos a ser programados
(RUSHKOFF, 2010).
A programação está intrinsecamente ligada à máquina e o
desenvolvimento de tecnologias digitais têm proporcionado mudanças
relevantes para a sociedade contemporânea LEVY (2010). Por conta disso, a
tecnologia tem sido um dos temas mais estudados atualmente. Em todas as
áreas do conhecimento ela se faz presente, não só como tema de debate, mas
transformando a ação humana e os objetos produzidos. Se no passado a
distinção entre natureza e máquina era natural, hoje essas diferenças tendem a
ganhar contornos bem mais obscuros (SASS, 2015).
Nos tempos atuais, existe uma extensa diversidade de linguagens de
programação, incluindo C++, Java, R, MATLAB, Júlia e, finalmente, Python.
Python é uma linguagem de programação de Alto Nível, Open Source, orientada
ao objeto e, atualmente, é amplamente utilizada por programadores, tornando-
se bastante popular no meio. A filosofia do seu design enfatiza a leitura do código
e sua sintaxe permite que programadores expressem conceitos em menos linhas
de código que em outras linguagens (SRINATH, 2017).

A eficiência e precisão, na visualização dos dados, apresentadas pelo


Python expressam seu grande potencial para a análise de dados. De acordo com
LEMENKOVA (2019), sendo Python uma linguagem de alto nível, ela mostra
uma aproximação mais objetiva para a análise de dados estatísticos, enquanto
outras linguagens implicam em mais poder na visualização de dados, por
exemplo. Além disso, Python é bastante versátil e sua diversidade de módulos,
implicando que pode-se construir programas mais sofisticados (OLIPHANT,
2007). Por conta dessa flexibilidade dos módulos,essa linguagem é aplicada em
diversas áreas, incluindo as do escopo deste presente trabalho, sendo elas
Ciência de Dados, Machine Learning e Redes Neurais.

No campo das Redes Neurais, existe um tipo especial de rede, chamada


Convolutional Neural Network (CNN). A CNN tem apresentado notável
desempenho nas áreas de Visão Computacional e Processamento de Imagens
(KHAN, 2020). Algumas aplicabilidades da CNN incluem Classificação e
Segmentação de Imagens, Detecção de Objetos, Processamento de Vídeo,
Processamento de Linguagem Natural e Reconhecimento de Fala.

Sendo o Machine Learning, assim como as Redes Neurais, aplicáveis à


linguagem Python, então podemos usá-los em prol das questões ambientais.
Dentre essas questões, a principal abordada por este trabalho: a prevenção de
incêndio. Portanto, uma Rede Neural treinada, que recebe imagens de câmeras
e, baseado na Visão Computacional, consegue identificar fumaça e detectar
princípios de incêndio, mostra-se adequada para o monitoramento ambiental.
Desta forma, o presente trabalho traz a metodologia e análise sobre o uso
de CNNs para detectar e prevenir incêndio. Portanto, serão apresentados os
modelos desenvolvidos, com detalhes das topologias de rede, configurações de
treinamento e validação, assim como análise dos resultados.
2. OBJETIVOS

O presente estudo tem como objetivo desenvolver modelos, baseados na


visão computacional, capazes de monitorar focos de incêndio de forma
automática.

São objetivos específicos deste trabalho:

o Configurar, treinar e validar modelos de redes neurais


convolucionais para detecção de focos de incêndio

o Usar o pacote Tensorflow para o desenvolvimento do projeto

o Identificar base de dados de imagens para treinar os modelos


propostos

o Identificar uma metodologia para o desenvolvimento de redes


neurais convolucionais para detecção de focos de incêndio
3. FUNDAMENTAÇÃO TEÓRICA E REVISÃO DA LITERATURA

3.1. DESASTRES AMBIENTAIS

A Primeira Revolução Industrial, no final do século XVIII, foi ponto de


partida para grandes mudanças no planeta. Como consequência da alteração
das atividades produtivas, anos depois, desastres ambientais ocorreram
causando milhares de mortes e chamando atenção, a partir do final da década
de 1960, para a necessidade de reformas no sistema produtivo e de consumo
(POTT, 2017).

O avanço da humanidade, da economia e da tecnologia e ciência


provocaram também mudanças nas dinâmicas ambientais: uma série de erros
e decisões tomadas no passado afetam, até os dias de hoje, os ecossistemas
do planeta. Contaminações dos recursos hídricos, poluição do ar, escassez de
matéria prima, degradação ambiental, alterações na fauna e flora, além do
aumento na frequência de eventos extremos, caracterizados como desastres
ambientais, são alguns dos problemas decorrentes da negligência de gerações
passadas sobre as questões ambientais (VAN AALST, 2006).

Ao longo das duas últimas décadas, evidências mostram que o clima


global está mudando, e, também, que as emissões de gases do efeito estufa,
por atividades antrópicas, são grandes responsáveis por isso. Enquanto as
mudanças, em termos gerais, podem ter sérias consequências por si só, os
maiores impactos da mudança climática global serão devidos as variações
climáticas e os eventos extremos (VAN AALST, 2006).

De acordo com a Revisão Estatística de Desastres Anuais (Annual


Disasters and Statistical Review) de 2012 (GUHA-SAPIR, 2013), a média anual
do número de vítimas por desastres naturais entre os anos 2000 e 2013 é
estimada em 280 milhões de pessoas ao redor do mundo. Os gastos econômicos
foram estimados em 143 milhões de dólares, em 2012 (MBAYE, 2015). Ao longo
da última década, China, Estados Unidos, Índia e Filipinas formaram o top 5 de
países mais atingidos por desastres naturais.
3.2. INCÊNDIO

O fogo é um fenômeno natural que teve papel fundamental no


desenvolvimento da humanidade nos primórdios e ainda se faz presente na
renovação da paisagem, que modela as florestas, e é anterior às influências do
Homem na tentativa de controlar a natureza (VERDE, 2010).

Contudo, sendo o fogo o maior inimigo e a maior fonte potencial de danos


às florestas de todo o mundo, é natural que seja dedicada atenção especial aos
problemas dos incêndios florestais (SOARES, 1972). De acordo com o
Greenpeace, o aumento das queimadas é uma "tragédia anunciada". Os
incêndios florestais têm destruído, nos últimos anos, milhares de hectares de
áreas verdes ao redor do mundo e a proteção florestal é uma parte fundamental
dentro das questões ambientais modernas. Adicionalmente, não se protege
adequadamente aquilo cujo valor se desconhece, e não se pode (ou não se
deveria) valorar bens ambientais. Portanto, não se deve medir esforços (ou fazer
economia) na questão da proteção ambiental.

Dentro desse aspecto protecionista, as acções de preservação se


mostram necessárias e devem ser integradas junto com uma efetiva gestão de
risco para redução dos prejuízos e optimização dos investimentos na própria
prevenção e posterior supressão. E muito se tem estudado e pesquisado sobre
o comportamento e medidas de controle dos incêndios. Contudo, no passado, a
atenção era quase que totalmente dirigida para se estimar as atividades de
supressão do fogo, ano após ano, procurando estabelecer a extensão dos
aperfeiçoamentos aplicados na supressão dos incêndios (VINES, 1969). A
tendência moderna, no entanto, é dedicar maior atenção às etapas de prevenção
e pré-supressão.

Uma das principais formas de garantir a pré-supressão é utilizando


índices de incêndio. Dentre as diversas metodologias propostas por vários
autores (vide Lourenço, 1980 e 2004; Vasconcelos, 2006 ; Weber et al, 1987),
estes estudos incidem, normalmente, sobre as componentes da perigosidade;
que podem variar entre variáveis químicas, meteorológicas, econômicas,
ambientais ou antropológicas, dependendo do autor. Contudo, a ideia principal
é obter um índice numérico que possa utilizar-se para prever o comportamento
do fogo, sensibilizar a população, aplicar restrições definidas por lei, manter
dispositivos de informação pública ou, simplesmente, prevenir desastres
(VERDE, 2010).

Dentre as formas mais utilizadas para a prevenção de incêndio, temos a


utilização de sensores para monitorar os níveis de CO2, temperatura ou
umidade. Embora os sensores de detecção de incêndio e fumaça sejam
amplamente instalados em ambientes internos, eles geralmente exigem que o
fogo queime por um tempo para produzir uma grande quantidade de fumaça e,
em seguida, acionar o alarme . Além disso, esses dispositivos não podem ser
implantados em ambientes externos, de grande escala, pois dependem de
diversos fatores externos para, de fato, monitorar (incluindo direção do vento,
proximidade do foco de incêndio, etc) (ZHANG, 2016). Portanto, devemos
procurar por tecnologias alternativas que supram o déficit que sensores
apresentam para o monitoramento de ambientes externos.

3.3. SISTEMAS AMBIENTAIS

As questões ambientais despertam a curiosidade de estudiosos desde a


antiguidade oriental e a tentativa de explicação dos fenômenos ambientais foi
postulada desde a Antiguidade Clássica, pelos filósofos gregos e romanos,
estendendo-se até o período moderno, em que a visão proposta a Geografia pela
contribuição epistemológica do filósofo Immanuel Kant e o desenvolvimento de
fundamentos prático-metodológicos por Forster, abriram o caminho para a
sistematização de uma Geografia científica (LENCIONI, 1999, VITTE, 2007 e
MOREIRA, 2008).

No início do século XX, o termo “ambiente” era discutido principalmente


entre os biólogos e não era inserido como uma categoria de análise na
Geografia. Em 1918, a obra de Thienemann, apud Cavalcanti e Rodriguez
(1997), foram consideradas fundamentais para a Ecologia pela interpretação das
inter-relações entre organismos e seus espaços de vida, constituindo-se na
integração da Ecologia, às ciências naturais

Um pressuposto importante na definição contemporânea do termo


“ambiente” foi a contribuição de Tansley (1935), ao propor o conceito de
ecossistema, que centralizava a análise da relação organismo-meio, baseada na
concepção da Teoria Geral de Sistemas. Assim, desenvolveu-se uma atenção
privilegiada ao estudo do funcionamento dos sistemas ecológicos, das trocas de
energia e matéria entre os componentes naturais e os organismos. Porém, o
entorno ambiental, nas primeiras análises dos ecossistemas, se concebia como
fatores ou componentes isolados do meio que não se consideravam como
totalidades, o que dificultava a representação espacial dos mesmos
(RODRIGUEZ e SILVA, 2002)

Os primeiros estudos que envolviam princípios sistêmicos (sistêmico diz


respeito a algo organizado, que tem uma regra) tiveram início no final do século
XIX, na Rússia, quando Dokoutchaev, apud Rodriguez, Silva e Cavalcanti
(2004), denominou de ‘’ciência da paisagem’’ todo o complexo natural territorial,
e a interação de componentes bióticos e abióticos que se desenvolvem no
interior de um complexo sistêmico (RODRIGUEZ, SILVA e CAVALCANTI, 2004).
Outra contribuição russa na concepção de ambiente sob a perspectiva sistêmica,
segundo Cavalcanti e Rodriguez (1997), foram os estudos de Borzov em 1908 e
Berg em 1913, que definiram o termo Landschaft (paisagem), de maior
penetração, e o definiram como uma região em que o relevo, o solo e a
vegetação estão organizados formando um conjunto, e que este conjunto
aparece de forma similar numa mesma zona geográfica.

A temática ambiental também foi analisada a partir de estudos sistêmicos,


apoiada na Teoria Geral dos Sistemas. Para Bertalanffy (1976), a Teoria Geral
dos Sistemas tem por fim identificar as propriedades, princípios e leis
característicos dos sistemas em geral, independentemente do tipo de cada um,
da natureza de seus elementos componentes e das relações ou forças entre
eles. Um sistema se define como um complexo de elementos em interação,
influência essa de natureza ordenada (não fortuita) (AMORIM, 2012).

Por meio da abordagem de sistemas, o potencial ecológico e a exploração


biológica devem ser considerados como fatores determinantes para a
identificação do ambiente. Embora sejam fenômenos naturais, é indiscutível a
interferência das atividades antrópicas em seu funcionamento, considerando
ainda a sua dinâmica, que é caracterizada pelo fluxo e a transferência de matéria
e energia.
Baseando-se nas discussões mais recentes sobre a temática ambiental,
no âmbito da Geografia, Perez Filho (2007) afirma que: “os termos “ambiente”
e “organizações espaciais”, numa concepção sistêmica, são sinônimos”.

Portanto, pode-se considerar que os Sistemas Ambientais constituem um


objeto de estudo da Geografia, possuindo uma extensão territorial definida e,
ainda, são produto das interações entre os Sistemas Naturais (Geossistemas ou
físico territoriais) com os Sistemas Antrópicos (sistemas socioeconômicos) e as
influências proporcionadas pelos aspectos físicos, químicos e biológicos.

Nos Sistemas Ambientais, mesmo nas áreas urbanizadas ou com intensa


atividade agrícola, a natureza apresenta uma dinâmica própria, claro que
adaptada às novas condições. Como exemplo, podemos citar a questão dos
Geossistemas em áreas urbanas, onde a impermeabilização dos solos altera a
dinâmica do escoamento e infiltração da água. Seguindo as leis da natureza, as
águas buscam outra dinâmica, outro fluxo, desencadeando novos fluxos de
matéria e energia. O resultado pode ser a ocorrência de inundações, o
incremento de mais água e sedimento em outro canal, o desencadeamento de
novos processos erosivos, a ocorrência de movimentos de massa entre outros
(AMORIM, 2012).

3.4. PYTHON

A decisão de criar um script vem sempre seguida da tarefa de se escolher


uma linguagem de programação. Uma linguagem pode ser escolhida pelo gosto
pessoal do programador, pelo padrão de aplicação em projetos específicos ou
pelas funcionalidades e peculiaridades que a mesma tem a oferecer ao
programador.

Enquanto, por um lado, os programadores de sistemas buscam


confiabilidade, segurança e manutenibilidade, por outro, eles dependem de
desempenho e acesso transparente aos níveis primitivos baixos (comunicação
com o Hardware) (FRAMPTON, 2009).

A linguagens de Baixo Nível são voltadas para o Hardware, utilizando


binários e estando mais próxima da simbologia da máquina, possui o objetivo de
se comunicar com o computador de maneira mais rápida e eficaz. Ao contrário
das linguagens de Alto Nível, as de Baixo Nível são direcionadas para o
processamento da máquina. Por conta disso, ela possui uma sintaxe mais
complexa e não conta com comandos intuitivos. Estas linguagens se subdividem
em dois tipos: as linguagens de máquina e as linguagens de montagem (também
conhecidas como linguagens de nível intermediário)

As linguagens de Alto Nível estão muito mais próximas


do programador do que do dispositivo. Se assemelham mais com a linguagem
humana, utilizando comandos mais simples e intuitivos. O poder das linguagens
de Alto Nível está na sua abstração sobre a complexidade do hardware e do
software, garantindo maior segurança, melhor confiabilidade e menor custo de
desenvolvimento (processamento) (FRAMPTON, 2009). Portanto, o principal
objetivo é facilitar a maneira de programar, sendo mais intuitiva, amigável e fácil
de aprender, principalmente para iniciantes na área de programação.

Python foi criado no começo dos anos 90 por Guido van Rossun no
Stichting Mathematisch Centrum (Centrum Wiskunde & Informatica, CWI), na
Holanda, como sucessor da linguagem de programação ABC. (VAN ROSSUM,
1995). É uma linguagem de programação de Alto Nível e de propósito geral. Sua
filosofia de design enfatiza a legibilidade do código, com o uso de identação
(espaçamento). Sua linguagem de construção e abordagem orientada a objetos
visa ajudar os programadores a escreverem um código claro e lógico, sendo para
projetos de pequena ou grande escala (VAN ROSSUM,2007).

Python usa Tipagem Dinâmica (não exige declaração dos tipos de


variáveis) e Garbage-Collected (gerenciamento de memória automático).
Suporta diversos paradigmas de programação, incluindo a possibilidade de usar
programação estruturada (particularmente procedural) ou programação
orientada à objetos (composição e interação entre diversas unidades de software
chamadas de objetos) e programação funcional (aplicação e composição de
funções). Além de contar com uma biblioteca padrão abrangente e flexível,
podendo ser incluídos módulos externos, de acordo com a necessidade do
programador. (VAN ROSSUM,2007)
Em relação à Computação Científica, de acordo com (OLIPHANT, 2007),
alguns dos motivos pelos quais Python se destaca no ramo são

I. Uma licença de código aberto permite o uso ou distribuição do script da melhor


forma, sem necessidade de permissão extra.
II. A sintaxe limpa da linguagem, mas com construções sofisticadas, permitem uma
escrita de maneira procedural ou totalmente orientada a objetos, conforme a
situação ditar.
III. Um poderoso interpretador interativo permite o desenvolvimento de códigos e a
experimentação (testagem) em tempo real, eliminando assim a etapa de
compilação demorada e que consome produtividade no processo de
desenvolvimento de código e teste.
IV. A capacidade de interagir com uma ampla variedade de outros softwares permite
integração com habilidades de outros softwares.
V. A grande diversidade de módulos permite a construção de programas
sofisticados de forma rápida e eficiente.

Por si só, Python é uma excelente linguagem de ‘’direcionamento’’ para


códigos científicos escritos em outras linguagens. Contudo, com ferramentas
básicas adicionais, Python se transforma em uma linguagem de Alto Nível
adequada para programação científica e engenharia, sendo geralmente rápida o
suficiente para ser imediatamente útil, mas também flexível o suficiente para ser
incrementada com extensões adicionais (OLIPHANT, 2007).

3.5. CIÊNCIA DE DADOS

Os dados estão crescendo muito mais rápido no mundo de hoje e não é


tão fácil processá-los manualmente. Os programas de análise e visualização de
dados permitem alcançar uma compreensão ainda mais profunda. A linguagem
de programação Python, com seus comandos simples e sintaxe fácil, oferece
uma alternativa de código aberto incrivelmente poderosa às técnicas e
aplicativos tradicionais (SAHOO, 2019).

Os dados precisam ser analisados para produzir bons resultados. A


análise de dados permite que as empresas entendam a eficiência e desempenho
interno e, em último caso, a análise ajuda a empresa a tomar decisões mais
informadas. A análise de dados pode ser aplicada a quase todos os aspectos de
um negócio se entendermos as ferramentas disponíveis para processar
informações (SAHOO, 2019).

Em relação à análise de dados, podemos definir um cientista de dados


como alguém que extrai conhecimento de dados desorganizados (GRUS,
Joel. 2019). A Análise Exploratória de Dados (EDA) é uma abordagem para
resumir os dados, pegando suas principais características e visualizando-os com
representações adequadas. A EDA concentra-se mais estritamente na
verificação das suposições necessárias para o ajuste do modelo e teste de
hipóteses, além de lidar com valores ausentes e fazer transformações de
variáveis, conforme necessário.

Os insights obtidos na Análise Exploratória de Dados (EDA) são utilizados


na tomada de decisões estratégicas de negócios, por exemplo (Tufféry, 2011).
A EDA é um procedimento fundamental que faz uso de técnicas estatísticas e
representações gráficas para obter insights de dados (Cui et al., 2018). A EDA
não só ajuda com a identificação de padrões ocultos e correlações entre atributos
nos dados, mas também ajuda na formulação e validação de hipóteses (GHOSH,
2018).

Essencialmente, a análise exploratória de dados é uma abordagem para


ver o que os dados podem comunicar, além da modelagem formal ou da tarefa
de teste e validação de hipóteses. A EDA ajuda a analisar os conjuntos de dados
para resumir suas características estatísticas com foco em quatro aspectos
principais, como: medidas de tendência central (compreendendo a média, moda
e mediana), medidas de dispersão (compreendendo desvio padrão e variância),
a forma da distribuição e a existência de outliers.
3.6. MACHINE LEARNING

Apesar do rápido desenvolvimento na indústria de máquinas, desde a


primeira revolução industrial, a inteligência continua sendo a principal diferença
entre humanos e máquinas. O corpo humano usa os sentidos para coletar
informações do ambiente que o cerca e o cérebro humano analisa essas
informações e toma decisões para cada situação. As máquinas, ao contrário,
não são inteligentes por natureza. Máquinas não têm a capacidade de analisar
dados e tomar decisões (MOHAMMED et al, 2016).

Computadores são máquinas que seguem instruções de uma


programação para realizar tarefas necessárias. Na Programação Clássica, para
se obter resultados, dados são fornecidos e instruções são criadas (expressas
por uma linguagem de programação). Um computador não consegue lidar com
os dados coletados de uma maneira inteligente. Diferentemente de nós,
humanos, computadores não têm a capacidade cognitiva de analisar dados para
classificação, beneficiar-se de experiências vivenciadas anteriormente e
armazenar novas experiências às unidades de memória; ou seja, as máquinas
não aprendem com experiências sensoriais e memórias (MOHAMMED, 2016).
No Machine Learning dados são fornecidos junto com as “respostas” para que o
computador possa determinar regras que associam ambas (identificando
padrões) e, com isso, “aprender”. A Figura 1 demonstra as diferenças entre as
formas de programação abordadas.

Figura 1: Diferenças entre Programação Clássica e o Machine Learning

Fonte: Coursera
Sendo inicialmente uma idealização da Ciência da Computação, quando
Alan Turing idealizou ser possível que um computador pensasse, no século
passado, o Machine Learning tornou-se um artifício necessário nos tempos
atuais. O Machine Learning trata do design de programas que podem aprender
regras a partir de dados, adaptar-se às mudanças e melhorar o desempenho
com a experiência (BLUM, 2007); sendo esperado que os computadores
resolvam problemas cada vez mais complexos e que se tornem mais integrados
em nosso cotidiano.

No campo do Machine Learning, de acordo com Tom M. Mitchell (1983):

É dito que um programa de computador aprende com a experiência E,


em relação a algumas tarefas T, e com desempenho P se o seu
desempenho, em relação à T, melhora com a experiência E.

O estudo e a modelagem computacional dos processos de aprendizagem


em suas múltiplas manifestações constituem o objeto de estudo da
aprendizagem de máquina. De acordo com Carbonell (1983) o campo do
aprendizado de máquina é organizado em torno de três pilares, sendo eles:

I. Estudos orientados a tarefas: o desenvolvimento e a análise de sistemas


de aprendizado para melhorar o desempenho em um conjunto definido
de tarefas.

II. Simulação cognitiva: a pesquisa e simulação computacional dos


processos de aprendizagem humana.

III. Análise teórica: exploração teórica do espaço de possíveis métodos de


aprendizagem e de algoritmos.

Existem algumas tarefas que nós, humanos,conseguimos aprender e


executar sem esforço (ou com alguns esforços), mas, as vezes, somos
incapazes de explicar como as compreendemos. A ideia principal do Machine
Learning não é compreender os processos implícitos que nos ajudam a aprender
uma tarefa, mas sim projetar um programa que construirá um modelo que
associará os dados de entrada com os resultado desejados e, com isso, permitir
que o computador aprenda conhecimentos instruídos pelo usuário e execute
tarefas de forma mais independente e eficiente (MOHAMMED, 2016).
Figura 2: Principais formas de aprendizado no Machine Learning

Fonte: Google

De acordo com MOHAMMED (2016), as principais formas de aprendizado


no Machine Learning, assim como algumas aplicações, são mostrados na Figura
2 e são:

I. Aprendizagem Supervisionada (Supervised Learning): onde objetivo é inferir


uma função ou mapeamento a partir de dados que podem ser classificados. Os
dados para os treinamentos consistem no vetor de entrada X (input) e no vetor
de saída Y (output).
II. Aprendizagem Não-supervisionada (Unsupervised Learning): A principal
característica da aprendizagem não supervisionada é que não estão presentes
supervisores ou dados de treinamento. Em outras palavras, tudo o que temos
são dados não classificados (categorizados). Podendo haver uma série de
razões para os dados não terem classificação, a ideia principal é encontrar
informações ocultas nestes dados.
III. Aprendizado Reforçado (Reinforcement Learning): O método de aprendizado
por reforço visa usar observações coletados a partir da interação com o
ambiente (environment) para tomar decisões que maximizam a recompensa
(reward) ou minimizam o risco (risk)
Por fim, o processo de aprendizado é um fenômeno peculiar para nós,
humanos. Contudo, ele pode ser integrado à máquinas para, com isso, simular,
de forma limitada, o aprendizado (como ensinar à uma criança). Will Durant em
seu famoso livro The Pleasures of Philosophy questionou, no capítulo intitulado
“Is Man a Machine?”, quando ele escreveu tais linhas clássicas:

“ Here is a child; … See it raising itself for the first


time, fearfully and bravely, to a vertical dignity; why should
it long so to stand and walk? Why should it tremble with
perpetual curiosity, with perilous and insatiable ambition,
touching and tasting, watching and listening, manipulating
and experimenting, observing and pondering, growing—till
it weighs the Earth and charts and measures the stars?…”

3.7. REDES NEURAIS

As Redes Neurais motivam-se nos paradigmas da Neuro Computação e


são um dos campos de conhecimento do Machine Learning. São inspiradas
pelas capacidades cognitivas das redes neurais biológicas e pelo conhecimento
da Neurociência (RAUBER, 2005). Na questão da biologia, algumas qualidades
do cérebro humano qualificam um comportamento inteligente, dentre elas temos:

I. Robustez e tolerância a falhas: A eliminação de alguns neurônios não afeta a


funcionalidade global.

II. Capacidade de aprendizagem: O cérebro é capaz de aprender novas tarefas


que nunca foram executadas antes.

III. Processamento de informação incerta: Mesmo que a informação fornecida


esteja incompleta, afetada por ruído ou parcialmente contraditória, ainda um
raciocínio correto é possível.

IV. Paralelismo: Um imenso número de neurônios está ativo ao mesmo tempo. Não
existe a restrição de um processador que obrigatoriamente trabalhe uma
instrução após a outra.
O processamento local de informação no cérebro ocorre em uma rede de
neurônios cujos quais têm uma estrutura relativamente simples. Sendo o
neurônio uma célula com núcleo e corpo (soma), o processamento de
informação provém de reações químicas e elétricas entre diferentes neurônios.
A ligação com outros neurônios é realizada através de sinapses que estão
conectadas a um dendrito do neurônio receptor. Esses dendritos recebem
informações dos neurônios antecessores e, em seguida, o núcleo avalia as
informações recebidas e, por fim, o núcleo determina o tipo de saída (excitação
ou inibição). A saída da informação do soma é realizada por impulsos elétricos
que se propagam através do axônio. No final do axônio existem inúmeras
ramificações que distribuem a informação para os neurônios seguintes. A
sinapse dispara uma substância química quando for excitada pelo impulso do
axônio. A substância se transmite entre a sinapse e o dendrito, realizando a
conexão entre neurônios vizinhos. A Figura 3 apresenta o modelo simplificado
de um único neurônio real.

Figura 3: Representação do neurônio biológico

Fonte: RAUBER, 2005

Baseado nesse conhecimento biológico (que refletem importantes


características do aprendizado humano) e no interesse pelo campo da simulação
de capacidades cognitivas (inteligência artificial), pesquisadores criaram as
Redes Neurais Artificiais (RNA)(RAUBER, 2005). Uma RNA tem duas
características elementares: a arquitetura e o algoritmo de aprendizagem. Essa
divisão surge naturalmente pelo paradigma de como a rede é treinada. Ao
contrário de um computador com arquitetura de von Neumann, que é
programado, a rede é treinada por exemplos dos dados iniciais reais. (RAUBER,
2005).

De acordo com Freitas (2020), uma abordagem histórica sobre Redes


Neurais Artificiais deve incluir três das mais importantes publicações iniciais
sobre o assunto, sendo: McCulloch e Pitts (1943), Hebb (1949), e Rosenblatt
(1958). Estas publicações pioneiras introduziram o primeiro modelo de redes
neurais simulando “máquinas”, o modelo básico de rede de auto-organização, e
o modelo Perceptron de aprendizado supervisionado, respectivamente.

3.7.1. MODELO DE MCCULLOCH E PITTS

Um aspecto fundamental da função de um neurônio é que o efeito da


sinapse nervosa é variável, e essa variabilidade é o que dá ao neurônio sua
capacidade de adaptação (HAYMAN, 1999). O modelo de McCulloch e Pitts
(1943) serve como modelo básico de um neurônio artificial, e a adaptabilidade
vem da representação da ação sináptica por um peso. Esse peso representa o
grau de prioridade da informação recebida, cujo qual o neurônio deve analisar
durante a sinapse em questão. Matematicamente, tal peso é representado por
W e recebe valores entre -1 e 1.

Em relação ao neurônio propriamente dito, a informação (input) é recebida


pelos seus diversos dendritos. Informações sinápticas de fontes distintas
ocorrem em dendritos de domínios diferentes (SPRUSTON, 2008). No Modelo
de McCulloch e Pitts (MCP), o input recebido por um dendrito qualquer é
representado por X e recebe valores 0 ou 1 (HAYMAN, 1999).

Antes de determinar se deve ser feito o disparo do axônio (sua sinapse


propriamente dita), o neurônio avalia todos os sinais recebidos de outras
sinapses (estimulantes ou inibidoras). No modelo MCP, o sinal recebido de uma
sinapse n qualquer pode ser entendido como o produto 𝑋𝑛 ⋅ 𝑊𝑛 e a avaliação é
feita pela soma de todos os sinais recebidos, como demonstra a Equação 1:
𝑓(𝑋1 ⋅ 𝑊1 + 𝑋2 ⋅ 𝑊2 + . . . + 𝑋𝑛 ⋅ 𝑊𝑛 ) (1)

Onde:
𝑋𝑛 é o input recebido pelo n-ésimo dendrito;
𝑊𝑛 é o peso da informação do n-ésimo dendrito;
𝑓 é a função de ativação

Por fim, o ato do disparo (F) no axônio (do neurônio em questão) é


representado por 1 e o não-disparo por 0 (HAYMAN, 1999) (Equação 2 e 3).
Logo:

Se 𝜇 < 𝑓(𝑋1 ⋅ 𝑊1 + 𝑋2 ⋅ 𝑊2 + . . . + 𝑋𝑛 ⋅ 𝑊𝑛 ) , 𝐹 = 1 (2)

Se 𝜇 > 𝑓(𝑋1 ⋅ 𝑊1 + 𝑋2 ⋅ 𝑊2 + . . . + 𝑋𝑛 ⋅ 𝑊𝑛 ) , 𝐹 = 0 (3)

Onde:
𝜇 é o limiar de ativação (Threshold) daquele neurônio.

A representação do Modelo de McCulloch-Pitts pode ser vista na Figura 4.

Figura 4: Modelo de McCulloch- Pitts

Fonte: Rauber, 2005.


3.7.2. TOPOLOGIA
O potencial e flexibilidade das redes neurais vêm da topologia (estrutura)
baseada em conjuntos de neurônios interligados entre si (RAUBER, 2005). Esse
paralelismo de elementos com processamento local cria a “inteligência” global
da rede; onde um neurônio da rede recebe um estímulo nas suas entradas,
processa esse sinal e emite um novo sinal de saída que é recebido pelos outros
neurônios.

De acordo com Rauber (2005), os principais tipos de topologias das


Redes Neurais são: propagação para frente (Feedforward) e realimentação
(Recurrent). Os dois tipos de topologias podem ser vistos na Figura 5.
Figura 5: Tipos de Topologias

Fonte: Rauber, 2005

Redes realimentadas têm ligações entre os neurônios sem restrições. Ao


contrário das redes de propagação para frente, o comportamento dinâmico da
realimentação desempenha o papel fundamental nesse modelo (RAUBER,
2005). Em alguns casos os valores de ativação da rede passam por um processo
de relaxação até chegarem a um estado estável.

No caso das redes de propagação para frente o fluxo de informação é


unidirecional. Nesse modelo, os Neurônios recebem a informação dos seus
antecessores e, depois de avaliar, repassam ou não a informação pros
Neurônios seguintes. Além disso, Neurônios nesse modelo são agrupados em
camadas e recebem a informação simultaneamente

Nos anos iniciais da pesquisa sobre Redes Neurais, as redes de


propagação para frente chamavam-se Perceptrons. O modelo primordial é o
perceptron com uma única camada de Rosenblatt (1958). Quando existe mais
de uma camada (nomeadas de Hidden Layers) trata-se de perceptrons multi-
camada. Existem pesos (assimétricos) unidirecionais entre dois neurônios que
necessariamente têm que estar em camadas diferentes

3.7.3. PERCEPTRON
No campo do aprendizado, de acordo com Rosenblatt (1958), três
questões são fundamentais:

I. Como a informação do mundo físico é sentida, ou detectada,


pelo sistema biológico?
II. De que jeito a informação é armazenada ou lembrada?
III. Como a informação armazenada influencia no reconhecimento
e comportamentos?

Baseado na segunda pergunta, duas teorias foram consideradas por


Rosenblatt (1958). A primeira teoria propõe que o armazenamento de
informações sensitivas é feito no formato de representações codificadas ou de
imagens que são guardadas, sendo algum tipo de mapeamento um a um entre
os estímulos sensoriais. A segunda teoria propõe que, diferentemente da
primeira teoria, as imagens nunca sequer foram guardadas e, ainda, que o
sistema nervoso central age apenas como uma rede de trocas de estímulos e
que o aprendizado é feito na forma de novas conexões, ou caminhos, entre
centros de atividades (neurônios).

Para responder às três perguntas fundamentais (especialmente a


segunda e a terceira), Rosenblatt (1958) se baseou na segunda teoria e propôs
o modelo Perceptron; um sistema nervoso hipotético. O Perceptron é projetado
para ilustrar algumas das propriedades fundamentais dos sistemas de
inteligência sem se prender a condições biológicas desconhecidas. O modelo
simples do Perceptron é mostrado nas Figura 6 e Figura 7
Figura 6: Representação esquemática das ilimitadas conexões em um Perceptron simples

Fonte: ROSENBLATT (1958)

Figura 7: Diagrama Venn do mesmo modelo Perceptron

Fonte: ROSENBLATT (1958)

Onde, em termos atuais:


S - Fonte de dados
A - Camada de entrada (Input Layer)
R - Camada de Saída (output Layer)

De acordo com Rosenblatt (1958), se R1 acontecer, então R2 tende a ser


inibido (e também sua source-set). Analogamente, se R2 acontecer, então R1 e
sua source-set serão inibidos. A quantidade de A’s e R’s, assim como suas
conexões, podem ser ilimitadas. Se o total de impulsos (excitação ou inibição)
recebidos de todas as unidades A em um R qualquer for mais intenso (ou mais
frequente) que os impulsos antagônicos recebidos, então uma resposta terá
vantagem sobre a outra e será tal qual irá ocorrer. Se tal sistema é capaz de
aprender, então ele deverá ser capaz de alterar os A’s (ou suas conexões) de tal
forma que uma classe será capaz de gerar um impulso mais forte em certos R’s,
enquanto sua classe antagônica irá gerar impulsos mais fortes em outros R’s
diferentes. A intensidade desses impulsos pode ser caracterizada por um valor
(numérico) que determinará o quanto dado A influência dado R.

Por conta da sua estrutura, o Perceptron é capaz de classificar entre


classes que são linearmente separáveis (Clustering). A característica importante
do perceptron foi a apresentação de um algoritmo de aprendizagem capaz de
adaptar os pesos internos do neurônio de maneira que fosse capaz de resolver
o problema de classificação linear (caso seja possível separar linearmente as
classes) (RAUBER, 2005).

Contudo, de acordo com Minsky et al. (1969), a principal limitação do


Perceptron é o problema “Ou exclusivo” (XOR), demonstrado pela Equação 4:

𝑓(0,0) = 𝑓(1,1) = 0 , 𝑓(0,1) = 𝑓(1,0) = 1 (4)

Sendo a Equação 1 uma função simples de classificação que não pode


ser calculada pelo modelo Perceptron inicial. A solução para o problema XOR já
era conhecida na época: acrescentar mais uma camada de neurônios na rede
(em termos atuais: uma Hidden Layer) ; contudo, a maior dificuldade na época
era a implementação de um algoritmo que fosse capaz de treinar os pesos dessa
rede multi-camada para que, por fim, o Perceptron pudesse classificar
corretamente problemas mais complexos. Tal algoritmo foi proposto anos depois
por (Rumelhart et al, 1986), sendo o algoritmo da retropropagação de erro (error
backpropagation) e, com isso, criando o Perceptron Multi-camadas. A partir
desse momento, surgiram inúmeros novos modelos, incluindo o Perceptron
Multi-camadas, que foram desenvolvidos nos anos seguintes; junto com novos
algoritmos de aprendizagem, que foram implementados.
3.7.4. FUNÇÃO DE ATIVAÇÃO

As funções de ativação são frequentemente usadas nas Redes Neurais


para transformar um sinal de entrada de um neurônio em um sinal de saída (que
serve como entrada à próxima camada de neurônios) (SHARMA et al, 2020).

A função de ativação é aplicada na soma dos produtos entre os dados de


entrada (inputs) e seus pesos associados (weight) para, em seguida, determinar
o output que alimentará a próxima camada de neurônios, como proposto pelo
modelo MCP (MCCULLOCH et al, 1949).

As funções de ativações podem ser lineares ou não-lineares. De acordo


com SHARMA et al, (2020), funções lineares permitem apenas associações
lineares e, quando usadas em uma Rede Neural, suas limitações permitem
somente adaptações lineares da Rede. Contudo, na maioria dos casos, os erros
possuem propriedades não lineares, que não podem ser ajustados por uma
função linear e, por conta disso, comprometem a capacidade de aprendizado
das Redes.

Portanto, funções não lineares são mais utilizadas nas Redes Neurais.
Algumas das funções de ativações são:

I. Binary Step Funcion


II. Linear
III. Sigmoid
IV. Tanh
V. ReLU
VI. Leaky ReLU
VII. Parametrized ReLU
VIII. Exponential Linear Unit
IX. Swish
X. SoftMax

As funções de ativação utilizadas nos modelos desenvolvidos ao longo


deste trabalho foram ReLU e Sigmoid.
Sigmoid

Sigmoid é uma das funções de ativação mais utilizadas nas Redes


Neurais. Sua principal vantagem é que ela é não-linear e transforma valores no
intervalo de 0 a 1 (SHARMA et al, 2020). Ela é definida pela Equação 5

1
𝑓(𝑥) = (5)
1 + 𝑒 −𝑥
Essa função é infinitamente diferenciável e possui um formato S suave,
como é mostrado na figura 8.

Figura 8: Função de Ativação Sigmoid

FONTE: Autoria Própria

Para este trabalho, essa função foi utilizada pois ela apresenta os
melhores resultados para classificações binárias (COURSERA, 2022).

ReLU

ReLU também é uma das funções de ativação mais utilizadas nas Redes
Neurais. Seu nome significa Rectified Linear Unit (unidade linear retificada) e
também é uma função não-linear (SHARMA et al, 2020) Sua fórmula é mostrada
na Equação 6.

𝑓(𝑥) = 𝑥 + = 𝑚𝑎𝑥(0, 𝑥) (6)

Sua principal vantagem é que nem todos os neurônios estão sempre


ativos (e, sequer, no mesmo momento). Portanto, um neurônio vai ser desativado
quando o output da transformação (função) for zero (SHARMA et al, 2020). O
gráfico da função ReLU é mostrado na figura 9
Figura 9: Função de Ativação ReLU

FONTE: Autoria Própria

3.8. REDE NEURAL CONVOLUCIONAL (CNN)

Computer Vision é a área do Machine Learning relacionada com a


capacidade dos computadores de obter conhecimento e informação através de
imagens ou vídeos digitais. Dentro dessa área, a CNN é uma das técnicas mais
utilizadas atualmente. De acordo com Ian Goodfellow (2015), Redes Neurais
Covolucionais (CNN) são um tipo especial de Rede Neural especializada em
processar dados com o formato de matrizes. Dentro desse aspecto, a CNN
apresenta um dos melhores algoritmos de aprendizado para entender o
conteúdo de imagens e tem demonstrado desempenho exemplar na
segmentação, classificação, detecção e tarefas relacionadas à recuperação
(KHAN, 2020).

Notavelmente caracterizada pela sua capacidade de extração informação


de alto nível (informação mais abstrata), a CNN é capaz de explorar correlações
espaciais (2D) ou temporais (1D) nos dados (GOODFELLOW, 2015). Essa
capacidade de extração de informação hierárquica emula o processo de
aprendizado profundo e em camadas do Neocórtex no cérebro humano; que
aprende dinamicamente com informações dos dados brutos (BENGIO, 2009)

Sua topologia é dividida em vários estágios de aprendizado; sendo eles


compostos por uma combinação de diversas camadas convolucionais, unidades
de processamento não lineares (função de ativação) e camadas de
subamostragem (JARRETT et al. 2009).
As multicamadas da CNN são alimentadas por propagação para frente
(feedforward) e, geralmente, são constituídas por três estágios . No primeiro
estágio, a camada realiza várias convoluções nos dados fornecidos, utilizando
filtros convolucionais (kernels) (LECUN et al 2010). Tais convoluções servem
para produzir um conjunto de ativações pré-sinápticas. No segundo estágio,
cada ativação pré-sináptica é executada através de uma função de ativação não
linear, como a ativação linear ReLU. No terceiro estágio é feito o pool para
modificar mais ainda o output (YOSHUA, 2015). Uma convolução seguida de um
pool é comumente classificada como sendo uma única camada da CNN
(ConvNet).

Por fim, os dados processados pelas ConvNets são fornecidos a uma ou


mais camadas densas (fully connected layer). Esse algoritmo, junto com a
otimização por retropropagação (backpropagation), proporciona o aprendizado
da Rede Neural. A estrutura de uma CNN pode ser observada na Figura 10.

Figura 10 : Estrutura da CNN

Fonte: analyticsvidhya.com (adaptado)


3.8.1. CONVOLUÇÃO E FILTROS (KERNEL)

Como o nome Rede Neural Convolucional indica, a CNN aplica a


operação matemática chamada convolução (Equação 7). De acordo com Ian
Goodfellow (2015), a convolução é uma operação linear especial e, geralmente,
a operação usada em uma CNN não corresponde necessariamente à definição
precisa de convolução como aplicada à engenharia e à matemática, por
exemplo.


𝑓 ∗ 𝑔(𝑡) = ⅀𝑓(𝑢) ⋅ 𝑔(𝑡 − 𝑢) 𝑑𝑢 = ∫ 𝑓(𝑢) ⋅ 𝑔(𝑡 − 𝑢) 𝑑𝑢 (7)
−∞

Onde (nas CNNs):

𝑓 é o input (imagens de entrada)


𝑔 é o kernel (filtro)
𝑓 ∗ 𝑔(𝑡) é o output (feature maps)

Como nas CNNs os inputs geralmente são matrizes (imagens) com n-


dimensões (Tensor) e os filtros (kernel) também são matrizes, então a
convolução acaba sendo uma multiplicação matricial, onde cada posição 𝑀𝑀,𝑀
representa uma posição de pixel da imagem. A figura 11 exemplifica.

Figura 11: Convolução aplicada nas CNNs

Fonte: Autoria própria


A convolução dos inputs (as imagens) com o kernel (filtros) resulta em um
output com características realçadas, dependendo do tipo de filtro aplicado, de
acordo com Andrew Ng (DeepLearningAI). Por exemplo: nas figuras 12 um filtro
com propriedades verticais é aplicado e realça certas características do Input;
enquanto que na figura 13 outro filtro com propriedades horizontais realça outras
características do mesmo Input.

Figura 12: Diferença entre filtros

Fonte: Autoria própria

Figura 13: Diferença entre filtros

Fonte: Autoria própria


3.8.2. POOL

No estágio final (de uma única camada), geralmente é feito o pool. Nessa
camada é realizada a substituição de pixels próximos entre si, por outros valores
e localmente, decorrentes de uma estatística. As estatísticas mais comuns são
o valor máximo (de uma vizinhança retangular), o valor médio (de uma
vizinhança retangular) ou a média ponderada da distância até o pixel central
(GOODFELLOW et al, 2015).
O objetivo principal do pool é tornar o output invariável à pequenas
translações do input, além de ajudar a realçar informações (MUHAMMAD, 2018).
A invariância pode ser uma propriedade útil, caso seja mais importante detectar
se uma característica está presente do que determinar onde exatamente ela está
presente (GOODFELLOW et al, 2015); por exemplo: ao determinar se uma
imagem contém um rosto, não precisamos saber a localização dos olhos com
precisão perfeita dos pixels, só precisamos saber que há um olho no lado
esquerdo da face e um olho no lado direito da face; contudo, se quisermos
encontrar um canto definido por duas arestas que se encontram em uma
orientação específica, precisamos preservar a localização das bordas bem o
suficiente para verificar o ponto de encontro. A aplicação do pool é demonstrada
pela Figura 14, onde um filtro 2x2 faz o Max Pool na imagem original (input).

Figura 14: Max Pool em uma vizinhança (2x2)

Fonte: Autoria própria


3.9. REDE NEURAL CONVOLUCIONAL APLICADA À DETECÇÃO DE
INCÊNDIO

Pesquisas na área do Machine Learning sobre Visão Computacional,


aplicadas em imagens, para detecção de incêndio tem se tornado um tópico
relevante nos tempos atuais. No entanto, os algoritmos convencionais usam
exclusivamente modelos baseados em regras e feature vectors (vetor n-
dimensional que representa numericamente um objeto) para classificar se um
frame contém fogo ou não. Esses vetores são difíceis de definir e dependem dos
tipos de incêndios. Por conta disso, algoritmos que utilizam essa técnica
possuem baixas taxas de acertos (resultando em altas taxas de falsos alarmes)
(SAEED et al, 2020).

Uma outra alternativa para a prevenção de incêndio (e que é bastante


aplicada atualmente) é a utilização de sensores. Embora os sensores de
detecção de incêndio e fumaça sejam amplamente instalados em ambientes
internos, eles geralmente exigem que o fogo queime por um tempo para produzir
uma grande quantidade de fumaça e, em seguida, acionar o alarme. Por conta
disso, dispositivos baseados em sensores não são eficientes em ambientes
externos (ZHANG, 2016 e 2017; SAEED, 2020; FRIZZI, 2016). Uma alternativa
que supre o déficit que os sensores apresentam é o campo da Visão
Computacional.

Dentro da área de Visão Computacional, a Rede Neural Convolucional


(CNN) apresenta notável desempenho no processamento de imagens e
detecção de objetos (KHAN, 2020). Além do desempenho superior, utilizar uma
CNN para detectar um objeto tem a vantagem de poder usar a imagem original
como input, sem necessidade de pré-processamento ou segmentação de bloco.
Portanto, não é necessário extrair recursos manualmente, utilizar feature vectors
ou sensores (ZHANG 2017).

Existem diversos métodos para detecção de fogo e fumaça baseados na


Visão Computacional na literatura; contudo, fogo e fumaça possuem
características bastante específicas em comparação aos objetos no entorno
(nesse caso, árvores), então modelos baseados em cores, movimentos e
comportamento espacial e temporal são os mais utilizados (ZHANG et al, 2016).
De acordo com KRIZHEVSKY et al (2017), o potencial da CNN pode ser
controlado variando sua profundidade (conexões) e largura (quantidade de
neurônios). Em comparação com as Redes Neurais tradicionais (feedforward)
com quantidades de camadas (layers) semelhantes, as CNNs necessitam de
menos conexões e parâmetros e, portanto, são mais fáceis de treinar; à medida
que exigem menos recursos computacionais. Além disso, as CNNs apresentam
maiores taxas de acertos sobre a natureza das imagens, em comparação com
as Redes Neurais tradicionais.

Contudo, como reportado pesquisadores da área (KRIZHEVSKY, 2017;


ZHANG, 2017), imagens de incêndios florestais disponíveis para aplicação no
Machine Learning são bastante limitadas em escala, em diversidade e em
disponibilidade; não existindo um banco de dados público acessível para treinar
modelos. Por conta disso, a maior dificuldade dos modelos de CNN, em geral,
está na limitação do banco de dados; sendo necessário que o desenvolvedor da
Rede Neural crie um banco de dados antes mesmo de criar a Rede Neural.

Trabalhos recentes sobre o tema demonstram bons resultados no


treinamento, tais como os modelos finais de Zhang (2016): SVM-Pool5 e CNN-
Pool5, que apresentaram no treinamento 89% e 90.1% respectivamente.
Contudo, ao fazer a validação com imagens reais, Zhang (2016) reportou o
mesmo problema deste presente trabalho: a falta de um banco de dados padrão
e a necessidade de expandir o banco de dados utilizado no treinamento; pois o
mesmo abrange um cenário muito específico.
3.10. TENSORFLOW

Neste capítulo serão apresentados alguns conceitos de Rede Neural que


foram utilizados para produção do trabalho, com ênfase na aplicação em um
submódulo do TensorFlow; o Keras. As informações aqui contidas foram
retiradas da documentação do Keras ou do TensorFlow.
TensorFlow é uma biblioteca do Google para desenvolver Redes Neurais,
treiná-las e validá-las; também permite o fácil ajuste de hiperparâmetros dos
modelos Keras. Essa biblioteca foi utilizada para desenvolver a Rede Neural
neste presente trabalho. As informações sobre os parâmetros das funções que
serão citados abaixo são os conhecimentos que foram utilizados; existindo
outros parâmetros que não foram utilizados (e não foram mencionados no
decorrer do texto).

3.10.1. MODELO

Keras permite a criação de três tipos de modelos, sendo eles: Sequential,


Functional e Model Subclassing. Para este presente trabalho, foi utilizado o
modelo Sequential.
O modelo Sequencial é composto por camadas de neurônios densamente
conectadas entre si, mas é limitado a uma única camada de entrada e uma única
camada de saída; sendo aplicação da topologia de Propagação para Frente
(Feedforward).
Além disso, todos os modelos desenvolvidos ao longo deste trabalho
tiveram ambas Convolutional Layers (ConvNets / CNN) e Core Layers (Fully
Connected Layer) como camadas de neurônios.

3.10.2. CONVOLUTIONAL LAYER

Para criar as camadas de CNN (também chamadas de ConvNet) foi


utilizada a função tf.keras.layers.Conv2D( Nc , filter , activation ) ,
onde:
I. Nc (Number of Channels): quantidade de filtros da CNN
II. Filter: Dimensões dos filtros utilizados (n x n)
III. Activation: Função de ativação da CNN
Para fazer o pool e retirar os valores máximos da imagem foi utilizada
função tf.keras.layers.MaxPooling2D( pool_size ) , onde pool_size é a
dimensão da matriz (n x n) utilizada no método. Todos os modelos tiveram pool
de (2 x 2).

Ao final das camadas de CNN, para transformar as imagens em vetor, para


poder servir como dados de entrada (pois a input layer só aceita vetores), foi
utilizado o comando tf.keras.layers.Flatten().

3.10.3. CORE LAYER

Para criar uma camada densa (Hidden Layer), foi utilizada a função
tf.keras.layers.Dense( units, activation ), onde

I. Units: quantidade de neurônios da layer


II. Activation: Função de ativação da layer

Vale ressaltar que essas camadas são baseadas no perceptron


multicamadas, onde cada peso W é adaptado para melhor se adequarem aos
resultados.

3.10.4. TREINAMENTO

Para começar o treinamento, é necessário compilar a rede. Para tal,


utiliza-se a função Model.compile( loss , optimizer ) , onde:

IV. Loss: o algoritmo utilizado para calcular a diferença entre o valor real e o valor
obtido no treinamento.

V. Optimizer: o algoritmo utilizado para melhorar a diferença entre o valor real e o


valor obtido

Para este trabalho, foi utilizado o algoritmo Binary cross-entropy para


calcular o valor de Loss. Essa função é ideal para uma classificação binária de
classes. Nesse trabalho, a classe “Fumaça” é 1 e a classe “Não-Fumaça” é 0. O
cálculo do valor de Loss é definido pela Equação 8 e seu gráfico é mostrado na
Figura 15. O valor de Loss é mostrado no final de cada treinamento.
𝑙𝑜𝑠𝑠 = −𝑡. 𝑙𝑜𝑔(𝑝) − (1 − 𝑡). 𝑙𝑜𝑔(1 − 𝑝) (8)

onde:

𝑡 : Representa a classe real


𝑙𝑜𝑔(𝑝) : Representa a probabilidade dessa classe
𝑝 : Representa a probabilidade da classe 1 (Fumaça)
1 − 𝑝 : Representa a probabilidade da classe 0 (Não-Fumaça)

Figura 15 : Gráfico da função Log Loss

Fonte: Analytics Vidhya (adaptado)


O gráfico vermelho representa a classe 1 Fumaça. Como podemos ver,
quando a probabilidade p (eixo x) está próxima do valor 1, a perda (loss) é menor
e quando a probabilidade p está próxima do valor 0, a perda (loss) se aproxima
do infinito.
O gráfico preto representa a classe 0 Não-Fumaça. Como podemos ver,
quando a probabilidade p (eixo x) está próxima do valor 0, a perda (loss) é menor
e quando a probabilidade p está próxima do valor 1, a perda (loss) se aproxima
do infinito.
O algoritmo optimizer utilizado foi o RMSprop( learning_rate ) , onde
learning rate representa a taxa de aprendizado do modelo e controla o quanto
os pesos W da Rede são ajustados em relação ao gradiente de perda. Quanto
menor o valor, mais devagar o algoritmo “caminha” ao longo da inclinação
descendente. Embora seja tentador usar uma baixa taxa de aprendizado (a fim
de garantir que não seja perdido nenhum ponto de mínimo local), pode significar
que o modelo leve muito tempo para convergir ao valor ideal; aumentando
consideravelmente o tempo de processamento.
Uma vez que o modelo foi compilado, ele pode ser treinado com a função
Model.fit( data , steps_per_epoch , epoch ) onde:
I. data: é o banco de dados utilizado para treinar a rede
II. epoch: é a quantidade de repetições do treinamento que o modelo tem
disponível para aprender;
III. step_per_epoch: representa a quantidade de imagens que são passadas pro
modelo antes de executar a próxima Epoch .

Ao final de cada treinamento, também é mostrado o valor de Accuracy


daquela Epoch. O valor de Accuracy representa o quanto o aprendizado da rede
naquele treinamento se aproxima do valor real.

3.10.5. VALIDAÇÃO

Para fazer o teste de validação da Rede Neural verificar sua eficiência, foi
adicionado o parâmetro validation_data na função Model.fit() e, com isso,
ao longo dos treinamentos, o modelo é avaliado com outra parte do banco de
dados não vista durante o treinamento.

Apesar do nome sugestivo, essa etapa é usada durante o treinamento


para decidir quando devemos parar de treinar o modelo. No momento X em que
o erro medido durante a etapa de validação parar de diminuir e começar a
crescer, então o treinamento deve ser interrompido no valor de Epoch do
momento X ( EL HINDI 2011).

3.10.6. TESTE

Para fazer os ensaios de precisão estatística da Rede Neural, foi utilizado


a função Model.predict( x ) , onde x é o dado que será testado e classificado
pela rede.
4. METODOLOGIA

A metodologia proposta consiste em quatro etapas para ambos os


Modelos e Banco de Dados. Sendo a Primeira Etapa o desenvolvimento e
treinamento dos modelos e suas respectivas análises. A Segunda Etapa é a
verificação do aprendizado dos modelos selecionados na Primeira Etapa. A
etapa Validação é a avaliação do aprendizado dos modelos com imagens
inéditas. A etapa Teste é a contagem de acertos e erros (falsos positivos e falsos
negativos) dos modelos.

O fluxograma apresentado na Figura 16 descreve, de forma sucinta, a


metodologia utilizada neste presente estudo.

Figura 16: Fluxograma da Metodologia

Fonte: Autoria própria


4.1. ESTUDO INICIAL

Para produzir esse trabalho, foi utilizada como base a linguagem de


programação em Python, especificamente os módulos TensorFlow (e seu
submódulo Keras), Pandas e OS (operational system).

Para poder desenvolver uma rede neural, primeiramente foi necessário


estudar sobre o tema e entender como funcionam os algoritmos. Para tal, foi
utilizado o curso online de introdução ao TensorFlow do Coursera (Coursera,
2022).

4.2. BANCO DE DADOS

Quando se trabalha no desenvolvimento de uma Rede Neural, um dos


passos mais importantes é a busca por uma fonte de dados confiável que será
utilizada para ensinar ao computador. Deve-se tomar cuidado com enviesamento
e evitar que tendências pessoais sejam transferidas no processo de
aprendizagem. Na prática a proporção de dados reais é muitas vezes
tendenciosa (TANIGUCHI et al, 2018).

Além disso, imagens de incêndios florestais disponíveis para aplicação no


Machine Learning são bastante limitadas em escala, em diversidade e em
disponibilidade; não existindo um banco de dados público disponível para treinar
modelos (ZHANG, 2017). Portanto, para uma demonstração e validação, da rede
neural, foi criada uma base de dados a partir de vídeos de incêndios florestais
de Toreyin et al, 2006, que são uma referência na literatura para detecção de
fogo.

4.2.1. BANCO DE DADOS DO TREINAMENTO

Primeira Etapa
Para o desenvolvimento das redes, foram extraídas imagens de parte do
vídeo “20090409 ManavgatTEst”, gerando uma imagem a cada 20 frames,
totalizando 224 imagens. Essas imagens foram redimensionadas para o
tamanho de 300 × 300 pixels (COURSERA, 2022). Em seguida, essas imagens
foram manualmente qualificadas como “Fumaça” ou “Não Fumaça”, sendo uma
classificação binária.
Segunda Etapa

Para um treinamento mais refinado das redes, foram adicionadas


imagens dos seguintes vídeos, também disponibilizados por Toreyin et al:
“Pelco_Colakli” com imagens a cada 20 frames; “Smoke_Manavgat_Raw” com
imagens a cada 35 frames e
“20070817_Aksehir_Duman_Test5_en_Iyisi_near_487_frame” com imagens a
cada 50 frames. Todas as imagens foram redimensionadas para o tamanho de
300 × 300 pixels. Todas as imagens foram processadas, manualmente
qualificadas como “Fumaça” ou “Não Fumaça” e, em seguida, foram adicionadas
ao banco de dados preexistente, que incluía as imagens de “20090409
ManavgatTEs”, totalizando 664 fotos. A descrição das imagens é mostrada na
Tabela 1.

Tabela 1: Vídeos de Toreyin utilizados


Nome do Vídeo Imagens
20090409 ManavgatTEs 224
20070817_Aksehir_Duman_Test5_en_Iyisi_near_487_frame 102
Smoke_Manavgat_Raw 172
Pelco_Colakli 155
Total 644
Fonte: Autoria própria

4.2.2. BANCO DE DADOS DA VALIDAÇÃO E DO TESTE

A próxima etapa consiste em assegurar o aprendizado dos modelos. Para


tal, foram feitas as etapas Validação e Teste.

As imagens do banco da Segunda Etapa, contendo as 664 imagens,


foram separadas em dois bancos de dados: “Treinamento” e “Validação”, na
proporção recomendada 80% / 20% (COURSERA, 2022). Em seguida, foi feita
a metodologia recomendada por El Hindi (2011) e foram retiradas amostras, dos
extremos, que tentem a ser complicadores (noisy instances) no treinamento.

Portanto, o banco de dados “Treinamento” contém 269 imagens de


Fumaça e 275 imagens de Não Fumaça. Já o banco de dados “Validação"
contém 42 imagens de Fumaça e 53 imagens de Não Fumaça. Para a etapa
Validação, foram utilizadas as imagens de “Validação”.
Para a etapa Teste, foram utilizadas imagens de “Validação” e também
foi criado um banco de dados chamado “Teste”; cujo qual é formado por imagens
que foram aleatoriamente escolhidas da internet (25 de fumaça e 25 de não
fumaça).

Em ambas etapas Validação e Teste, ao longo dos treinamentos, os


Modelos não tiveram acesso às imagens dos respectivos bancos de dados.
Portanto as imagens contidas em “Validação” e “Teste” são inéditas para a Rede
Neural. Na Tabela 2 é mostrado a divisão do banco de dados.

Tabela 2: Quantidade de imagens em cada diretório


Treinamento Validação Teste
Fumaça 269 imagens 42 imagens 25 imagens
Não Fumaça 275 imagens 53 imagens 25 imagens
Total 544 95 50
Fonte: Autoria própria

4.3. MODELOS

Todos os modelos desenvolvidos possuem hiperparâmetros (valores que


caracterizam a estrutura da rede) diferentes entre si. Além disso, os modelos
foram baseados no conceito de CNN; que é um tipo especial de Rede Neural
que trabalha com imagens e tem apresentado desempenho excepcional em
diversas áreas relacionadas à Visão Computacional e processamento de
Imagens (KHAN et al, 2020).

A numeração dos modelos segue uma ordem sequencial cronológica; tendo


os modelos com numeração baixa sido desenvolvidos primeiro. Inicialmente
foram criados 5 modelos, sendo eles os Modelos 1, 2, 3, 4 e 5 e, em seguida,
após verificar o desempenho desses modelos iniciais, outros três foram
desenvolvidos, a partir das análises dos anteriores, sendo eles os Modelos 6, 7
e 8. Por fim, os Modelos 9 e 10 foram desenvolvidos a partir dos resultados dos
modelos anteriores, sendo eles uma versão melhorada dos seus antecessores.
4.3.1. ANÁLISES PROPOSTAS

Ambos os modelos da Primeira e da Segunda Etapa de Treinamento


foram submetidos a 1000 treinamentos cada. Ao longo dos treinamentos, foram
salvos os valores de Accuracy ao longo de cada Epoch para todos os modelos.
Com esses dados foram feitas duas análises:

I. A primeira análise consiste em plotar os valores médios de


Accuracy de cada Epoch para verificar a taxa de aprendizagem média
dos modelos ao longo dos treinamentos. Essa análise foi feita em todos
os modelos e em todas as etapas (Primeira Etapa, Segunda Etapa e
Validação)

II. A segunda análise consiste em plotar o valor de Accuracy da


última Epoch dos modelos, gerando um histograma, para verificar o
comportamento dos modelos ao término de cada treinamento (ao longo
dos 1000 treinamentos). Essa análise foi feita apenas nos modelos que
tiveram os maiores desempenhos na primeira análise. Essa análise não
foi feita nos modelos da Segunda Etapa e nem na Validação.

4.3.2. HIPERPARÂMETROS

Os hiperparâmetros da CNN podem ser vistos na tabela 3. Em todas as


camadas, as imagens tiveram Max Pool de 2x2.Por fim, cada layer de CNN teve
seus respectivos Kernels (filtros), que podem ser vistos na Tabela 3.

Tabela 3: Convolutional Layers (ConvNet)


Convolutional Layer
Modelo 1º 2º 3º 4º 5º 6º 7º 8º 9º 10º

1ª Conv Layer (Filtros) 32 32 16 16 16 16 16 16 16 16

2ª Conv Layer (Filtros) 64 64 32 32 32 32 32 32 32 32

3ª Conv Layer (Filtros) 32 32 64 64 64 32 32 64 32 64

4ª Conv Layer (Filtros) 32 32 32 - 32 32 32 32 32 32

5ª Conv Layer (Filtros) 32 - - - 32 - - 32 - 32

Função de Ativação ReLU ReLU ReLU ReLU ReLU ReLU ReLU ReLU ReLU ReLU

Fonte: Autoria própria


Em todas as camadas, os kernels são uma potência de 2 (2𝑛 ) visto que,
computacionalmente, é mais eficiente (COURSERA,2022; QUORA, 2022).
Como foi utilizada uma classificação Binária (“Fumaça” ou Não-Fumaça)
a Função de Ativação aplicada à output layer dos modelos foi Sigmoid, sendo
essa a Função de Ativação majoritariamente mais utilizada para classificação
binária (SHARMA et al, 2017). Os hiperparâmetros das camadas densas podem
ser vistos na Tabela 4.

Tabela 4: Dense Layers (Fully Connected Layer)


Dense Layer
Modelo 1º 2º 3º 4º 5º 6º 7º 8º 9º 10º

1ª Hidden Layers 512 512 512 512 512 256 256 512 256 512
(Neurônios)

Função de Ativação ReLU ReLU ReLU ReLU ReLU ReLU ReLU ReLU ReLU ReLU

Output Layer (Neurônios) 1 1 1 1 1 1 1 1 1 1

Sigmoid Sigmoid Sigmoid Sigmoid Sigmoid Sigmoid Sigmoid Sigmoid Sigmoid Sigmoid
Função de Ativação

Fonte: Autoria própria

Os hiperparâmetros do treinamento podem ser vistos na Tabela 5

Tabela 5: Hiperparâmetros do Treinamento


Treinamento
Modelo 1º 2º 3º 4º 5º 6º 7º 8º 9º 10º

Epochs 15 15 15 15 15 15 16 10 27 15

Learning Rate 0.01 0.01 0.01 0.02 0.002 0.002 0.001 0.001 0.001 0.001

Fonte: Autoria própria


4.4. ETAPAS

4.4.1. PRIMEIRA ETAPA

Nessa primeira etapa de treinamentos, os modelos criados foram


submetidos aos treinamentos propostos com o banco de dados inicial (com 224
imagens).

Essa é uma etapa para distinguir e separar os modelos com bom


aprendizado dos modelos com aprendizado ruim. Portanto, nessa etapa e em
alguns casos, os hiperparâmetros dos modelos foram alterados; numa tentativa
de melhorar o desempenho do modelo em questão. Qualquer alteração feita em
algum hiperparâmetro do modelo em questão resultou na renomeação do
modelo, seguindo a sequência numérica.

Por fim, modelos que tiveram bom desempenho nessa etapa foram
selecionados para a Segunda Etapa.

4.4.2. SEGUNDA ETAPA

Nessa segunda etapa de treinamentos, os modelos selecionados foram


treinados com o banco de dados expandido (com 664 imagens).
A intenção dessa Segunda Etapa é validar os modelos selecionados na
Primeira Etapa. Portanto, além do número de Epoch, nenhum hiperparâmetros
foi alterado ao longo dessa etapa.
O número de Epoch não é diretamente responsável pela forma como a
Rede Neural aprende, mas sim por aumentar a relação de aprendizado Accuracy
x Epoch da Rede Neural. Modelos com alto aprendizado precisam de menos
Epochs; modelos com baixo aprendizado precisam de mais Epochs. Contudo,
caso o modelo não aprenda nada de fato, grandes quantidades de Epochs não
irão aumentar a relação de aprendizado da rede.
Além disso, a análise utilizada aqui foi somente a primeira análise
(Accuracy média x Epoch); não havendo necessidade de utilizar a segunda
análise (Histograma), visto que os modelos não perderam suas qualidades, uma
vez que não tiveram seus hiperparâmetros alterados.
4.4.3. VALIDAÇÃO

Nesta penúltima etapa, os modelos foram submetidos aos primeiros


testes de assertividade. Ao utilizar as imagens de “Validação” no parâmetro
validation_data da função Model.fit(), podemos verificar a assertividade
dos modelos ao longo do próprio treinamento e, com isso, determinar um valor
mais adequado de Epoch que não resulte em Overfitting.
Ao longo dessa etapa nenhuma alteração foi feita nos hiperparâmetros
dos modelos.

4.4.4. TESTE

Nessa etapa final foram feitos os ensaios de precisão com a função


Model.predict(). Os ensaios propostos consistem na contagem de acertos e
erros dos modelos, sendo eles:

I. Ensaio I: Imagens do banco de dados “Validação”; (contendo 95


imagens que não foram utilizadas no treinamento).
II. Ensaio II: Imagens do banco de dados “Teste” (contendo 50
imagens de florestas e fumaça aleatoriamente coletadas da
Internet).

Aqui, são considerados: “Acertos” se a o modelo classificar corretamente


imagens de fumaça ou não-fumaça; “Falso Positivo” se o modelo classificar
erroneamente uma imagem de não-fumaça como sendo fumaça; “Falso
Negativo” se o modelo classificar erroneamente uma imagem de fumaça como
sendo não-fumaça.
Ao longo dessa etapa nenhuma alteração foi feita nos hiperparâmetros
dos modelos.
5. RESULTADOS

Seguindo a metodologia proposta, aqui serão discutidos os resultados dos


modelos.
5.1. PRIMEIRA ETAPA

Os resultados da Primeira Etapa (treinamentos com 224 imagens) são


mostrados na Figura 17.

Figura 17: Resultados dos Modelos na Primeira Etapa

Fonte: Autoria própria

Nessa discussão, a relação Accuracy x Epoch será chamada de


“Aprendizado” para melhor entendimento.
Primeiro Modelo

O resultado do Modelo 1 é mostrado na Figura 18.


Figura 18: Gráfico Accuracy x Epoch do Modelo 1

Fonte: Autoria própria

Sendo esse o primeiro modelo desenvolvido, ele apresentou um dos


piores resultados em comparação aos outros modelos. Tal fato aconteceu por
causa do excesso de hiperparâmetros, que podem ter processado demais as
imagens do banco de dados e o Learning Rate muito alto (0.01), que tornou o
aprendizado “rápido demais” e, portanto, ineficiente.

Segundo Modelo

O resultado do Modelo 2 é mostrado na Figura 19.


Figura 19: Gráfico Accuracy x Epoch do Modelo 2

Fonte: Autoria própria


O Modelo 2 é uma tentativa de otimização do modelo um, tendo uma
camada de convolução a menos. Esse modelo também não teve um bom
desempenho no treinamento; sendo similar ao do Modelo 1. Contudo, ele indica
que o problema não está somente na quantidade de filtros das CNNs; visto que
a mudança de filtros (do Modelo 1 para o Modelo 2) não trouxe uma melhora
significativa no desempenho.

Terceiro Modelo

O resultado do Modelo 3 é mostrado na Figura 20.

Figura 20: Resultado do Modelo 3

Fonte: Autoria própria

Esse modelo foi a terceira tentativa de resolver o problema dos


hiperparâmetros. O Modelo 3 obteve uma taxa de aprendizado maior que os
seus antecessores nas primeiras Epochs e, apesar de ainda apresentar
desempenho insuficiente, ele demonstra que o problema da quantidade de filtros
não é substancial para todo o treinamento. Além disso, outro fato em comum
com os três primeiros modelos é o valor do Learning Rate; tal fato foi revisado
no quarto modelo.
Quarto Modelo

O resultado do Modelo 4 é mostrado na Figura 21.


Figura 21: Gráfico Accuracy x Epoch do Modelo 4

Fonte: Autoria própria


O Modelo 4, dentre todos os Modelos, é o que apresenta menos camadas
de convolução e, mesmo assim, seu desempenho foi insuficiente; tendo ele,
assim como seus predecessores, ficado preso no ponto 58% de Accuracy, como
é mostrado na figura 21. Contudo, esse modelo passou pela segunda análise
(onde foi feito o histograma da última Accuracy de cada um dos 1000
treinamentos; detalhado em 4.3.1.) a fim de evidenciar que o ponto de 58% é, de
fato, um mínimo local, como demonstra a Figura 22.
Figura 22: Histograma da última Epoch do Modelo 4

Fonte: Autoria própria


Esse modelo também foi a primeira tentativa de ajuste no Learning Rate,
tornando o treinamento mais rápido (numa tentativa de sair do ponto mínimo
local de 58%), porém o aprendizado foi o menor dentre os modelos iniciais;
indicando que, de fato, a Learning Rate estava alta demais. A partir dos próximos
Modelos, o Learning Rate será diminuído em uma casa decimal; ficando em
torno de 10−3 . Além disso, aumentar o número de Epochs nesses quatro
modelos iniciais não teria tornado o aprendizado melhor, visto que, a partir de
certa Epoch, o aprendizado estabiliza em 58%.

Quinto Modelo

O resultado do Modelo 5 é mostrado na Figura 23.

Figura 23: Gráfico Accuracy x Epoch do Modelo 5

Fonte: Autoria própria

Tendo o quinto modelo hiperparâmetros similares aos do modelo um


(numa tentativa de revisar a Learning Rate), ele se apresenta como um bom
candidato para o monitoramento de incêndio, pois foi o primeiro que,
aparentemente, conseguiu terminar o treinamento fora do ponto de mínimo local.
Uma análise no histograma da última Epoch (15) do modelo (figura 24) mostra
que o Modelo Cinco, em alguns casos, teve 100% de Accuracy em muitos
treinamentos (decorou o banco de dados) e, em outros casos, o modelo ficou
preso no ponto de mínimo local.
Figura 24:Histograma da última Epoch do Modelo 5

Fonte: Autoria própria

Contudo, um ajuste na Learning Rate pode melhorar seu desempenho no


aprendizado. Após o ajuste, o Modelo 5 foi renomeado para Modelo 8.

Sexto Modelo

O resultado do Modelo 6 é mostrado na Figura 25.

Figura 25: Gráfico Accuracy x Epoch do Modelo 6

Fonte: Autoria própria

Esse modelo proposto teve a quantidade de neurônios da Hidden Layer


reduzida pela metade (256) e, ainda, teve sua quantidade de filtros nas ConvNets
similares ao do Modelo Três (que apresentou maiores aprendizados nas
primeiras Epochs até então). O Modelo 6 apresentou uma taxa de aprendizado
crescente na primeira análise, tendo finalizado-a com 82.13% de Accuracy ; seu
resultado na segunda análise é mostrado na Figura 26.
Figura 26: Histograma da última Epoch do Modelo 6

Fonte: Autoria própria

Diferentemente do Modelo 5, esse modelo não decorou o banco de dados;


apresentando distribuição suave no Histograma e concentrando mais pontos
acima de 95% (indicando que ele terminou vários treinamentos com mais de 95%
de Accuracy). Contudo, esse modelo também terminou alguns treinamentos
(122) preso em 58%, indicando que, em alguns treinamentos, ele terminava-os
preso no ponto de mínimo local. Numa tentativa de corrigir isso, assim como o
Modelo 5, ele teve sua Learning Rate diminuída ainda mais (para 0.001); sendo,
em seguida, renomeado para Modelo 7.

Sétimo Modelo
O resultado do Modelo 7 é mostrado na Figura 27.
Figura 27: Gráfico Accuracy x Epoch do Modelo 7

Fonte: Autoria própria


Na primeira análise proposta (Accuracy x Epoch), esse modelo é um dos
que apresentou um dos maiores resultados de Accuracy; terminando essa etapa
com 97.08% de média. Tendo sido o Modelo 7 definido após uma cautelosa
análise dos modelos anteriores, ele apresenta quase os mesmos
hiperparâmetros do Modelo 6, contudo, a Learning Rate foi ajustada para 0.001.
Esse ajuste no Modelo 7 permitiu que ele tivesse mais “tempo” para aprender e,
por conta disso, ele apresentou desempenho superior ao seu predecessor. Além
disso, essa mudança no Learning Rate fez com que o modelo não ficasse preso
no ponto de mínimo local (em 58%), como demonstrado pela segunda análise,
na Figura 28.

Figura 28: Histograma da última Epoch do Modelo 7

Fonte: Autoria própria

O Modelo 7 foi o primeiro modelo selecionado dessa Primeira Etapa (com


224 imagens) para ser testado pelo banco de dados da Segunda Etapa (com
664 imagens).
Oitavo Modelo

O resultado do Modelo 8 é mostrado na Figura 29.


Figura 29: Gráfico Accuracy x Epoch do Modelo 8

Fonte: Autoria própria

Na primeira análise proposta (Accuracy x Epoch), o Modelo 8 é o que


apresentou melhor resultado (maior Accuracy, 97.14% ). Sendo esse modelo
definido após a análise do Modelo 5, ele possui quase os mesmos
hiperparâmetros do seu modelo progenitor, contudo, a Learning Rate foi
ajustada. Esse ajuste permitiu que ele tivesse mais “tempo” para aprender e, por
conta disso, ele apresentou desempenho superior em relação ao Modelo 5.
Assim como no Modelo 7, a mudança no Learning Rate fez com que o Modelo 8
não ficasse preso no ponto de mínimo local (em 58%), como demonstrado na
Figura 30.

Figura 30: Histograma da última Epoch do Modelo 8

Fonte: Autoria própria


Apesar desse modelo ter decorado o banco de dados (overfitting, causado
por 100% de Accuracy) em alguns treinamentos (92), sua performance na
segunda análise foi promissora, tendo terminado grande parte dos 1000
treinamentos propostos com Accuracy acima de 95% (como demonstrado pelo
histograma da figura 31). Além disso, o problema do overfitting pode ser
resolvido com uma redução no número de Epochs (EL HINDI, 2011) como
demonstra a Figura 31.

Figura 31: Gráfico Accuracy x Epoch

Fonte: Autoria própria

Portanto, o número de Epochs do Modelo 8 ficou definido como 10. Além


disso, devido ao seu resultado promissor, o modelo também foi selecionado para
a Segunda Etapa de treinamentos (com 664 imagens). Com esse modelo, se
encerra a primeira fase; que utilizou o banco de dados com 224 imagens.
5.2. SEGUNDA ETAPA

Nessa segunda etapa de treinamentos, os modelos iniciais selecionados


(Modelo 7 e 8) foram treinados com o banco de dados expandido (com 664
imagens). Com exceção do número de Epoch, nenhum outro hiperparâmetros
foi alterado ao longo dessa etapa. Os resultados dos Modelos 7, 8, 9 e 10 são
mostrados nas Figura 32 e 33.
Figura 32: Gráfico Accuracy x Epoch dos Modelos 7 e 8

Fonte: Autoria própria


Figura 33: Gráfico Accuracy x Epoch dos Modelos: 9 e 10

Fonte: Autoria própria


A análise utilizada aqui foi somente a primeira análise (Accuracy média x
Epoch); não havendo necessidade de utilizar a segunda análise (Histograma),
visto que os modelos não tiveram seus atributos alterados e, portanto, não
perderam a capacidade de aprendizado; que se tornou mais “lento” por causa da
maior diversidade de imagens no banco de dados.
Portanto, mesmo o aprendizado ainda sendo efetivo (demonstrado pela
Figura 32), houve a necessidade de aumentar o número de Epochs, a fim de se
chegar em valores maiores, como demonstrado pela Figura 33.

Sétimo Modelo

Ao utilizar o banco de dados da Segunda Etapa (664 imagens), a relação


Accuracy x Epoch do Modelo 7 foi menor quando comparado com os
treinamentos da Primeira Etapa (contendo 224 imagens). Na Figura 34 é
mostrado o aprendizado do modelo nessa etapa (em azul), junto com os
resultados de Accuracy ao longo das Epochs em diversos treinamentos (pontos
coloridos).
Figura 34: Gráfico Accuracy x Epoch

Fonte: Autoria própria

O modelo teve uma média de 87.73% de Accuracy, evidenciando uma


queda no desempenho (em comparação aos 97% da etapa anterior). Contudo,
o modelo ainda apresenta uma taxa crescente no aprendizado (Accuracy x
Epoch), sendo limitado pelo número de Epochs. Para resolver isso, o número de
Epochs foi aumentado para 35. Essa mudança resultou na alteração do nome
do Modelo 7 para Modelo 9.
Oitavo Modelo
Assim como o Modelo 7, ao utilizar o banco de dados da Segunda Etapa
(664 imagens) o Modelo 8 teve uma redução no aprendizado (em comparação
com os resultados dos treinamentos da Primeira Etapa, contendo 224 imagens).
A Figura 35 demonstra os resultados desse modelo nessa etapa.

Figura 35: Gráfico Accuracy x Epoch do modelo 8

Fonte: Autoria própria

O Modelo 8 teve uma média de 87.06% de Accuracy, evidenciando uma


queda no desempenho (em comparação aos 97.14% da etapa anterior).
Contudo, o modelo ainda apresenta uma boa eficiência no aprendizado, como
demonstra sua curva de aprendizado na Figura 35. Para resolver isso, o número
de Epochs foi aumentado para 15. Essa mudança resultou na alteração do nome
do Modelo 8 para Modelo 10.
Nono Modelo

Sendo esse modelo derivado do Modelo 7, para testar sua eficiência no


aprendizado, ele foi submetido a 1000 treinamentos. A Figura 36 demonstra o
resultado do Modelo 9.
Figura 36: Gráfico Accuracy x Epoch

Fonte: Autoria própria

Como demonstrado na Figura 36, o aprendizado do modelo obteve um


resultado final de Accuracy maior. Contudo, a partir de certo ponto, o mesmo não
apresenta grandes taxas de crescimento no aprendizado; obtendo 4% a mais de
Accuracy ao longo de 10 Epochs, como é mostrado na figura 37.

Figura 37: Gráfico Accuracy x Epoch

Fonte: Autoria própria

A fim de evitar gastos desnecessários de recursos computacionais, com


excesso de Epochs (EL HINDI), o número final de Epochs ficou definido como
27; apresentando uma média de 94.71% de Accuracy. Essa é a versão final do
Modelo que será submetida à próxima etapa de Validação.
Décimo Modelo

Assim como o Modelo 9, o Modelo 10 foi submetido a 1000 treinamentos


para verificar seu aprendizado. O resultado é mostrado na Figura 38.

Figura 38: Gráfico Accuracy x Epoch

Fonte: Autoria própria

O Modelo 10 terminou os treinamentos com uma média de 94.66% de


Accuracy, sendo esse um valor superior que seu antecessor (o Modelo 8, com
87.06%). Esse modelo também foi selecionado para a próxima fase, sendo essa
sua versão final.
5.3. VALIDAÇÃO

A validação realizada utilizou a divisão do banco de dados (80 % / 20%),


com o diretório “Validação” (contendo 95 imagens que não são mostradas
durante o treinamento) e o diretório “Treinamento” (contendo 544 imagens
exclusivas ao treinamento). O resultado do Modelos 9 é mostrado na Figura 39
e o resultado do Modelo 10 é mostrado na Figura 40

Figura 39: Nono Modelo

Fonte: Autoria própria

Figura 40: Décimo Modelo

Fonte: Autoria própria


Uma vez que a validação do modelo é feita ao final de cada Epoch,
utilizando o parâmetro validation_data na função Model.fit() , então,
indiretamente, os modelos foram submetidos à mais 1000 treinamentos cada
(porém, dessa vez, foi feita a validação).
Ao comparar os resultados dos treinamentos desta etapa com os da etapa
passada, os modelos apresentaram resultados similares nos treinamentos das
duas etapas (94.71% e 94.2% do Modelo 9 e 94.58% e 94.98% do Modelo 10).
Portanto, mesmo que a ideia principal da etapa de validação seja avaliar os
modelos com um banco de dados diferente do treinamento (80/20), foi possível
ratificar o treinamento dos modelos.
Em relação à validação, o Modelo 9 apresentou 94.62% na validação e o
Modelo 10 apresentou 94.66% na validação. Contudo, devido à pouca
quantidade de vídeos disponíveis na literatura para gerar imagens para o banco
de dados original (com 664), a divisão 80/20 não necessariamente resultou em
uma divisão com amostras diversificadas para ambas etapas de treinamento e
validação. Isso é demonstrado pelos gráficos nas figuras 39 e 40: a diferença
entre as curvas (de treinamento e validação) de cada modelo é
consideravelmente pequena, visto que os dois bancos de dados são bastante
parecidos entre si.
Apesar das limitações citadas, essa etapa demonstra que os modelos
puderam aprender a identificar fumaça; mesmo que restrito aos locais das
imagens dos treinamentos

5.4. TESTE

Essa etapa Teste, consistindo na contagem de acertos, falsos positivos e


falsos negativos, foi realizada com os diretórios “Validação” (95 imagens não
vistas no treinamento) e “Teste” (50 imagens aleatórias da internet que não foram
vistas no treinamento).
Com o diretório “Validação”, o modelo 9 apresentou 95.78% de acerto e o
Modelo 10 apresentou 96.84% de acerto. Os resultados são discriminados na
Tabela 6.
Tabela 6: Resultados com o banco de dados “Validação”

Validação
Acertos Falsos Positivos Falsos Negativos
Modelo 9 91 0 4
Modelo 10 92 0 3
Fonte: Autoria própria

Com o banco de dados “Teste”, o modelo 9 apresentou 34% de acerto e


o Modelo 10 apresentou 32% de acerto. A discrição dos resultados é mostrada
na Tabela 7.

Tabela 7: Resultados com o banco de dados “Teste”


Teste
Acertos Falsos Positivos Falsos Negativos
Modelo 9 17 8 25
Modelo 10 16 9 25
Fonte: Autoria própria

Assim como nos modelos propostos por Zhang et al (2016) (SVM-Pool5 e


CNN-Pool5), os Modelos 9 e 10 propostos neste trabalho tiveram baixos valores
de acertos no segundo ensaio, se compararmos com o primeiro ensaio. Tal fato
não está relacionado com a Rede Neural em si; mas sim com os bancos de
dados consideravelmente pequenos e pouco diversificados. Por conta disso, a
Rede Neural se torna muito especializada em alguns cenários (os locais dos
vídeos), como demonstra o primeiro ensaio; contudo, quando submetidas a
outros cenários mais diversos (as imagens da internet), no segundo ensaio, a
Rede Neural não consegue ser tão bem sucedida na detecção de fumaça, uma
vez que as imagens da internet, em alguns casos, são bastante diferentes das
imagens de fumaça do treinamento. Tais diferenças afetam o aprendizado da
Rede sobre o entendimento das características de fumaça; que, até mesmo para
humanos é difícil de descrever, visto que fumaças podem ter diversas cores,
tamanho e, principalmente, não possuem um formato específico (além de serem
facilmente confundidas com nuvens!).
Exemplo de imagens utilizadas na etapa de Treinamento são mostradas
na figura 41 a e b

Figura 41 a: Amostras de imagens de Fumaça do Treinamento

Fonte: Videos de Toreyn et al (2006); imagens editadas de autoria própria

Figura 41 b: Amostras de imagens de Não Fumaça do Treinamento

Fonte: Videos de Toreyn et al (2006); imagens editadas de autoria própria


Exemplo de imagens utilizadas em ambas etapas de Validação e Teste
são mostradas na Figura 42 a e b

Figura 42 a: Amostras de imagens de Fumaça da Validação e Teste

Fonte: Videos de Toreyn et al (2006); imagens editadas de autoria própria

Figura 42 b: Amostras de imagens de Não Fumaça da Validação e Teste

Fonte: Videos de Toreyn et al (2006); imagens editadas de autoria própria


Exemplo de imagens da internet utilizadas na etapa Teste são mostradas
na figura 43 a e b.
Figura 43 a: Amostras de imagens de Fumaça do Teste

Fonte: Videos de Toreyn et al (2006); imagens editadas de autoria própria

Figura 43 b: Amostras de imagens de Não Fumaça do Teste

Fonte: Videos de Toreyn et al (2006); imagens editadas de autoria própria


6. CONCLUSÃO

Embora o primeiro ensaio tenha apresentado 95.7% e 96.8% de acerto, o


segundo ensaio apresentou 34% e 32%; essa diferença entre os testes ratifica a
principal limitação relacionada ao Machine Learning: acesso a um banco de
dados suficientemente grande e não enviesado. O mesmo problema foi
reportado por outros pesquisadores, tais como Zhang et al. (2016).

Contudo, os modelos propostos mostram-se capazes de monitorar


incêndio em dois cenários. O primeiro cenário é o uso em ambientes onde a
Rede teve previamente acesso a imagens do local para o seu treinamento; com
isso a Rede terá um treinamento em local específico e, portanto, pode ser
aplicada para monitorar incêndio, desde que o local não seja alterado.

O segundo cenário é tal que, uma vez que o banco de dados seja
ampliado, alcançando milhares de imagens, a Rede poderá treinar com imagens
mais diversificadas. Com isso, evita-se que o banco de dados seja monótono e,
portanto, os modelos poderão ser aplicados para monitorar incêndio em lugares
diversos, sem precisar ter prévio acesso às imagens do local. Portanto, ambas
soluções são adequadas para usos específicos.

Por fim, para a aplicar os modelos propostos, é sugerido que sejam


implementado uma das seguintes opções:

I. Aumentar o número de Epochs dos modelos e, em seguida utilizar a


Classe Callback do Keras para interromper o treinamento quando alguma
condição for atingida (no caso, o valor de Accuracy desejado);

II. Utilizar a quantidade de Epochs sugeridas por esse trabalho e, caso o


valor de Accuracy não seja suficiente, treinar novamente a Rede Neural.
7. REFERÊNCIAS BIBLIOGRÁFICAS

NG, A. (Deep Learning AI) . C4W1L02 Edge Detection Examples. YouTube, 7 de nov. de 2017.
Disponível em :
https://www.youtube.com/playlist?list=PLkDaE6sCZn6Gl29AoE31iwdVwSG-KnDzF.
Acesso em: 15 de set. de 2022.

AMORIM, R. R. Um novo olhar na geografia para os conceitos e aplicações de geossistemas,


sistemas antrópicos e sistemas ambientais. Caminhos de Geografia, Uberlândia, v. 13, n. 41,
p. 80-101, 2012.

BENGIO, Y. et al. Learning deep architectures for AI. Foundations and trends® in Machine
Learning, v. 2, n. 1, p. 1-127, 2009.

BENGIO, Y. ; GOODFELLOW, I.; COURVILLE, A. Deep learning. Cambridge, MA, USA: MIT
press, 2017.

BERTALANFFY, L. V. (org.) Teoria Geral dos Sistemas. Rio de Janeiro: Editora da Fundação
Getulio Vargas, 1976.

BLUM, A. Machine learning theory. Carnegie Melon Universit, School of Computer Science,
v. 26, 2007.

CARBONELL, J. G.; MICHALSKI, R. S.; MITCHELL, T. M. An overview of machine learning.


Machine learning, p. 3-23, 1983.

CAVALCANTI, A. P. B; RODUIGUEZ, J. M. M. O meio ambiente: histórico e contextualização.


In: CAVALCANTI, A. P. B. (org.). Desenvolvimento Sustentável e planejamento: bases
teóricas e conceituais. Fortaleza: UFC, 1997. p. 9-26.

DE SOUSA FREITAS, M. A.; FREITAS, G. B. INTELIGÊNCIA ARTIFICIAL E MACHINE


LEARNING: Teoria e Aplicações.

EL HINDI, Khalil; MOUSA, AL-Akhras. Smoothing decision boundaries to avoid overfitting in


neural network training. Neural Network World, v. 21, n. 4, p. 311, 2011.

FRAMPTON, D.et al. Demystifying magic: high-level low-level programming. In: Proceedings of
the 2009 ACM SIGPLAN/SIGOPS international conference on Virtual execution
environments. 2009. p. 81-90.

FRIZZI, S. et al. Convolutional neural network for video fire and smoke detection. In: IECON 2016-
42nd Annual Conference of the IEEE Industrial Electronics Society. IEEE, 2016. p. 877-882.

GHOSH, A. et al. A comprehensive review of tools for exploratory analysis of tabular industrial
datasets. Visual Informatics, v. 2, n. 4, p. 235-253, 2018.

GRUS, J. Data science from scratch: first principles with python. O'Reilly Media, 2019
HAYMAN, S. The mcculloch-pitts model. In: IJCNN'99. International Joint Conference on
Neural Networks. Proceedings (Cat. No. 99CH36339). IEEE, 1999. p. 4438-4439.

HUDAK, P. Conception, evolution, and application of functional programming languages. ACM


Computing Surveys (CSUR), v. 21, n. 3, p. 359-411, 1989.

JARRETT, K. et al. What is the best multi-stage architecture for object recognition?. In: 2009 IEEE
12th international conference on computer vision. IEEE, 2009. p. 2146-2153.

KHAN, A. et al. A survey of the recent architectures of deep convolutional neural


networks. Artificial intelligence review, v. 53, n. 8, p. 5455-5516, 2020.

KRIZHEVSKY, A. ; SUTSKEVER, I. ; HINTON, Geoffrey E. Imagenet classification with deep


convolutional neural networks. Communications of the ACM, v. 60, n. 6, p. 84-90, 2017.

LECUN, Y.; KAVUKCUOGLU, K.; FARABET, C. Convolutional networks and applications in


vision. In: Proceedings of 2010 IEEE international symposium on circuits and systems.
IEEE, 2010. p. 253-256.

LEMENKOVA, P. Computing and Plotting Correlograms by Python and R Libraries for Correlation
Analysis of the Environmental Data in Marine Geomorphology. Jeomorfolojik Araştırmalar
Dergisi, n. 3, p. 1-16, 2019.

LENCIONI, S. Região e Geografia. São Paulo: EDUSP, 1999. v. 1. 214 p.

LEVY, P. Cibercultura. 3.ed. São Paulo: Ed.34, 2010.

LOURENÇO, L. Geografia dos incêndios florestais em Portugal continental. Actes de les


Jornades sobre Terrasses I Prevenció de Riscos Naturals, p. 39-62, 2006.

LOURENÇO, L. Risco meteorológico de incêndio florestal. Biblos, v. 56, p. 653-673, 1980.

MBAYE, L.; ZIMMERMANN, K. F. Environmental disasters and migration. 2015.

MCCULLOCH, W. S.; PITTS, W. A logical calculus of the ideas immanent in nervous activity. The
bulletin of mathematical biophysics, v. 5, n. 4, p. 115-133, 1943.

MOHAMMED, M; KHAN, M. B,; BASHIER, E. B. M. Machine learning: algorithms and


applications. Crc Press, 2016.

MOREIRA, R. . Para Onde Vai o Pensamento Geográfico. 1a.. ed. São Paulo: Contexto, 2008.
191 p.

OLIPHANT, T. E. Python for scientific computing. Computing in science & engineering, v. 9,


n. 3, p. 10-20, 2007.
PEREZ FILHO, A. Sistemas Naturais e Geografia. In: SILVA, J. B.; LIMA, L. C.; ELIAS, D. (org.).
Panorama da Geografia Brasileira. São Paulo: Annablume, 2007, v. 01, p. 333-336.

PH, D. G.-S.; WALLEMACQ, P.; BELOW, R. Annual disaster statistical review 2016: the numbers
and trends. Centre for Research on the Epidemiology of Disasters, 2017.

QUORA. Why do people tend to use powers of 2 when specifying the number of nodes in
a layer of a neural net, and for the size of mini-batches?.
Disponível em: < https://www.quora.com/Why-do-people-tend-to-use-powers-of-2-when-
specifying-the-number-of-nodes-in-a-layer-of-a-neural-net-and-for-the-size-of-mini-batches >.
Acesso em: 25 de set, 2022.

QUORA. Why should I choose a mini-batch size of 32, 64, 128, 256, etc. (i.e., a power of
two) and not a size of 50, 100, 500, 1000? Is there any benefit of choosing power of two
mini-batch sizes?
Disponível em: < https://www.quora.com/Why-should-I-choose-a-mini-batch-size-of-32-64-128-
256-etc-i-e-a-power-of-two-and-not-a-size-of-50-100-500-1000-Is-there-any-benefit-of-choosing-
power-of-two-mini-batch-sizes >.
Acesso em: 25 de set, 2022.

RAUBER, T. W. Redes neurais artificiais. Universidade Federal do Espírito Santo, v. 29, 2005.

RODRIGUEZ, J. M. M.; SILVA, E. V. A classificação das paisagens a partir de uma visão


geossistêmica. Revista Mercator. v. 1/ n. 1; jan/jun 2002. 95-112p

RODRIGUEZ, J. M. M. Planejamento Ambiental: bases conceituais, níveis e métodos. In:


CAVALCANTI, A. P. B. (org.). Desenvolvimento Sustentável e planejamento: bases teóricas
e conceituais. Fortaleza: UFC, 1997. p. 9-26.

ROSENBLATT, F. The perceptron: a probabilistic model for information storage and organization
in the brain. Psychological review, v. 65, n. 6, p. 386, 1958.

RUMELHART, D E.; HINTON, Geoffrey E.; WILLIAMS, Ronald J. Learning representations by


back-propagating errors. nature, v. 323, n. 6088, p. 533-536, 1986.

RUSHKOFF, D. As 10 questões essenciais da era digital: programa seu futuro para não
ser programado por ele. São Paulo: Saraiva, 2012.

SAEED, F. et al. Convolutional neural network based early fire detection. Multimedia Tools and
Applications, v. 79, n. 13, p. 9083-9099, 2020.

SAHOO, K. et al. Exploratory data analysis using Python. International Journal of Innovative
Technology and Exploring Engineering (IJITEE), v. 8, n. 12, p. 2019, 2019.

SASS, S. D. A tecnologia no mundo contemporâneo: promessas e desafios. Revista de


Filosofia Aurora, v. 27, n. 40, p. 219-243, 2015.

SÁ-SILVA, J. R.; ALMEIDA, C. D. de; GUINDANI, J. F. Pesquisa documental: pistas teóricas e


metodológicas. Revista brasileira de história & ciências sociais, v. 1, n. 1, p. 1-15, 2009.
SHARMA, S.; SHARMA, S.; ATHAIYA, A. Activation functions in neural networks. towards data
science, v. 6, n. 12, p. 310-316, 2017.

SILVEIRA, D. T.; CÓRDOVA, F. P. A pesquisa cientítica. Métodos de pesquisa. Porto Alegre:


Editora da UFRGS, 2009. p. 33-44, 2009.

SRINATH, K. R. Python–the fastest growing programming language. International Research


Journal of Engineering and Technology (IRJET), v. 4, n. 12, p. 354-357, 2017.

SOARES, R. V. Índices de perigo de incêndio. Floresta, v. 3, n. 3, 1972.

SPRUSTON, N. Pyramidal neurons: dendritic structure and synaptic integration. Nature Reviews
Neuroscience, v. 9, n. 3, p. 206-221, 2008.

TANIGUCHI, H.; SATO, H.; SHIRAKAWA, T. A machine learning model with human cognitive
biases capable of learning from small and biased datasets. Scientific reports, v. 8, n. 1, p. 1-13,
2018.

TANSLEY, A. G. The use and abuse of vegetational concept and terms. Ecology. n. 16: 284-
307p., 1935.

TÖREYIN, B. Uğur et al. Computer vision based method for real-time fire and flame
detection. Pattern recognition letters, v. 27, n. 1, p. 49-58, 2006. Disponível em:
http://signal.ee.bilkent.edu.tr/VisiFire/. Acesso em 10 de Set. de 2022.

VAN AALST, M. K. The impacts of climate change on the risk of natural disasters. Disasters, v.
30, n. 1, p. 5-18, 2006.

VAN DER AALST, W.; DAMIANI, E. Processes meet big data: Connecting data science with
process science. IEEE Transactions on Services Computing, v. 8, n. 6, p. 810-819, 2015.

VAN ROSSUM, G. ; DRAKE JR, F. L. Python tutorial. Amsterdam, The Netherlands: Centrum
voor Wiskunde en Informatica, 1995.

VAN ROSSUM, G. et al. Python Programming language. In: USENIX annual technical
conference. 2007. p. 1-36.

VERDE, J. C. Avaliação da perigosidade de incêndio florestal. 2010. Tese de Doutorado.

VITTE, A. C. (org.). Contribuições à Historia e a Epistemologia da Geografia. Rio de Janeiro:


Bertrand Brasil, 2007. 290 p.

WEBER, M. G.; WAGNER, CE Van; HUMMEL, Monte. Selected parameters of fire behavior and
Pinus banksiana Lamb. regeneration in eastern Ontario. The Forestry Chronicle, v. 63, n. 5, p.
340-346, 1987.
ZHANG, Q. et al. Deep convolutional neural networks for forest fire detection. In: 2016
International Forum on Management, Education and Information Technology Application.
Atlantis Press, 2016. p. 568-575.
8. ANEXOS

Os scripts estão disponíveis em:


https://github.com/Leandro-Bernardo/Neural-Network-for-fire-detection

SCRIPT 1 ( Recorte das imagens do banco de dados)

#### Drive Mount

from google.colab import drive

from google.colab import drive


drive.mount('/content/drive/') # autoriza acesso ao drive

#### Video e Directorio

import os

!ls "/content/drive/My Drive/TCC/Videos/" # para ver os arquivos na pasta

nome_video = str(input('nome do video \n'))

drive = (f'/content/drive/My Drive/TCC/Videos/Imagens/{nome_video}')

try:
os.mkdir(path=drive)

except:
pass
print('\nDiretório já existe')

else:
os.mkdir(f'/content/drive/My Drive/TCC/Videos/Imagens/{nome_video}/Frames')
os.mkdir(f'/content/drive/My Drive/TCC/Videos/Imagens/{nome_video}/Cortes')

#### Frames

import cv2

# https://techtutorialsx.com/2021/04/29/python-opencv-splitting-video-frames/

video = cv2.VideoCapture(f"/content/drive/My Drive/TCC/Videos/{nome_video}") #


cv2.VideoCapture pega os videos no caminho indicado

frameNr, frame_atual, passo = 0, 0, int(input('Print a cada quantos frames? \n'))


while (True):
success, imagem_frame = video.read() # .read() : this method takes no arguments and
returns a tuple. The first value of the tuple is a Boolean indicating if we could read the frame or
not and the second value is the actual frame

if success:
if (frame_atual % passo == 0): # para poder decidir quantos o intervalo de prints entre os
frames ( cv2.imwrite() tira print por frames)

cv2.imwrite(f'/content/drive/MyDrive/TCC/Videos/Imagens/{nome_video}/Frames/frame_{frame
Nr}.jpg',imagem_frame)
frameNr +=1

else:
pass

else:
break

frame_atual +=1
frameNr=0

#### Recortes

from PIL import Image


import shutil

# https://pillow.readthedocs.io/en/stable/handbook/tutorial.html

imagens = os.listdir(f'/content/drive/MyDrive/TCC/Videos/Imagens/{nome_video}/Frames/') #
os.listdir() mostra os arquivos contidos no diretorio
imagens[-1] # mostra a quantidade de fotos

# para verificar o tamanho dos Frames Salvos

teste =
Image.open(f'/content/drive/MyDrive/TCC/Videos/Imagens/{nome_video}/Frames/{imagens[0]}')
print(teste.format, teste.size, teste.mode)
teste

print('Coordenadas são (left, upper, right, lower)\n')


x_inicial, y_inicial, x_final, y_final = int(input('Posição Inicial de X? (left) ')), int(input('Posição
Inicial de Y? (upper) ')), int(input('Posição Final de X? (right) ')), int(input('Posição Final de
Y? (lowe) '))

box = (x_inicial, y_inicial, x_final, y_final ) # coordinates are (left, upper, right, lower)

teste.crop(box)
val = str(input('Usar recorte atual? ').lower())

if 's' in val:
for i,j in enumerate(imagens):
# abre a imagem
im = Image.open(f'/content/drive/MyDrive/TCC/Videos/Imagens/{nome_video}/Frames/{j}')
#To load an image from a file, use the open() function in the Image module

# corta a imagem com o formato previo


im = im.crop(box)

if os.path.exists(f'corte_{i}.jpeg') == False: # verifica se a imagem ja existe


# salva as imagems im.save(nome , formato)
im.save(fp = f'corte_{i}.jpeg', format='JPEG') # https://www.geeksforgeeks.org/python-pil-
image-save-method/
else:
im.save(fp = f'corte_{i}(1).jpeg', format='JPEG')

# move as imagens (salvas no diretório padrão do Colab (content)) pra


pasta específica
shutil.move(f'/content/corte_{i}.jpeg' ,
f'/content/drive/MyDrive/TCC/Videos/Imagens/{nome_video}/Cortes') #
https://www.geeksforgeeks.org/python-shutil-copy-method/

elif 'n' in val:


pass
print('\nAs imagens não serão geradas')

SCRIPT 2 ( Treinamento dos Modelos )

#### Drive

from google.colab import drive


drive.mount('/content/drive')

#### Pré processamento das Imagens

import os

local = input('Qual Treinamento?')

dir = list(os.listdir(local))
dir

print(f'{dir[0]} contem :', len(os.listdir(f'{local}/{dir[0]}')),'fotos')


print(f'{dir[1]} contem :', len(os.listdir(f'{local}/{dir[1]}')),'fotos')

size = sum([len(os.listdir(f'{local}/{dir[0]}')) ,len(os.listdir(f'{local}/{dir[1]}'))])


print('Total:', size)

amostras = int(size/8)
amostras

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Para reescalar as imagens em 1./255 (normalizar)


reescala = ImageDataGenerator(rescale=1/255)

# Flow training images in batches using train_datagen generator


imagens_treinamento = reescala.flow_from_directory(
local, # This is the source directory for training images
target_size=(300, 300), # All images will be resized to 300x300
batch_size= amostras,
# Since we use binary_crossentropy loss, we need binary labels
class_mode='binary')

#### Modelos

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.optimizers import RMSprop

class CustomCallback(keras.callbacks.Callback): #
https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/Callback
def on_epoch_end(self, epoch, logs=None):
keys = list(logs.values())
# print("Epoch {} ; accuracy: {}".format(epoch, keys[1]))

##### Modelo 1
def modelo_1(): # 15 epochs, learning rate 0.01 , 5 layers de convolução
rede = tf.keras.models.Sequential([

# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de


entrada)
tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(64, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(512, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid).


tf.keras.layers.Dense(1, activation='sigmoid')]) #Esse neurônio recebe valor 0 ou 1 (0 para
classe 1 e 1 para a outra classe)

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.01),
metrics=['accuracy'])

return rede

##### Modelo 2

def modelo_2(): # 15 epochs, learning rate 0.01 , 4 layers de convolução


rede = tf.keras.models.Sequential([

# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de


entrada)
tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(64, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(512, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid).


tf.keras.layers.Dense(1, activation='sigmoid')]) #Esse neurônio recebe valor 0 ou 1 (0 para
classe 1 e 1 para a outra classe)

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.01),
metrics=['accuracy'])

return rede

##### Modelo 3

def modelo_3(): # 15 epochs, learning rate 0.01 , 4 layers de convolução


rede = tf.keras.models.Sequential([

# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de


entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(64, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(512, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid).


tf.keras.layers.Dense(1, activation='sigmoid')]) #Esse neurônio recebe valor 0 ou 1 (0 para
classe 1 e 1 para a outra classe)

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.01),
metrics=['accuracy'])
return rede

##### Modelo 4

def modelo_4(): # 15 epochs, learning rate 0.001 , 3 layers de convolução


rede = tf.keras.models.Sequential([

# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de


entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(64, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(512, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid). Esse neurônio


recebe valor 0 ou 1 (0 para classe 1 e 1 para a outra classe)
tf.keras.layers.Dense(1, activation='sigmoid')])

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.02),
metrics=['accuracy'])
return rede

##### Modelo 5

def modelo_5(): # 15 epochs, learning rate 0.002 , 5 layers de convolução (5 tentativa)


rede = tf.keras.models.Sequential([

# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de


entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(64, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(512, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid). Esse neurônio


recebe valor 0 ou 1 (0 para classe 1 e 1 para a outra classe)
tf.keras.layers.Dense(1, activation='sigmoid')])

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.002),
metrics=['accuracy'])

return rede

##### Modelo 6

def modelo_6(): # 15 epochs, learning rate 0.002 , 4 layers de convolução


rede = tf.keras.models.Sequential([

# Primeira Convolução (nos dados iniciais)


# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de
entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(256, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid).


tf.keras.layers.Dense(1, activation='sigmoid')]) #Esse neurônio recebe valor 0 ou 1 (0 para
classe 1 e 1 para a outra classe)

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.002),
metrics=['accuracy'])

return rede

##### Modelo 7

def modelo_7(): # 16 epochs, learning rate 0.001 , 4 layers de convolução


rede = tf.keras.models.Sequential([

# Primeira Convolução (nos dados iniciais)


# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de
entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(256, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid).


tf.keras.layers.Dense(1, activation='sigmoid')]) #Esse neurônio recebe valor 0 ou 1 (0 para
classe 1 e 1 para a outra classe)

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.001),
metrics=['accuracy'])

return rede

##### Modelo 8

def modelo_8(): # 10 epochs, learning rate 0.001 , 5 layers de convolução


rede = tf.keras.models.Sequential([
# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de
entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(64, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(512, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid). Esse neurônio


recebe valor 0 ou 1 (0 para classe 1 e 1 para a outra classe)
tf.keras.layers.Dense(1, activation='sigmoid')])

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.001),
metrics=['accuracy'])

return rede

##### Modelo 9 (35 epoch)

def modelo_9(): # 35 epochs, learning rate 0.001 , 4 layers de convolução


rede = tf.keras.models.Sequential([

# Primeira Convolução (nos dados iniciais)


# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de
entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(256, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid).


tf.keras.layers.Dense(1, activation='sigmoid')]) #Esse neurônio recebe valor 0 ou 1 (0 para
classe 1 e 1 para a outra classe)

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.001),
metrics=['accuracy'])

return rede

##### Modelo 9 (27 epoch)

def modelo_10(): # 27 epochs, learning rate 0.001 , 4 layers de convolução (atual)


rede = tf.keras.models.Sequential([

# Primeira Convolução (nos dados iniciais)


# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de
entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(256, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid).


tf.keras.layers.Dense(1, activation='sigmoid')]) #Esse neurônio recebe valor 0 ou 1 (0 para
classe 1 e 1 para a outra classe)
rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.001),
metrics=['accuracy'])

return rede

##### Modelo 10

def modelo_8(): # modelo 8 com 15 epochs, learning rate 0.001 , 5 layers de convolução
rede = tf.keras.models.Sequential([

# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de


entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(64, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(512, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid). Esse neurônio


recebe valor 0 ou 1 (0 para classe 1 e 1 para a outra classe)
tf.keras.layers.Dense(1, activation='sigmoid')])

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.001),
metrics=['accuracy'])

return rede

class CustomCallback(keras.callbacks.Callback): #
https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/Callback
def on_epoch_end(self, epoch, logs=None):
keys = list(logs.values())
# print("Epoch {} ; accuracy: {}".format(epoch, keys[1]))

#### Accuracy x Epoch ( todas )

import shutil

n = int(input('quantos treinamentos? '))

%cd '/content/drive/MyDrive/TCC/Videos'

##### Modelo 1

acc1 = list(range(n))

nome = f'model1({n})(Acc*Epoch)'
epoch = 15

try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model1 = modelo_1()
report1 = model1.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report1.history['accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

##### Modelo 2

acc2 = list(range(n))

nome = f'model2({n})(Acc*Epoch)'
epoch = 15

try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model2 = modelo_2()
report2 = model2.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report2.history['accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')
##### Modelo 3

acc3 = list(range(n))

nome = f'model3({n})(AccxEpoch)'
epoch = 15

try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model3 = modelo_3()
report3 = model3.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report3.history['accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

##### Modelo 4

acc4 = list(range(n))

nome = f'model1({n})(AccxEpoch)'
epoch = 15
try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model4 = modelo_4()
report4 = model4.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report4.history['accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

##### Modelo 5

acc5 = list(range(n))

nome = f'model5({n})(AccxEpoch)'
epoch = 15

try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')
else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model5 = modelo_5()
report5 = model5.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report5.history['accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

##### Modelo 6

acc6 = list(range(n))

nome = f'model6({n})(AccxEpoch)'
epoch = 15

try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')
for i in range(n):
print(f'\n treinamento {i+1} \n')

model6 = modelo_6()
report6 = model6.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report6.history['accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

##### Modelo 7

acc7 = list(range(n))

nome = f'model7({n})(AccxEpoch).treinamento_novo(664imagens)'
epoch = 16

try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model7 = modelo_7()
report7 = model7.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report7.history['accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

##### Modelo 8

acc8 = list(range(n))

nome = f'model8({n})(AccxEpoch)(664)'
epoch = 15

try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model8 = modelo_8()
report8 = model8.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report8.history['accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

##### Modelo 9

acc9 = list(range(n))

nome = f'model7({n})(AccxEpoch)'
epoch = 35

try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model9 = modelo_9()
report9 = model9.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report9.history['accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

##### Modelo 10

acc10 = list(range(n))

nome = f'model7({n})(AccxEpoch)'
epoch = 27

try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model10 = modelo_10()
report10 = model10.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report10.history['accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

#### Accuracy x Epoch ( ultima )

import shutil

n = int(input('quantos treinamentos? '))

%cd '/content/drive/MyDrive/TCC/Videos'

acc1 = list(range(n))

try:
assert f'model1({n})t.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se
existe o arquivo no drive

except:
print(f'model1({n}) já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'model1({n})t.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele
não exista
m.write('Treinamento,Accuracy\n')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model1 = modelo_1()
report1 = model1.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=15,
verbose=0,
callbacks= [CustomCallback()])

acc1[i] = report1.history['accuracy'][-1]

with open(f'model1({n})t.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores


m.write(f'{i+1}, {acc1[i]} \n')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/model1({n})t.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

acc2 = list(range(n))
try:
assert f'model2({n})t.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se
existe o arquivo no drive

except:
print(f'model2({n}) já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'model2({n})t.txt', 'w') as m: # cria o arquivo para receber os valores
m.write('Treinamento,Accuracy\n')
for i in range(n):
print(f'\n treinamento {i+1} \n')

model2 = modelo_2()
report2 = model2.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=15,
verbose=0,
callbacks= [CustomCallback()])

acc2[i] = report2.history['accuracy'][-1]

with open(f'model2({n})t.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores


m.write(f'{i+1}, {acc2[i]} \n')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/model2({n})t.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
pass
print('modelo 2 nao foi movido')

acc3 = list(range(n))

try:
assert f'model3({n})t.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se
existe o arquivo no drive

except:
print(f'model3({n})t já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'model3({n})t.txt', 'w') as m: # cria o arquivo para receber os valores
m.write('Treinamento,Accuracy\n')
for i in range(n):
print(f'\n treinamento {i} \n')

model3 = modelo_3()
report3 = model3.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=15,
verbose=0,
callbacks= [CustomCallback()])

acc3[i] = report3.history['accuracy'][-1]
with open(f'model3({n})t.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores
m.write(f'{i+1}, {acc3[i]} \n')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/model3({n})t.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
pass
print('modelo 3 nao foi movido')

acc4 = list(range(n))

try:
assert f'model4({n})t.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se
existe o arquivo no drive

except:
print(f'model4({n})t já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'model4({n})t.txt', 'w') as m: # cria o arquivo para receber os valores
m.write('Treinamento,Accuracy\n')
for i in range(n):
print(f'\n treinamento {i} \n')

model4 = modelo_4()
report4 = model4.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=15,
verbose=0,
callbacks= [CustomCallback()])

acc4[i] = report4.history['accuracy'][-1]
with open(f'model4({n})t.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores
m.write(f'{i+896}, {acc4[i]} \n')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/model4({n})t.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
pass
print('modelo 4 nao foi movido')

acc5 = list(range(n))
try:
assert f'model5({n})t.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se
existe o arquivo no drive

except:
print(f'model5({n}) já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'model5({n})t.txt', 'w') as m: # cria o arquivo para receber os valores
m.write('Treinamento,Accuracy\n')
for i in range(n):
print(f'\n treinamento {i+1} \n')

model5 = modelo_5()
report5 = model5.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=15,
verbose=0,
callbacks= [CustomCallback()])

acc5[i] = report5.history['accuracy'][-1]

with open(f'model5({n})t.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores


m.write(f'{i+1}, {acc5[i]} \n')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/model5({n})t.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
pass
print('modelo 5 nao foi movido')

acc6 = list(range(n))

try:
assert f'model6({n})t.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se
existe o arquivo no drive

except:
print(f'model6({n}) já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'model6({n})t.txt', 'w') as m: # cria o arquivo para receber os valores
m.write('Treinamento,Accuracy\n')
for i in range(n):
print(f'\n treinamento {i+1} \n')

model6 = modelo_6()
report6 = model6.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=15,
verbose=0,
callbacks= [CustomCallback()])

acc6[i] = report6.history['accuracy'][-1]

with open(f'model6({n})t.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores


m.write(f'{i+1}, {acc6[i]} \n')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/model6({n})t.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
pass
print('modelo 6 nao foi movido')

acc7 = list(range(n))

try:
assert f'model7({n})t.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se
existe o arquivo no drive

except:
print(f'model7({n}) já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'model7({n})t.txt', 'w') as m: # cria o arquivo para receber os valores
m.write('Treinamento,Accuracy\n')
for i in range(n):
print(f'\n treinamento {i+1} \n')

model7 = modelo_7()
report7 = model7.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=16,
verbose=0,
callbacks= [CustomCallback()])

acc7[i] = report2.history['accuracy'][-1]

with open(f'model7({n})t.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores


m.write(f'{i+1}, {acc7[i]} \n')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/model7({n})t.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
pass
print('modelo 7 nao foi movido')

acc8 = list(range(n))

try:
assert f'model8({n})t.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se
existe o arquivo no drive

except:
print(f'model8({n}) já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'model8({n})t.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele
não exista
m.write('Treinamento,Accuracy\n')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model8 = modelo_8()
report8 = model8.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=15,
verbose=1,
callbacks= [CustomCallback()])

acc8[i] = report8.history['accuracy'][-1]

with open(f'model8({n})t.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores


m.write(f'{i+1}, {acc8[i]} \n')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/model5({n})t.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

# acc9 = list(range(n))

# try:
# assert f'model9({n})t.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se
existe o arquivo no drive

# except:
# print(f'model9({n}) já existe em /content/drive/MyDrive/TCC/Videos')

# else:
# with open(f'model9({n})t.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele
não exista
# m.write('Treinamento,Accuracy\n')

# for i in range(n):
# print(f'\n treinamento {i+1} \n')

# model9 = modelo_9()
# report9 = model9.fit(imagens_treinamento,
# steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o
passo será x/y
# epochs=35,
# verbose=0,
# callbacks= [CustomCallback()])

# acc9[i] = report9.history['accuracy'][-1]

# with open(f'model1({n})t.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores


# m.write(f'{i+1}, {acc1[i]} \n')

# try:
# shutil.move(f'/content/drive/MyDrive/TCC/Videos/model9({n})t.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

# except:
# print('modelo 9 nao foi movido')

# acc10 = list(range(n))

# try:
# assert f'model10({n})t.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se
existe o arquivo no drive

# except:
# print(f'model10({n}) já existe em /content/drive/MyDrive/TCC/Videos')

# else:
# with open(f'model10({n})t.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso
ele não exista
# m.write('Treinamento,Accuracy\n')

# for i in range(n):
# print(f'\n treinamento {i+1} \n')

# model10 = modelo_10()
# report10 = model10.fit(imagens_treinamento,
# steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o
passo será x/y
# epochs=27,
# verbose=0,
# callbacks= [CustomCallback()])
# acc10[i] = report10.history['accuracy'][-1]

# with open(f'model1({n})t.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores


# m.write(f'{i+1}, {acc1[i]} \n')

# try:
# shutil.move(f'/content/drive/MyDrive/TCC/Videos/model10({n})t.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

# except:
# print('modelo 10 nao foi movido')

SCRIPT 3 ( Gráfico Accuracy x Epoch )

#### Drive

from google.colab import drive


drive.mount('/content/drive')
#### Grafico

import pandas as pd

import matplotlib.pyplot as plt


import plotly.express as px
import plotly.graph_objects as go

import plotly.graph_objects as go

%cd '/content/drive/MyDrive/TCC/Scripts/Modelos'

!ls '/content/drive/MyDrive/TCC/Scripts/Modelos'

##### Modelo 1

#dado = input('Qual dado?\n')


#dado = 'model8(100)(AccxEpoch).txt'
dado = 'model1(100)(Acc_Epoch).txt'

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


dados1 = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed:
15',axis=1).transpose()
dados1

media1 = dados1.transpose().mean()
medias1 = list(media1.values)
medias1

fig= px.scatter(dados1 ,template = 'plotly_white', title= 'Accuracy x Epoch',


width=1350, height=600)
#fig.add_trace(medias)

fig.update_layout(font_size = 18, showlegend=False)


fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

fig = go.Figure() # cria um grafico com propriedades de objeto

fig = go.Figure()
for i in range(1,16):
fig.add_trace(go.Scatter(x = list(range(1,36)),
y = dados1[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for
adiciona cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'darkred'}

fig.add_trace(go.Scatter(x = list(range(1,15)), y = medias1, line = dic))


fig

##### Modelo 2

#dado = input('Qual dado?\n')


dado = 'model2(100)(Acc_Epoch).txt'

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


dados2 = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed:
15',axis=1).transpose()
dados2

media2 = dados2.transpose().mean()
medias2 = list(media2.values)
medias2

fig= px.scatter(dados2 ,template = 'plotly_white', title= 'Accuracy x Epoch',


width=1350, height=600)
#fig.add_trace(medias)

fig.update_layout(font_size = 18, showlegend=False)


fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

fig = go.Figure() # cria um grafico com propriedades de objeto

fig = go.Figure()
for i in range(1,16):
fig.add_trace(go.Scatter(x = list(range(1,16)),
y = dados2[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for
adiciona cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'darkred'}


fig.add_trace(go.Scatter(x = list(range(1,16)), y = medias2, line = dic))
fig

##### Modelo 3

#dado = input('Qual dado?\n')


dado = 'model3(100)(Acc_Epoch).txt'

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


dados3 = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed:
15',axis=1).transpose()
dados3

media3 = dados3.transpose().mean()
medias3 = list(media3.values)
medias3

fig= px.scatter(dados3 ,template = 'plotly_white', title= 'Accuracy x Epoch',


width=1350, height=600)
#fig.add_trace(medias)

fig.update_layout(font_size = 18, showlegend=False)


fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

fig = go.Figure() # cria um grafico com propriedades de objeto

fig = go.Figure()
for i in range(1,16):
fig.add_trace(go.Scatter(x = list(range(1,16)),
y = dados3[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for
adiciona cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'darkred'}

fig.add_trace(go.Scatter(x = list(range(1,16)), y = medias3, line = dic))


fig

##### Modelo 4
#dado = input('Qual dado?\n')
dado = 'model4(100)(Acc_Epoch).txt'

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


dados4 = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed:
15',axis=1).transpose()
dados4

media4 = dados4.transpose().mean()
medias4 = list(media4.values)
medias4

fig= px.scatter(dados4 ,template = 'plotly_white', title= 'Accuracy x Epoch',


width=1350, height=600)
#fig.add_trace(medias)

fig.update_layout(font_size = 18, showlegend=False)


fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

fig = go.Figure() # cria um grafico com propriedades de objeto

fig = go.Figure()
for i in range(1,16):
fig.add_trace(go.Scatter(x = list(range(1,16)),
y = dados4[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for
adiciona cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'darkred'}

fig.add_trace(go.Scatter(x = list(range(1,16)), y = medias4, line = dic))


fig

##### Modelo 5

#dado = input('Qual dado?\n')


dado = 'model5(100)(Acc_Epoch).txt'

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


dados5 = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed:
15',axis=1).transpose()
dados5
media5 = dados5.transpose().mean()
medias5 = list(media5.values)
medias5

fig= px.scatter(dados5 ,template = 'plotly_white', title= 'Accuracy x Epoch',


width=1350, height=600)
#fig.add_trace(medias)

fig.update_layout(font_size = 18, showlegend=False)


fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

fig = go.Figure() # cria um grafico com propriedades de objeto

fig = go.Figure()
for i in range(1,16):
fig.add_trace(go.Scatter(x = list(range(1,16)),
y = dados5[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for
adiciona cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'darkred'}

fig.add_trace(go.Scatter(x = list(range(1,16)), y = medias5, line = dic))


fig

##### Modelo 6

#dado = input('Qual dado?\n')


dado = 'model6(100)(Acc_Epoch).txt'

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


dados6 = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed:
15',axis=1).transpose()
dados6

media6 = dados6.transpose().mean()
medias6 = list(media6.values)
medias6
fig= px.scatter(dados6 ,template = 'plotly_white', title= 'Accuracy x Epoch',
width=1350, height=600)
#fig.add_trace(medias)

fig.update_layout(font_size = 18, showlegend=False)


fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

fig = go.Figure() # cria um grafico com propriedades de objeto

fig = go.Figure()
for i in range(1,100):
fig.add_trace(go.Scatter(x = list(range(1,100)),
y = dados6[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for
adiciona cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'darkred'}

fig.add_trace(go.Scatter(x = list(range(1,16)), y = medias6, line = dic))


fig

##### Modelo 7

!ls '/content/drive/MyDrive/TCC/Scripts/Modelos'

#dado = input('Qual dado?\n')


#dado = 'model7(1000)t(Acc*Epoch)(banco_de_dados_antigo).txt'
dado = 'model7(250)(AccxEpoch).treinamento_novo(664imagens).txt'

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


dados7 = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed:
16',axis=1).transpose()
dados7 *=100
dados7

media7 = dados7.transpose().mean()
medias7 = list(media7.values)
#medias7.remove(0.9696234438730322)
medias7

fig= px.scatter(dados7 ,template = 'plotly_white', title= 'Accuracy x Epoch',


width=1350, height=600)
#fig.add_trace(medias)
fig.update_layout(font_size = 18, showlegend=False)
fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

fig = go.Figure() # cria um grafico com propriedades de objeto

fig = go.Figure()
for i in range(1,100):
fig.add_trace(go.Scatter(x = list(range(1,100)),
y = dados7[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for
adiciona cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'crimson'}

fig.add_trace(go.Scatter(x = list(range(1,17)), y = medias7, line = dic))


fig

##### Modelo 8

#dado = input('Qual dado?\n')


dado = 'model8(1000)(AccxEpoch)(664).txt'

! ls

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


#dados8 = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed:
15',axis=1).transpose()
dados8 = pd.read_csv(dado).reset_index().drop('index', axis =
1).drop(['11','12','13','14','15','Unnamed: 15'],axis=1).transpose()
dados8 *= 100
dados8

media8 = dados8.transpose().mean()
medias8 = list(media8.values)
medias8

fig= px.scatter(dados8 ,template = 'plotly_white', title= 'Accuracy x Epoch',


width=1350, height=600)
#fig.add_trace(medias)
fig.update_layout(font_size = 18, showlegend=False)
fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

fig = go.Figure() # cria um grafico com propriedades de objeto

fig = go.Figure()
for i in range(1,16):
fig.add_trace(go.Scatter(x = list(range(1,16)),
y = dados8[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for
adiciona cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'hotpink'}

fig.add_trace(go.Scatter(x = list(range(1,15)), y = medias8, line = dic))


fig

##### Modelo 9

!ls '/content/drive/MyDrive/TCC/Scripts/Modelos'

#dado = input('Qual dado?\n')


dado = 'model9(35epoch)(1000)(AccxEpoch).txt'
dadoval = 'model9(1000)(Val_AccxEpoch).txt'

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


dados9 = pd.read_csv(dado).reset_index().drop('index', axis =
1).drop(['28','29','30','31','32','33','34','35','Unnamed: 35'],axis=1).transpose()
dados9val = pd.read_csv(dadoval).reset_index().drop('index', axis = 1).drop('Unnamed:
27',axis=1).transpose()
#dados9 *= 100

dados9 *=100
dados9

dados9val *=100
dados9val

media9 = dados9.transpose().mean()
medias9 = list(media9.values)
medias9
# para validacao
media9val = dados9val.transpose().mean()
medias9val = list(media9val.values)
medias9val

modelo9 = pd.DataFrame((medias9,medias9val)).rename({1:'treinamento',
0:'validação'}).transpose().rename({0:'1',1:'2',2:'3',3:'4',4:'5',5:'6',6:'7',7:'8',8:'9',9:'10',10:'11',11:'1
2',12:'13',13:'14',14:'15',15:'16',16:'17',17:'18',18:'19',19:'20',20:'21',21:'22',22:'23',23:'24',24:'25',
25:'26',26:'27'})
modelo9

modelo9 = modelo9.transpose()

modelo9

fig= px.line((modelo9) ,template = 'plotly_white', title= 'Accuracy x Epoch',


width=1350, height=600,
color_discrete_sequence=['indigo','dodgerblue'],
)
#fig.add_trace(medias)

fig.update_layout(font_size = 18, showlegend=True)


fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

fig = go.Figure() # cria um grafico com propriedades de objeto

fig = go.Figure()
for i in range(1,36):
fig.add_trace(go.Scatter(x = list(range(1,36)),
y = dados9[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for
adiciona cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'crimson'}

fig.add_trace(go.Scatter(x = list(range(1,36)), y = medias9, line = dic))


fig
##### Modelo 10

!ls '/content/drive/MyDrive/TCC/Scripts/Modelos'

#dado = input('Qual dado?\n')


#dado = 'model10(1000)t(Acc*Epoch).txt'
dado = 'model8(1000)(AccxEpoch)(664).txt'
dado10val = 'model10(1000)(Val_AccxEpoch).txt'

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


#dados10 = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed:
28',axis=1).transpose()
dados10 = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed:
15',axis=1).transpose()
dados10val = pd.read_csv(dado10val).reset_index().drop('index', axis = 1).drop('Unnamed:
15',axis=1).transpose()

dados10*=100
dados10

dados10val *=100
dados10val

media10 = dados10.transpose().mean()
medias10 = list(media10.values)
medias10

media10val = dados10val.transpose().mean()
medias10val = list(media10val.values)
medias10val

modelo10 = pd.DataFrame((medias10val,medias10)).rename({0:'treinamento',
1:'validação'}).transpose().rename({0:'1',1:'2',2:'3',3:'4',4:'5',5:'6',6:'7',7:'8',8:'9',9:'10',10:'11',11:'1
2',12:'13',13:'14',14:'15'})
modelo10

fig= px.line(modelo10 ,template = 'plotly_white', title= 'Accuracy x Epoch',


width=1350, height=600,
color_discrete_sequence=['hotpink','indigo'])
#fig.add_trace(medias)

fig.update_layout(font_size = 18, showlegend=True)


fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

#add_anotation = {'fill':'toself','bgcolorcolor': 'aa'}


# fig = go.Figure(add_anotation) # cria um grafico com propriedades de objeto
# fig.show()

fig = go.Figure()
for i in range(1,28):
fig.add_trace(go.Scatter(x = list(range(1,28)),
y = dados10[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for
adiciona cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'hotpink'}

fig.add_trace(go.Scatter(x = list(range(1,28)), y = medias10, line = dic))


fig

#### Gráfico de todos os modelos (Primeira Etapa)

y=
pd.DataFrame([medias1,medias2,medias3,medias4,medias5,medias6,medias7,medias8]).trans
pose().rename(columns={0:'modelo 1',1:'modelo 2',2:'modelo 3',3:'modelo 4',4:'modelo
5',5:'modelo 6',6:'modelo 7',7:'modelo 8'}).rename(index =
{0:1,1:2,2:3,3:4,4:5,5:6,6:7,7:8,8:9,9:10,10:11,11:12,12:13,13:14,14:15})
y

for coluna in y.columns: # transforma em percentual os valores de Accuracy


y[coluna] = y[coluna]*100

fig = px.line(y, template = 'plotly_white', title= 'Accuracy x Epoch', width=1200, height=600,


color_discrete_sequence=['black','crimson','purple', 'chartreuse',
'slategrey','tomato','dodgerblue','hotpink'])
fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy (%)'
fig.show()

#### Gráfico de todos os modelos (Segunda Etapa)

y=
pd.DataFrame([medias7,medias8,medias9,medias10]).transpose().rename(columns={0:'modelo
7',1:'modelo 8',2:'modelo 9',3:'modelo 10'}).rename(index =
{0:1,1:2,2:3,3:4,4:5,5:6,6:7,7:8,8:9,9:10,10:11,11:12,12:13,13:14,14:15,15:16,16:17,17:18,18:19
,19:20,20:21,21:22,22:23,23:24,24:25,25:26,26:27,27:28})
y

# for coluna in y.columns: # transforma em percentual os valores de Accuracy


# y[coluna] = y[coluna]*100
y.iloc[1]

fig = px.line(y, template = 'plotly_white', title= 'Accuracy x Epoch', width=1200, height=600,


color_discrete_sequence=['dodgerblue','hotpink'])
fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy (%)'

#fig.update_traces(y = y.iloc[1],marker= dict(symbol = ('3'),size = 5,color = 'black'))


#fig.update_traces(y = y.iloc[2],marker= dict(symbol = ('4'),size = 5,color = 'red'))
fig.show()

y = y.transpose()

y.iloc[1]

SCRIPT 4 ( Histograma da Accuracy da última epoch)

#### Drive

from google.colab import drive


drive.mount('/content/drive')

%cd '/content/drive/MyDrive/TCC/Scripts/Modelos'

!pwd
#### Dados

nome = 'epochs' # nome para as colunas do DataFrame

epochs = list(range(1001))
epochs.remove(0)

import os

import matplotlib.pyplot as plt


import plotly.express as px

##### 100 Treinamentos

###### Modelo 1 (100)

os.listdir('/content/drive/MyDrive/TCC/Scripts/Modelos')

import pandas as pd

#modelo_1 = pd.read_csv('model1(100)t.txt', index_col = 'Treinamento')


#modelo_1

#!pwd

#acc = [0.9910714030265808, 0.9910714030265808, 0.9776785969734192,


0.5758928656578064, 0.8883928656578064, 0.9910714030265808, 0.8125,
0.8080357313156128, 0.9821428656578064, 0.8883928656578064, 0.5982142686843872,
0.9910714030265808, 0.9776785969734192, 0.8705357313156128, 0.9419642686843872,
0.9821428656578064, 0.9776785969734192, 0.8258928656578064, 0.7723214030265808,
0.9866071343421936, 0.9866071343421936, 0.9241071343421936, 0.7633928656578064,
0.9419642686843872, 0.9866071343421936, 0.8928571343421936, 0.9955357313156128,
0.5848214030265808, 0.9910714030265808, 0.9776785969734192, 0.9821428656578064,
1.0, 0.9821428656578064, 0.6964285969734192, 0.96875, 0.9866071343421936,
0.7276785969734192, 0.9776785969734192, 0.9375, 0.9821428656578064, 0.96875,
0.6741071343421936, 0.9866071343421936, 0.6160714030265808, 0.8883928656578064,
0.9910714030265808, 0.9196428656578064, 0.6919642686843872, 0.9910714030265808,
0.7455357313156128, 0.9776785969734192, 0.8660714030265808, 0.9419642686843872,
0.9508928656578064, 0.5758928656578064, 0.8839285969734192, 0.9732142686843872,
0.9598214030265808, 0.9598214030265808, 0.875, 0.96875, 0.8794642686843872,
0.9776785969734192, 0.6651785969734192, 0.9821428656578064, 0.8214285969734192,
0.6696428656578064, 0.9732142686843872, 0.9866071343421936, 0.9821428656578064,
0.9821428656578064, 0.9776785969734192, 0.7901785969734192, 0.5758928656578064,
0.9017857313156128, 0.9419642686843872, 0.9285714030265808, 0.9732142686843872,
0.9241071343421936, 0.9821428656578064, 0.5848214030265808, 0.9330357313156128,
0.9910714030265808, 0.9330357313156128, 0.90625, 0.9241071343421936,
0.9821428656578064, 0.9285714030265808, 0.9776785969734192, 0.9107142686843872,
0.6785714030265808, 0.90625, 0.9732142686843872, 0.9821428656578064,
0.5803571343421936, 0.9866071343421936, 0.9107142686843872, 0.7142857313156128,
0.9107142686843872, 0.8973214030265808]
#modelo_1 = pd.DataFrame(data = acc, index = epochs).rename(columns = {0:'Accuracy'})
#modelo_1.transpose()

###### Modelo 2 (100)

import pandas as pd

#modelo_2 = pd.read_csv('model 2.txt').transpose()

# acc2= [0.9419642686843872, 0.9910714030265808, 1.0, 0.9910714030265808,


0.5848214030265808, 0.9955357313156128, 0.9553571343421936, 1.0, 1.0,
0.8392857313156128, 0.5848214030265808, 1.0, 0.9910714030265808,
0.8482142686843872, 1.0, 0.9285714030265808, 0.9241071343421936,
0.9955357313156128, 1.0, 0.5848214030265808, 0.9375, 0.9598214030265808,
0.7053571343421936, 0.8883928656578064, 1.0, 0.9955357313156128,
0.5848214030265808, 0.9419642686843872, 0.9955357313156128, 0.8794642686843872,
0.9955357313156128, 0.6071428656578064, 0.9598214030265808, 0.9910714030265808,
0.6026785969734192, 0.9955357313156128, 0.8392857313156128, 0.5848214030265808,
0.9910714030265808, 1.0, 0.6339285969734192, 0.9821428656578064, 1.0,
0.5535714030265808, 0.5848214030265808, 0.6741071343421936, 0.9732142686843872,
0.9910714030265808, 0.6473214030265808, 0.96875, 0.6473214030265808,
0.9955357313156128, 0.5848214030265808, 1.0, 0.5848214030265808,
0.6383928656578064, 1.0, 0.5848214030265808, 0.8526785969734192,
0.7232142686843872, 0.53125, 0.9955357313156128, 0.9642857313156128,
0.5848214030265808, 0.7276785969734192, 1.0, 0.5848214030265808,
0.5848214030265808, 1.0, 0.9598214030265808,0.5848214030265808,
0.9776785969734192, 0.7366071343421936, 0.5848214030265808, 0.9642857313156128,
0.9732142686843872, 0.75, 0.5848214030265808, 0.5848214030265808,
0.9017857313156128, 0.5848214030265808, 0.9866071343421936, 0.96875,
0.9955357313156128, 0.5223214030265808, 0.8348214030265808, 0.7455357313156128,
0.9196428656578064, 1.0, 0.8482142686843872, 0.9910714030265808,
0.9955357313156128, 1.0, 0.9955357313156128, 0.875, 0.6830357313156128,
0.7678571343421936, 0.5848214030265808, 0.9955357313156128,0.95]
# modelo_2 = pd.DataFrame(data = acc2, index = epochs).rename(columns = {0:'Accuracy'})
# modelo_2.transpose()

###### Modelo 3 (100)

import pandas as pd

acc3 = [0.7589285969734192, 0.8392857313156128, 0.8571428656578064, 0.75,


0.6026785969734192, 0.5714285969734192, 0.6026785969734192, 0.6339285969734192,
0.8571428656578064, 0.5044642686843872, 0.6517857313156128, 0.7455357313156128,
0.5848214030265808, 0.6339285969734192, 0.8526785969734192, 0.96875,
0.5491071343421936, 0.6919642686843872, 0.5491071343421936, 0.6205357313156128,
0.8839285969734192, 0.7053571343421936, 0.6339285969734192, 0.7276785969734192,
0.5714285969734192, 0.59375, 0.7544642686843872, 0.5848214030265808,
0.7991071343421936, 0.7633928656578064, 0.5848214030265808, 0.6651785969734192,
0.53125, 0.9642857313156128, 0.8526785969734192, 0.7142857313156128,
0.5580357313156128, 0.8169642686843872, 0.5446428656578064, 0.6339285969734192,
0.6741071343421936, 0.8705357313156128, 0.6607142686843872, 0.7544642686843872,
0.6071428656578064, 0.5982142686843872, 0.6026785969734192, 0.6517857313156128,
0.5401785969734192, 0.5848214030265808, 0.5848214030265808, 0.5892857313156128,
0.6473214030265808, 0.78125, 0.59375, 0.8214285969734192, 0.78125,
0.5669642686843872, 0.5848214030265808, 0.6651785969734192, 0.5848214030265808,
0.5848214030265808, 0.6651785969734192, 0.6428571343421936, 0.5848214030265808,
0.8214285969734192, 0.6160714030265808, 0.7901785969734192, 0.5758928656578064,
0.7857142686843872, 0.625, 0.7410714030265808, 0.5848214030265808,
0.5357142686843872, 0.5848214030265808, 0.6339285969734192, 0.5669642686843872,
0.5714285969734192, 0.5848214030265808, 0.6294642686843872, 0.6964285969734192,
0.9330357313156128, 0.6294642686843872, 0.7544642686843872, 0.5848214030265808,
0.71875, 0.7767857313156128, 0.9866071343421936, 0.5535714030265808,
0.6785714030265808, 0.6473214030265808, 0.5848214030265808, 0.9553571343421936,
0.5803571343421936, 0.84375, 0.9330357313156128, 0.9375, 0.5848214030265808,
0.6428571343421936, 0.7232142686843872]

# #modelo_3 = pd.read_csv('model 3.txt')


# modelo_3 = pd.DataFrame(data = acc3, index = epochs).rename(columns = {0:'Accuracy'})

# modelo_3.transpose()

##### 1000 Treinamentos

###### Modelo 8 (1000)

os.listdir('/content/drive/MyDrive/TCC/Scripts/Modelos')

import pandas as pd

modelo_8 = pd.read_csv('model8(1000)t.txt', index_col=0)


modelo_8

#fig= px.scatter(modelo_1,x=modelo_1['Accuracy'] ,template = 'plotly_white', title= 'Modelo


1',width=800, height=500, color_discrete_sequence=['light blue'])
#fig.show()

fig= px.histogram(modelo_8, x='Accuracy' ,template = 'plotly_white', title= 'Modelo 8',width=800,


height=500, color_discrete_sequence=['light blue'], nbins = 500)
fig.show()

###### Modelo 7 (1000)

os.listdir('/content/drive/MyDrive/TCC/Scripts/Modelos')

import pandas as pd

modelo_7 = pd.read_csv('model7(1000)t.txt', index_col=0)


modelo_7

modelo_7[modelo_7.index.duplicated()]
#fig= px.scatter(modelo_1,x=modelo_1['Accuracy'] ,template = 'plotly_white', title= 'Modelo
1',width=800, height=500, color_discrete_sequence=['light blue'])
#fig.show()

fig= px.histogram(modelo_7, x='Accuracy' ,template = 'plotly_white', title= 'Modelo 7',width=800,


height=500, color_discrete_sequence=['light blue'], nbins = 500)
fig.show()

###### Modelo 6 (1000)

import pandas as pd

modelo_6 = pd.read_csv('model6(1000)t.txt', index_col = 0)


modelo_6

#fig= px.scatter(modelo_2,x='Accuracy' ,template = 'plotly_white', title= 'Modelo 2',width=800,


height=500, color_discrete_sequence=['firebrick'])
#fig.show()

fig= px.histogram(modelo_6,x='Accuracy',template = 'plotly_white' , title= 'Modelo 6',width=800,


height=500, color_discrete_sequence=['firebrick'], nbins = 500)
fig.show()

###### Modelo 5 (1000)

import pandas as pd

modelo_5 = pd.read_csv('model5(1000)t.txt')
modelo_5

#fig= px.scatter(modelo_3,x='Accuracy' ,template = 'plotly_white', title= 'Modelo 3',width=800,


height=500, color_discrete_sequence=['green'])
#fig.show()

fig= px.histogram(modelo_5,x='Accuracy' ,template = 'plotly_white', title= 'Modelo 5',width=800,


height=500, color_discrete_sequence=['green'], nbins = 500)
fig.show()

###### Modelo 4 (1000)

import pandas as pd

modelo_4 = pd.read_csv('model4(1000)t.txt')
modelo_4

#fig= px.scatter(modelo_4,x='Accuracy' ,template = 'plotly_white', title= 'Modelo 3',width=800,


height=500, color_discrete_sequence=['mediumpurple'])
#fig.show()

fig= px.histogram(modelo_4,x='Accuracy' ,template = 'plotly_white', title= 'Modelo 4',width=800,


height=500, color_discrete_sequence=['mediumpurple'], nbins = 500)
fig.show()
#### Gráficos

import matplotlib.pyplot as plt


import plotly.express as px

modelos = pd.DataFrame()

# # transformando em percentual
modelos['Modelo 8'] = modelo_8['Accuracy']*100
modelos['Modelo 7'] = modelo_7['Accuracy']*100
modelos['Modelo 6'] = modelo_6['Accuracy']*100
modelos['Modelo 5'] = modelo_5['Accuracy']*100
modelos['Modelo 4'] = modelo_4['Accuracy']*100
modelos

fig= px.histogram(modelos ,template = 'plotly_white', title= 'Histograma dos Modelos',


width=1200, height=600, nbins = 600
,color_discrete_sequence = ['lightpink','dodgerblue','tomato', 'slategrey', 'chartreuse'])
fig.update_layout(font_size = 18)
fig['layout']['xaxis']['title']['text'] = 'Accuracy (%)'
fig['layout']['yaxis']['title']['text'] = 'Contagem (Individual)'

fig.show()

#modelos = pd.DataFrame()
#modelos['Modelo 1'] , modelos['Modelo 2'] , modelos['Modelo 3'] = modelo_1['Accuracy'],
modelo_2['Accuracy'], modelo_3['Accuracy']

#fig = px.histogram(modelos, x = ['Modelo 1', 'Modelo 2', 'Modelo 3'],y = modelos.index


,template = 'plotly_white',width=1200, height=700,nbins = 100)
#fig['layout']['yaxis']['title']['text'] = 'Eixo y'
#fig.show()

modelos['Modelo 1'] = modelo_1['Accuracy'].mean()


modelos['Modelo 2'] = modelo_2['Accuracy'].mean()
modelos['Modelo 3'] = modelo_3['Accuracy'].mean()
modelos['Modelo 4'] = modelo_4['Accuracy']
modelos

media_m1 = modelo_1['Accuracy'].mean()
media_m2 = modelo_2['Accuracy'].mean()
media_m3 = modelo_3['Accuracy'].mean()
media_m4 = modelo_4['Accuracy'].mean()
media_m5 = modelo_5['Accuracy'].mean()

print(media_m1, media_m2, media_m3, media_m4, media_m5)


#with open('/content/drive/MyDrive/TCC/Scripts/Modelos/model5novo','w') as m:
# m.write('')

# count = 0
# for i,j in enumerate(open('/content/drive/MyDrive/TCC/Scripts/Modelos/model5(500)t.txt')):
# splited = j.split(', ')
# splited[0] = count+501
# count+=1
# print(splited)
# with open('/content/drive/MyDrive/TCC/Scripts/Modelos/model5novo','a+') as m:
# m.write(f'{splited[0]}, {splited[1]}')

SCRIPT 5 ( Histograma da ultima accuracy de cada Epoch dos melhores


modelos)

Modelo 7 e 9

#### Drive

from google.colab import drive


drive.mount('/content/drive')

#### Pré processamento das Imagens


import os

dir = list(os.listdir('/content/drive/MyDrive/TCC/Videos/Treinamento/'))
dir

dir = ['Fumaca', 'Nao_Fumaca']

%cd '/content/drive/MyDrive/TCC/Videos'

print(f'{dir[0]} contem :',


len(os.listdir(f'/content/drive/MyDrive/TCC/Videos/Treinamento/{dir[0]}')),'fotos')
print(f'{dir[1]} contem :',
len(os.listdir(f'/content/drive/MyDrive/TCC/Videos/Treinamento/{dir[1]}')),'fotos')

size = sum([len(os.listdir(f'/content/drive/MyDrive/TCC/Videos/Treinamento/{dir[0]}'))
,len(os.listdir(f'/content/drive/MyDrive/TCC/Videos/Treinamento/{dir[1]}'))])
print('Total:', size)

amostras = int(size/8)
amostras

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Para reescalar as imagens em 1./255 (normalizar)


reescala = ImageDataGenerator(rescale=1/255)

# Flow training images in batches using train_datagen generator


imagens_treinamento = reescala.flow_from_directory(
'./Treinamento/', # This is the source directory for training images
target_size=(300, 300), # All images will be resized to 300x300
batch_size= amostras,
# Since we use binary_crossentropy loss, we need binary labels
class_mode='binary')

#### Modelos

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.optimizers import RMSprop

def modelo_1(): # 16 epochs, learning rate 0.001 , 4 layers de convolução (MODELO 7)


rede = tf.keras.models.Sequential([

# Primeira Convolução (nos dados iniciais)


# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de
entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(256, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid).


tf.keras.layers.Dense(1, activation='sigmoid')]) #Esse neurônio recebe valor 0 ou 1 (0 para
classe 1 e 1 para a outra classe)

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.001),
metrics=['accuracy'])

return rede

class CustomCallback(keras.callbacks.Callback): #
https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/Callback
def on_epoch_end(self, epoch, logs=None):
keys = list(logs.values())

#### Treinamento

import shutil

%cd '/content/drive/MyDrive/TCC/Videos'

n = int(input('quantos treinamentos? '))

nome = str(input('nome do arquivo\n'))

epoch = int(input('Quantas epochs?\n'))

acc1 = list(range(n))
try:
assert f'{nome}' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome} já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model1 = modelo_1()
report1 = model1.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report1.history['accuracy']):


if j ==0:
with open(f'{nome}', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

#original :

# acc1 = list(range(n))

# try:
# assert f'model1({n})t(Acc*Epoch).txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') #
verifica se existe o arquivo no drive

# except:
# print(f'model1({n})t(Acc*Epoch).txt já existe em /content/drive/MyDrive/TCC/Videos')
# else:
# with open(f'model1({n})t(Acc*Epoch).txt', 'w') as m: # 'w' cria o arquivo para receber os
valores caso ele não exista
# m.write('1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,')

# for i in range(n):
# print(f'\n treinamento {i+1} \n')

# model1 = modelo_1()
# report1 = model1.fit(imagens_treinamento,
# steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o
passo será x/y
# epochs=35,
# verbose=0,
# callbacks= [CustomCallback()])

# for j,acc in enumerate(report1.history['accuracy']):


# if j ==0:
# with open(f'model1({n})t(Acc*Epoch).txt', 'a+') as m:
# #m.write(f'\ntreinamento{i},')
# m.write(f'\n,{acc},')
# else:
# with open(f'model1({n})t(Acc*Epoch).txt', 'a+') as m:
# m.write(f'{acc},')

# try:
# shutil.move(f'/content/drive/MyDrive/TCC/Videos/model1({n})t(Acc*Epoch).txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

# except:
# print('modelo nao foi movido')

#### Grafico

%cd '/content/drive/MyDrive/TCC/Scripts/Modelos'

import pandas as pd

coluna = {1:'epoch 1', 2:'epoch 2',3:'epoch 3',4:'epoch 4',5:'epoch 5',6:'epoch 6',7:'epoch


7',8:'epoch 8',9:'epoch 9',10:'epoch 10',11:'epoch 11',12:'epoch 12',13:'epoch 13',14:'epoch
14',15:'epoch 15'}

coluna = {}
epochs = range(1,36)
for i in epochs:
coluna[f'{i}']= f'epochs {i}'
!ls '/content/drive/MyDrive/TCC/Scripts/Modelos'

dado = input('Qual dado?\n')

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose() #


para o modelo 7
dados = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed:
35',axis=1).transpose() #para o modelo 9
dados*=100
dados

media = dados.transpose().mean()
media

import matplotlib.pyplot as plt


import plotly.express as px
import plotly.graph_objects as go

medias = list(media.values)
medias

fig= px.scatter(dados ,template = 'plotly_white', title= 'Accuracy x Epoch',


width=1350, height=600)
#fig.add_trace(medias)

fig.update_layout(font_size = 18, showlegend=False)


fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

import plotly.graph_objects as go

fig = go.Figure() # cria um grafico com propriedades de objeto

fig = go.Figure()
for i in range(1,27):
fig.add_trace(go.Scatter(x = list(range(1,36)),
y = dados[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for
adiciona cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'dodgerblue'}

fig.add_trace(go.Scatter(x = list(range(1,36)), y = medias, line = dic))


fig
medias

Modelo 8 e 10

#### Drive

from google.colab import drive


drive.mount('/content/drive')

#### Pré processamento das Imagens

import os

caminho = '/content/drive/MyDrive/TCC/Videos/Treinamento_Original'
dir = list(os.listdir(caminho))
dir

#dir = ['Fumaca', 'Nao_Fumaca']

%cd '/content/drive/MyDrive/TCC/Videos'

print(f'{dir[0]} contem :', len(os.listdir(f'{caminho}/{dir[0]}')),'fotos')


print(f'{dir[1]} contem :', len(os.listdir(f'{caminho}/{dir[1]}')),'fotos')

size = sum([len(os.listdir(f'{caminho}/{dir[0]}')) ,len(os.listdir(f'{caminho}/{dir[1]}'))])


print('Total:', size)

amostras = int(size/8)
amostras

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Para reescalar as imagens em 1./255 (normalizar)


reescala = ImageDataGenerator(rescale=1/255)
# Flow training images in batches using train_datagen generator
imagens_treinamento = reescala.flow_from_directory(
'./Treinamento/', # This is the source directory for training images
target_size=(300, 300), # All images will be resized to 300x300
batch_size= amostras,
# Since we use binary_crossentropy loss, we need binary labels
class_mode='binary')

#### Modelos

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.optimizers import RMSprop

def modelo_1(): # 16 epochs, learning rate 0.001 , 4 layers de convolução (MODELO 7)


rede = tf.keras.models.Sequential([

# Primeira Convolução (nos dados iniciais)


# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), # input_shape(linhas,
colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),
# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios
tf.keras.layers.Dense(256, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid).


tf.keras.layers.Dense(1, activation='sigmoid')]) #Esse neurônio recebe valor 0 ou 1 (0 para classe 1 e
1 para a outra classe)

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.001),
metrics=['accuracy'])

return rede

class CustomCallback(keras.callbacks.Callback): #
https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/Callback
def on_epoch_end(self, epoch, logs=None):
keys = list(logs.values())

#### Treinamento

import shutil

%cd '/content/drive/MyDrive/TCC/Videos'

n = int(input('quantos treinamentos? '))

nome = str(input('nome do arquivo\n'))


epoch = int(input('Quantas epochs?\n'))

acc1 = list(range(n))

try:
assert f'{nome}' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o arquivo no
drive

except:
print(f'{nome} já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não exista
for i in range(1,epoch):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model1 = modelo_1()
report1 = model1.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo será x/y
epochs=epoch,
verbose=1,
callbacks= [CustomCallback()])

for j,acc in enumerate(report1.history['accuracy']):


if j ==0:
with open(f'{nome}', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}', 'a+') as m:
m.write(f'{acc},')

try:
shutil.move(f'/content/drive/MyDrive/TCC/Videos/{nome}.txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

except:
print('modelo nao foi movido')

#original :

# acc1 = list(range(n))

# try:
# assert f'model1({n})t(Acc*Epoch).txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica
se existe o arquivo no drive

# except:
# print(f'model1({n})t(Acc*Epoch).txt já existe em /content/drive/MyDrive/TCC/Videos')

# else:
# with open(f'model1({n})t(Acc*Epoch).txt', 'w') as m: # 'w' cria o arquivo para receber os valores
caso ele não exista
# m.write('1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,')

# for i in range(n):
# print(f'\n treinamento {i+1} \n')

# model1 = modelo_1()
# report1 = model1.fit(imagens_treinamento,
# steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo será x/y
# epochs=35,
# verbose=0,
# callbacks= [CustomCallback()])

# for j,acc in enumerate(report1.history['accuracy']):


# if j ==0:
# with open(f'model1({n})t(Acc*Epoch).txt', 'a+') as m:
# #m.write(f'\ntreinamento{i},')
# m.write(f'\n,{acc},')
# else:
# with open(f'model1({n})t(Acc*Epoch).txt', 'a+') as m:
# m.write(f'{acc},')

# try:
# shutil.move(f'/content/drive/MyDrive/TCC/Videos/model1({n})t(Acc*Epoch).txt',
'/content/drive/MyDrive/TCC/Scripts/Modelos')

# except:
# print('modelo nao foi movido')

#### Grafico

%cd '/content/drive/MyDrive/TCC/Scripts/Modelos'

import pandas as pd

coluna = {1:'epoch 1', 2:'epoch 2',3:'epoch 3',4:'epoch 4',5:'epoch 5',6:'epoch 6',7:'epoch 7',8:'epoch
8',9:'epoch 9',10:'epoch 10',11:'epoch 11',12:'epoch 12',13:'epoch 13',14:'epoch 14',15:'epoch 15'}

coluna = {}
epochs = range(1,36)
for i in epochs:
coluna[f'{i}']= f'epochs {i}'

!ls '/content/drive/MyDrive/TCC/Scripts/Modelos'

dado = input('Qual dado?\n')

#### Histograma

import matplotlib.pyplot as plt


import plotly.express as px

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


dados = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop(['Unnamed:
15','11','12','13','14','10'],axis=1).drop(['1','2','3','4','5','6','7','8','9'], axis = 1)
dados = dados.rename({'15':'Accuracy'}, axis = 1)
dados

fig= px.histogram(dados, x='Accuracy' ,template = 'plotly_white', title= 'Modelo 8',width=800,


height=500, color_discrete_sequence=['hotpink'], nbins = 500)
fig.show()

#### Acc x Epoch

#dados = pd.read_csv(dado).reset_index().drop(['index','Unnamed: 16'], axis =1).transpose()


#dados = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop(['Unnamed:
15','11','12','13','14','15'],axis=1).transpose()
dados = pd.read_csv(dado).reset_index().drop('index', axis = 1).drop('Unnamed: 15', axis =
1).transpose()
dados

media = dados.transpose().mean()
media

import matplotlib.pyplot as plt


import plotly.express as px
import plotly.graph_objects as go

medias = list(media.values)
medias

fig= px.scatter(dados ,template = 'plotly_white', title= 'Accuracy x Epoch',


width=1350, height=600)
#fig.add_trace(medias)
fig.update_layout(font_size = 18, showlegend=False)
fig['layout']['xaxis']['title']['text'] = 'Epoch'
fig['layout']['yaxis']['title']['text'] = 'Accuracy'

fig.show()

import plotly.graph_objects as go

fig = go.Figure() # cria um grafico com propriedades de objeto

fig = go.Figure()
for i in range(1,27):
fig.add_trace(go.Scatter(x = list(range(1,36)),
y = dados[i],
mode ='markers', opacity = 0.3)) # .add_trace() adiciona UM plot em fig (for adiciona
cada grafico)

fig.show()

dic = {'width' : 6, 'smoothing' : 1, 'color' : 'hotpink'}

fig.add_trace(go.Scatter(x = list(range(1,17)), y = medias, line = dic))


fig
medias

SCRIPT 6 (Validação dos melhores Modelos )

#### Drive

from google.colab import drive


drive.mount('/content/drive')

#### Pré processamento das Imagens

import os

%cd '/content/drive/MyDrive/TCC/Videos'

#import shutil
#for i,j in enumerate(os.listdir('/content/drive/MyDrive/TCC/Videos/Treinamento/Fumaca')):
#usado para mover as fotos de treinamento para validacao
# if (i+1) % 5 ==0:
#
shutil.move(f'/content/drive/MyDrive/TCC/Videos/Treinamento/Fumaca/{j}',f'/content/drive/MyDri
ve/TCC/Videos/Validação/Fumaca/{j}')
# if (i+1) % 5 ==0:
#
shutil.move(f'/content/drive/MyDrive/TCC/Videos/Treinamento/Nao_Fumaca/{j}',f'/content/drive/
MyDrive/TCC/Videos/Validação/Nao_Fumaca/{j}')

print('Treinamento Fumaça contem :',


len(os.listdir('/content/drive/MyDrive/TCC/Videos/Treinamento/Fumaca')),'fotos')
print('Treinamento Não Fumaça contem :',
len(os.listdir('/content/drive/MyDrive/TCC/Videos/Treinamento/Nao_Fumaca')),'fotos')

size = sum([len(os.listdir('/content/drive/MyDrive/TCC/Videos/Treinamento/Fumaca'))
,len(os.listdir('/content/drive/MyDrive/TCC/Videos/Treinamento/Nao_Fumaca'))])
print('Total:', size)

print('\nValidação Não Fumaça contem :',


len(os.listdir('/content/drive/MyDrive/TCC/Videos/Validação/Nao_Fumaca')),'fotos')
print('Validação Fumaça contem :',
len(os.listdir('/content/drive/MyDrive/TCC/Videos/Validação/Fumaca')),'fotos')

size1 = sum([len(os.listdir('/content/drive/MyDrive/TCC/Videos/Validação/Nao_Fumaca'))
,len(os.listdir('/content/drive/MyDrive/TCC/Videos/Validação/Fumaca'))])
print('Total:', size1)

amostras, amostras1 = int(size/8), int(size1/8)


amostras, amostras1

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Para reescalar as imagens em 1./255 (normalizar)


reescala = ImageDataGenerator(rescale=1/255)

# Flow training images in batches using train_datagen generator


imagens_treinamento = reescala.flow_from_directory(
'./Treinamento/', # This is the source directory for training images
target_size=(300, 300), # All images will be resized to 300x300
batch_size= amostras,
# Since we use binary_crossentropy loss, we need binary labels
class_mode='binary')

imagens_validacao = reescala.flow_from_directory(
'./Validação/', # This is the source directory for training images
target_size=(300, 300), # All images will be resized to 300x300
batch_size= amostras1,
# Since we use binary_crossentropy loss, we need binary labels
class_mode='binary')
#### Modelos

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.optimizers import RMSprop

def modelo_9(): # 27 epochs, learning rate 0.001 , 4 layers de convolução (atual)


rede = tf.keras.models.Sequential([

# Primeira Convolução (nos dados iniciais)


# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de
entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(256, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid).


tf.keras.layers.Dense(1, activation='sigmoid')]) #Esse neurônio recebe valor 0 ou 1 (0 para
classe 1 e 1 para a outra classe)

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.001),
metrics=['accuracy'])

return rede

def modelo_10():
rede = tf.keras.models.Sequential([

# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de


entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(64, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(512, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid). Esse neurônio


recebe valor 0 ou 1 (0 para classe 1 e 1 para a outra classe)
tf.keras.layers.Dense(1, activation='sigmoid')])

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.001),
metrics=['accuracy'])

return rede

class CustomCallback(keras.callbacks.Callback): #
https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/Callback
def on_epoch_end(self, epoch, logs=None):
keys = list(logs.values())

#### Treinamento

%cd '/content/drive/MyDrive/TCC/Videos/'

model9 = modelo_9()
report9 = model9.fit(imagens_treinamento, # treina o modelo
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=27,
verbose=2,
validation_data = imagens_validacao,
validation_steps = 4,
callbacks= [CustomCallback()])

model10 = modelo_10()
report10 = model10.fit(imagens_treinamento, # treina o modelo
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=15,
verbose=2,
validation_data = imagens_validacao,
validation_steps = 4,
callbacks= [CustomCallback()])

#### Validamento

from tensorflow.keras.utils import load_img, img_to_array


from google.colab import files
import numpy as np

n = 125

import os

# %cd '/content/'
# for i in os.listdir('/content'):
# if 'images' in i:
# os.remove(f'/content/{i}')

##### Acc x Epoch

acc9 = list(range(n))

nome = f'model9({n})(Val_AccxEpoch)'
epoch = 27

try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model9 = modelo_9()
report9 = model9.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
validation_data = imagens_validacao,
validation_steps = 8,
callbacks= [CustomCallback()])

for j,acc in enumerate(report9.history['val_accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

acc10 = list(range(n))

nome = f'model10({n})(Val_AccxEpoch)'
epoch = 15

try:
assert f'{nome}.txt' not in os.listdir('/content/drive/MyDrive/TCC/Videos') # verifica se existe o
arquivo no drive

except:
print(f'{nome}.txt já existe em /content/drive/MyDrive/TCC/Videos')

else:
with open(f'{nome}.txt', 'w') as m: # 'w' cria o arquivo para receber os valores caso ele não
exista
for i in range(1,epoch+1):
m.write(f'{i},')

for i in range(n):
print(f'\n treinamento {i+1} \n')

model10 = modelo_10()
report10 = model10.fit(imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=epoch,
verbose=1,
validation_data = imagens_validacao,
validation_steps = 8,
callbacks= [CustomCallback()])

for j,acc in enumerate(report10.history['val_accuracy']):


if j ==0:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'\n,{acc},')
else:
with open(f'{nome}.txt', 'a+') as m:
m.write(f'{acc},')

##### Histograma

acc9 = list(range(n))
val9 = list(range(n))

for i in range(n):
print(f'\n treinamento {i+1} \n')

model9 = modelo_9()
report9 = model9.fit(imagens_treinamento, # treina o modelo
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=27,
verbose=2,
validation_data = imagens_validacao,
validation_steps = 8,
callbacks= [CustomCallback()])

acc9[i] = report9.history['accuracy'][-1]
val9[i] = report9.history['val_accuracy'][-1]
with open(f'model9({n})va.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores
m.write(f'{i+1}, {acc9[i]}, {val9[i]} \n')

acc10 = list(range(n))
val10 = list(range(n))

for i in range(n):
print(f'\n treinamento {i+1} \n')

model10 = modelo_10()
report10 = model10.fit(imagens_treinamento, # treina o modelo
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo
será x/y
epochs=15,
verbose=2,
validation_data = imagens_validacao,
validation_steps = 8,
callbacks= [CustomCallback()])

acc10[i] = report10.history['accuracy'][-1])
val10[i] = report10.history['val_accuracy'][-1])
with open(f'model10({n})va.txt', 'a+') as m: # 'a+' adiciona ao arquivo existente os valores
m.write(f'{i+1}, {acc10[i]}, {val10[i]} \n')

uploaded = files.upload()
for fn in uploaded.keys():

# predicting images
path = '/content/' + fn
img = load_img(path, target_size=(300, 300))
x = img_to_array(img)
x /= 255
x = np.expand_dims(x, axis=0)

images = np.vstack([x])
classes_m9 = model9.predict(images)

print(classes_m9)
if classes_m9[0]<0.5:
print(fn + " é fumaça")
else:
print(fn + " não é fumaça ")

SCRIPT 7 ( Teste de Estatística com imagens aleatórias e inéditas ao banco de


dados )

#### Drive

from google.colab import drive


drive.mount('/content/drive')

#### Pré processamento das Imagens

import os

local = input('Qual Treinamento? ')

dir = list(os.listdir(local))
dir

print(f'{dir[0]} contem :', len(os.listdir(f'{local}/{dir[0]}')),'fotos')


print(f'{dir[1]} contem :', len(os.listdir(f'{local}/{dir[1]}')),'fotos')

size = sum([len(os.listdir(f'{local}/{dir[0]}')) ,len(os.listdir(f'{local}/{dir[1]}'))])


print('Total:', size)

amostras = int(size/8)
amostras

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Para reescalar as imagens em 1./255 (normalizar)


reescala = ImageDataGenerator(rescale=1/255)

# Flow training images in batches using train_datagen generator


imagens_treinamento = reescala.flow_from_directory(
local, # This is the source directory for training images
target_size=(300, 300), # All images will be resized to 300x300
batch_size= amostras,
# Since we use binary_crossentropy loss, we need binary labels
class_mode='binary')

#### Rede Neural

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.optimizers import RMSprop

##### Modelo 9 (27 epoch)

def modelo_9(): # 27 epochs, learning rate 0.001 , 4 layers de convolução (atual)


rede = tf.keras.models.Sequential([

# Primeira Convolução (nos dados iniciais)


# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de
entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(256, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid).


tf.keras.layers.Dense(1, activation='sigmoid')]) #Esse neurônio recebe valor 0 ou 1 (0 para
classe 1 e 1 para a outra classe)

rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.001),
metrics=['accuracy'])

return rede

##### Modelo 10

def modelo_10(): # modelo 8 com 15 epochs, learning rate 0.001 , 5 layers de convolução
rede = tf.keras.models.Sequential([

# tf.keras.layers.Conv2D ( numero de filtros , matriz n x n, função de ativação, dados de


entrada)
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)), #
input_shape(linhas, colunas, camadas (de cor))
tf.keras.layers.MaxPooling2D(2, 2), # max pool usando uma matriz n x n

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(64, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(32, (3,3), activation='relu'),


tf.keras.layers.MaxPooling2D(2,2),

# Flatten os resultados para usar na Rede Neural Densa


tf.keras.layers.Flatten(),

# tf.keras.layers.Dense( N, função) cria uma Hidden Layer com N neuronios


tf.keras.layers.Dense(512, activation='relu'),

# Só um neurônio de saída por causa da função de ativação (Sigmoid). Esse neurônio


recebe valor 0 ou 1 (0 para classe 1 e 1 para a outra classe)
tf.keras.layers.Dense(1, activation='sigmoid')])
rede.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=0.001),
metrics=['accuracy'])
return rede
#### Treinamento

#para trocar o diretorio


%cd '/content/drive/MyDrive/TCC/Videos/'

model9 = modelo_9()
model9.fit(
imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo será
x/y
epochs=27,
verbose=1)

model10 = modelo_10()
model10.fit(
imagens_treinamento,
steps_per_epoch=8, # total de x imagens e cada batch com y imagens , logo o passo será
x/y
epochs=15,
verbose=1)

#### Estatísticas

n = 1000 #int(input('Quantas repetições para avaliação?\n'))

##### Modelo 9

#%cd '/content/drive/MyDrive/TCC/Videos/Validação'

import os
import numpy as np
from tensorflow.keras.utils import load_img, img_to_array
import random

# validação com imagens do banco de dados


fumaca = os.listdir('/content/drive/MyDrive/TCC/Videos/Validação/Fumaca')
nao_fumaca = os.listdir('/content/drive/MyDrive/TCC/Videos/Validação/Nao_Fumaca')

# # validação com imagens da internet


# fumaca = os.listdir('/content/drive/MyDrive/TCC/Videos/Validação Inedito/Fumaca_internet')
# nao_fumaca = os.listdir('/content/drive/MyDrive/TCC/Videos/Validação
Inedito/Nao_Fumaca_internet')
dir = [0,1]

positivo, negativo, falso_positivo, falso_negativo = 0,0,0,0

for i in range(n):
n_aleatorio = random.choice(dir) # escolhe aleatoriamente fumaca ou nao fumaca

if n_aleatorio == 0:
path =
os.path.join('/content/drive/MyDrive/TCC/Videos/Validação/Fumaca',random.choice(fumaca)) #
usa uma foto aleatoria do diretorio fumaca
#path = os.path.join('/content/drive/MyDrive/TCC/Videos/Validação
Inedito/Fumaca_internet',random.choice(fumaca))
else:
path =
os.path.join('/content/drive/MyDrive/TCC/Videos/Validação/Nao_Fumaca',random.choice(nao_f
umaca)) # usa uma foto aleatoria do diretorio nao fumaca
#path = os.path.join('/content/drive/MyDrive/TCC/Videos/Validação
Inedito/Nao_Fumaca_internet',random.choice(nao_fumaca))
img = load_img(path, target_size=(300, 300))
x = img_to_array(img)
x /= 255
x = np.expand_dims(x, axis=0)

images = np.vstack([x])
classes = model9.predict(images, batch_size=10)

if classes[0] < 0.5 and n_aleatorio == 0: # se a rede classificou certo fumaca:


positivo += 1

elif classes[0] > 0.5 and n_aleatorio == 1: # se a rede classificou certo como nao fumaca
negativo += 1

elif classes[0] > 0.5 and n_aleatorio == 0: # se a rede classificou errado como fumaca:
falso_positivo += 1

elif classes[0] < 0.5 and n_aleatorio == 1: # se a rede classificou errado como nao fumaca
falso_negativo += 1

if classes[0]>0.5:
print(path + " não é fumaça")
else:
print(path + " é fumaça ")

print(positivo, negativo, falso_positivo, falso_negativo)

with open('Teste de Validação inedito (banco de dados) (1000 testes) (modelo 9)', 'w+') as m:
m.write(f'Resultados do teste de validação:\n')
m.write(f'positivos: {positivo}\n')
m.write(f'negativos: {negativo}\n')
m.write(f'falto positivo: {falso_positivo}\n')
m.write(f'falso negativo: {falso_negativo}\n')

!pwd

##### Modelo 10

#%cd '/content/drive/MyDrive/TCC/Videos/Validação'

import os
import numpy as np
from tensorflow.keras.utils import load_img, img_to_array
import random

# validação com imagens do banco de dados


fumaca = os.listdir('/content/drive/MyDrive/TCC/Videos/Validação/Fumaca')
nao_fumaca = os.listdir('/content/drive/MyDrive/TCC/Videos/Validação/Nao_Fumaca')

# # validação com imagens da internet


# fumaca = os.listdir('/content/drive/MyDrive/TCC/Videos/Validação Inedito/Fumaca_internet')
# nao_fumaca = os.listdir('/content/drive/MyDrive/TCC/Videos/Validação
Inedito/Nao_Fumaca_internet')

dir = [0,1]

positivo, negativo, falso_positivo, falso_negativo = 0,0,0,0

for i in range(n):
n_aleatorio = random.choice(dir) # escolhe aleatoriamente fumaca ou nao fumaca

if n_aleatorio == 0:
path =
os.path.join('/content/drive/MyDrive/TCC/Videos/Validação/Fumaca',random.choice(fumaca)) #
usa uma foto aleatoria do diretorio fumaca
#path = os.path.join('/content/drive/MyDrive/TCC/Videos/Validação
Inedito/Fumaca_internet',random.choice(fumaca))
else:
path =
os.path.join('/content/drive/MyDrive/TCC/Videos/Validação/Nao_Fumaca',random.choice(nao_f
umaca)) # usa uma foto aleatoria do diretorio nao fumaca
#path = os.path.join('/content/drive/MyDrive/TCC/Videos/Validação
Inedito/Nao_Fumaca_internet',random.choice(nao_fumaca))
img = load_img(path, target_size=(300, 300))
x = img_to_array(img)
x /= 255
x = np.expand_dims(x, axis=0)

images = np.vstack([x])
classes = model10.predict(images, batch_size=10)
if classes[0] < 0.5 and n_aleatorio == 0: # se a rede classificou certo fumaca:
positivo += 1

elif classes[0] > 0.5 and n_aleatorio == 1: # se a rede classificou certo como nao fumaca
negativo += 1

elif classes[0] > 0.5 and n_aleatorio == 0: # se a rede classificou errado como fumaca:
falso_positivo += 1

elif classes[0] < 0.5 and n_aleatorio == 1: # se a rede classificou errado como nao fumaca
falso_negativo += 1

if classes[0]>0.5:
print(path + " não é fumaça")
else:
print(path + " é fumaça ")

print(positivo, negativo, falso_positivo, falso_negativo)

with open('Teste de Validação inedito 4 (banco de dados) (1000 testes) (modelo 10)', 'w+') as
m:
m.write(f'Resultados do teste de validação:\n')
m.write(f'positivos: {positivo}\n')
m.write(f'negativos: {negativo}\n')
m.write(f'falto positivo: {falso_positivo}\n')
m.write(f'falso negativo: {falso_negativo}\n')

!pwd

Você também pode gostar