{"cells":[{"metadata":{},"cell_type":"markdown","source":"Esse notebook foi feito para gerar mel-espectrogramas usando a biblioteca NVIDIA’s Data Loading Library.\n\nO código abaixo instala a biblioteca:"},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install --extra-index-url https://developer.download.nvidia.com/compute/redist nvidia-dali-cuda100","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Importando bibliotecas\nimport os\nimport librosa as librosa\nimport numpy as np\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport librosa.display\nimport pandas as pd\nimport cv2\nimport timeit\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\nfrom nvidia.dali.pipeline import Pipeline\nimport nvidia.dali.ops as ops\nimport nvidia.dali.types as types\nimport nvidia.dali as dali","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"A função abaixo recebe um mel-espectrograma e retorna uma array que representa uma imagem. Será usado mais abaixo."},{"metadata":{"trusted":true},"cell_type":"code","source":"def mono_to_color(X: np.ndarray,\n                  mean=None,\n                  std=None,\n                  norm_max=None,\n                  norm_min=None,\n                  eps=1e-6):\n    \"\"\"\n    Code from https://www.kaggle.com/daisukelab/creating-fat2019-preprocessed-data\n    \"\"\"\n    # Stack X as [X,X,X]\n    #X = np.stack([X, X, X], axis=-1)\n\n    # Standardize\n    mean = mean or X.mean()\n    X = X - mean\n    std = std or X.std()\n    Xstd = X / (std + eps)\n    _min, _max = Xstd.min(), Xstd.max()\n    norm_max = norm_max or _max\n    norm_min = norm_min or _min\n    if (_max - _min) > eps:\n        # Normalize to [0, 255]\n        V = Xstd\n        V[V < norm_min] = norm_min\n        V[V > norm_max] = norm_max\n        V = 255 * (V - norm_min) / (norm_max - norm_min)\n        V = V.astype(np.uint8)\n    else:\n        # Just zero\n        V = np.zeros_like(Xstd, dtype=np.uint8)\n    return V","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"O código em baixo é uma maneira mais rápida de carregar os audios com o librosa"},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_clip_sr(path,offset=0,duration=None):\n    clip, sr_native = librosa.core.audio.__audioread_load(path, offset=offset, duration=duration, dtype=np.float32)\n    clip = librosa.to_mono(clip)\n    sr = 22050\n    if sr_native > 0:\n        clip = librosa.resample(clip, sr_native, sr, res_type='kaiser_fast')\n    return clip, sr","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Aqui é definido o pipeline para a geração de espectrogramas:"},{"metadata":{"trusted":true},"cell_type":"code","source":"class MelSpectrogramPipeline(Pipeline):\n    def __init__(self,full_path, device, batch_size, nfft, window_length, window_step, num_threads=1, device_id=0):\n        super(MelSpectrogramPipeline, self).__init__(batch_size, num_threads, device_id)\n        self.device = device\n\n        self.batch_data = []\n        y,sr =  get_clip_sr(full_path,0,5);\n        for _ in range(batch_size):\n            self.batch_data.append(np.array(y, dtype=np.float32))\n\n        self.external_source = ops.ExternalSource()\n        self.spectrogram = ops.Spectrogram(device=self.device,\n                                           nfft=nfft,\n                                           window_length=window_length,\n                                           window_step=window_step)\n\n        self.mel_fbank = ops.MelFilterBank(device=self.device,\n                                           sample_rate=sr,\n                                           nfilter = 310,\n                                           freq_high = 10300,)\n\n        self.dB = ops.ToDecibels(device=self.device,\n                                 multiplier = 10.0,\n                                 cutoff_db = -80)\n\n    def define_graph(self):\n        self.data = self.external_source()\n        out = self.data.gpu() if self.device == 'gpu' else self.data\n        out = self.spectrogram(out)\n        out = self.mel_fbank(out)\n        out = self.dB(out)\n        return out\n\n    def iter_setup(self):\n        self.feed_input(self.data, self.batch_data)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Abaixo estou iterando por todos as linhas presentes no arquivo train.csv e extraindo os mel-espectrogramas e gerando imagens para os 5s iniciais de cada audios pertencente a primeira espécie."},{"metadata":{"trusted":true},"cell_type":"code","source":"PATH_TRAIN = \"../input/segmentation-on-cornell-dataset-exemple\"\nspecies = os.listdir(PATH_TRAIN)\nspecies.sort()\nspecies = species[3:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Declarando variavel para contar o tempo\nstart = timeit.default_timer()\n\nfor sp in species:\n    print(sp)\n    if(os.path.isdir(sp)):\n        continue\n    \n    if(not(os.path.isdir(PATH_TRAIN + '/' + sp))):\n       continue\n    \n    os.mkdir(sp)\n    \n    for chunk in os.listdir(PATH_TRAIN + '/' + sp):    \n        #Montando o caminho do audio    \n        full_path = PATH_TRAIN + '/' + sp +'/' + chunk\n    \n        pipe = MelSpectrogramPipeline(full_path,device='cpu', batch_size=1, nfft=1536, window_length=1536, window_step=360)\n        pipe.build()\n        outputs = pipe.run()\n        S_dB = outputs[0].at(0)\n    \n        #Ajustando imagem\n        im = mono_to_color(S_dB);\n        im = cv2.resize(im, (224,224))\n        im = cv2.flip(im, 0)\n    \n        #Escrevendo imagem\n        cv2.imwrite('{}/{}.png'.format(sp,str(chunk[:-4])),im)\n\n#contador final do tempo    \nstop = timeit.default_timer()\n\nprint('Time: ', stop - start) ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Exemplo de visualização das imagens geradas."},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.image as mpimg\nimg = mpimg.imread('./yetvir/38365.png')\nimgplot = plt.imshow(img)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}