图像数据预处理
介绍
在新媒体平台上,用户经常分享各种图片,这些图片反映了他们的兴趣和喜好。因此这些图片就可以用来制作后续图像分析要用的图像数据集。在本任务中,我们收集并整理出了一批图像数据,现在需要你们研发小组对该数据集进行必要的图像预处理。
准备
开始答题前,请确认 /home/project
目录下包含以下文件:
-
Imagedata.zip
-
task.py
其中:
-
Imagedata.zip
,是本任务提供的数据集。解压后,你将看到一个image_class_index.json
文件和一个images
文件夹。image_class_index.json
文件,类别索引映射文件。images
文件夹,包含了若干文件夹,每个文件夹下是同一类别的图像。
-
task.py
,是你后续答题过程中编写代码的地方。
提示:可输入命令
unzip -q -o /home/project/Imagedata.zip -d ./
解压文件夹。
目标
请在 task.py
文件中编写代码,并按以下要求完善 img_processor
函数,实现对数据集的预处理。
- 函数功能
- 对输入图像进行预处理,包括图像缩放、中心裁剪和标准化。
- 参数
- data_path:字符串,指定图像文件的路径。
- dst_size:元组,指定最终输出图像的目标尺寸,默认为 (224, 224)。
- 返回值
- image_src:numpy.ndarray,原始图像。
- image:numpy.ndarray,预处理后的图像,尺寸为 dst_size。
- (startx, starty):元组,表示实现中心裁剪时,对原始图像数组进行切片的起始索引位置。
基于以下代码块在 img_processor
函数中 #TODO
处补充代码,确保实现以下目标。
① 图像缩放:将图像大小调整为 (256, 256)。
② 中心裁剪:计算正确的起始索引,裁剪出大小为 (224, 224) 的中心区域。
③ 标准化:使用代码中设置的 _mean
和 _std
对图像像素进行标准化。
提示:点击代码块右上方的
copy
按钮,将代码完整复制到右侧环境中后开始编码。
#task-start
import numpy as np
import pandas as pd
import json
import cv2
import os
def img_processor(data_path, dst_size = (224,224)):
Image_std = [0.229, 0.224, 0.225]
Image_mean = [0.485, 0.456, 0.406]
_std = np.array(Image_std).reshape((1,1,3))
_mean = np.array(Image_mean).reshape((1,1,3))
image_src = cv2.imread(data_path)
#TODO
return image_src, image, (startx,starty)
def simple_generator(data_list, json_file, dst_size = (224, 224)):
with open(json_file, 'r') as f:
data = json.load(f)
folder_map = {v[0]: (int(k), v[1]) for k,v in data.items()}
for img_path in data_list:
image_src, image, (startx,starty) = img_processor(img_path, dst_size)
label = folder_map[img_path.split('/')[-2]]
yield image_src, image, label, (startx,starty)
def main():
Image_path = 'Imagedata/images'
Json_path = 'Imagedata/image_class_index.json'
data_list = []
for dirname, _, filenames in os.walk(Image_path):
if os.path.basename(dirname).startswith('n'):
for filename in filenames:
data_list.append(os.path.join(dirname, filename))
# 创建生成器
generator = simple_generator(data_list, Json_path)
# 查看示例,检查图像、标签等属性的正确性
num_samples = 5
for _ in range(num_samples):
image_src, image, label, (startx,starty) = next(generator)
print("SrcImage shape:", image_src.shape)
print("Image shape:", image.shape)
print("Label:", label)
print("startx and starty:",(startx,starty))
if __name__ == '__main__':
main()
#task-end
规定
- 务必在
#TODO
所在的函数范围内编写代码,以免造成判题不通过。 - 切勿删除以上代码块中的任何字符,以免造成判题不通过。
- 切勿修改任务中默认提供的文件名称、函数名称等,以免造成判题不通过。
判分标准
- 实现目标,该题得 7 分。
- 未实现目标,该题得 0 分。
实现代码:
#TODO
#1.图像缩放:将图像大小调整为 (256, 256)。
image = cv2.resize(image_src,(256,256))#cv2的给一个图像重新赋值并改变大小
#2.中心裁剪:计算裁剪的起始坐标 startx 和 starty,从图像中裁剪出大小为 (224, 224) 的中心区域。
startx = 256//2 - (224//2)
starty = 256//2 - (224//2)
image = image[starty:starty+224,startx:startx+224]
#3.标准化:使用代码中设置的 _mean 和 _std 对图像像素进行标准化。
image=(image-_mean)/_std