PyWavelets / pywt

PyWavelets - Wavelet Transforms in Python
http://pywavelets.readthedocs.org
MIT License
1.97k stars 460 forks source link

Error when i tried to generte dataset using cwt #639

Closed normal7070 closed 1 year ago

normal7070 commented 2 years ago

from math import ceil import random from scipy.io import loadmat from scipy import signal import numpy as np import os from PIL import Image from matplotlib.pyplot import get_cmap, imshow import shutil import pandas as pd

cutoff = 1 fs = 128

random.seed(0) data = loadmat("EMGData.mat") data = data["EMGData"] emg = data["Data"][0][0] labels = data["Labels"][0][0] labels = [labels[i][0][0] for i in range(labels.size)] sig_HC1, lab_HC1 = emg[0:240] , labels[0:240] sig_TT1, lab_TT1 = emg[240:480] , labels[240:480] sig_II1, lab_ll1 = emg[480:720] , labels[480:720] sig_MM1, lab_MM1 = emg[720:960] , labels[720:960] sig_TL1, lab_TL1 = emg[960:1200] , labels[960:1200] sig_RR1, lab_RR1 = emg[1200:1440] , labels[1200:1440] sig_TM1, lab_TM1 = emg[1440:1680] , labels[1440:1680] sig_TR1, lab_TR1 = emg[1680:1920] , labels[1680:1920] sig_TI1, lab_TI1 = emg[1920:2160] , labels[1920:2160] sig_LL1, lab_LL1 = emg[2160:2400] , labels[2160:2400] sig_HC2, lab_HC2 = emg[2400:2640] , labels[2400:2640] sig_TT2, lab_TT2 = emg[2640:2880] , labels[2640:2879] sig_II2, lab_II2 = emg[2880:3120] , labels[2880:3119] sig_MM2, lab_MM2 = emg[3120:3360] , labels[3120:3359] sig_TL2, lab_TL2 = emg[3360:3600] , labels[3360:3599] sig_RR2, lab_RR2 = emg[3600:3840] , labels[3600:3839] sig_TM2, lab_TM2 = emg[3840:4080] , labels[3840:4079] sig_TR2, lab_TR2 = emg[4080:4320] , labels[4080:4319] sig_TI2, lab_TI2 = emg[4320:4560] , labels[4320:4559] sig_LL2, lab_LL2 = emg[4560:4800] , labels[4560:4799] sig_HC3, lab_HC3 = emg[4800:5040] , labels[4800:5039] sig_TT3, lab_TT3 = emg[5040:5280] , labels[5040:5279] sig_II3, lab_ll3 = emg[5280:5520] , labels[5280:5519] sig_MM3, lab_MM3 = emg[5520:5760] , labels[5520:5759] sig_TL3, lab_TL3 = emg[5760:6000] , labels[5760:5999] sig_RR3, lab_RR3 = emg[6000:6240] , labels[6000:6239] sig_TM3, lab_TM3 = emg[6240:6480] , labels[6240:6479] sig_TR3, lab_TR3 = emg[6480:6720] , labels[6480:6719] sig_TI3, lab_TI3 = emg[6720:6960] , labels[6720:6959] sig_LL3, lab_LL3 = emg[6960:7200] , labels[6960:7199] sig_HC4, lab_HC4 = emg[7200:7440] , labels[7200:7439] sig_TT4, lab_TT4 = emg[7440:7680] , labels[7440:7679] sig_II4, lab_ll4 = emg[7680:7920] , labels[7680:7919] sig_MM4, lab_MM4 = emg[7920:8160] , labels[7920:8159] sig_TL4, lab_TL4 = emg[8160:8400] , labels[8160:8399] sig_RR4, lab_RR4 = emg[8400:8640] , labels[8400:8639] sig_TM4, lab_TM4 = emg[8640:8880] , labels[8640:8879] sig_TR4, lab_TR4 = emg[8880:9120] , labels[8880:9119] sig_TI4, lab_TI4 = emg[9120:9360] , labels[9120:9359] sig_LL4, lab_LL4 = emg[9360:9600] , labels[9360:9599] sig_HC5, lab_HC5 = emg[9600:9840] , labels[9600:9839] sig_TT5, lab_TT5 = emg[9840:10080] , labels[9840:10079] sig_II5, lab_ll5 = emg[10080:10320] , labels[10080:10319] sig_MM5, lab_MM5 = emg[10320:10560] , labels[10320:10559] sig_TL5, lab_TL5 = emg[10560:10800] , labels[10560:10799] sig_RR5, lab_RR5 = emg[10800:11040] , labels[10800:11039] sig_TM5, lab_TM5 = emg[11040:11280] , labels[11040:11279] sig_TR5, lab_TR5 = emg[11280:11520] , labels[11280:11519] sig_TI5, lab_TI5 = emg[11520:11760] , labels[11520:11759] sig_LL5, lab_LL5 = emg[11760:12000] , labels[11760:11999] sig_HC6, lab_HC6 = emg[12000:12240] , labels[12000:12239] sig_TT6, lab_TT6 = emg[12240:12480] , labels[12240:12479] sig_II6, lab_ll6 = emg[12480:12720] , labels[12480:12719] sig_MM6, lab_MM6 = emg[12720:12960] , labels[12720:12959] sig_TL6, lab_TL6 = emg[12960:13200] , labels[12960:13199] sig_RR6, lab_RR6 = emg[13200:13440] , labels[13200:13439] sig_TM6, lab_TM6 = emg[13440:13680] , labels[13440:13679] sig_TR6, lab_TR6 = emg[13680:13920] , labels[13680:13919] sig_TI6, lab_TI6 = emg[13920:14160] , labels[13920:14159] sig_LL6, lab_LL6 = emg[14160:14400] , labels[14160:14399] sig_HC7, lab_HC7 = emg[14400:14640] , labels[14400:14639] sig_TT7, lab_TT7 = emg[14640:14880] , labels[14640:14879] sig_II7, lab_ll7 = emg[14880:15120] , labels[14880:15119] sig_MM7, lab_MM7 = emg[15120:15360] , labels[15120:15359] sig_TL7, lab_TL7 = emg[15360:15600] , labels[15369:15599] sig_RR7, lab_RR7 = emg[15600:15840] , labels[15600:15839] sig_TM7, lab_TM7 = emg[15840:16080] , labels[15840:16079] sig_TR7, lab_TR7 = emg[16080:16320] , labels[16080:16319] sig_TI7, lab_TI7 = emg[16320:16560] , labels[16320:16559] sig_LL7, lab_LL7 = emg[16560:16800] , labels[16560:16799] sig_HC8, lab_HC8 = emg[16800:17040] , labels[16800:17039] sig_TT8, lab_TT8 = emg[17040:17280] , labels[17040:17279] sig_II8, lab_ll8 = emg[17280:17520] , labels[17280:17519] sig_MM8, lab_MM8 = emg[17520:17760] , labels[17520:17759] sig_TL8, lab_TL8 = emg[17760:18000] , labels[17760:18000] sig_RR8, lab_RR8 = emg[18000:18240] , labels[18000:18240] sig_TM8, lab_TM8 = emg[18240:18480] , labels[18240:18480] sig_TR8, lab_TR8 = emg[18480:18720] , labels[18480:18720] sig_TI8, lab_TI8 = emg[18720:18960] , labels[18720:18960] sig_LL8, lab_LL8 = emg[18960:19200] , labels[18960:19200]

