Բովանդակություն:

Sistema Autônomo Localizador De Vazamentos. 11 քայլ
Sistema Autônomo Localizador De Vazamentos. 11 քայլ

Video: Sistema Autônomo Localizador De Vazamentos. 11 քայլ

Video: Sistema Autônomo Localizador De Vazamentos. 11 քայլ
Video: The Submarine Graveyard that Became a Nightmare (Devonport Royal Dockyard) 2024, Նոյեմբեր
Anonim
Sistema Autônomo Localizador De Vazamentos
Sistema Autônomo Localizador De Vazamentos

Este projeto შედგება em um robô, que através da leitura realizada por um dispitivo, equipado com um sensor piezoelétrico, captura os espectros das vibrações no solo, pode identificar e localizar, com o processamento dos dados por uma rede neural, possíveis vazamentos uma tubulação.

O processamento destes dados é realizado por algoritmos instalados na DRAGONBOARD 410c. Os dados também são enviados para um serviço na nuvem, responsável porux auxiliar no processo de Integência Artificial do projeto.

Este projeto foi desenvolvido no Hackaton Qualcomm, durante a TecnoFACENS da Faculdade de Engenharia de Sorocaba (FACENS), մասնակցություն մասնագիտացված մեխանիկական մեխանիկա Eneo Juliano Bovino, Felipe Xavogie, Lucas de Suesogéri, Lucas de Sues, Rues, Luques de Suues, Lucas de Sues, Rueses. Gomes Polo e Ronaldo P. Gomes Polo. Դանիել դե Կաստրո Պաչեկոյի մասնագիտացված մասնաճյուղը ՝ 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.

Քայլ 1: Նյութերի ցուցակ

Lista De Materiais
Lista De Materiais

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

1 Arduino Due

1 Dragonboard 410c

2 վարորդ ՝ para motor de corrente Continua contendo cada um:

4 Տրանզիստորներ BC548

4 Դիոդոս 1n4007

4 դիմադրություն 4k7Ω ¼ W

1 վարորդ para servo motor contendo:

1 Տրանզիստորներ BC548

1 Դիոդոս 1N4007

1 դիմադրում է 4k7Ω ¼ W

1 մուկ USB

1 Teclado USB

1 Մոնիտոր

1 Cabo HDMI

1 Robô De Esteiras - Plataforma Zumo

1 Mini dispositivo de cremalheira e engrenagem

1 սերվո շարժիչ 9 գ

Քայլ 2: Adaptação Mecânica

Image
Image

Para a aquisição dos dados pelo sensor piezoelétrico, faz se needário, or desenvolvimento de um dispitivo com pinhão e cremalheira, conforme desenhos anexados, neste caso as peças foram fabricadas por uma impressora 3D, devido ao fato tempo de execução, fixou-se o dispositivo na plataforma zumo, utilizando fita dupla face, conforme vídeo.

Քայլ 3. Acionamento Dos Motores

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

Para exear a movimentação dos motores do robô ZUMO e do dispositivo de captura, fez-se needária a montagem de dois drivers para os motores de corrente Continua e um driver para o servo motor, conforme as figuras acima, sendo a Primeira figura o driver para um motor de corrente Continua ea segunda կամ վարորդ para serum motor.

Քայլ 4: Obtenção Do Áudio

Para obtenção do espectro de áudio das vibrações do solo, foi utilizado um dispitivo desenvolvido como parte do TCC de Engenharia Mecatrônica dos graduandos Lucas Nunes Monteiro e Felipe C. da Silva Salvagnini, maiores detalhes soemo sober obera sober ores oraval sober ober ores atravas sobre ores overa փոստ [email protected]:

Օգտագործման համար անհրաժեշտ է օգտագործել սենսորային էլեկտրահաղորդիչ և uma placa de circuito que realiza a filtragem և amplificação do sinal:

