Example #1
0
def tensordot_adjoint_0(B, G, axes, A_ndim, B_ndim):
    # The adjoint of the operator
    # A |--> np.tensordot(A, B, axes)
    if B_ndim == 0:
        return G * B

    G_axes = ocp.arange(ocp.ndim(G))
    if type(axes) is int:
        axes = max(axes, 0)
        B_axes = ocp.arange(B_ndim)
        return ocp.tensordot(G, B, [G_axes[A_ndim - axes:], B_axes[axes:]])

    elif type(axes[0]) is int:
        axes = [axes[0] % A_ndim, axes[1] % B_ndim]
        B_axes = ocp.arange(B_ndim)
        return ocp.tensordot(
            G, B, [G_axes[A_ndim - 1:],
                   ocp.delete(B_axes, axes[1])])  # noqa: E501

    else:
        A_axes = ocp.arange(A_ndim)
        B_axes = ocp.arange(B_ndim)
        summed_axes = [
            ocp.asarray(axes[0]) % A_ndim,
            ocp.asarray(axes[1]) % B_ndim,
        ]  # noqa: E501
        other_axes = [
            ocp.delete(A_axes, summed_axes[0]),
            ocp.delete(B_axes, summed_axes[1]),  # noqa: E501
        ]
        out = ocp.tensordot(G, B, [G_axes[len(other_axes[0]):], other_axes[1]])
        perm = ocp.argsort(
            ocp.concatenate(
                (other_axes[0], summed_axes[0][ocp.argsort(summed_axes[1])])))
        return ocp.transpose(out, perm)
Example #2
0
def tensordot_adjoint_1(A, G, axes, A_ndim, B_ndim):
    # The adjoint of the operator
    # B |--> np.tensordot(A, B, axes)
    if A_ndim == 0:
        return G * A

    G_axes = ocp.arange(ocp.ndim(G))
    if type(axes) is int:
        axes = max(axes, 0)
        A_axes = ocp.arange(A_ndim)
        return ocp.tensordot(
            A, G,
            [A_axes[:A_ndim - axes], G_axes[:A_ndim - axes]])  # noqa: E501

    elif type(axes[0]) is int:
        axes = [axes[0] % A_ndim, axes[1] % B_ndim]
        A_axes = ocp.arange(A_ndim)
        return ocp.tensordot(
            A, G,
            [ocp.delete(A_axes, axes[0]), G_axes[:A_ndim - 1]])  # noqa: E501

    else:
        A_axes = ocp.arange(A_ndim)
        B_axes = ocp.arange(B_ndim)
        summed_axes = [
            ocp.asarray(axes[0]) % A_ndim,
            ocp.asarray(axes[1]) % B_ndim,
        ]  # noqa: E501
        other_axes = [
            ocp.delete(A_axes, summed_axes[0]),
            ocp.delete(B_axes, summed_axes[1]),  # noqa: E501
        ]
        out = ocp.tensordot(A, G, [other_axes[0], G_axes[:len(other_axes[0])]])
        perm = ocp.argsort(
            ocp.concatenate(
                (summed_axes[1][ocp.argsort(summed_axes[0])], other_axes[1])))
        return ocp.transpose(out, perm)
Example #3
0
    def filter(self,eventpackage, compelted, lastposition):
        #if self.davisT[-1] < (self.LEDT[-1] + self.slidestep/2):
        #    return
        #else:
        #EventStream = [eventX,eventY,eventT,eventPol,eventPixel,eventOccurrence]
        eventX = eventpackage[0]
        eventY = eventpackage[1]
        eventT = eventpackage[2]
        eventPol = eventpackage[3]
        eventPixel = eventpackage[4]
        noisePixel = eventpackage[6]
        #eventOccurrence = EventStream[:,6]
        if (compelted >= 10):
            self.evidTime = cp.ones(shape=(self.xPixelResol,self.yPixelResol))*self.initEvid
        for pixel in eventPixel:
            if (compelted >= 10)and(cp.linalg.norm(pixel-lastposition) >= 25)and(self.lostflag == 0):
                self.evidTime[pixel[0], pixel[1]] = 0
                continue
                #pass
            pixelPol = eventPol[(eventX == pixel[0])&(eventY == pixel[1])]
            pixelT = eventT[(eventX == pixel[0])&(eventY == pixel[1])]
            pixelState = cp.append(self.state[pixel[0], pixel[1]], pixelPol[0:-1])
            self.state[pixel[0], pixel[1]] = pixelPol[-1]

            transition = pixelPol[1:] - pixelPol[0:-1]
            trans01time = pixelT[cp.append(cp.array([False]),transition==1)]
            trans10time = pixelT[cp.append(cp.array([False]),transition==-1)]
            hyperInterval = cp.append(trans01time[1:]-trans01time[0:-1],trans10time[1:]-trans10time[0:-1])

            if len(hyperInterval)==0:
                continue
            '''
            if len(pixelTransTime) == 1:
                pixelLastTime = cp.array([self.lastTransTime[pixel[0], pixel[1], pixelPol[transition][0]]])
                self.lastTransTime[pixel[0], pixel[1], pixelPol[transition][0]] = pixelTransTime[0]
            elif len(pixelTransTime) > 1:
                pixelLastTime = cp.append([self.lastTransTime[pixel[0], pixel[1], pixelPol[transition][0]], self.lastTransTime[pixel[0], pixel[1], pixelPol[transition][1]]], pixelTransTime[0:-2])
                self.lastTransTime[pixel[0], pixel[1], [pixelPol[transition][-2], pixelPol[transition][-1]]] = pixelTransTime[[-2, -1]]
                hyperInterval = pixelTransTime - pixelLastTime
            '''
            tmpInterval = self.covarLEDInterval - abs(hyperInterval - self.meanInterval)
            #indLED = tmpInterval > 0 #Intervals which locate between mean-covar and mean+covar are valid
            hyperInterval = cp.delete(hyperInterval,cp.where(tmpInterval <= 0))
            self.evidTime[pixel[0], pixel[1]] = self.evidTime[pixel[0], pixel[1]] + cp.sum(100/(cp.sqrt(2*cp.pi)*self.covarLEDInterval)*cp.exp((hyperInterval - self.meanInterval)**2/(-2*self.covarLEDInterval**2)))
            #self.evidTime[pixel[0], pixel[1]] = self.evidTime[pixel[0], pixel[1]] + cp.sum(indLED*((self.meanLEDPeakRatio*tmpInterval)/self.covarLEDInterval))#sustitute triangle for normal distribution

        tmpEvid = self.evidTime
        tmpEvid[noisePixel[:,0],noisePixel[:,1]] = self.initEvid
        self.evidTime = tmpEvid
        self.weightParticleTime = self.evidTime[self.setParticleCoord[:,0].astype(cp.int64),self.setParticleCoord[:,1].astype(cp.int64)]   
        sumWeightParticleTime = cp.sum(self.weightParticle, 0)
        #print(sumWeightParticleTime)
        
        indResample = 0.5 > sumWeightParticleTime
        if indResample:
            tmpIndValidPixel = cp.array(cp.where(self.evidTime>self.initEvid))
            tmpRaw = tmpIndValidPixel[0,:]
            tmpCol = tmpIndValidPixel[1,:]
            tmpIndLowWeight = cp.argsort(self.weightParticleTime)
            tmpIndLowWeight = cp.delete(tmpIndLowWeight,cp.arange(len(tmpRaw),len(tmpIndLowWeight)))
            self.setParticleCoord[tmpIndLowWeight,0] = tmpRaw
            self.setParticleCoord[tmpIndLowWeight,1] = tmpCol
            self.weightParticleTime[tmpIndLowWeight] = self.evidTime[tmpIndValidPixel[0],tmpIndValidPixel[1]]
            self.weightParticleLast = self.initWeight
        
        self.weightParticleTime = self.weightParticleTime/cp.sum(self.weightParticleTime)
       
        
        self.weightParticle = self.weightParticleLast * (self.weightParticleTime)
        self.weightParticle = self.weightParticle / cp.sum(self.weightParticle, 0)
        
        if 1/cp.sum(self.weightParticle**2) < self.resampleRatio*self.numParticles:
            index = cp.arange(2000)
            tmpIndParticle = cp.random.choice(a=index, size=self.numParticles, replace=True, p=self.weightParticle)
            self.weightParticle = self.initWeight
            self.setParticleCoord = self.setParticleCoord[tmpIndParticle.astype(cp.int64)]
        
        self.LEDPosition[0] = cp.sum(self.weightParticle*self.setParticleCoord[:,0])
        self.LEDPosition[1] = cp.sum(self.weightParticle*self.setParticleCoord[:,1])
        self.setParticleCoord = self.setParticleCoord + cp.random.normal(0,3, (self.numParticles,2))
        tmpSetParticleCoord = cp.round(self.setParticleCoord[:,0])
        tmpSetParticleCoord[tmpSetParticleCoord > (self.xPixelResol - 1)] = self.xPixelResol - 1
        self.setParticleCoord[:, 0] = tmpSetParticleCoord
        tmpSetParticleCoord = cp.round(self.setParticleCoord[:, 1])
        tmpSetParticleCoord[tmpSetParticleCoord > (self.yPixelResol - 1)] = self.yPixelResol - 1
        self.setParticleCoord[:, 1] = tmpSetParticleCoord
        self.setParticle = self.setParticleCoord[:, 0] * self.yPixelResol + self.setParticleCoord[:, 1]
        self.weightParticleLast = self.weightParticle
        self.lost[1:] = self.lost[:-1]
        self.lost[0] = cp.linalg.norm(self.LEDPosition-lastposition) <= 2
        if ((cp.sum(self.lost))>2):
            #self.lostflag = 1
            pass
Example #4
0
def cross_over(good_data, gene_list, require_goods, non_require_values, cross_rate):
    get_chrom_length = len(require_goods)+non_require_values #取得染色體長度
    get_cross_index = [] #宣告一個放所有染色體index的陣列
    for j in range(len(gene_list)):
            get_cross_index.append(j) #把所有染色體的index放入
    
    for i in range(int(len(gene_list)/2)):
        get_index = random.sample(get_cross_index, 2) #抽取要被交配的基因
        rnd_cross_rate = round(random.random(), 3) #產生亂數
        if rnd_cross_rate<=cross_rate:
            divide_index = sorted(random.sample(range(0, get_chrom_length), 2)) #隨機選擇切割地方(採雙點交配)
            tempChrom_A = copy.deepcopy(gene_list[get_index[0]]) #先將染色體給暫時變數A
            tempChrom_B = copy.deepcopy(gene_list[get_index[1]]) #先將染色體給暫時變數B
            tempChrom_A['chromosome'][divide_index[0]:divide_index[1]] = copy.deepcopy(gene_list[get_index[1]]['chromosome'][divide_index[0]:divide_index[1]]) #開始進行交配, 將第二個基因切割的染色體給第一個基因
            tempChrom_B['chromosome'][divide_index[0]:divide_index[1]] = copy.deepcopy(gene_list[get_index[0]]['chromosome'][divide_index[0]:divide_index[1]]) #開始進行交配, 將第二個基因切割的染色體給第一個基因
            tempChrom_A['data.frame'][divide_index[0]:divide_index[1],:] = copy.deepcopy(gene_list[get_index[1]]['data.frame'][divide_index[0]:divide_index[1],:]) #開始進行交配, 將第二個基因切割的商品給第一個基因
            tempChrom_B['data.frame'][divide_index[0]:divide_index[1],:] = copy.deepcopy(gene_list[get_index[0]]['data.frame'][divide_index[0]:divide_index[1],:]) #開始進行交配, 將第二個基因切割的商品給第一個基因
            tempChrom_A['totalWeight'] = cp.sum(tempChrom_A['data.frame'][:,10]) #重新計算總重量
            tempChrom_B['totalWeight'] = cp.sum(tempChrom_B['data.frame'][:,10]) #重新計算總重量
        
            tempChrom_A_length = len(tempChrom_A['data.frame']) #取得原始長度
            tempChrom_A_category = np.unique(tempChrom_A['data.frame'][:,8]) #取得所有不重複的種類
            
            for k in range(len(tempChrom_A_category)):
                duplicate_index = np.where(tempChrom_A['data.frame'][:,8] == tempChrom_A_category[k])[0] #取得每個相對應種類的index
                if len(duplicate_index) >= 2:
                    tempChrom_A['data.frame'] = cp.delete(tempChrom_A['data.frame'], duplicate_index[1:], axis = 0) #除了第一個商品不做刪除, 其餘皆刪除
            
            while len(tempChrom_A['data.frame']) < tempChrom_A_length:
                tempChrom_A_category = tempChrom_A['data.frame'][:,8] #抓出tempChrom_A中data frame的所有種類
                temp_df = copy.deepcopy(good_data) #將原始資料複製一份
                for j in range(len(tempChrom_A_category)):
                    temp_df = temp_df[temp_df[:,8]!=tempChrom_A_category[j]] #挑出tempChrom_A中沒有的種類品項
                    random_df_row = random.randint(0,(len(temp_df)-1)) #隨機取得沒有重複種類的品項
                    random_df_row = temp_df[random_df_row]
                tempChrom_A['data.frame'] = cp.vstack((tempChrom_A['data.frame'], random_df_row)) #將隨機取出的資料放入染色體中
                tempChrom_A['data.frame'].sort(axis=0) #將資料按照產品代號排序
                tempChrom_A['chromosome'] = tempChrom_A['data.frame'][:,0] #重新將染色體編碼
                
            
            tempChrom_B_length = len(tempChrom_B['data.frame']) #取得原始長度
            tempChrom_B_category = np.unique(tempChrom_B['data.frame'][:,8]) #取得所有不重複的種類
            
            for k in range(len(tempChrom_B_category)):
                duplicate_index = np.where(tempChrom_B['data.frame'][:,8] == tempChrom_B_category[k])[0] #取得每個相對應種類的index
                if len(duplicate_index) >= 2:
                    tempChrom_B['data.frame'] = cp.delete(tempChrom_B['data.frame'], duplicate_index[1:], axis = 0) #除了第一個商品不做刪除, 其餘皆刪除
            
            while len(tempChrom_B['data.frame']) < tempChrom_B_length:
                tempChrom_B_category = tempChrom_B['data.frame'][:,8] #抓出tempChrom_A中data frame的所有種類
                temp_df = copy.deepcopy(good_data) #將原始資料複製一份
                for j in range(len(tempChrom_B_category)):
                    temp_df = temp_df[temp_df[:,8]!=tempChrom_B_category[j]] #挑出tempChrom_A中沒有的種類品項
                    random_df_row = random.randint(0,(len(temp_df)-1)) #隨機取得沒有重複種類的品項
                    random_df_row = temp_df[random_df_row]
                tempChrom_B['data.frame'] = cp.vstack((tempChrom_B['data.frame'], random_df_row)) #將隨機取出的資料放入染色體中
                tempChrom_B['data.frame'].sort(axis=0) #將資料按照產品代號排序
                tempChrom_B['chromosome'] = tempChrom_B['data.frame'][:,0] #重新將染色體編碼
                               
            gene_list[get_index[0]] = copy.copy(tempChrom_A) #將處理完畢的所有資料放回去
            gene_list[get_index[1]] = copy.copy(tempChrom_B) #將處理完畢的所有資料放回去
            get_cross_index.remove(get_index[0]) #刪除已交配完的染色體
            get_cross_index.remove(get_index[1]) #刪除已交配完的染色體
        else:
            get_cross_index.remove(get_index[0]) #刪除已交配完的染色體
            get_cross_index.remove(get_index[1]) #刪除已交配完的染色體
    return(gene_list)
Example #5
0
def track(a,b,c,d):
    led_tracker = []
    led_position = cp.zeros(shape=(2,5))
    led_position[0,:] += 173
    led_position[1,:] += 130
    freq = [167,333,286,250,200]#palm thumb fore middle ring
    led_mean_interval = [5975,2994,3487,3990,4967]
    led_peak_ration = [40, 40, 40, 40, 40]
    covar = [515,229,331,425,514]
    slidestep = 20000 #10000
    xPixelResol = 346
    yPixelResol = 260
    count = 0
    numtrackers = [5]
    color = ['violet','orangered','y','limegreen','blue']
    vis = visdom.Visdom(env='tracking')
    #imgwin = vis.image(cp.zeros(shape=(346,260)))
    print('Tracking gesture %d to %d, file from %d to %d'%(a,b-1,c,d-1))
    for gesture in range(a,b):
        filepath = '/home/xuzhongcong/Data_ONC/' + str(gesture) + '/'
        savepath = '/home/xuzhongcong/DataOutput_ONC/' + str(gesture) + '/'
        filenum = range(c,d)
        for sample in filenum:
            Result = []
            print('Ges:', gesture, 'Sample:', sample)
            data = filepath + str(sample) + '.aedat'
            T,X,Y,P = getDVSeventsDavis(data,startEvent=0)
            num_events = len(T)
            st_evetns = int(len(T)*0.1)
            T = cp.array(T).reshape(num_events,1)
            X = cp.array(X).astype(cp.uint16).reshape(num_events,1)
            Y = cp.array(Y).astype(cp.uint16).reshape(num_events,1)
            P = cp.array(P).astype(cp.uint16).reshape(num_events,1)
            LEDT = T[st_evetns] + slidestep/2
            st = time.time()
            record = 0
            count = 0
            for i in range(5):
                led_tracker.append(LedTracker(LedNum=i, num_particles=2000, meanInterval=led_mean_interval[i], Led_peak_ratio=led_peak_ration[i],covarledinterval=covar[i]))
                led_tracker[i].init_Particle()
            while ((LEDT+slidestep/2) <= T[-1]):
                compelte_ratio = int((LEDT-T[st_evetns]+slidestep/2)*100/(T[-1]-T[st_evetns]))
                print('Ges:'+str(gesture)+'Sample:'+str(sample)+' Tracking Compeleted:'+str(compelte_ratio)+'%')
                slide = (T >= (LEDT - slidestep/2))&(T < (LEDT + slidestep/2))
                eventPic = cp.zeros(shape = (xPixelResol,yPixelResol))
                eventX = X[slide].astype(cp.int64)
                eventY = Y[slide].astype(cp.int64)
                eventPol = P[slide].astype(cp.int64)
                eventPol[cp.where(eventPol!=0)] = 1
                eventT = T[slide]
                eventXY = cp.concatenate((eventX.reshape(len(eventX),1), eventY.reshape(len(eventY),1)), axis=1)
                if len(eventXY)==0:
                    count += 1
                    LEDT = LEDT + slidestep/2
                    continue
                eventPixel, eventOccurrence = cp.unique(eventXY, return_counts=True)
                eventPic[eventPixel[:, 0], eventPixel[:, 1]] = eventPic[eventPixel[:, 0], eventPixel[:, 1]] + eventOccurrence
                ifNoiseEvent = cp.array(cp.where(eventOccurrence < 4))
                noisePixel = cp.delete(eventPixel, cp.array(cp.where(eventOccurrence >= 4)), axis=0)
                eventPixel = cp.delete(eventPixel, ifNoiseEvent, axis=0)
                eventOccurrence = cp.delete(eventOccurrence, ifNoiseEvent)
                EventStream = [eventX,eventY,eventT,eventPol,eventPixel,eventOccurrence,noisePixel]
                fig = plot.figure()
                ax = fig.add_subplot(1, 1, 1)
                ax.imshow(cp.transpose(eventPic))
                for i in range(5):
                    led_tracker[i].filter(eventpackage = EventStream, compelted = compelte_ratio, lastposition = (led_position[:,i]))
                    led_position[0,i] = led_tracker[i].get_LED()[0]
                    led_position[1,i] = led_tracker[i].get_LED()[1]
                    ax.scatter(led_position[0,i], led_position[1,i], s=50, c=color[i])
                    #if (record%(100000/slidestep-1)==0):
                    Result.append(cp.hstack((led_position[0,i],led_position[1,i])))
                    #record = 0
                    #print(Result)
                    Outputfile = savepath + str(sample) + '.txt'
                    if os.path.exists(Outputfile):
                        os.remove(Outputfile)
                    cp.savetxt(Outputfile, Result, fmt="%.6f", delimiter="\t", newline="\n")
                    #evidmap = led_tracker[i].get_evidmap()
                    #plt.imshow(cp.transpose(evidmap))
                #ax.pause(0.001)
                end = time.time()
                print('Running Time for Tracking Period:',end-st)
                ax.text(x=0,y=-1,s='Ges:'+str(gesture)+'Sample:'+str(sample)+' Tracking Compeleted:'+str(compelte_ratio)+'%'+'Tracking Period Time:'+str(end-st))
                st = time.time()
                ax.axis('off')
                pic = fig4vis(ax)
                vis.image(pic,win=imgwin)
                #ax.savefig('/home/eric/HandGesture/fig/single/'+str(count)+'.png')
                ax.cla()
                LEDT = LEDT + slidestep/2
                count += 1
            print('Finish!')