sig_HC1=pd.DataFrame(sig_HC1) sig_HC2=pd.DataFrame(sig_HC2) sig_HC3=pd.DataFrame(sig_HC3) sig_HC4=pd.DataFrame(sig_HC4) sig_HC5=pd.DataFrame(sig_HC5) sig_HC6=pd.DataFrame(sig_HC6) sig_HC7=pd.DataFrame(sig_HC7) sig_HC8=pd.DataFrame(sig_HC8)

sig_TT1=pd.DataFrame(sig_TT1) sig_TT2=pd.DataFrame(sig_TT2) sig_TT3=pd.DataFrame(sig_TT3) sig_TT4=pd.DataFrame(sig_TT4) sig_TT5=pd.DataFrame(sig_TT5) sig_TT6=pd.DataFrame(sig_TT6) sig_TT7=pd.DataFrame(sig_TT7) sig_TT8=pd.DataFrame(sig_TT8)

sig_II1=pd.DataFrame(sig_II1) sig_II2=pd.DataFrame(sig_II2) sig_II3=pd.DataFrame(sig_II3) sig_II4=pd.DataFrame(sig_II4) sig_II5=pd.DataFrame(sig_II5) sig_II6=pd.DataFrame(sig_II6) sig_II7=pd.DataFrame(sig_II7) sig_II8=pd.DataFrame(sig_II8)

sig_MM1=pd.DataFrame(sig_MM1) sig_MM2=pd.DataFrame(sig_MM2) sig_MM3=pd.DataFrame(sig_MM3) sig_MM4=pd.DataFrame(sig_MM4) sig_MM5=pd.DataFrame(sig_MM5) sig_MM6=pd.DataFrame(sig_MM6) sig_MM7=pd.DataFrame(sig_MM7) sig_MM8=pd.DataFrame(sig_MM8)

sig_TL1=pd.DataFrame(sig_TL1) sig_TL2=pd.DataFrame(sig_TL2) sig_TL3=pd.DataFrame(sig_TL3) sig_TL4=pd.DataFrame(sig_TL4) sig_TL5=pd.DataFrame(sig_TL5) sig_TL6=pd.DataFrame(sig_TL6) sig_TL7=pd.DataFrame(sig_TL7) sig_TL8=pd.DataFrame(sig_TL8)

sig_RR1=pd.DataFrame(sig_RR1) sig_RR2=pd.DataFrame(sig_RR2) sig_RR3=pd.DataFrame(sig_RR3) sig_RR4=pd.DataFrame(sig_RR4) sig_RR5=pd.DataFrame(sig_RR5) sig_RR6=pd.DataFrame(sig_RR6) sig_RR7=pd.DataFrame(sig_RR7) sig_RR8=pd.DataFrame(sig_RR8)

sig_TM1=pd.DataFrame(sig_TM1) sig_TM2=pd.DataFrame(sig_TM2) sig_TM3=pd.DataFrame(sig_TM3) sig_TM4=pd.DataFrame(sig_TM4) sig_TM5=pd.DataFrame(sig_TM5) sig_TM6=pd.DataFrame(sig_TM6) sig_TM7=pd.DataFrame(sig_TM7) sig_TM8=pd.DataFrame(sig_TM8)

sig_TR1=pd.DataFrame(sig_TR1) sig_TR2=pd.DataFrame(sig_TR2) sig_TR3=pd.DataFrame(sig_TR3) sig_TR4=pd.DataFrame(sig_TR4) sig_TR5=pd.DataFrame(sig_TR5) sig_TR6=pd.DataFrame(sig_TR6) sig_TR7=pd.DataFrame(sig_TR7) sig_TR8=pd.DataFrame(sig_TR8)

sig_TI1=pd.DataFrame(sig_TI1) sig_TI2=pd.DataFrame(sig_TI2) sig_TI3=pd.DataFrame(sig_TI3) sig_TI4=pd.DataFrame(sig_TI4) sig_TI5=pd.DataFrame(sig_TI5) sig_TI6=pd.DataFrame(sig_TI6) sig_TI7=pd.DataFrame(sig_TI7) sig_TI8=pd.DataFrame(sig_TI8)

sig_LL1=pd.DataFrame(sig_TI1) sig_LL2=pd.DataFrame(sig_TI2) sig_LL3=pd.DataFrame(sig_TI3) sig_LL4=pd.DataFrame(sig_TI4) sig_LL5=pd.DataFrame(sig_TI5) sig_LL6=pd.DataFrame(sig_TI6) sig_LL7=pd.DataFrame(sig_TI7) sig_LL8=pd.DataFrame(sig_TI8)

