当前位置: 首页 > news >正文

用 TensorFlow 1.x 快速找出两幅图的差异 —— 完整实战与逐行解析 -Python程序图片找不同

用 TensorFlow 1.x 快速找出两幅图的差异 —— 完整实战与逐行解析 -Python程序图片找不同

在这里插入图片描述

用 TensorFlow 1.x 快速找出两幅图的差异 —— 完整实战与逐行解析

适用于仍在使用 TensorFlow 1.15 或无法开启 Eager 的环境(阿里云 PAI-DSW、部分离线服务器等)。

在这里插入图片描述在这里插入图片描述

一、背景与痛点

一、背景与痛点

  • 场景:线上 Notebook 里只有 TF 1.x,默认 Graph 模式,.numpy() 不可用。
  • 问题
    1. 两张图片尺寸不一致(本文示例中宽 459 vs 455)导致 InvalidArgumentError: Incompatible shapes
    2. 代码需要同时兼容 静态图 + 任意尺寸输入 + 可视化输出

本文给出的 40 行脚本一次性解决上述痛点,并逐行拆解思路,方便读者即拷即用,也能二次开发。


二、最终效果

原始图 1原始图 2卷积后图 1差异热力图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、完整代码(可直接运行)

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np# 1. 显式关闭 Eager(TF1.x 默认 Graph,防止误开)
tf.compat.v1.disable_eager_execution()# 2. 统一尺寸:可按需修改
TARGET_H, TARGET_W = 512, 512image_path1 = '1.png'
image_path2 = '2.png'# 3. 封装读取+resize
def load_and_resize(path, channels=1):img = tf.io.read_file(path)img = tf.image.decode_png(img, channels=channels)img = tf.image.resize(img, [TARGET_H, TARGET_W])   # 关键:保证同尺寸img = tf.cast(img, tf.float32) / 255.0           # 归一化img = tf.expand_dims(img, 0)                     # [1, H, W, C]return imgimg1 = load_and_resize(image_path1)
img2 = load_and_resize(image_path2)# 4. 定义卷积层
conv2d_layer = tf.keras.layers.Conv2D(filters=1, kernel_size=3, activation='relu', padding='same'
)output1 = conv2d_layer(img1)
output2 = conv2d_layer(img2)
diff = tf.abs(output1 - output2)# 5. 在 Session 中运行
with tf.compat.v1.Session() as sess:sess.run(tf.compat.v1.global_variables_initializer())img1_np, img2_np, out1_np, diff_np = sess.run([tf.squeeze(img1),tf.squeeze(img2),tf.squeeze(output1),tf.squeeze(diff)])# 6. 可视化
plt.figure(figsize=(10, 5))
plt.subplot(1, 4, 1)
plt.imshow(img1_np, cmap='gray')
plt.title('Image 1')
plt.axis('off')plt.subplot(1, 4, 2)
plt.imshow(img2_np, cmap='gray')
plt.title('Image 2')
plt.axis('off')plt.subplot(1, 4, 3)
plt.imshow(out1_np, cmap='gray')
plt.title('Conv2D Image 1')
plt.axis('off')plt.subplot(1, 4, 4)
plt.imshow(diff_np, cmap='gray')
plt.title('Difference')
plt.axis('off')plt.tight_layout()
plt.show()

四、逐行拆解与知识点

行号范围关键代码作用 & 要点
1–3import ...TF1.x 仍需手动 import tensorflow.compat.v1;Matplotlib 负责可视化。
6disable_eager_execution()防止某些环境默认开启 Eager,导致 Graph 与 Eager 混用。
9统一尺寸避免 InvalidArgumentError 的核心:任何输入图都会被拉伸/压缩到 [512,512]
11–12路径支持 PNG/JPEG;若有多张图,可改写为循环。
15–25load_and_resize重点函数
- tf.image.decode_png 指定 channels=1 直接变灰度
- tf.image.resize 支持双线性(默认)或最近邻
- 归一化到 [0,1] 可加速收敛、避免梯度爆炸
28–31卷积层使用 tf.keras.layers.Conv2D 在 Graph 中也能直接建图;padding='same' 保证输出尺寸与输入一致。
33tf.abs(output1 - output2)元素级绝对差,得到差异热力图。
35–40Session.runTF1.x 必走流程;变量需先 global_variables_initializer
43–60可视化4 张子图并排,方便肉眼比对;cmap='gray' 更适合灰度图。

