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)
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)
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
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)
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!')