TensorFlow中MobileNet的输入预处理具体执行流程是怎样的?
MobileNet预处理核心逻辑与PIL/OpenCV实现
TensorFlow 中tf.keras.applications.mobilenet.preprocess_input的具体操作步骤如下:
- 输入要求为uint8格式的RGB图像,像素值范围0~255
- 核心计算逻辑是将像素值从[0,255]线性映射到[-1,1],公式为
像素值 = 像素值 / 127.5 - 1 - 不需要额外做通道均值减法、标准差归一化操作,只要输入为RGB格式即可,无需调整通道顺序
PIL 实现代码
from PIL import Image import numpy as np def mobilenet_preprocess_pil(image_path, target_size=(224,224)): # 读取图像并转为RGB格式 img = Image.open(image_path).convert('RGB') # 按双线性插值规则resize到模型要求的输入尺寸 img = img.resize(target_size, Image.Resampling.BILINEAR) # 低版本PIL可替换为Image.BILINEAR # 转为float32类型的numpy数组 img_arr = np.array(img, dtype=np.float32) # 归一化到[-1,1]区间 img_arr = img_arr / 127.5 - 1.0 # 如需适配模型batch输入格式,可添加batch维度:img_arr = np.expand_dims(img_arr, axis=0) return img_arr
OpenCV 实现代码
import cv2 import numpy as np def mobilenet_preprocess_cv2(image_path, target_size=(224,224)): # 读取图像,OpenCV默认返回BGR格式 img = cv2.imread(image_path) # BGR转RGB,匹配模型输入要求 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 按双线性插值规则resize到目标尺寸 img = cv2.resize(img, target_size, interpolation=cv2.INTER_LINEAR) # 转为float32类型数组 img_arr = np.array(img, dtype=np.float32) # 归一化到[-1,1]区间 img_arr = img_arr / 127.5 - 1.0 # 如需适配模型batch输入格式,可添加batch维度:img_arr = np.expand_dims(img_arr, axis=0) return img_arr
注意:如果输入已经是RGB格式的numpy数组,可跳过通道转换步骤,直接执行resize和归一化操作,输出结果和TensorFlow官方接口完全一致。
内容的提问来源于stack exchange,提问作者Mohammadreza Riahi
相关产品推荐
相关产品推荐

