无Eager执行模式下M1端tf.Tensor转numpy并保存为图像的方法
静态图模式下提取sr张量并保存图像的操作方法
当前环境禁用了Eager执行,sr本质是静态计算图上的计算节点,不携带实际运算结果,必须通过显式会话触发计算才能拿到真实像素值,具体操作如下:
- 创建TensorFlow会话触发实际计算
适配当前tf2.4的静态图运行逻辑,加载Hub模型权重后执行sr节点,将计算结果转为numpy数组:# 接在原代码 sr = model(image) 之后补充 with tf.compat.v1.Session() as sess: # 初始化Hub加载的模型全局权重 sess.run(tf.compat.v1.global_variables_initializer()) # 执行sr对应的计算图节点,获取实际运算结果 sr_array = sess.run(sr) - 适配图像存储所需的数组格式
拿到的数组形状为(1, 2880, 4320, 3),存在多余的批量维度,且ESRGAN模型输出的浮点像素可能超出[0,255]的合法图像值范围,需要做格式修正才能正常生成图像:# 移除数组第0维的批量维度 sr_array = np.squeeze(sr_array, axis=0) # 将像素值截断到0-255的合法区间,避免存图时出现颜色异常 sr_array = np.clip(sr_array, 0, 255) # 转换为PIL库可识别的uint8图像格式 sr_image = Image.fromarray(sr_array.astype(np.uint8)) - 保存为本地图像文件
直接调用PIL的保存接口即可输出最终的超分辨率图像:sr_image.save("/Users/alex26/Downloads/sr_output.jpg")
注意:该流程和当前环境下配置的MLCompute GPU加速逻辑完全兼容,会话执行时会自动把计算任务路由到M1芯片的GPU端,无需额外调整设备配置。
内容的提问来源于stack exchange,提问作者Ymka
相关产品推荐
相关产品推荐

