用Python浏览指定目录下的各个子目录,如 ./imgs /1 /2 /3 每个子目录下有对应数字的图片。 写程序可以自动读取每个子目录下的图片,每读一张图片生成一个列表 [图片x,标签],这里标签为图片所在目录的名字,如:0,1,2,3,... 将每次生成的列表作为一个元素加入总图片列表,最终把该总列表存入磁盘文件中。 把给定的图片打包为一个文件。 编写类实现,上一步打包文件的读取。 类方法有: __len__获取所有图片的数量。 __getitem__获取每一张图片和对应的标签。 编写程序使用上面自定义的类 在使用文件类的基础上派生出子类。 新的类继承父类的所有语法元素,覆盖父类的__getitem__方法,增加__resize__方法(在_getitem__方法中被调用,用来修改原始图像的尺寸) 使用新的子类,进行图像遍历操作。
时间: 2023-06-01 14:05:47 浏览: 189
这是一个技术问题,我可以回答。
你可以使用 os 模块来遍历目录下的文件夹和文件,使用 Pillow 模块读取图片,最后使用 pickle 模块将总列表存入磁盘文件中。
具体代码如下:
```python
import os
from PIL import Image
import pickle
root_dir = './imgs'
file_list = []
for dirpath, dirs, files in os.walk(root_dir):
for file in files:
if file.endswith('.jpg'):
abs_path = os.path.join(dirpath, file)
label = abs_path.split('/')[-2] # 目录名即为标签
img = Image.open(abs_path)
img_list = [img, label]
file_list.append(img_list)
with open('file_list.pkl', 'wb') as f:
pickle.dump(file_list, f)
```
然后,我们可以定义一个类来读取 pickle 文件中的数据:
```python
import pickle
class MyDataset:
def __init__(self, file_path):
with open(file_path, 'rb') as f:
self.file_list = pickle.load(f)
def __len__(self):
return len(self.file_list)
def __getitem__(self, index):
img, label = self.file_list[index]
return img, label
```
现在,我们可以实例化 `MyDataset` 类,得到一个数据集,使用其中的数据:
```python
dataset = MyDataset('file_list.pkl')
for i in range(len(dataset)):
img, label = dataset[i]
# do something
```
如果要派生出子类,在子类中覆盖 `__getitem__` 方法并增加 `__resize__` 方法,可以这样实现:
```python
class MyChildDataset(MyDataset):
def __init__(self, file_path):
super().__init__(file_path)
def __getitem__(self, index):
img, label = super().__getitem__(index)
img = self.__resize__(img)
return img, label
def __resize__(self, img):
# do resizing
return img
```
使用 `MyChildDataset` 实例化后,可以对每张图片进行尺寸调整,也可以使用基类的方法获取图片和标签。
阅读全文