Mục lục:

Sistema Autônomo Localizador De Vazamentos: 11 bước
Sistema Autônomo Localizador De Vazamentos: 11 bước

Video: Sistema Autônomo Localizador De Vazamentos: 11 bước

Video: Sistema Autônomo Localizador De Vazamentos: 11 bước
Video: Невероятные истории когда животные СПАСАЛИ ЧЕЛОВЕКА 2024, Tháng mười một
Anonim
Sistema Autônomo Localizador De Vazamentos
Sistema Autônomo Localizador De Vazamentos

Este projeto gồm có em um robô, que através da leitura realizada por um dispositivo, Equipado com um sensor piezoelétrico, captura os espectros das vibrações no solo, pode Idificar e localizar, com o processamento dos dados por uma red neural, Possíveis vazamentos uma tubulação.

O processamento destes dados é realizado bởi algoritmos instalados na DRAGONBOARD 410c. Os dados também são enviados para um serviço na nuvem, responseável por auxiliar no processo de Integência Nhân tạo do projeto.

Este projeto foi desenvolvido no Hackaton Qualcomm, durante a TecnoFACENS da Faculdade de Engenharia de Sorocaba (FACENS), joinaram do projeto os graduandos de engenharia mecatrônica Eneo Juliano Bovino, Felipe Xavier, Lucas de Sousa Rodrigues, Rogério Apgues. Gomes Polo e Ronaldo P. Gomes Polo. Também tham gia do projeto o aluno Daniel de Castro Pacheco graduando de engenharia mecânica na Universidade Newton Paiva de Belo Horizonte. O projeto contou com o apoio dos graduandos de engenharia mecatrônica da FACENS, Lucas Nunes Monteiro e Felipe Crispim da Silva Salvagnini.

Bước 1: Lista De Materiais

Lista De Materiais
Lista De Materiais

Para realização deste projeto, os seguintes materiais foram useizados:

1 Arduino Đến hạn

1 Bảng rồng 410c

2 Trình điều khiển para motor de Corrente Continua Contendo cada um:

4 bóng bán dẫn BC548

4 Diodos 1n4007

4 Điện trở 4k7Ω ¼ W

1 Trình điều khiển cho mô tơ servo para servo:

1 bóng bán dẫn BC548

1 Diodos 1N4007

1 Điện trở 4k7Ω ¼ W

1 chuột USB

1 USB Teclado

1 màn hình

1 Cabo HDMI

1 Robô De Esteiras - Plataforma Zumo

1 Mini dispositivo de cremalheira e engrenagem

1 động cơ Servo 9g

Bước 2: Adaptação Mecânica

Image
Image

Para a aquisição dos dados pelo sensor piezoelétrico, faz se needário, o desenvolvimento de um dispositivo com pinhão e cremalheira, conforme desenhos anexados, neste caso as peças foram vảiadas por uma Ấn tượng 3D, devido ao fato de se tratar de um protóti tempo de executeução, fixou-se o dispositivo na plataforma zumo, tiện ích mặt fita Dupla, conforme vídeo.

Bước 3: Acionamento Dos Motores

Obtenção Do Áudio
Obtenção Do Áudio

Người thực hiện một đoạn phim điện ảnh dos motores do robô ZUMO e do dispositivo de captura, fez-se needária a monticm de dois drivers para os motores de Corrente Continua e um driver para o servo motor, coi là figuras acima, sendo a primeira figura o driver para um motor de Corrente Continua ea segunda o driver para um servo motor.

Bước 4: Obtenção Do Áudio

Para obtenção do espectro de áudio das vibrações do solo, foi useizado um dispositivo desenvolvido como parte do TCC de Engenharia Mecatrônica dos graduandos Lucas Nunes Monteiro e Felipe C. da Silva Salvagnini, maiores detalhes sobre o TCC e sobre o dispositivo p email [email protected].

Este dispositivo useiza-se de um sensor piezoelétrico e uma coroa de circuito que realiza a filtragem e amplificação do sinal.