Որպես հաճախականություններ, որոնք հետաքրքրություն են առաջացնում 100Hz և 800Hz հաճախականությունների համար: Isգացմունքների համար անհրաժեշտ է օգտագործել 3 կՀց հաճախականություններ, որոնք թույլ են տալիս արագացնել արագությունը, քանի որ այն առաջացրել է Nyquist արագության բարձր մակարդակ, որն ապահովում է ջրի հաճախականությունների հաճախականությունը:

A aquisição é habilitada e desabilitada através da interrupção do Arduino DUE- ով:

Քայլ 5. Կազմաձևեք Do Arduino DUE (լեզվական C)

Configuração Do Arduino DUE (լեզվական C)
Configuração Do Arduino DUE (լեզվական C)

Devido a grande quantidade de dados, cerca de 3000 pontos por segundo, do tipo inteiro de 32 bits, gerados pelo dispitivo de sensoriamento e e needários para processamento dos algoritmos na DRAGONBOARD 410c, foi utilizado o Arduino DUE para fazer usoó de entao de entaóo de umauma ento poder de processamento, isso foi needino por que o Shield de interfaceamento Grove Seeed Sensor Mezzanine instalado on DRAGONBOARD 410c, que possui um microcontrolador ATmega 328, neo potui poder de processamento para essa operação.

O Arduino DUE foi configurado para receber os comandos enviados da plataforma QUALCOMM DRAGONBOARD 410c- ի միջոցով comunicação սերիալի միջոցով:

As ações configuradas no Arduino foram:

Realizar a aquisição dos dados;

Transmitir os dados obtidos para a DRAGONBOARD 410c;

Ընտրեք ծրագիր.

#ներառել #սահմանել Numb_Sample 3000 #սահմանել DAC_Input A0

#սահմանեք SERVO 7

#սահմանել PosServoMin 4 #սահմանել PosServoMax 6 #սահմանել ժամանակահատված 60 անստորագիր int Scont = 0, SNow = PosServoMin; unsigned long int DAC [Numb_Sample], ind = Numb_Sample; անվավեր TC3_Handler () {TC_GetStatus (TC1, 0); եթե (ind <Numb_Sample) DAC [ind ++] = analogRead (DAC_Input); եթե (Սկոնտ

1); // 50% տուրքի ցիկլ

TC_SetRC (tc, channel, rc); TC_Start (tc, ալիք); tc-> TC_CHANNEL [ալիք]. TC_IER = TC_IER_CPCS | TC_IER_CPAS; // habilita os registradores tc-> TC_CHANNEL [ալիք]. TC_IDR = ~ (TC_IER_CPCS | TC_IER_CPAS); // desabilita os registradores NVIC_EnableIRQ (irq); // habilita interrupção}

դատարկ կարգավորում ()