五、常见踩坑 FAQ

  1. RuntimeWarning: divide by zero
    归一化时若原图为纯黑(全 0),不会报错,但差异图可能全 0,属正常现象。

  2. 颜色通道不一致
    若读入 RGB(channels=3),请把 cmap='gray' 改为 cmap=None,或转灰度:tf.image.rgb_to_grayscale

  3. 尺寸缩放导致细节失真
    可把 TARGET_H/W 设成两张图的最大高宽,再裁剪居中;或改用 tf.image.resize_with_pad 保持比例。

  4. TF2.x 用户
    直接删掉 tf.compat.v1.disable_eager_execution()Session 相关代码,用 .numpy() 即可。


六、延伸玩法

  • 批量比较:把路径换成 glob('*.png'),循环输出差异 GIF。
  • 阈值过滤diff_np = (diff_np > 0.1).astype(float) 高亮显著差异。
  • 迁移到部署:把 diff 结果再送入二分类网络,做“缺陷检测”。

七、一句话总结

TF1.x 静态图 下,只要 提前统一尺寸 + 用 Session 取数 + Matplotlib 可视化,就能无痛完成“两图找茬”任务;
若环境允许,直接升级到 TF2.x 会更简洁。希望这篇博客能帮你少踩坑、多产出!

NotoBook在线编辑平台为开发者提供了一站式的云端编程环境,具备以下核心优势:

  1. 专业级IDE功能:
  • 支持多种编程语言(Python、R、Java等)的语法高亮和自动补全
  • 内置代码调试器和版本控制工具
  • 支持多文件管理和项目结构导航
  • 提供实时协作编辑功能,支持团队协同开发
  1. 强大的计算资源配置:
  • GPU资源:60小时/月的Tesla V100计算卡使用权

    • 适用于深度学习训练、3D渲染等计算密集型任务
    • 典型应用场景包括:
      • 图像识别模型训练
      • 自然语言处理任务
      • 科学计算模拟
  • CPU资源:无限制使用

    • 配备Intel Xeon处理器集群
    • 适用于常规编程、数据处理等任务
    • 支持长时间运行的批处理作业
  1. 特色功能:
  • 预装主流数据科学工具包(TensorFlow、PyTorch等)
  • 支持Jupyter Notebook交互式开发
  • 提供数据可视化工具
  • 内置常用数据集和模型库
  1. 使用场景:
  • 高校教学与科研
  • 企业原型开发
  • 个人编程学习
  • 算法竞赛准备

平台采用按需分配的资源管理机制,确保用户能够高效利用计算资源完成开发任务。NotoBook在线编辑, 为大家提供完备的IDE以及丰富的计算资源
GPU :60.0小时
CPU :不限

http://www.dtcms.com/a/309052.html

相关文章:

  • forceStop流程会把对应进程的pendingIntent给cancel掉
  • ceph 14.2.22 nautilus Balancer 数据平衡
  • 通过CISSP考试,共答到第127题
  • 雷达微多普勒特征代表运动中“事物”的运动部件。
  • 机械手弧焊电源气体流量优化方法
  • 算法:分治-快速排序
  • IO流File类的基本使用
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第二天(CSS)
  • 《n8n基础教学》第三节:模拟一个自动化场景
  • CSS的2D转换
  • 【Shell脚本自动化编写——报警邮件,检查磁盘,web服务检测】
  • 了解Reddit自动化 社区营销更精准
  • CSS组件化样式新篇章:@scope
  • vi/vim跳转到指定行命令
  • 机器学习第二课之逻辑回归(二)LogisticRegression
  • LSTM网络从浅入深原理级讲解与Pytorch逐行讲解实现
  • [python][selenium] Web UI自动化8种页面元素定位方式
  • K8S周期性备份etcd数据实战案例
  • 番茄项目3:完成了项目的数据库设计
  • npm报错:npm install 出现“npm WARN old lockfile”
  • ZED 2/2i 相机安装与调试完整指南 | Ubuntu 20.04 + CUDA 11.8
  • k8s云原生rook-ceph pvc快照与恢复(下)
  • 前端SWR策略:优化数据请求
  • STM32学习记录--Day5
  • AG-UI 协议全面解析--下一代 AI Agent 交互框架医疗应用分析(下)
  • 接口幂等性
  • 【Flutter】双路视频播放方案
  • 《R for Data Science (2e)》免费中文翻译 (第3章) --- Data transformation(1)
  • Jupyter Notebook 使用指南
  • Idea集成Jenkins Control插件,在IDEA中触发Jenkins中项目的构建