本文是学习lesson1-pets后的总结。
在图像数据集的准确过程中,图片一般保存到一个文件夹中,所以加载可以按照固定的套路来,但label的形式却是千差万别,有的图片的label位于图片文件名中,我们要自己提取出来,有的位于图片的文件夹名称中,有的放在csv中等,所以我们要借助fastAI的函数,提取出每张图片对应的label。
比如对于mnist_sample数据集,这个数据集只有3,7两种图片,两种label,可以通过fastAI的URLs来自动下载。如下:
# path = untar_data(URLs.MNIST_SAMPLE);
path=Path('/home/ray/DataSet/mnist_sample')
1. 借助pandas来获取labels
如果原始的图片对应的labels位于csv等文本文件中,而且图片名称和label一一对应,那么我们可以用pandas来加载该csv文件,然后提取得到labels. fastAI中已经定义了from_df函数来获取labels.
eg:
df = pd.read_csv(path/'labels.csv')
df.head()

提取方法:
data = ImageDataBunch.from_df(path, df, ds_tfms=tfms, size=24)
data.classes
[0, 1]
2. 从csv中直接提取labels
其实,fastAI已经定义了从csv直接提取labels的函数from_csv,使用方法为:
data = ImageDataBunch.from_csv(path, ds_tfms=tfms, size=28)
注意此处的path是该labels.csv文件所在目录,所以如果是其他名称的csv文件,需要修改from_csv中的csv_labels参数。
3. 使用正则表达式提取labels
如果labels存在于图片的路径中,我们可以构建正则表达式提取出各自的labels, eg:
fn_paths = [path/name for name in df['name']]
fn_paths[:2]
[PosixPath('/home/ray/DataSet/mnist_sample/train/3/7463.png'),
PosixPath('/home/ray/DataSet/mnist_sample/train/3/21102.png')]
这种,fn_paths就是由所有图片的路径构成的list,我们可以用正则提取出3和7,eg:
pat = r"/(\d)/\d+\.png$"
data = ImageDataBunch.from_name_re(path, fn_paths, pat=pat, ds_tfms=tfms, size=24)
data.classes
['3', '7']
注意:要提取出的labels放在正则表达式中的()中。
4. 使用自定义函数来提取出labels
我们也可以自定义函数来获取图片路径中的labels, 比如:
data = ImageDataBunch.from_name_func(path, fn_paths, ds_tfms=tfms, size=24,
label_func = lambda x: '3' if '/3/' in str(x) else '7')
data.classes
['3', '7']
里面的label_func就是从fn_paths中提取出label的func,虽然是个lambda表达式,但换成其他函数也可以。
5. 从list中直接加载labels
一般的图片的路径会放到一个list中,我们可以从这个list中提取出labels,也组成list,这样image的list和label组成的list就会一一对应。这样就可以用from_lists来构建ImageDataBunch对象。
labels = [('3' if '/3/' in str(x) else '7') for x in fn_paths]
labels[:5]
data = ImageDataBunch.from_lists(path, fn_paths, labels=labels, ds_tfms=tfms, size=24)
data.classes
['3', '7']
上面的5种方法基本上涵盖了所有labels可能出现的情况。
网友评论