{Serial.begin (115200); pinMode (DAC_Input, INPUT); TimerStart (TC1, 0, TC3_IRQn, 1500); // Init the Timer // TC_Stop (TC1, 0); pinMode (SERVO, OUTPUT); }

դատարկ շրջան ()

{/*// մինչ (! Serial.available ()); char rc; // = Serial.read (); int ինդեքս = 0; if (rc == 0) {while (! Serial.available ()); rc = Serial.read (); switch (rc) {case 1: indice = 0; իսկ (! Serial.available ()); while ((rc = Serial.read ())! = 0xFF) {ինդեքս << = 8; ինդեքս += rc; իսկ (! Serial.available ()); } Serial.print (0); Serial.print (2); SendNumber (DAC [ինդեքս]); Serial.print (0xFF); ընդմիջում; դեպք 3. մինչ (! Serial.available ()); if ((Serial.read ()) == 0xFF) {SNow = PosServoMax; ուշացում (500); ind = 0; // TC_Start (TC1, 0); while (ind <Numb_Sample); // TC_Stop (TC1, 0); SNow = PosServoMin; ուշացում (500); Serial.print (0); Serial.print (4); Serial.print (0xFF); } ընդմիջում; }} else if (rc == '2') {Serial.print ("Փորձարկել սերվորի շարժիչը / n"); իսկ (! Serial.available ()); rc = Serial.read (); if (rc == '1') {Serial.print ("Mode 1 / n"); SNow = PosServoMax; } if (rc == '2') {Serial.print ("Mode 2 / n"); SNow = PosServoMin; }} */ SNow = PosServoMax; ուշացում (100); SNow = PosServoMin; ուշացում (100); }

Քայլ 6: Տեխնոլոգիաների միջերես

Interfaceamento Das Tecnologias
Interfaceamento Das Tecnologias

Կոմունիկացիաներ ՝ doso dado entre o Arduíno DUE ea DRAGONBOARD 410c- ի միջոցով, օգտագործելով մի ինտերֆեյս, որն ունի պատկերներ, որոնք թույլ են տալիս կատարելագործել մի ծրագիր, որը թույլ է տալիս օգտագործել USB CDC ինտերֆեյսը Arduino DUE ea DRCONBOARD 410 անհրաժեշտության դեպքում այն խորհուրդ է տալիս կատարել KERNEL da DRAGONBOARD 410c, որը թույլ չի տալիս արագացնել տեմպը:

Քայլ 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.

Դիտարկումներ. Առատ օգտագործումը ոչ մի կերպ չի օգտագործվում, քանի որ այն կարող է օգտագործվել միայն այն բանի համար, որ դուք կարող եք օգտագործել տասնյակ ժամանակներ, քանի որ Arduíno DUE e o Mezzanine serem անհամատեղելի է: USB- ի միջոցով անհրաժեշտ է միացնել USB- ը, որն անհրաժեշտ է KERNEL- ի և DRAGONBOARD 410c- ի առաջարկով, որը թույլ է տալիս օգտագործել կապի կոռեկտացման թույլտվություն:

ներմուծել ժամանակ ներմուծել սերիական ներմուծում պանդաներ որպես pd ներմուծել թվով որպես np

# Configuração da conexão սերիալ

սերիա = սերիա: Սերիալ (պորտ = '/dev/ttyAMC0', #tty96B0 ', baudrate = 250000, հավասարություն = սերիա: PARITY_NONE, stopbits = serial. STOPBITS_ONE, bytesize = serial. EIGHTBITS)

ser.isOpen ()

տպել ('Մուտքագրեք ձեր հրամանները ստորև: / r / n Մուտքագրեք «ելք» ՝ դիմումը թողնելու համար:')

մուտքագրում = 1

մինչդեռ 1: մուտքագրում = մուտքագրում (">>") եթե մուտքագրում == 'ելք': ser.close () exit () elif մուտքագրում == 'կարդալ': realizar a coleta dos dados ser.write (1) # Envia o comando para o Arduino DUE transmitir os dados coletados

ցուցակ =

i- ի համար (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)

Քայլ 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 a need a conversão dos arquivos no formato WAV, fornexidos pelos alunos autores do TCC e colaboradores do projeto, para valores numéricos, que são utilizados nos algoritmosososososososososososososososososososososososososososososososos 4, 4, 4, 4, 4, 4, 4, 4,,,,,,,. Para realizar esta conversã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 utilizado segue abaixo e em anexo para download.

Esse algoritmo não se faz Անհրաժեշտ է գործարկել համակարգի կամ գործառույթի համար, այն արդեն Arduino- ով ՊԱՐՏԱՎՈՐՈáՄ Է ՝ շրջակա միջավայրի պահպանման համար, որոնք մենք օգտագործում ենք մեր թվային արժեքների զանգվածը:

# կոդավորում ՝ utf-8

# Leitura e conversão dos audios para csv

# MÓDULOS UTILIZADOS

ներմուծման ալիք ներմուծում numpy որպես np ներմուծում pandas որպես pd ներմուծում matplotlib.pyplot որպես 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_file.readframes)) 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 (ազդանշան), pd. DataFrame (Timeամանակ)], առանցք = 1) df.to_csv (ֆայլի անուն + '.csv', ինդեքս = Կեղծ) վերադարձ df

# 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']

# GRÁFICO DO ESPECTRO DE AUDIO

գործիչ, (ax1, ax2) = plt. ենթատեքստեր (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 ()

Քայլ 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 – ը իրականացնում է Ֆուրյեի փոխակերպումը, արհեստականորեն արվում է մի փոփոխություն, որը կարող է իրականացվել որպես արագության կամ արագության հաճախականություն, որը թույլ է տալիս վերլուծել տարբեր հաճախականություններ, ինչպես նաև ամպլիտուդներ, ինչպես նաև ջրային սինալ: Ուղղակի տեսողականորեն վերաբերվում ենք Ֆուրյեի փոխակերպմանը մեր մասնագիտական / u200b / u200b համադրումների, որոնք ենթադրվում են, որ կան նույնականացման և աճեցման միջոցներ: Estes gráficos servirão para validação das anaslises realizadas pelo algoritmo de detecção automática.

Սահմանափակելով հաճախականությունների մուտքը 100Hz և 800Hz, դա նշանակում է, որ գոյություն ունի արագության բարձր արագություն ՝ դիտարկելով հեռավոր հաճախականությունների հաճախականությունը:

# ծածկագրում. utf-8

ներմուծել pandas որպես pd ներմուծել numpy որպես np ներմուծել ալիք matplotlib- ից ներմուծել pyplot որպես plt# Função que realiza a transformada 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; # Intostalo de amostragem y = pd.concat (df_list) t = y ['time'] # Vetor de tempos y = y ['amp'] # Vetor de amplitudes n = len (y) # Comprimento sinal k = np. arange (n) T = n/Fs frq = k/T frq = frq [միջակայք (n // 2)] Y = np.fft.fft (y)/n Y = Y [տիրույթ (n // 2)] tmp = pd. DataFrame () tmp ['amp'] = abs (Y) tmp ['freq'] = frq max_lim = max (tmp ['amp'] [(tmp ['freq']> = 100) & (tmp ['freq'] <= 800)]) թուզ, ax = plt. ենթածրագրեր (2, 1, figsize = (20, 10)) ax [0]. սյուժե (t, y) ax [0].set_xlabel (''Ամանակ') ax [0].set_ylabel ('Amplitude') 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 կամ chama a funçaão de Fourier def read_csv (file_name, init, final): df = pd.read_csv (file_name + '.csv') df.columns = ['amp', ' ժամանակ '] դելտա = վերջնական-ինֆտ, եթե ինիտ*44100> լեն (դֆ) կամ վերջնական*44100> լեն (դֆ). '] <= 800)] mx = տեսակավորված (df [' amp ']) տպել ("Média das amplitudes:", np.round (np.mean (mx))) print ("Percentuais em relação a média das amplitudes.") print ("100 maiores amplitudes", np.mean (mx [-100:]) // df ['amp']. միջին ()*100, "%", sep = "") տպել ("50 maiores amplitudes:", np.mean (mx [-50:]) // df ['amp']. միջին ()*100, "%", sep = "") տպագիր ("10 maiores amplitudes:", np.mean (mx [-10:]) // df ['amp']: միջին ()*100, «%», sep = "") տպագիր ("հիմնական ամպլիտուդ.", np.mean (mx [-1:]) // df ['amp']. միջին ()*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

Քայլ 10. Algoritmo Em R Para Extração Das Features Dos Dados

Algoritmo Em R Para Extração Das Features Dos Dados
Algoritmo Em R Para Extração Das Features Dos Dados
Algoritmo Em R Para Extração Das Features Dos Dados
Algoritmo Em R Para Extração Das Features Dos Dados

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

Este primeiro algoritmo realiza uma extração identificada, onde é needário saber se o arquivo de áudio trata-se de uma amostra vazamento vazamento detected ou não, isso por que os dados resultantes desse processo servirão para o treinamento da rede neural useizada- ի միջոցով:

Որպես համակարգային համակարգ, որը գործում է որպես գործառնական գործառույթ, որն օգտագործվում է տարբեր եղանակներով, մենք կարող ենք տարբերակել մեր կատարողականը, քանի որ մենք չենք կարող նույնականացնել մի շարք այլ բնութագրեր, որոնք բնութագրվում են որպես նույնականացման բնութագրիչ:

Estas features ou caraterísticas são propriedades acústicas compostas por varias informações referentes ao espectro de captudio capturado, abaixo seguirá uma descrição (em inglês) destas Karacterísticas.

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

Softwareրագրային ապահովման միջոցով դուք կարող եք անվճար ներբեռնել, ներբեռնել և մեկնաբանել R e do R Studio:

Características extraídas:

  • meanfreq: միջին հաճախականությունը (կՀց)
  • sd: հաճախականության ստանդարտ շեղում
  • միջին: միջին հաճախականությունը (կՀց)
  • Q25. Առաջին քվանտիլ (կՀց)
  • Q75: երրորդ քվանտիլ (կՀց)
  • IQR: միջերկրյա միջակայք (կՀց հաճախականությամբ)
  • թեքություն. շեղություն (տե՛ս նշումը specprop նկարագրության մեջ)
  • kurt: kurtosis (տե՛ս նշումը specprop նկարագրության մեջ)
  • sp.ent: սպեկտրալ էնտրոպիա
  • sfm: սպեկտրալ հարթություն
  • ռեժիմ ՝ ռեժիմի հաճախականություն
  • centroid: հաճախականություն centroid (տես specprop)
  • պիկֆ. գագաթնակետային հաճախականություն (հաճախականություն ամենաբարձր էներգիայով)
  • meanfun: ձայնային ազդանշանի միջոցով չափվող հիմնական հաճախականության միջին
  • minfun: նվազագույն հիմնական հաճախականությունը, որը չափվում է ձայնային ազդանշանի վրա
  • maxfun: առավելագույն հիմնական հաճախականությունը, որը չափվում է ձայնային ազդանշանի վրա
  • միջնակարգ. գերիշխող հաճախականության միջին ցուցանիշը, որը չափվում է ձայնային ազդանշանի վրա
  • mindom: գերիշխող հաճախականության նվազագույնը, որը չափվում է ձայնային ազդանշանի վրա
  • maxdom. գերիշխող հաճախականության առավելագույնը, որը չափվում է ձայնային ազդանշանի վրա
  • dfrange: գերիշխող հաճախականության տիրույթ, որը չափվում է ձայնային ազդանշանի վրա
  • modindx: մոդուլյացիայի ինդեքս: Հաշվարկված է որպես հիմնական հաճախականությունների հարակից չափումների կուտակված բացարձակ տարբերություն `բաժանված հաճախականությունների տիրույթի
  • պիտակը ՝ արտահոսք կամ առանց_թափանցում

Algoritmo usado:

փաթեթներ <- c ('tuneR', 'seewave', 'fftw', 'caTools', 'randomForest', 'warbleR', 'mice', 'e1071', 'rpart', 'xgboost', 'e1071'), եթե (երկարություն (setdiff (փաթեթներ, անունների անուններ (տեղադրված. փաթեթներ))))> 0) {install.packages (setdiff (փաթեթներ, անունների անուններ (տեղադրված. փաթեթներ ()))))}

գրադարան (tuneR)

գրադարան (seewave) գրադարան (caTools) գրադարան (rpart) գրադարան (rpart.plot) գրադարան (randomForest) գրադարան (warbleR) գրադարան (մկներ) գրադարան (xgboost) գրադարան (e1071)

specan3 <- գործառույթ (X, bp = c (0, 22), wl = 2048, շեմ = 5, զուգահեռ = 1) { # parallelուգահեռ մշակման համար `գրադարան (devtools), install_github ('nathanvan/parallellsugar'), եթե (դաս (X) == "data.frame") {if (բոլորը (c ("sound.files", "selec", "start", "end") % % colnames (X))) {սկսել <- 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 (տեղադրեք (տեղադրեք (c («sound.files», «selec», «start», «end») [! (c («sound.files», «selec», "սկիզբ", "ավարտ") % % սյունակներում (X))], փլուզում = ","), "սյունակ (ներ) ը տվյալների շրջանակում չեն գտնվել"))} else stop ("X- ը տվյալների շրջանակ չէ") #եթե սկզբնական կամ վերջնական կանգառներում կան Աs -ներ, եթե (որևէ (is.na (գ (վերջ, սկիզբ)))) կանգառ («սկզբում և/կամ վերջում հայտնաբերված ԱԱ») #եթե վերջը կամ սկիզբը թվային կանգառ չեն if (all (class (end)! = "numeric" & class (start)! = "numeric")) stop ("" end "and" selec "must be numeric") #եթե ցանկացած սկիզբ ավելի բարձր է, քան վերջը, եթե (ցանկացած (վերջ - սկիզբ <0)) կանգառ (տեղադրեք («Մեկնարկը ավելի բարձր է, քան en դ », երկարություն (որը (վերջ - սկիզբ 20)) կանգառ (տեղադրում (երկարություն (որը (վերջ - սկիզբ> 20)),« ընտրություն (ներ) ավելի քան 20 վրկ »)) ընտրանքներ (show.error.messages = TRUE) #եթե bp- ն վեկտոր կամ երկարություն չէ! = 2 կանգառ, եթե (! 2) կանգառ ("'bp' պետք է լինի երկարության թվային վեկտոր 2")} #վերադարձի նախազգուշացում, եթե ոչ բոլոր ձայնային ֆայլերը գտնվեն fs <- list.files (path = getwd (), pattern = ".wav $", ignore.case = TRUE) if (երկարություն (եզակի (sound.files [(sound.files % in % fs)]))! = երկարություն (եզակի (sound.files))) cat (կպցնել (երկարությունը (եզակի (ձայնային ֆայլեր))-երկարություն (եզակի (sound.files [(sound.files % in % fs)]))), ".wav ֆայլ (եր) չեն գտնվել")) #աշխատանքային գրացուցակում ձայնային ֆայլերի #հաշվիչ և եթե 0 կանգառ d <- որը (sound.files % in % fs) if (length (d) == 0) {stop (".wav ֆայլերը աշխատանքային գրացուցակում չեն")} այլ {սկսել <- սկսել [d] ավարտ <- end [d] selec <- selec [d] sound.files <- sound.files [d]} # Եթե զուգահեռը թվային չէ, եթե (! is.numeric (զուգահեռ)) stop ("must" լինի երկարության 1 ") եթե (ցանկացած (! (զուգահեռ %% 1 == 0), զուգահեռ 1) {տարբերակ (նախազգուշացում = -1) եթե (բոլորը (Sys.info () [1] ==" Windows », requireNamespace (« parallellsugar », հանգիստ = TRUE) == TRUE)) lapp <- գործառույթը (X, FUN) parallellsugar:: mclapply (X, FUN, mc.cores = parallel) else if (Sys.info () [1] == «Windows») {cat («Windows- ի օգտվողները պետք է տեղադրեն« parallellsugar »փաթեթը զուգահեռ հաշվարկման համար (այժմ դա չեք անում))») lapp <- pbapply:: pblapply} else lapp <- գործառույթ (X, FUN) զուգահեռ:: mclapply (X, FUN, mc.cores = զուգահեռ)} else lapp <- pbapply:: pblapply ընտրանքներ (նախազգուշացում = 0) եթե (զուգահեռ == 1) կատու ("Չափման ձայնային պարամետրեր.") x <- as.data.frame (lapp (1: երկարություն (սկիզբ), գործառույթ (i) {r <- tuneR:: readWave (file.path (getwd (), sound.files ), սկսած = սկիզբ , մինչև = վերջ , միավորներ = «վայրկյան») b առաստաղ ([email protected]/2000) - 1) b [2] < - առաստաղ ([email protected]/2000) - 1 #հաճախականությունների սպեկտրի վերլուծություն songspec <- seewave:: spec (r, f = [email protected], plot = FALSE) analysis <- seewave:: specprop (songspec, f = [email protected], flim = c (0, 280/1000), plot = FALSE) #save parameters meanfreq <- analysis $ mean/1000 sd <- analysis $ sd/1000 median <- analysis $ median/1000 Q25 < - վերլուծություն $ QQ75 <- վերլուծություն $ QIQR <- վերլուծություն $ IQR/1000 շեղում <- վերլուծություն $ թեքություն kurt <- վերլուծություն $ kurtosis sp.ent <- վերլուծություն $ sh sfm <- վերլուծություն $ sfm ռեժիմ <- վերլուծություն $ ռեժիմ/1000 centroid <- վերլուծություն $ cent/1000 #Հաճախականություն ամպլիտուդյան գագաթներով գագաթ </0 #seewave:: fpeaks (songspec, f = [email protected], wl = wl, nmax = 3, plot = FALSE) [1, 1] #Հիմնական հաճախականության պարամետրեր ff <- seewave:: fund (r, f = [email protected], ovlp = 50, threshold = threshold, fmax = 280, ylim = c (0, 280/1000), plot = FALSE, wl = wl) [, 2] meanfun <-միջոց (ff, na.rm = T) minfun <-min (ff, na.rm = T) maxfun <-max (ff, na.rm = T) #հաճախականության գերիշխող պարամետրեր y <- seewave:: dfreq (r, f = [email protected], wl = wl, ylim = c (0, 280/1000), ovlp = 0, plot = F, շեմ = շեմ, bandpass = b * 1000, fftw = TRUE) [, 2] meandom <- միջին (y, na.rm = TRUE) mindom <- min (y, na.rm = TRUE) maxdom <- max (y, na.rm = TRUE) dfrange <- (maxdom- mindom) տևողություն <- (վերջ - սկիզբ ) #մոդուլյացիայի ինդեքսի հաշվարկը փոխում է <- վեկտորը () համար (j- ում որի համար (! է) na (y))) {փոփոխություն <- abs (y [j]- y [j + 1]) փոփոխություններ <- հավելել (փոփոխություններ, փոփոխություններ)} եթե (mindom == maxdom) modindx <-0 else modindx <- mean (փոփոխություններ, na.rm = T)/dfrange #պահպանել արդյունքները (c (տևողությունը, միջին արժեքը, sd, միջին, Q25, Q75, IQR, շեղում, կարճ, sp.ent, sfm, ռեժիմ, centroid, peakf, meanfun, minfun, maxfun, meandom, mindom, maxdom, dfrange, modindx))})) #փոփոխության արդյունքների անուններ անունների անուններ (x) <- c («տևողություն», «meanfreq», «sd», «միջին», «Q25», "Q75", "IQR", "skew", "kurt", "sp.ent", "sfm", "mode", "centroid", "peakf", "meanfun", "minfun", "maxfun", "meandom", "mindom", "maxdom", "dfrange", "modindx") x <- data.frame (sound.files, selec, as.data.frame (t (x))) սյուներ (x) [1: 2] <- c ("sound.files", "selec") rownames (x) <- c (1: nrow (x)) return (x)}

processFolder <- գործառույթը (folderName) { # Սկսեք դատարկ data.frame- ով: data <- data.frame () # Ստացեք թղթապանակում գտնվող ֆայլերի ցանկը: ցուցակ <- list.files (folderName, '\. wav') # Ավելացնել ֆայլերի ցուցակ data.frame- ին ՝ մշակման համար: for (fileName in list) {row <- data.frame (fileName, 0, 0, 20) data <- rbind (data, row)} # Սահմանել սյունակների անուններ անուններ (տվյալներ) <- c ('sound.files', 'selec', 'start', 'end') # Տեղափոխել թղթապանակ մշակման համար: setwd (folderName) # Գործընթացի ֆայլեր: ակուստիկա <- specan3 (տվյալներ, զուգահեռ = 1) # Վերադարձ դեպի մայր թղթապանակ: setwd ('..') ակուստիկա}

սեռ <- գործառույթը (filePath) {if (! գոյություն ունի ('genderBoosted')) {load ('model.bin')} # Կարգավորման ուղիներ: currentPath <- getwd () fileName <- basename (filePath) path <- dirname (filePath) # Սահմանել ֆայլը կարդալու գրացուցակը: setwd (ուղի) # Սկսեք դատարկ data.frame- ով: տվյալներ <- data.frame (ֆայլի անուն, 0, 0, 20) # Սահմանել սյունակների անուններ: անուններ (տվյալներ) <- c ('sound.files', 'selec', 'start', 'end') # Գործընթաց ֆայլեր: ակուստիկա <- specan3 (տվյալներ, զուգահեռ = 1) # Վերականգնել ուղին: setwd (ընթացիկ ճանապարհ) կանխատեսել (genderCombo, newdata = ակուստիկա)}

# Բեռնել տվյալները

արտահոսք <- գործընթաց Թղթապանակ («caminho para o pasta com samples de áudio com vazamento») առանց_ արտահոսքի <- processFolder ('caminho para o pasta com sample de áudio sem vazamento')

# Սահմանեք պիտակներ:

արտահոսքի $ label <- 1 առանց_թափանցման $ label <- 2 տվյալներ <- rbind (արտահոսք, առանց_թափանցման) տվյալներ $ label <- գործոն (տվյալներ $ label, labels = c ('արտահոսք', 'առանց_թափանցում'))

# Հեռացրեք չօգտագործված սյուները:

տվյալներ $ տևողություն <- NULL տվյալներ $ sound.files <- NULL տվյալներ $ selec <- NULL տվյալներ $ պիկֆ <- NULL

# Հեռացրեք Ա NA պարունակող տողերը:

տվյալներ <- տվյալներ [ամբողջական. դեպքեր (տվյալներ),]

# Գրեք csv տվյալների հավաքածուն:

write.csv (տվյալներ, ֆայլ = 'features.csv', sep = ',', row.names = F)

Քայլ 11. Վերականգնել նյարդային համակարգը

Rede Neural
Rede Neural

A ideia do uso de uma rede neural, and a de realizar um reconhecimento automatizado através dos dados coletados pelo dispositivo de sensoriamento- ի միջոցով:

A neure neal use é do tipo MLP (Multilayer Perceptron), este modelo é treinado com dodos previamente identificados and após esse treinamento or modelo implantado no sistema conseguirá realizar a identificação automática do sinal Recebido, informando se naqueum pouqueo.

Foi needário realizar uma filtragem dos dados de entrada, pois algumas características estavam diminuindo a taxa de acerto da rede ao invés de melhora-la. Não foi realizado nenhuma abordagem estatística muito aprofundada, mas mesmo com um trabalho mais superficial 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 is use for treinar o modelo da rede e retornar a taxa de acerto do mesmo. Ոչ մի համակարգ, որը կարող է օգտագործվել տարբեր եղանակներով, մենք կարող ենք հասկանալ, թե որն է մեր մոդելը, որն իրականացնում է իրագործումը որպես կանխատեսված կանխատեսում:

# կոդավորում ՝ utf-8

ներմուծել պանդաները որպես PDF

ներմուծել numpy as np sklearn.model_selection ներմուծել train_test_split որպես tts sklearn.neural_network ներմուծել MLP դասակարգիչ որպես MLP sklearn.metrics ներմուծման դասակարգում_հաշվետվություն որպես cr sklearn.metrics ներմուծել confusion_matrix սմ

# 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 rede նյարդային

modelo = MLP (alpha = 0.0001, learning_rate_init = 0.0001, hidden_layer_sizes = = (50, 50, 50, 50), max_iter = 10000, ակտիվացում = 'tanh', solver = 'lbfgs')

# Տրեյնանդո մոդել

modelo.fit (X_train, Y_train) արդյունք = modelo.predict (X_test)

# Imprimindo resultados

հաշվետվություն = 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 (զեկույց)

Խորհուրդ ենք տալիս: