สารบัญ:
- ขั้นตอนที่ 1: Lista De Materiais
- ขั้นตอนที่ 2: Adaptação Mecânica
- ขั้นตอนที่ 3: Acionamento Dos Motores
- ขั้นตอนที่ 4: Obtenção Do Áaudio
- ขั้นตอนที่ 5: กำหนดค่า Do Arduino DUE (ภาษา C)
- ขั้นตอนที่ 6: Interfaceamento Das Tecnologias
- ขั้นตอนที่ 7: กำหนดค่า Da DRAGONBOARD 410c (Python)
- ขั้นตอนที่ 8: INTERPRETACÃO DOS ARQUIVOS DE AUDIO
- ขั้นตอนที่ 9: Análise Visual Do Sinal
- ขั้นตอนที่ 10: Algoritmo Em R Para Extração Das คุณสมบัติ Dos Dados
- ขั้นตอนที่ 11: ทำซ้ำประสาท
วีดีโอ: Sistema Autônomo Localizador De Vazamentos: 11 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:04
Este projeto ประกอบด้วย 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 identificar e localizar, com o กระบวนการ porne uma dos สีแดง อูมา ทูบูลาเซา
O processamento destes dados é realizado por algoritmos ติดตั้งบน DRAGONBOARD 410c. Os dados também são enviados para um serviço na nuvem, ตอบกลับโดย auxiliar no processo de Integência ประดิษฐ์ตามโครงการ.
Este projeto foi desenvolvido no Hackaton Qualcomm, durante a TecnoFACENS da Faculdade de Engenharia de Sorocaba (FACENS), participaram do projeto os graduandos de engenharia mecatrônica Eneo Juliano Bovino, Felipe Xavier, Lucas de Sousa. โกเมส โปโล และ โรนัลโด้ พี. โกเมส โปโล ผู้เข้าร่วมโครงการหรือศิษย์เก่า Daniel de Castro Pacheco จบการศึกษาจากมหาวิทยาลัยในมหาวิทยาลัย Newton Paiva de Belo Horizonte O projeto contou com o apoio dos graduandos de engenharia mecatrônica da FACENS, Lucas Nunes Monteiro และ Felipe Crispim da Silva Salvagnini
ขั้นตอนที่ 1: Lista De Materiais
Para realização deste projeto, ระบบปฏิบัติการ seguintes การใช้งานสำหรับฟอรัม:
1 Arduino Due
1 กระดานมังกร 410c
2 ไดรเวอร์สำหรับมอเตอร์ de corrente ต่อเนื่อง contendo cada um:
4 ทรานซิสเตอร์ BC548
4 ไดโอด 1n4007
4 ตัวต้านทาน 4k7Ω ¼ W
1 ไดรเวอร์สำหรับการแข่งขันเซอร์โวมอเตอร์:
1 ทรานซิสเตอร์ BC548
1 ไดโอด 1N4007
1 ตัวต้านทาน 4k7Ω ¼ W
1 เมาส์ USB
1 เทคลาโด USB
1 จอภาพ
1 Cabo HDMI
1 โรโบ เด เอสเตราส - Plataforma Zumo
1 มินิ dispositivo de cremalheira e engrenagem
1 เซอร์โวมอเตอร์ 9g
ขั้นตอนที่ 2: Adaptação Mecânica
สำหรับ aquisição dos dados pelo sensor piezoelétrico, faz se necessário, o desenvolvimento de um dispositivo com pinhão e cremalheira, Conforme desenhos anexados, neste caso as peças foram fabricadas por umatar impressidoum a pro, จังหวะของการดำเนินการ, fixou-se o dispositivo na plataforma zumo, utilizando fita dupla face, Conforme vídeo
ขั้นตอนที่ 3: Acionamento Dos Motores
ระบบปฏิบัติการสำหรับมอเตอร์ที่ทำ robô ZUMO e do dispositivo de captura, fez-se necessária a montagem de dois drivers สำหรับ os motores de corrente คอนเนคเตอร์ e um driver สำหรับเซอร์โวมอเตอร์, สอดคล้องกับ figuras acima, sendo a primeira figura o driver para um motor de corrente ต่อเนื่อง ea segunda o ไดรเวอร์สำหรับเซอร์โวมอเตอร์
ขั้นตอนที่ 4: Obtenção Do Áaudio
ที่ด้านบนสุดของเสียง das vibrações do solo, foi utilizado um dispositivo desenvolvido como parte do TCC ของ Engenharia Mecatrônica dos graduandos Lucas Nunes Monteiro e Felipe C. da Silva Salvagnini, เพื่อนร่วมงานที่อาศัยอยู่ที่ห่างไกล อีเมล [email protected]
Este dispositivo utiliza-se de um เซ็นเซอร์ piezoelétrico e uma placa de circuito que realiza a filtragem e amplificação do sinal.
เป็นความถี่ของความถี่สำหรับ o projeto estão entre 100Hz e 800Hz Para isso o dispositivo de sensoriamento foi configurado com uma frequência de amostragem de 3 kHz para que sejam respeitada as condições do teorema de amostragem de Nyquist, onde a frequência de aquisição deve estarada pelo meos duasquest.
Aquisição é habilitada และ desabilitada através da interrupção do Arduino DUE
ขั้นตอนที่ 5: กำหนดค่า Do Arduino DUE (ภาษา C)
ทุ่มเทให้กับงบประมาณทั้งหมด, มากกว่า 3000 ต่อพอร์ตสำหรับ segundo, ใช้งาน 32 บิต, ใช้งานจริงผ่านเซ็นเซอร์และความจำเป็นสำหรับการประมวลผลสำหรับอัลกอริทโมสบน DRAGONBOARD 410c, สำหรับ Arduino ใช้งานจริงสำหรับ Arduino กระบวนการที่จำเป็น, จำเป็นสำหรับ por que o Shield สำหรับอินเทอร์เฟซ Grove Seeed Sensor Mezzanine ติดตั้งบน DRAGONBOARD 410c, ต่อด้วยไมโครคอนโทรลเลอร์ ATmega 328, ก่อนหน้า
O Arduino เนื่องจากการกำหนดค่าสำหรับ receber os comandos enviados da plataforma QUALCOMM DRAGONBOARD 410c ผ่าน comunicação serial
ในฐานะที่เป็นคอนฟิกูเรชันไม่มี Arduino foram:
Realizar aquisição dos dados;
ตัวส่งผ่านระบบ obtidos สำหรับ DRAGONBOARD 410c;
ต่อโปรแกรม:
#รวม#define Numb_Sample 3000 #define DAC_Input A0
#กำหนด SERVO 7
#define PosServoMin 4 #define PosServoMax 6 #define ระยะเวลา 60 unsigned int Scont=0, SNow=PosServoMin; DAC int ยาวที่ไม่ได้ลงนาม[Numb_Sample], ind=Numb_Sample; เป็นโมฆะ TC3_Handler () { TC_GetStatus (TC1, 0); ถ้า (ind < Numb_Sample) DAC[ind++] = analogRead (DAC_Input); ถ้า(Scont
1); // 50% รอบการทำงาน
TC_SetRC(tc, ช่อง, rc); TC_Start(tc, ช่อง); tc->TC_CHANNEL[ช่อง]. TC_IER = TC_IER_CPCS | TC_IER_CPAS; // habilita ระบบปฏิบัติการ registradores tc->TC_CHANNEL[channel]. TC_IDR = ~(TC_IER_CPCS | TC_IER_CPAS); // desabilita ระบบปฏิบัติการ registradores NVIC_EnableIRQ(irq); // habilita interrupção }
การตั้งค่าเป็นโมฆะ ()
{ Serial.begin (115200); โหมดพิน (DAC_Input, INPUT); TimerStart(TC1, 0, TC3_IRQn, 1500); // เริ่มจับเวลา //TC_Stop(TC1, 0); โหมดพิน (SERVO, OUTPUT); }
วงเป็นโมฆะ ()
{ /*//while(!Serial.available()); ถ่าน rc;//=Serial.read(); ดัชนี int = 0; if(rc==0) { while(!Serial.available()); rc=Serial.read(); สวิตช์ (rc) { กรณีที่ 1: ดัชนี = 0; ในขณะที่(!Serial.available()); ในขณะที่ ((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); ในขณะที่ (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("โหมด 1\n"); หิมะ=PosServoMax; } if(rc=='2') { Serial.print("โหมด 2\n"); SNow=PosServoMin; } } */ SNow=PosServoMax; ล่าช้า (100); SNow=PosServoMin; ล่าช้า (100); }
ขั้นตอนที่ 6: Interfaceamento Das Tecnologias
สำหรับการติดต่อสื่อสารระหว่างกัน กับ Arduíno DUE ea DRAGONBOARD 410c, การใช้งานทั่วไป-อินเทอร์เฟซสำหรับ Arduino, o que não foi possível executar, então optou-se pelo uso de uma interface USB CDR entre BOARD necessitaria da recompilação do KERNEL da DRAGONBOARD 410c, que não se fez por causa do curto จังหวะการแสดง
ขั้นตอนที่ 7: กำหนดค่า Da DRAGONBOARD 410c (Python)
กำหนดค่าสำหรับสภาพแวดล้อมสำหรับ Arduino DUE os comandos para realizar aquisição de dados e sendir os dados obtidos Segue codigo abaixo.
การสังเกต: A abordagem utilizada no código, não funcionou devido aos níveis de tensão utilizados pelo Arduíno DUE e o Mezzanine serem incompatíveis. Por isso optou-se pelo interfaceamento USB, que necessitaria da recompilação do KERNEL na DRAGONBOARD 410c สำหรับ que a porta fosse criada corretamente para a comunicação.
นำเข้า timeimport แพนด้านำเข้าซีเรียลเป็น pd นำเข้าจำนวนเป็น np
# Configuração da conexão serial
ser = serial. Serial(port='/dev/ttyAMC0', #tty96B0', baudrate=250000, parity=serial. PARITY_NONE, stopbits=serial. STOPBITS_ONE, bytesize=serial. EIGHTBITS)
ser.isOpen()
print('ป้อนคำสั่งของคุณด้านล่าง\r\nแทรก "exit" เพื่อออกจากแอปพลิเคชัน')
อินพุต=1
ในขณะที่ 1: input = input(">> ") if input == 'exit': ser.close() exit() elif input == 'read': ser.write(0) # Envia o comando para o Arduino DUE ใช้งานจริง coleta dos dados ser.write(1) # Envia o comando para o Arduino DUE เครื่องส่งสัญญาณ os dados coletados
รายการ =
สำหรับฉันอยู่ในช่วง (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: INTERPRETACÃO DOS ARQUIVOS DE AUDIO
มากกว่า ความเป็นจริง มากกว่า สำคัญ การวิเคราะห์ ที่ dos dados obtidos através do sensor, จำเป็น จำเป็น การสนทนา ในรูปแบบ WAV, fornecidos pelos alunos autores do TCC e colaboradores do projeto, para valores al numéricoss บอร์ด มากกว่า บอร์ด มากกว่า บอร์ด มากกว่า บอร์ด. 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 ดาวน์โหลด
อัลกอริทึม ก่อนหน้า จำเป็น สำหรับ o funcionameto do sistema, já que o Arduino DUE já enviará ess dados em um array de valores numéricos.
# การเข้ารหัส: utf-8
# Leitura และการสนทนา dos ไฟล์เสียงสำหรับ csv
# MÓDULOS UTILIZADOS
นำเข้าคลื่นนำเข้า numpy เป็น np นำเข้าแพนด้าเป็น pd นำเข้า matplotlib.pyplot เป็น plt
# ตัวแปลง FUNÇÃO PARA WAV EM DADOS ทำ ESPECTRO E SALVAR CSV
def เสียง) สัญญาณ = 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)], axis=1) df.to_csv(file_name + '.csv', index=False) return df
# CARREGANDO DATA FRAME 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_names_csv' (ไฟล์])
# GRÁFICO DO ESPECTRO DE AUDIO
รูป (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()
ขั้นตอนที่ 9: Análise Visual Do Sinal
Com o PYTHON 3 é realizada a transformada de Fourier, este artificio matemático realiza a transformação do sinal do domínio do tempo para o domínio da frequência, onde se torna possível analisar as Varias frequêmciasque แอมพลิจูด. คำอธิบาย visual do gráfico da transformada de Fourier um profissional com conhecimentos específicos poderá identificar a residence de algum vazamento na tubulação. Estes graficos servirão para validação das análises realizadas pelo algoritmo de detecção automática.
ขีด จำกัด ของความถี่ที่ 100Hz และ 800Hz, fica claro มีอยู่จริง vazamentos quando se observam distúrbios nesse range de frequências.
# การเข้ารหัส: utf-8# Módulos utilizados para processamento da transformada de Fourier
นำเข้าแพนด้าเป็น 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; # แท็ก amostragem em Hz Ts = 1.0/Fs; # Intervalo de amostragem y = pd.concat(df_list) t = y['time'] # Vetor de tempos y = y['amp'] # ความกว้างของคลื่น 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('เวลา') ขวาน[0].set_ylabel('แอมพลิจูด') ขวาน[1].plot(frq, abs(Y), 'r') ขวาน[1].set_xlim([100, 800]) ขวาน[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) หรือ final*44100 > len(df): init = (len(df)/44100)-delta if init =100) & (df['freq ']<=800)] mx = เรียงลำดับแล้ว (df['amp']) print("Media das amplitudes:", np.round(np.mean(mx))) print("Percentuais em relação a média das amplitudes.") พิมพ์ ("100 maiores amplitudes ", np.mean(mx[-100):])//df['amp'].mean()*100, "%", sep="") print("50 maiores amplitudes:", np.mean(mx[-50:])//df ['amp'].mean()*100, "%", sep="") print("10 maiores amplitudes:", np.mean(mx[-10:])//df['amp'] หมายถึง()*100, "%", sep="") print("Maior amplitude:", np.mean(mx[-1:])//df['amp'].mean()*100, " %", sep="")read_csv('Solo_com_Vazamento', 2, 10) # ตัวอย่างสำหรับ vazamentoread_csv('Solo_sem_Vazamento', 2, 10) # แบบอย่างสำหรับ sem vazamento
ขั้นตอนที่ 10: Algoritmo Em R Para Extração Das คุณสมบัติ Dos Dados
Utilizou-se um algoritmo em R para realizar o กระบวนการและคุณสมบัติพิเศษ (características) dos dados obtidos
Este primeiro algoritmo realiza uma extração identificada, onde é necessário saber se o arquivo de áudio trata-se de uma amostra vazamento detectado ou não, isso por que os dados resultantes desse การประมวลผล เซิร์ฟเวอร์ tre o da สีแดง
Para quando o sistema estiver em modo de operação um algoritmo um pouco diferente será executado, onde não este fará a extração não identificada, gerando somente เป็น características sem uma identificação
Estas แสดงคุณลักษณะ ou caraterísticas são propriedades acústicas compostas por varias informações referentes 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, หรือ mesmo foi modificado para atender as especificações do projeto.
O software usado para rodar o algoritmo é gratuito ดาวน์โหลด do interpretador R e do R Studio
Características extraídas:
- ความถี่เฉลี่ย: ความถี่เฉลี่ย (เป็น kHz)
- sd: ส่วนเบี่ยงเบนมาตรฐานของความถี่
- ค่ามัธยฐาน: ความถี่มัธยฐาน (เป็น kHz)
- Q25: ควอนไทล์แรก (เป็น kHz)
- Q75: ควอนไทล์ที่สาม (เป็น kHz)
- IQR: ช่วงอินเตอร์ควอนไทล์ (เป็น kHz)
- เอียง: ความเบ้ (ดูหมายเหตุในคำอธิบาย specprop)
- kurt: kurtosis (ดูหมายเหตุในคำอธิบาย specprop)
- sp.ent: สเปกตรัมเอนโทรปี
- sfm: ความเรียบของสเปกตรัม
- โหมด: โหมดความถี่
- centroid: centroid ความถี่ (ดู specprop)
- peakf: ความถี่สูงสุด (ความถี่ที่มีพลังงานสูงสุด)
- Meanfun: ค่าเฉลี่ยของความถี่พื้นฐานที่วัดผ่านสัญญาณอะคูสติก
- minfun: ความถี่พื้นฐานขั้นต่ำที่วัดจากสัญญาณอะคูสติก
- maxfun: ความถี่พื้นฐานสูงสุดที่วัดผ่านสัญญาณเสียง
- ค่าเฉลี่ย: ค่าเฉลี่ยของความถี่เด่นที่วัดผ่านสัญญาณอะคูสติก
- Mindom: ความถี่ต่ำสุดที่วัดผ่านสัญญาณอะคูสติก
- maxdom: ความถี่สูงสุดที่วัดผ่านสัญญาณอะคูสติก
- dfrange: ช่วงความถี่เด่นที่วัดผ่านสัญญาณอะคูสติก
- modindx: ดัชนีการมอดูเลต คำนวณจากผลต่างสัมบูรณ์สะสมระหว่างการวัดความถี่พื้นฐานที่อยู่ติดกันหารด้วยช่วงความถี่
- ฉลาก: รั่วหรือไม่รั่วไหล
อัลกอริทโม อูซาโด:
แพ็คเกจ <- c ('tuneR', 'seewave', 'fftw', 'caTools', 'randomForest', 'warbleR', 'mice', 'e1071', 'rpart', 'xgboost', 'e1071') ถ้า (ความยาว (setdiff (แพ็คเกจ ชื่อแถว (installed.packages ()))) > 0) { install.packages (setdiff (แพ็คเกจ ชื่อแถว (installed.packages ()))) }
ห้องสมุด(tuneR)
ห้องสมุด (seewave) ห้องสมุด (caTools) ห้องสมุด (rpart) ห้องสมุด (rpart.plot) ห้องสมุด (randomForest) ห้องสมุด (warbleR) ห้องสมุด (หนู) ห้องสมุด (xgboost) ห้องสมุด (e1071)
specan3 <- function(X, bp = c(0, 22), wl = 2048, threshold = 5, parallel = 1){ # ในการใช้การประมวลผลแบบขนาน: 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() ไม่แสดงรายการ(X$selec)) } else stop(paste(paste(c("sound.files", "selec", "start", "end")[!(c("sound.files", "selec", "start", "end") %in% colnames(X))], dissolve=", "), "column(s) not found in data frame")) } else stop("X ไม่ใช่ data frame") #if มี NA ใน start หรือ end stop if(any(is.na(c(end, start)))) stop("NAs found in start and/or end") #if end or start ไม่ใช่ตัวเลขหยุด if(all(class(end) != "numeric" & class(start) != "numeric")) stop("'end' and 'selec' ต้องเป็นตัวเลข") #if ใด ๆ เริ่มต้นที่สูงกว่า end หยุด if(any(end - start<0)) stop(paste("การเริ่มต้นสูงกว่า en d in", length((ซึ่ง(สิ้นสุด - start20))) หยุด(paste(length(((end - start>20))), "selection(s) นานกว่า 20 วินาที")) ตัวเลือก(show.error.messages = TRUE) #if bp ไม่ใช่เวกเตอร์หรือความยาว!=2 หยุด if(!is.vector(bp)) stop("'bp' ต้องเป็นเวกเตอร์ตัวเลขที่มีความยาว 2") else{ if(!length(bp) == 2) stop("'bp' ต้องเป็นเวกเตอร์ตัวเลขที่มีความยาว 2")} #return warning หากไม่พบไฟล์เสียงทั้งหมด fs <- list.files(path = getwd(), pattern = ".wav$", ละเว้นกรณี = จริง) if(length(unique(sound.files[(sound.files %in% fs)])) != length(unique(sound.files))) cat(paste(length(unique(sound.files))) cat(paste(length(unique(sound.files))) files))-length(unique(sound.files[(sound.files %in% fs)])), ".wav file(s) not found")) #นับจำนวนไฟล์เสียงในไดเร็กทอรีการทำงาน และถ้า 0 หยุด d <- which(sound.files %in% fs) if(length(d) == 0){ stop("ไฟล์.wav ไม่ได้อยู่ในไดเร็กทอรีการทำงาน") } else { start <- start[d] end <- end[d] selec <- selec[d] sound.files <- sound.files[d] } # ถ้า Parallel ไม่ใช่ตัวเลข if(!is.numeric(parallel)) stop("'parallel' must เป็นเวกเตอร์ตัวเลขที่มีความยาว 1") if(any(!(parallel %% 1 == 0), parallel 1) { options(warn = -1) if(all(Sys.info()[1] == " Windows", requireNamespace("parallelsugar", อย่างเงียบ ๆ = TRUE) == TRUE)) lapp <- function(X, FUN) parallelsugar::mclapply(X, FUN, mc.cores = parallel) else if(Sys.info() [1] == "Windows"){ cat("ผู้ใช้ Windows ต้องติดตั้งแพ็คเกจ 'parallelsugar' สำหรับการคำนวณแบบขนาน (คุณไม่ได้ทำตอนนี้!)") lapp <- pbapply::pblapply} อื่น lapp <- function (X, FUN) parallel::mclapply(X, FUN, mc.cores = parallel)} else lapp <- pbapply::pblapply options(warn = 0) if(parallel == 1) cat("การวัดพารามิเตอร์อะคูสติก:") x <- as.data.frame(lapp(1:length(start), function(i) { r <- tuneR::readWave(file.path(getwd(), sound.files), from = start ถึง = end หน่วย = "seconds") b เพดาน([email protected]/2000) - 1) b[2] <- ceiling([email protected]/2000) - 1 #frequency สเปกตรัมการวิเคราะห์เพลงสเปค <- seewave::spec(r, f = [email protected], plot = FALSE) การวิเคราะห์ <- seewave::specprop(songspec, f = [email protected], flim = c(0, 280/1000), plot = FALSE) #save พารามิเตอร์ meanfreq <- analysis$mean/1000 sd <- ค่ามัธยฐานของการวิเคราะห์$sd/1000 <- ค่ามัธยฐานของการวิเคราะห์$ค่ามัธยฐาน/1000 Q25 < - การวิเคราะห์$QQ75 <- การวิเคราะห์$QIQR <- การวิเคราะห์$IQR/1000 ความเบ้ <- การวิเคราะห์$ความเบ้ kurt <- การวิเคราะห์$kurtosis sp.ent <- การวิเคราะห์$sh sfm <- การวิเคราะห์$sfm โหมด <- การวิเคราะห์$โหมด/1000 centroid <- การวิเคราะห์$cent/1000 #ความถี่ที่มีความกว้างสูงสุด peakf <- 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<-mean(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, threshold = threshold, bandpass = b * 1000, fftw = TRUE)[, 2] meandom <- หมายถึง (y, na.rm = TRUE) ความคิด <- min(y, na.rm = TRUE) maxdom <- max (y, na.rm = TRUE) dfrange <- (maxdom - mindom) ระยะเวลา <- (end - start) #modulation index การคำนวณเปลี่ยนแปลง <- vector() for(j in which(!is. na(y))){ เปลี่ยน <- abs(y[j] - y[j + 1]) เปลี่ยนแปลง <- ผนวก (เปลี่ยนแปลง เปลี่ยนแปลง) } if(mindom==maxdom) modindx<-0 else modindx <- หมายถึง (การเปลี่ยนแปลง na.rm = T)/dfrange #save ผลลัพธ์กลับมา (c(duration, meanfreq, sd, median, Q25, Q75, IQR, skew, kurt, sp.ent, sfm, mode, centroid, peakf, meanfun, minfun, maxfun, meandom, mindom, maxdom, dfrange, modindx)) })) #เปลี่ยนชื่อผลลัพธ์ rownames(x) <- c("duration", "meanfreq", "sd", "median", "Q25", "Q75", "IQR", "skew", "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 <- ฟังก์ชั่น (ชื่อโฟลเดอร์) { # เริ่มต้นด้วย data.frame ที่ว่างเปล่า data <- data.frame() # รับรายการไฟล์ในโฟลเดอร์ list <- 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 (ชื่อโฟลเดอร์) # ประมวลผลไฟล์ อะคูสติก <- specan3(data, parallel=1) # ย้ายกลับไปที่โฟลเดอร์หลัก setwd('..') อะคูสติก }
เพศ <- ฟังก์ชั่น (filePath) { if (!exists ('genderBoosted')) { load ('model.bin') } # ตั้งค่าเส้นทาง currentPath <- getwd() fileName <- basename(filePath) path <- dirname(filePath) # ตั้งค่าไดเร็กทอรีเพื่ออ่านไฟล์ setwd (เส้นทาง) # เริ่มต้นด้วย data.frame ที่ว่างเปล่า data <- data.frame(fileName, 0, 0, 20) # ตั้งชื่อคอลัมน์ ชื่อ (ข้อมูล) <- c('sound.files', 'selec', 'start', 'end') # ประมวลผลไฟล์ อะคูสติก <- specan3(data, parallel=1) # Restore path. setwd(currentPath) ทำนาย (genderCombo, newdata=acoustics) }
# โหลดข้อมูล
การรั่วไหล <- processFolder('caminho para o pasta com Example de áudio com vazamento') without_leakage <- processFolder('caminho para o pasta com Example de áudio sem vazamento')
#ตั้งป้าย.
leakage$label <- 1 without_leakage$label <- 2 data <- rbind(leakage, without_leakage) data$label <- factor(data$label, labels=c('leakage', 'without_leakage'))
# ลบคอลัมน์ที่ไม่ได้ใช้
data$duration <- NULL data$sound.files <- NULL data$selec <- NULL data$peakf <- null
# ลบแถวที่มี NA
ข้อมูล <- data[complete.cases(data),]
# เขียนชุดข้อมูล csv
write.csv(data, file='features.csv', sep=', ', row.names=F)
ขั้นตอนที่ 11: ทำซ้ำประสาท
A ideia do uso de uma rede neural, é a de realizar um reconhecimento automatizado através dos dados coletados pelo dispositivo de sensoriamento.
A rede neural utilizada é do tipo MLP (Multilayer Perceptron), este modelo é treinado com dados previamente identificados e após esse treinamento o modelo implantado no sistema conseguirá realizar a identificação ข้อมูลอัตโนมัติที่มีอยู่, ที่มีอยู่จริง
จำเป็นจริง ๆ uma filtragem dos dados de entrada, pois algumas características estavam diminuindo a taga 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 é utilizado para treinar o modelo da rede e retornar แท็กซ่าเดอ acerto do mesmo ไม่มีระบบการทำงาน um algoritmo um pouco diferente seria usado, pois ele realizaria o treino ou receberia um modelo já treinado da nuvem ou de alguma outra fonte e com esse modelo realizaria as prediçites para cada.
# การเข้ารหัส: utf-8
นำเข้าแพนด้าเป็น pd
นำเข้า numpy เป็น np จาก sklearn.model_selection นำเข้า train_test_split เป็น tts จาก sklearn.neural_network นำเข้า MLPClassifier เป็น MLP จาก sklearn.metrics นำเข้าการจำแนกประเภท_report เป็น cr จาก sklearn.metrics นำเข้าความสับสน_matrix เป็น cm
# Leitura dos dados ทำ CSV
df = pd.read_csv('features.csv') # Separação das entradas df_X = df[df.columns[:len(df.columns)-1] # Filtrando เป็น 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(อัลฟา=0.0001, learning_rate_init=0.0001, hidden_layer_sizes=(50, 50, 50, 50), max_iter=10000, การเปิดใช้งาน='tanh', ตัวแก้ปัญหา='lbfgs')
#รุ่น Treinando
modelo.fit(X_train, Y_train) ผลลัพธ์ = modelo.predict(X_test)
# Imprimindo resultados
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") พิมพ์ (รายงาน)
แนะนำ:
Projeto IoT - Sistema Detector De Fumaça: 5 ขั้นตอน
Projeto IoT - Sistema Detector De Fumaça: IntroduçãoO Sistema Detector de Fumaça ประกอบไปด้วย uma solução IoT com o objetivo de permitir o monitoramento de alarmes de incêndio de residências através de um aplicativo Android O projeto é baseado em um microcontrolador que se comunica com a นู
SISTEMA DE IRIGAÇÃO AUTOMÁTICA CONTROLADA POR SMARTPHONE: 8 ขั้นตอน
SISTEMA DE IRRIGAÇÃO AUTOMÁTICA CONTROLADA POR SMARTPHONE: PONTIFÍCIA UNIVERSIDADE CATÓLICA DE MINAS GERAISCurso: Especialização em Arquitetura de Software Distribuído Data: 26/10/2017 Universeda อินเทอร์เน็ต ศาสตราจารย์: อิโล ริเวโร
Sistema De Irrigação Automático Para Plantas: 8 ขั้นตอน
ระบบอัตโนมัติ Para Plantas: A irrigação é uma das tecnologias mais utilizadas por agricultores pois esta atividade independe da ocorrência de chuvas, garante uma safra uniformezan และ reduz a falámhaom
Vision 4all - Sistema Visão Assistida Para Deficientes Visuais Usando OpenCV, Dragonboard 410c E Aplicativo Android: 6 ขั้นตอน
Vision 4all - Sistema Visão Assistida Para Deficientes Visuais Usando OpenCV, Dragonboard 410c E Aplicativo Android: DESCRIÇÃOO ใช้งานง่าย é ดาร์ autonomia para deficientes visuais se locomoverem em Ambientes ในร่ม como casas ou ศูนย์การค้า e aeroportos.A locomoço สภาพแวดล้อม j´ mapeados pode ou n&o s
Pasos Para Instalar El Sistema Operativo Linux: 12 ขั้นตอน
Pasos Para Instalar El Sistema Operativo Linux: สภาพแวดล้อมที่ใช้งานได้จริง ลินุกซ์ที่ใช้งานได้