HuBMAPDataset类中乘法操作触发TypeError错误求助
类型错误:
builtin_function_or_method与int无法执行乘法运算 问题场景
在HuBMAPDataset类的初始化方法中,执行self.sz = reduce*sz计算尺寸参数时,触发以下类型错误:
TypeError: unsupported operand type(s) for *: 'builtin_function_or_method' and 'int'
相关代码
reduce = 4 class HuBMAPDataset: def __init__(self, idx, fold, train=True, tfms=None): self.data = rasterio.open(os.path.join(DATA,idx+'.tiff'), transform = identity,num_threads='all_cpus') ids = pd.read_csv(LABELS).id.astype(str).values kf = KFold(n_splits=nfolds,random_state=SEED,shuffle=True) ids = set(ids[list(kf.split(ids))[fold][0 if train else 1]]) self.fnames = [fname for fname in os.listdir(TRAIN) if fname.split('_')[0] in ids] self.train = train self.tfms = tfms if self.data.count != 3: subdatasets = self.data.subdatasets self.layers = [] if len(subdatasets) > 0: for i, subdataset in enumerate(subdatasets, 0): self.layers.append(rasterio.open(subdataset)) self.shape = self.data.shape self.reduce = reduce self.sz = reduce*sz # 报错行 self.pad0 = (self.sz - self.shape[0]%self.sz)%self.sz self.pad1 = (self.sz - self.shape[1]%self.sz)%self.sz self.n0max = (self.shape[0] + self.pad0)//self.sz self.n1max = (self.shape[1] + self.pad1)//self.sz def __len__(self): return len(self.fnames), self.n0max*self.n1max def __getitem__(self, idx): fname = self.fnames[idx] img = cv2.cvtColor(cv2.imread(os.path.join(TRAIN,fname)), cv2.COLOR_BGR2RGB) mask = cv2.imread(os.path.join(MASKS,fname),cv2.IMREAD_GRAYSCALE) if self.tfms is not None: augmented = self.tfms(image=img,mask=mask) img,mask = augmented['image'],augmented['mask'] n0,n1 = idx//self.n1max, idx%self.n1max x0,y0 = -self.pad0//2 + n0*self.sz, -self.pad1//2 + n1*self.sz p00,p01 = max(0,x0), min(x0+self.sz,self.shape[0]) p10,p11 = max(0,y0), min(y0+self.sz,self.shape[1]) img = np.zeros((self.sz,self.sz,3),np.uint8) if self.data.count == 3: img[(p00-x0):(p01-x0),(p10-y0):(p11-y0)] = np.moveaxis(self.data.read([1,2,3], window=Window.from_slices((p00,p01),(p10,p11))), 0, -1) else: for i,layer in enumerate(self.layers): img[(p00-x0):(p01-x0),(p10-y0):(p11-y0),i] =\ layer.read(1,window=Window.from_slices((p00,p01),(p10,p11))) if self.reduce != 1: img = cv2.resize(img,(self.sz//reduce,self.sz//reduce), interpolation = cv2.INTER_AREA) #check for empty imges hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) h,s,v = cv2.split(hsv) if (s>s_th).sum() <= p_th or img.sum() <= p_th: #images with -1 will be skipped return img2tensor((img/255.0 - mean)/std), -1, img2tensor(mask) else: return img2tensor((img/255.0 - mean)/std), idx, img2tensor(mask) for fold in range(nfolds): for idx,row in tqdm(df_sample.iterrows(),total=len(df_sample)): idx = str(row['id']) ds_t = HuBMAPDataset(idx, fold=fold, train=True, tfms=get_aug())
报错回溯
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) /tmp/ipykernel_33/1067530021.py in <module> 3 for idx,row in tqdm(df_sample.iterrows(),total=len(df_sample)): 4 idx = str(row['id']) ----> 5 ds_t = HuBMAPDataset(idx, fold=fold, train=True, tfms=get_aug()) 6 ds_v = HuBMAPDataset(idx, fold=fold, train=False) 7 data = ImageDataLoaders.from_dsets(ds_t,ds_v,bs=bs,num_workers=NUM_WORKERS,pin_memory=True).cuda() /tmp/ipykernel_33/3421423662.py in __init__(self, idx, fold, train, tfms) 25 self.shape = self.data.shape 26 self.reduce = reduce ---> 27 self.sz = reduce*sz 28 self.pad0 = (self.sz - self.shape[0]%self.sz)%self.sz 29 self.pad1 = (self.sz - self.shape[1]%self.sz)%self.sz TypeError: unsupported operand type(s) for *: 'builtin_function_or_method' and 'int'
df_sample数据
df_sample.to_dict() {'id': {0: 10078}, 'rle': {0: '12 34'}}
问题原因与解决方案
原因
代码中未定义数值类型的sz变量,Python将sz解析为了某个内置函数/方法对象,导致无法与整数reduce(值为4)执行乘法运算。
解决方案
- 定义基础尺寸变量:在类的外部或
__init__方法内部,先定义一个数值类型的基础尺寸sz,例如常用的分块尺寸256或512:
或者在# 示例:在类外定义基础sz reduce = 4 sz = 256 # 新增基础尺寸定义 class HuBMAPDataset: def __init__(self, idx, fold, train=True, tfms=None): # ... 其他代码 ... self.sz = reduce * sz__init__内定义:def __init__(self, idx, fold, train=True, tfms=None): # ... 其他代码 ... sz = 256 self.sz = reduce * sz - 检查变量名冲突:确保
sz没有与导入的库内置函数、方法重名,若有冲突则更换变量名(例如改为base_sz)。
内容的提问来源于stack exchange,提问作者melolilili
相关产品推荐
相关产品推荐