Như thường xuyên liên quan đến mối quan hệ tình dục của công ty 100Hz e 800Hz. Para isso o dispositivo de sensoriamento foi configurado com uma preferência de amostragem de 3 kHz para que sejam respeitada as condições do teorema de amostragem de Nyquist, onde a frequencyência de aquisição deve estar pelo menos duas vezes acudas dasências estar thường xuyên.

A aquisição é habilitada e desabilitada através da interrupção do Arduino DUE.

Bước 5: Configuração Do Arduino DUE (ngôn ngữ C)

Configuração Do Arduino DUE (ngôn ngữ C)
Configuração Do Arduino DUE (ngôn ngữ C)

Devido a grande quantidade de dados, cerca de 3000 pontos por segundo, do tipo inteiro de 32 bits, gerados pelo dispositivo de sensoriamento e needários para processamento dos algoritmos na DRAGONBOARD 410c, foi useizado o Arduino DUE para fazer uso de uma entrada mai hậu môn poder de processamento, isso foi needário por que o Shield de interfaceamento Grove Seeed Sensor Mezzanine instalado na DRAGONBOARD 410c, que kangui um vi điều khiển ATmega 328, não Possui poder de processamento para essa operação.

O Arduino DUE foi configurado para Collectber os comandos enviados da plataforma QUALCOMM DRAGONBOARD 410c qua nối tiếp comunicação.

Như ações configuradas no Arduino foram:

Realizar a aquisição dos dados;

Transmitir os dados obtidos para a DRAGONBOARD 410c;

Xác định một chương trình:

# bao gồm # xác định Numb_Sample 3000 # xác định DAC_Input A0

#define SERVO 7

#define PosServoMin 4 #define PosServoMax 6 #define Kỳ 60 unsigned int Scont = 0, SNow = PosServoMin; unsigned long int DAC [Numb_Sample], ind = Numb_Sample; void TC3_Handler () {TC_GetStatus (TC1, 0); if (ind <Numb_Sample) DAC [ind ++] = analogRead (DAC_Input); nếu (Scont

1); // chu kỳ nhiệm vụ 50%

TC_SetRC (tc, kênh, rc); TC_Start (tc, kênh); tc-> TC_CHANNEL [kênh]. TC_IER = TC_IER_CPCS | TC_IER_CPAS; // habilita os registerradores tc-> TC_CHANNEL [channel]. TC_IDR = ~ (TC_IER_CPCS | TC_IER_CPAS); // desabilita os registerradores NVIC_EnableIRQ (irq); // habilita interrupção}

void setup ()

{Serial.begin (115200); pinMode (DAC_Input, INPUT); TimerStart (TC1, 0, TC3_IRQn, 1500); // Khởi động Timer // TC_Stop (TC1, 0); pinMode (SERVO, OUTPUT); }

void loop ()

{/ * // while (! Serial.available ()); char rc; // = Serial.read (); int indice = 0; if (rc == 0) {while (! Serial.available ()); rc = Serial.read (); switch (rc) {case 1: indice = 0; while (! Serial.available ()); while ((rc = Serial.read ())! = 0xFF) {indice << = 8; dấu gạch chéo + = rc; while (! Serial.available ()); } Serial.print (0); Serial.print (2); SendNumber (DAC [dấu gạch chéo]); Serial.print (0xFF); nghỉ; trường hợp 3: while (! serial.available ()); if ((Serial.read ()) == 0xFF) {SNow = PosServoMax; chậm trễ (500); ind = 0; // TC_Start (TC1, 0); while (ind <Numb_Sample); // TC_Stop (TC1, 0); SNow = PosServoMin; chậm trễ (500); Serial.print (0); Serial.print (4); Serial.print (0xFF); } nghỉ; }} else if (rc == '2') {Serial.print ("Kiểm tra Động cơ Servo / n"); while (! Serial.available ()); rc = Serial.read (); if (rc == '1') {Serial.print ("Chế độ 1 / n"); SNow = PosServoMax; } if (rc == '2') {Serial.print ("Chế độ 2 / n"); SNow = PosServoMin; }} * / SNow = PosServoMax; chậm trễ (100); SNow = PosServoMin; chậm trễ (100); }

Bước 6: Giao diện Das Tecnologias

Giao diện Das Tecnologias
Giao diện Das Tecnologias

Para a comunicação dos dados entre o Arduíno DUE ea DRAGONBOARD 410c, inicialmente useizou-se a interface da figura acima, o que não foi Possível executive, então optou-se pelo uso de uma giao diện USB CDC entre o Arduino DUE ea DRAGONBOARD 410c, que needitaria da rempilação do KERNEL da DRAGONBOARD 410c, que não se fez bởi causa do curto tempo disponível.

Bước 7: Configuração Da DRAGONBOARD 410c (Python)

Configuração Da DRAGONBOARD 410c (Python)
Configuração Da DRAGONBOARD 410c (Python)

Foi configurada para enviar ao Arduino DUE os comandos para realizar a aquisição de dados e transmitir os dados obtidos. Segue código abaixo.

Observação: A abordagem usedizada no hasdigo, não funcionou devido aos níveis de tensão effizados pelo Arduíno DUE e o Mezzanine serem thiếu sót. Por isso optou-se pelo interfaceamento USB, que needitaria da rempilação do KERNEL na DRAGONBOARD 410c para que a porta fosse criada corretamente para a comunicação.

import timeimport serial import gấu trúc dưới dạng pd import numpy as np

# Configuração da conexão nối tiếp

ser = serial. Serial (port = '/ dev / ttyAMC0', # tty96B0 ', baudrate = 250000, parity = serial. PARITY_NONE, stopbits = serial. STOPBITS_ONE, bytesize = serial. EIGHTBITS)

ser.isOpen ()

print ('Nhập các lệnh của bạn bên dưới. / r / nNhấn "exit" để thoát khỏi ứng dụng.')

đầu vào = 1

while 1: input = input (">>") if input == 'exit': ser.close () exit () elif input == 'read': ser.write (0) # Envia o comando para o Arduino DUE realizar a coleta dos dados ser.write (1) # Envia o comando para o Arduino DUE transmitir os dados coletados

lista =

cho tôi trong phạm vi (3000):

ser.write (i / 256) ser.write ((i <0: out = ser.read (2) if (out == 0x0002): atual = 0 c = ser.read (1) while (c! = 0xFF): atual << 8 atual + = cc = ser.read (1) lista.append (atual)

Bước 8: INTERPRETAÇÃO DOS ARQUIVOS DE AUDIO

INTERPRETAÇÃO DOS ARQUIVOS DE AUDIO
INTERPRETAÇÃO DOS ARQUIVOS DE AUDIO

Para poder realizar uma primeira análise dos dados obtidos através do sensor, se fez needária a talkingão dos arquivos no formato WAV, fornecidos pelos alunos autores do TCC e colaboradores do projeto, para valores numéricos, queARD são useiz DRados nos algocise embarcad de anarcad 410. Para realizar esta seekão foi escrito um algoritmo em PYTHON 3 que lê o arquivo WAV e salva os dados do espectro em um arquivo CSV. O algoritmo useizado segue abaixo e em anexo para download.

Esse algoritmo não se faz needário para o funcionamento do sistema, já que o Arduino DUE já enviará esses dados em um array de valores numéricos.

# mã hóa: utf-8

# Leitura e seekão dos audios para csv

# MÓDULOS UTILIZADOS

import wave import numpy as np import pandas as pd import matplotlib.pyplot as plt

# FUNÇÃO PARA CONVERTER WAV EM DADOS DO ESPECTRO E SALVAR CSV

def audio_to_csv (file_name): wave_file = wave.open (file_name + '. wav', 'rb') data_size = wave_file.getnframes () sample_rate = wave_file.getframerate () time_step = 1 / sample_rate waveData = wave_file.readframes (data_size-1) signal = np.fromstring (waveData, dtype = 'int32') Time = np.linspace (start = 0, stop = data_size / sample_rate, num = data_size, endpoint = True) df = pd.concat ([pd. DataFrame (signal), pd. DataFrame (Time)], axis = 1) df.to_csv (file_name + '.csv', index = False) trả về df

# KHUNG DỮ LIỆU CARREGANDO COM OS DADOS DO AUDIO

file_name = 'Solo_com_Vazamento' df_vazamento = audio_to_csv (file_name) df_vazamento.columns = ['amp', 'time'] file_name = 'Solo_sem_Vazamento' df_sem_vazamento = audio_to_csv (file_name) df_se ',' timevazament 'amp.columns

# GRÁFICO DO ESPECTRO DE AUDIO

figure, (ax1, ax2) = plt.subplots (nrows = 2, ncols = 1, figsize = (20, 10)) ax1.plot (df_vazamento ['time'], df_vazamento ['amp']) ax1.set_title ('Solo com Vazamento', fontdict = {'fontsize': 20, 'fontweight': 'bold'}) ax1.set_xlabel ('Tempo [s]', fontdict = {'fontsize': 16}) ax1.set_ylim ([-4e8, 4e8]) ax2.plot (df_sem_vazamento ['time'], df_sem_vazamento ['amp']) ax2.set_title ('Solo sem Vazamento', fontdict = {'fontsize': 20, 'fontweight': 'bold' }) ax2.set_xlabel ('Tempo [s]', fontdict = {'fontsize': 16}) ax2.set_ylim ([- 4e8, 4e8]) figure.tight_layout (h_pad = 5) plt.show ()

Bước 9: Análise Visual Do Sinal

Análise Visual Do Sinal
Análise Visual Do Sinal
Análise Visual Do Sinal
Análise Visual Do Sinal
Análise Visual Do Sinal
Análise Visual Do Sinal

Com o PYTHON 3 é realizada a variada de Fourier, este artificio matemático realiza a biến đổi ação do sinal do domínio do tempo para o domínio da thường xuyên, onde se torna kangível analisar as varias thường xuyên, e suas biên độ, que compõem aquele sinal. Pela análise visual do gráfico da biến đổi Estes gráficos servirão para validação das análises realizadas pelo algoritmo de detecção automática.

Limitando o eixo das thường xuyên liên quan đến 100Hz e 800Hz, fica claro a tồn tại de vazamentos quando se quan sát phạm vi distúrbios nesse de thường xuyên.

# coding: utf-8 # Módulos useizados para processamento daformationada de Fourier

import pandas as pd import numpy as np import wave from matplotlib import pyplot as plt # Função que realiza a variableada de Fourier e plota os gráficos para análise def Fourier (df_list): Fs = 44100; # Taxa de amostragem em Hz Ts = 1,0 / Fs; # Intervalo de amostragem y = pd.concat (df_list) t = y ['time'] # Vetor de tempos y = y ['amp'] # Vetor de amplitudes n = len (y) # Comprimento do sinal k = np. arange (n) T = n / Fs frq = k / T frq = frq [range (n // 2)] Y = np.fft.fft (y) / n Y = Y [range (n // 2)] tmp = pd. DataFrame () tmp ['amp'] = abs (Y) tmp ['freq'] = frq max_lim = max (tmp ['amp'] [(tmp ['freq']> = 100) & (tmp ['freq'] <= 800)]) fig, ax = plt.subplots (2, 1, figsize = (20, 10)) ax [0].plot (t, y) ax [0].set_xlabel ('Thời gian') ax [0].set_ylabel ('Biên độ') ax [1].plot (frq, abs (Y), 'r') ax [1].set_xlim ([100, 800]) ax [1].set_ylim ([0, max_lim]) ax [1].set_xlabel ('Freq (Hz)') ax [1].set_ylabel ('| Y (freq) |') plt.show () return frq, abs (Y) # Função que realiza a carga dos dados do CSV e chama a função de Fourier def read_csv (file_name, init, final): df = pd.read_csv (file_name + '.csv') df.columns = ['amp', ' time '] delta = final-init if init * 44100> len (df) or final * 44100> len (df): init = (len (df) / 44100) -delta if init = 100) & (df [' freq '] <= 800)] mx = đã sắp xếp (df [' amp ']) print ("Biên độ Média das:", np.round (np.mean (mx))) print ("Percentuais em relação a média das biên độ.") print ("Biên độ 100 maiores", np.mean (mx [-100:]) // df ['amp']. mean () * 100, "%", sep = "") print ("Biên độ 50 maiores:", np.mean (mx [-50:]) // df ['amp']. mean () * 100, "%", sep = "") print ("Biên độ 10 maiores:", np.mean (mx [-10:]) // df ['amp']. mean () * 100, "%", sep = "") print ("Biên độ Maior:", np.mean (mx [-1:]) // df ['amp']. mean () * 100, " % ", sep =" ") read_csv ('Solo_com_Vazamento', 2, 10) # Exemplo de gráficos para vazamentoread_csv ('Solo_sem_Vazamento', 2, 10) # Exemplo de gráficos para sem vazamento

Bước 10: Tính năng Algoritmo Em R Para Extração Das Dos Dados

Algoritmo Em R Para Extração Das Tính năng Dos Dados
Algoritmo Em R Para Extração Das Tính năng Dos Dados
Algoritmo Em R Para Extração Das Tính năng Dos Dados
Algoritmo Em R Para Extração Das Tính năng Dos Dados

Utilizou-se um algoritmo em R para realizar o processamento e extração das tính năng (características) dos dados obtidos.

Este primeiro algoritmo realiza uma extração Idificada, onde é needário saber se o arquivo de áudio trata-se de uma amostra vazamento detado ou não, isso por que os dados resultantes desse processo servirão para o treinamento da red neural effizada.

Para quando o Sistema estiver em modo de operação um algoritmo um pouco diferente será executive, onde não este fará a extração não Idificada, gerando somente as características sem uma Idificação.

Estas có tính năng ou caraterísticas são propriedades acústicas compostas por varias Informações tham chiếu ao espectro de áudio capturado, abaixo seguirá uma descrição (em inglês) destas características.

Este algoritmo faz parte de um projeto disponível no GitHub e pode ser acessado através deste link, o mesmo foi modificado para atender as especificações do projeto.

O phần mềm usado para rodar o algoritmo é gratuito, tải về do phiên dịch R e do R Studio.

Características extraídas:

  • meanfreq: tần số trung bình (tính bằng kHz)
  • sd: độ lệch chuẩn của tần số
  • median: tần số trung bình (tính bằng kHz)
  • Q25: lượng tử đầu tiên (tính bằng kHz)
  • Q75: lượng tử thứ ba (tính bằng kHz)
  • IQR: dải ký tự (tính bằng kHz)
  • xiên: độ lệch (xem ghi chú trong mô tả cụ thể)
  • kurt: kurtosis (xem ghi chú trong mô tả specprop)
  • sp.ent: entropy quang phổ
  • sfm: độ phẳng quang phổ
  • mode: tần số chế độ
  • centroid: tần số trung tâm (xem specprop)
  • peakf: tần số đỉnh (tần số có năng lượng cao nhất)
  • meanfun: trung bình của tần số cơ bản được đo trên tín hiệu âm thanh
  • minfun: tần số cơ bản tối thiểu được đo trên tín hiệu âm thanh
  • maxfun: tần số cơ bản tối đa được đo trên tín hiệu âm thanh
  • mondom: trung bình của tần số ưu thế được đo trên tín hiệu âm thanh
  • mindom: tần số tối thiểu được đo trên tín hiệu âm thanh
  • maxdom: tối đa của tần số ưu thế được đo trên tín hiệu âm thanh
  • dfrange: dải tần số chính được đo trên tín hiệu âm thanh
  • modindx: chỉ số điều chế. Được tính bằng hiệu số tuyệt đối tích lũy giữa các phép đo lân cận của các tần số cơ bản chia cho dải tần số
  • nhãn: rò rỉ hoặc không có_leakage

Algoritmo usado:

các gói <- c ('tuneR', 'seewave', 'fftw', 'caTools', 'randomForest', 'warbleR', 'mouse', 'e1071', 'rpart', 'xgboost', 'e1071') nếu (length (setdiff (package, rownames (install.packages ())))> 0) {install.packages (setdiff (package, rownames (install.packages ())))}

thư viện (tuneR)

thư viện (seewave) thư viện (caTools) thư viện (rpart) thư viện (rpart.plot) thư viện (randomForest) thư viện (warbleR) thư viện thư viện (chuột) thư viện (xgboost) thư viện (e1071)

specan3 <- function (X, bp = c (0, 22), wl = 2048, ngưỡng = 5, song song = 1) {# Để sử dụng xử lý song song: library (devtools), install_github ('nathanvan / parallelsugar') if (class (X) == "data.frame") {if (all (c ("sound.files", "selec", "start", "end")% in% colnames (X))) {start <- as.numeric (unlist (X $ start)) end <- as.numeric (unlist (X $ end)) sound.files <- as.character (unlist (X $ sound.files)) selec <- as.character (unlist (X $ selec))} else stop (paste (paste (c ("sound.files", "selec", "start", "end") [! (c ("sound.files", "selec", "start", "end")% in% colnames (X))], sập = ","), "không tìm thấy (các) cột trong khung dữ liệu"))} else stop ("X không phải là khung dữ liệu") # nếu có NA ở start hoặc end stop if (bất kỳ (is.na (c (end, start)))) stop ("NAs được tìm thấy ở start và / hoặc end") # if end hoặc start không phải là số dừng if (all (class (end)! = "numeric" & class (start)! = "numeric")) stop ("'end' và 'selec' phải là số") # if bất kỳ start nào cao hơn end stop if (any (end - start <0)) stop (paste ("Phần bắt đầu cao hơn en d trong các tùy chọn ", length (which (end - start20)) stop (paste (length (which (end - start> 20)))," selection (s) long more than 20 sec ")) (show.error.messages = TRUE) #if bp không phải là vectơ hoặc độ dài! = 2 stop if (! is.vector (bp)) stop ("'bp' phải là vectơ số có độ dài 2") else {if (! length (bp) == 2) stop ("'bp' phải là vectơ số có độ dài 2")} cảnh báo #return nếu không tìm thấy tất cả các tệp âm thanh fs <- list.files (path = getwd (), pattern = ".wav $", ignore.case = TRUE) if (length (unique (sound.files [(sound.files% in% fs)]))! = length (unique (sound.files))) cat (paste (length (unique (sound)). tệp)) - chiều dài (duy nhất (sound.files [(sound.files% in% fs)])), "không tìm thấy (các) tệp.wav")) # số lượng tệp âm thanh trong thư mục làm việc và nếu 0 dừng d <- which (sound.files% in% fs) if (length (d) == 0) {stop ("Các tệp.wav không có trong thư mục làm việc")} else {start <- start [d] end <- end [d] selec <- selec [d] sound.files <- sound.files [d]} # Nếu song song không phải là số if (! is.numeric (song song)) dừng ("'song song' phải là một vectơ số có độ dài 1 ") if (any (! (song song %% 1 == 0), song song 1) {options (warning = -1) if (all (Sys.info () [1] ==" Windows ", RequiNamespace (" parallelsugar ", lặng lẽ = TRUE) == TRUE)) lapp <- function (X, FUN) parallelsugar:: mclapply (X, FUN, mc.cores =llel) else if (Sys.info () [1] == "Windows") {cat ("Người dùng Windows cần cài đặt gói 'parallelsugar' để tính toán song song (bạn hiện không làm điều đó!)") Lapp <- pbapply:: pblapply} else lapp <- function (X, FUN) song song:: mclapply (X, FUN, mc.cores = song song)} else lapp <- pbapply:: pblapply options (warning = 0) if (song song == 1) cat ("Đo thông số âm thanh:") x <- as.data.frame (lapp (1: length (start), function (i) {r <- tuneR:: readWave (file.path (getwd (), sound.files ), from = start , to = end , units = "seconds") b trần ([email protected]/2000) - 1) b [2] <- bare ([email protected]/2000) - 1 # phân tích phổ tần số songspec <- seewave:: spec (r, f = [email protected], plot = FALSE) phân tích <- seewave:: specprop (songspec, f = [email protected], flim = c (0, 280/1000), plot = FALSE) # lưu tham số meanfreq <- phân tích $ trung bình / 1000 sd <- phân tích $ sd / 1000 trung bình <- phân tích $ trung bình / 1000 Q25 < - phân tích $ QQ75 <- phân tích $ QIQR <- phân tích $ IQR / 1000 xiên <- phân tích $ xiên kurt <- phân tích $ kurtosis sp.ent <- phân tích $ sh sfm <- chế độ phân tích $ sfm <- phân tích $ mode / 1000 centroid <- analysis $ cent / 1000 # Tần số có biên độ cực đại peakf <- 0 # seewave:: fpeaks (songspec, f = [email protected], wl = wl, nmax = 3, plot = FALSE) [1, 1] # Thông số tần số cơ bản ff <- seewave:: fund (r, f = [email protected], ovlp = 50, ngưỡng = ngưỡng, fmax = 280, ylim = c (0, 280/1000), plot = FALSE, wl = wl) [, 2] meanfun <-mean (ff, na.rm = T) minfun <-min (ff, na.rm = T) maxfun <-max (ff, na.rm = T) # Tham số tần số tự do chủ yếu y <- seewave:: dfreq (r, f = [email protected], wl = wl, ylim = c (0, 280/1000), ovlp = 0, plot = F, ngưỡng = ngưỡng, dải thông = b * 1000, fftw = TRUE) [, 2] mondom <- mean (y, na.rm = TRUE) mindom <- min (y, na.rm = TRUE) maxdom <- max (y, na.rm = TRUE) dfrange <- (maxdom - mindom) thời lượng <- (end - start ) # phép tính chỉ số điều chế thay đổi <- vector () for (j trong đó (! là). na (y))) {change <- abs (y [j] - y [j + 1]) thay đổi <- append (thay đổi, thay đổi)} if (mindom == maxdom) modindx <-0 else modindx <- mean (thay đổi, na.rm = T) / dfrange #save trả về kết quả (c (thời lượng, meanfreq, sd, trung vị, Q25, Q75, IQR, xiên, kurt, sp.ent, sfm, mode, centroid, peakf, meanfun, minfun, maxfun, Meandom, mindom, maxdom, dfrange, modindx))})) # thay đổi tên kết quả rownames (x) <- c ("thời lượng", "meanfreq", "sd", "median", "Q25", "Q75", "IQR", "xiên", "kurt", "sp.ent", "sfm", "mode", "centroid", "peakf", "meanfun", "minfun", "maxfun", "" ", mindom", "maxdom", "dfrange", "modindx") x <- data.frame (sound.files, selec, as.data.frame (t (x))) colnames (x) [1: 2] <- c ("sound.files", "selec") rownames (x) <- c (1: nrow (x)) return (x)}

processFolder <- function (folderName) {# Bắt đầu với data.frame trống. data <- data.frame () # Lấy danh sách các tập tin trong thư mục. list <- list.files (folderName, '\. wav') # Thêm danh sách tệp vào data.frame để xử lý. for (fileName in list) {row <- data.frame (fileName, 0, 0, 20) data <- rbind (data, row)} # Đặt tên cột. tên (dữ liệu) <- c ('sound.files', 'selec', 'start', 'end') # Di chuyển vào thư mục để xử lý. setwd (folderName) # Xử lý tệp. acoustics <- specan3 (data, song song = 1) # Di chuyển trở lại thư mục mẹ. setwd ('..') acoustics}

giới tính <- function (filePath) {if (! tồn tại ('worldBoosted')) {load ('model.bin')} # Thiết lập đường dẫn. currentPath <- getwd () fileName <- basename (filePath) đường dẫn <- dirname (filePath) # Đặt thư mục để đọc tệp. setwd (path) # Bắt đầu với data.frame trống. data <- data.frame (fileName, 0, 0, 20) # Đặt tên cột. tên (dữ liệu) <- c ('sound.files', 'selec', 'start', 'end') # Xử lý tệp. acoustics <- specan3 (dữ liệu, song song = 1) # Khôi phục đường dẫn. setwd (currentPath) dự đoán (worldCombo, newdata = acoustics)}

# Tải dữ liệu

rò rỉ <- processFolder ('caminho para o pasta com samples de áudio com vazamento') without_leakage <- processFolder ('caminho para o pasta com samples de áudio sem vazamento')

# Đặt nhãn.

rò rỉ $ label <- 1 without_leakage $ label <- 2 data <- rbind (rò rỉ, không có_leakage) dữ liệu $ label <- factor (dữ liệu $ nhãn, nhãn = c ('rò rỉ', 'without_leakage'))

# Loại bỏ các cột không sử dụng.

dữ liệu $ thời lượng <- Dữ liệu NULL $ sound.files <- Dữ liệu NULL $ selec <- Dữ liệu NULL $ peakf <- NULL

# Xóa các hàng chứa NA.

data <- data [complete.case (data),]

# Viết ra tập dữ liệu csv.

write.csv (data, file = 'features.csv', sep = ',', row.names = F)

Bước 11: Làm lại Neural

Rede Neural
Rede Neural

A Ideia do uso de uma red neural, é a de realizar um rechecimento automatizado através dos dados coletados pelo dispositivo de sensoriamento.

A red neural Operatingizada é do tipo MLP (Multilayer Perceptron), este modelo é treinado com dados previamente Idificados e após esse treinamento o modelo implantado no sistema conseguirá realizar a Idificação automática do sinal thubido, Informando se naquele pomento tồn tại não.

Foi needário realizar uma filtragem dos dados de entrada, độc dược algumas características estavam diminuindo a taxa de acerto da red ao invés de melhora-la. Não foi realizado nenhuma abordagem estatística muito aprofundada, mas mesmo com um trabalho mais sur pode-se chegar a algumas variáveis com bons desempenhos.

Para os testes realizados o modelo obteve um desempenho muito bom, alcançando na maioria dos testes uma taxa de acerto de 100%, como pode ser Observado na imagem anexa.

Este algoritmo é useizado para treinar o modelo da red e retornar a taxa de acerto do mesmo. No Sistema de detecção um algoritmo um pouco diferente seria usado, độc ele realizaria o treino ou Receria um modelo já treinado da nuvem ou de alguma outra fonte e com esse modelo realizaria as Predções para cada leitura realizada.

# mã hóa: utf-8

nhập gấu trúc dưới dạng pd

nhập numpy dưới dạng np từ sklearn.model_selection nhập train_test_split dưới dạng tts từ sklearn.neural_network nhập MLPClassifier dưới dạng MLP từ sklearn.metrics nhập phân loại_report dưới dạng cr từ sklearn.metrics nhập nhầm lẫn_matrix dưới dạng cm

# Leitura dos dados do CSV

df = pd.read_csv ('features.csv') # Separação das entradas df_X = df [df.columns [: len (df.columns) -1] # Filtrando as entradas df_X = df_X

# Separando dados para treino e teste

X_train, X_test, Y_train, Y_test = tts (df_X, df_Y, test_size = 0,1)

# Criando modelo de red neural

modelo = MLP (alpha = 0,0001, learning_rate_init = 0,0001, hidden_layer_sizes = (50, 50, 50, 50), max_iter = 10000, activation = 'tanh', solver = 'lbfgs')

# Treinando modelo

modelo.fit (X_train, Y_train) result = modelo.p Dự đoán (X_test)

# Kết quả Imprimindo

report = cr (Y_test, result) mat = cm (y_pred = result, y_true = Y_test) print ("Matriz de confusão") print (mat, end = "\ n / n") print ("Relatório de Classificação") print (bản báo cáo)

Đề xuất: