Fast.ai图像分类调用np.vectorize报0输入未设otypes错误如何解决
报错根因
该错误是numpy的vectorize方法的限制:当输入数组长度为0时,numpy无法自动推断输出数据类型,必须显式指定otypes参数才能正常执行。而触发该错误的前置条件是CustomImageItemList.from_folder执行后没有读取到任何符合条件的jpg图片,导致self.items是空数组,进而在调用向量化方法时报错。
解决方案
第一步:排查图片读取问题
先确认你定义的path变量指向的目录正确,目录下确实存在后缀为.jpg的图片。如果你的图片后缀有大写.JPG格式,需要修改extensions参数匹配大小写:CustomImageItemList.from_folder(path, extensions=['.jpg', '.JPG'])可以先打印读取到的图片数量验证:
img_list = CustomImageItemList.from_folder(path, extensions='.jpg') print(f"读取到的图片总数:{len(img_list)}")如果输出为0,说明路径配置或者文件后缀匹配有误,先修正该问题再执行后续逻辑。
第二步:兼容空输入的代码修改
如果你需要兼容空输入的场景,避免直接抛出报错,可以选择以下两种修改方式二选一:- 给
np.vectorize显式指定otypes参数
把原代码中的file_names=np.vectorize(lambda files: str(files).split('/')[-1][:-4])修改为:file_names = np.vectorize(lambda files: str(files).split('/')[-1][:-4], otypes=[str]) - 替换numpy向量化写法,改用原生Python列表推导(更推荐,可读性和兼容性更高)
原custom_label方法可以改写为:def custom_label(self,df, **kwargs)->'LabelList': """Custom Labels from path""" file_names = [str(f).split('/')[-1][:-4] for f in self.items] labels = [df.loc[x,'lesion'] for x in file_names] y = CategoryList(items=labels) res = self._label_list(x=self,y=y) return res
- 给
内容的提问来源于stack exchange,提问作者Vinayak Anil
相关产品推荐
相关产品推荐