df0=pd.concat([sig_HC1,sig_HC2,sig_HC3,sig_HC4,sig_HC5,sig_HC6,sig_HC7,sig_HC8], ignore_index = True) df1=pd.concat([sig_TT1,sig_TT2,sig_TT3,sig_TT4,sig_TT5,sig_TT6,sig_TT7,sig_TT8], ignore_index = True) df2=pd.concat([sig_II1,sig_II2,sig_II3,sig_II4,sig_II5,sig_II6,sig_II7,sig_II8], ignore_index = True) df3=pd.concat([sig_MM1,sig_MM2,sig_MM3,sig_MM4,sig_MM5,sig_MM6,sig_MM7,sig_MM8], ignore_index = True) df4=pd.concat([sig_TL1,sig_TL2,sig_TL3,sig_TL4,sig_TL5,sig_TL6,sig_TL7,sig_TL8], ignore_index = True) df5=pd.concat([sig_RR1,sig_RR2,sig_RR3,sig_RR4,sig_TL5,sig_RR6,sig_RR7,sig_RR8], ignore_index = True) df6=pd.concat([sig_TM1,sig_TM2,sig_TM3,sig_TM4,sig_TM5,sig_TM6,sig_TM7,sig_TM8], ignore_index = True) df7=pd.concat([sig_TR1,sig_TR2,sig_TR3,sig_TR4,sig_TR5,sig_TR6,sig_TR7,sig_TR8], ignore_index = True) df8=pd.concat([sig_TI1,sig_TR2,sig_TI3,sig_TI4,sig_TI5,sig_TI6,sig_TI7,sig_TI8], ignore_index = True) df9=pd.concat([sig_LL1,sig_LL2,sig_LL3,sig_LL4,sig_LL5,sig_LL6,sig_LL7,sig_LL8], ignore_index = True)

v0=df0.to_numpy() v1=df1.to_numpy() v2=df2.to_numpy() v3=df3.to_numpy() v4=df4.to_numpy() v5=df5.to_numpy() v6=df6.to_numpy() v7=df7.to_numpy() v8=df8.to_numpy() v9=df9.to_numpy() def create_save_wavelets(data:np.ndarray, name:str):

[os.makedirs(x, exist_ok=True) for x in ["Dataset/HC","Dataset/TT","Dataset/II","Dataset/MM","Dataset/TL","Dataset/RR","Dataset/TM","Dataset/TR","Dataset/TI","Dataset/LL"]]
path = "Dataset/" + name.upper()
if not os.path.isdir(path):

    assert NotADirectoryError(f"{path} is not a valid path")

# For all the signals of a particular type:
for i, sig in enumerate(data):

    #Subsample the signal to create a robust dataset [Signal length = 1280 i.e. Sampling frequency(128) * 10]
    start = [100, 200, 300,400, 500, 600, 700,800, 900,1000]
    stop = [x+50 for x in start]  

    cnt = 0
    #For a signal, create images
    for k,l in zip(start, stop):
        #For each sample create a unique directory
        imdir = os.path.join(path , name+"_"+str(i)+"_"+str(cnt)+".png")
        #Scipy cwt: [https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.cwt.html]
        cwt = signal.cwt(sig[k:l], signal.morlet2, widths=np.arange(1,101,100/1000), w=6)
        #Convert cwt to absolute values
        cwt = np.abs(cwt)
        #Get a colormap to generate color images
        cm = get_cmap('viridis')
        #Apply color map while converting the pixel values from [0~1] to [0~255]
        cwt = (cm(cwt)[:,:,:3]*255).astype(np.uint8)
        #Create Image from array
        result = Image.fromarray(cwt)
        # Resize the image to (224,224) i.e. resolution needed for Neural networks
        result = result.resize((224,224), resample = Image.BICUBIC)
        #Save the image
        result.save(imdir, format="png")
        cnt += 1

class Create_Database:

def __init__(self, src = "Dataset", dst = "images", split = [0.7, 0.2, 0.1]) -> None:
    self.signals = os.listdir(src)
    print(self.signals)
    self.src = src
    self.dst = dst
    self.seed = random.seed(random.random())
    self.splits = [split[0], split[1]/ (split[1]+ split[2]), None]

