我的模型需要线上部署了,想直接使用 onnx,而不是 pytorch,所以我需要把代码中关于 pytorch 的都删除了,比如下面这段代码,怎么使用其他库替代?
from torchvision import transforms
preprocess = transforms.Compose([
transforms.Resize(224),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
注意:返回值 ndarray 的 dtype 是 float32
下面是 ChatGPT 给我的答案:
可以使用 Pillow 和 numpy 库替代 torchvision 和 torch 中的操作,示例代码如下:
下面的代码是 chatGPT 给的,有一个问题就是 返回值 ndarray 的 dtype 是 float64,为了和 transforms.ToTensor 保持一致,我觉得修改一下
from PIL import Image
import numpy as np
def preprocess(image_path):
image = Image.open(image_path)
image = image.resize((224, 224))
image = np.array(image)
image = image.transpose((2, 0, 1))
image = image.astype(np.float32)
image /= 255.0
mean = np.array([0.485, 0.456, 0.406]).reshape((3, 1, 1))
std = np.array([0.229, 0.224, 0.225]).reshape((3, 1, 1))
image = (image - mean) / std
return image
注意:返回值 ndarray 的 dtype 是 float64
修改后如下:
from PIL import Image
import numpy as np
from numpy import ndarray
def preprocess(image: Image.Image) -> ndarray:
resized_image = image.resize((224, 224))
resized_image_ndarray = np.array(resized_image)
transposed_image_ndarray = resized_image_ndarray.transpose((2, 0, 1))
transposed_image_ndarrayfloat32 = transposed_image_ndarray.astype(
np.float32)
transposed_image_ndarrayfloat32 /= 255.0
mean = np.array([0.485, 0.456, 0.406]).reshape((3, 1, 1))
std = np.array([0.229, 0.224, 0.225]).reshape((3, 1, 1))
normalized_image_ndarray = (transposed_image_ndarrayfloat32 - mean) / std
normalized_image_ndarrayfloat32 = normalized_image_ndarray.astype(
np.float32)
return normalized_image_ndarrayfloat32
注意:返回值 ndarray 的 dtype 是 float32
这个函数将接受图像文件路径作为输入并返回预处理后的图像。
但是我测速发现,chatGPT 给的这段代码速度慢了50%
╰─➤ time python pre001.py
python pre001.py 10.29s user 0.98s system 118% cpu 9.502 total
╰─➤ time python pre002.py
python pre002.py 15.91s user 0.99s system 111% cpu 15.185 total
可以看到新版的比原版的慢 50%,所以这个思路失败了
关于这两个方式是否能够利用多核 CPU,我发现都是不行的
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。