#Create train folder
def ds_train(self):
    print(self.signals)
    dst_path = os.path.join(self.dst, "train")
    [os.makedirs(os.path.join(dst_path, x), exist_ok=True) for x in self.signals]

    for sig in self.signals:
        path = os.path.join(self.src, sig)
        files = os.listdir(path)
        random.shuffle(files)
        print(len(files))
        train = files[:ceil(self.splits[0]*len(files))]
        print(len(train))

        for file in train:
            file = os.path.join(self.src, sig, file)
            shutil.move(file, os.path.join(dst_path, sig))
#Create Validation folder
def ds_valid(self):
    dst_path = os.path.join(self.dst, "val")
    [os.makedirs(os.path.join(dst_path, x), exist_ok=True) for x in self.signals]

    for sig in self.signals:
        path = os.path.join(self.src, sig)
        files = os.listdir(path)
        random.shuffle(files)
        print(len(files))
        val = files[:ceil(self.splits[1]*len(files))]
        print(len(val))

        for file in val:
            file = os.path.join(self.src, sig, file)
            shutil.move(file, os.path.join(dst_path, sig))
#Create test folder
def ds_test(self):
    dst_path = os.path.join(self.dst, "test")
    [os.makedirs(os.path.join(dst_path, x), exist_ok=True) for x in self.signals]

    for sig in self.signals:
        path = os.path.join(self.src, sig)
        files = os.listdir(path)

        for file in files:
            file = os.path.join(self.src, sig, file)
            shutil.move(file, os.path.join(dst_path, sig))
#Masking the individual functions into one function for the class
def create(self):
    self.ds_train()
    self.ds_valid()
    self.ds_test()

if name == "main": create_save_wavelets(v0, "HC")
create_save_wavelets(v1, "TT") create_save_wavelets(v2, "II") create_save_wavelets(v3, "MM")
create_save_wavelets(v4, "TL") create_save_wavelets(v5, "RR") create_save_wavelets(v6, "TM")
create_save_wavelets(v7, "TR") create_save_wavelets(v8, "TI") create_save_wavelets(v9, "TL")

Create_Database(src="Dataset", dst = "images", split = [0.7, 0.2, 0.1]).create()

here is the error i tired to used different datset which is ECG and its working fine but when i used the EMG its showing this error

ValueError Traceback (most recent call last) Input In [239], in <cell line: 63>() 61 self.ds_test() 63 if name == "main": ---> 64 create_save_wavelets(v0, "HC")
65 create_save_wavelets(v1, "TT") 66 create_save_wavelets(v2, "II")

Input In [237], in create_savewavelets(data, name) 28 imdir = os.path.join(path , name+""+str(i)+"_"+str(cnt)+".png") 29 #Scipy cwt: [https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.cwt.html] ---> 30 cwt = signal.cwt(sig[k:l], signal.morlet2, widths=np.arange(1,101,200/1000), w=3.5) 31 #Convert cwt to absolute values 32 cwt = np.abs(cwt)

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\signal_wavelets.py:480, in cwt(data, wavelet, widths, dtype, kwargs) 478 N = int(N) 479 wavelet_data = np.conj(wavelet(N, width, kwargs)[::-1]) --> 480 output[ind] = convolve(data, wavelet_data, mode='same') 481 return output

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\signal_signaltools.py:1409, in convolve(in1, in2, mode, method) 1406 elif method == 'direct': 1407 # fastpath to faster numpy.convolve for 1d inputs when possible 1408 if _np_conv_ok(volume, kernel, mode): -> 1409 return np.convolve(volume, kernel, mode) 1411 return correlate(volume, _reverse_and_conj(kernel), mode, 'direct') 1412 else:

File <__array_function__ internals>:180, in convolve(*args, **kwargs)

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\core\numeric.py:841, in convolve(a, v, mode) 839 a, v = v, a 840 if len(a) == 0: --> 841 raise ValueError('a cannot be empty') 842 if len(v) == 0: 843 raise ValueError('v cannot be empty')

ValueError: a cannot be empty

rgommers commented 1 year ago

I'm sorry, we can't help with debugging this sort of thing.