我正在寻找一种使用 ai 发现两个图像之间差异的方法。
这是我的大学项目,我的教授要求我创建一个程序来使用人工智能检测并发现两对图像中的差异。
我使用 siamese network 部署它,来计算差异,如果差异大于阈值,我使用以下代码来显示差异:
input_images = np.array([[img1, img2]])
difference_image = np.abs(input_images[0, 0] - input_images[0, 1])
plt.imshow(difference_image)
但是我的教授不接受 他提示我使用 conv2d 将图像分割成更小的形状,然后比较这些形状,如果存在差异,请使用边界框突出显示。
任何人都可以帮助部署此代码吗?
我以前的代码是:
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers
img1 = plt.imread('1-1.jpg')
img2 = plt.imread('1-2.jpg')
input_shape = img1.shape # Assuming images are of the same shape
# Function to create
# def create_siamese_model(input_shape):
input_image_1 = layers.Input(shape=input_shape, name='input_image_1')
input_image_2 = layers.Input(shape=input_shape, name='input_image_2')
# Base network
base_network = keras.Sequential([
layers.Conv2D(40, (3, 3), activation='relu', input_shape=input_shape),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Flatten(),
layers.Dense(256, activation='relu')
])
# Encoded representations of input images
encoded_image_1 = base_network(input_image_1)
encoded_image_2 = base_network(input_image_2)
# L1 distance layer
l1_distance = layers.Lambda(lambda tensors: keras.backend.abs(tensors[0] - tensors[1]))([encoded_image_1, encoded_image_2])
# Output layer
output_layer = layers.Dense(15, activation='sigmoid')(l1_distance)
model = keras.Model(inputs=[input_image_1, input_image_2], outputs=output_layer)
input_images = np.array([[img1, img2]])
predictions = model.predict([input_images[:, 0], input_images[:, 1]])
threshold=0.5
if predictions[0, 0] > threshold:
# Highlight differences if the prediction is above the threshold
difference_image = np.abs(input_images[0, 0] - input_images[0, 1])
difference_image
plt.imshow(difference_image)
plt.show()
正确答案
我找到了一种使用 cnn 网络来查找两幅图像之间差异的方法 代码:
# Importing necessary libraries
import tensorflow as tf
import matplotlib.pyplot as plt
# Specify the file paths for the two images
image_path1 = '1.jpg'
image_path2 = '2 .jpg'
# Read and decode images, then normalize pixel values to the range [0, 1]
img1 = tf.io.read_file(image_path1)
img1 = tf.image.decode_image(img1, channels=1)
img1 = tf.cast(img1, tf.float32) / 255.0
img2 = tf.io.read_file(image_path2)
img2 = tf.image.decode_image(img2, channels=1)
img2 = tf.cast(img2, tf.float32) / 255.0
# Add a batch dimension to the images
img1 = tf.expand_dims(img1, axis=0)
img2 = tf.expand_dims(img2, axis=0)
# Create a Conv2D layer with specified parameters
conv2d_layer = tf.keras.layers.Conv2D(filters=1, kernel_size=(3, 3), activation='relu', padding='same')
# Apply the Conv2D layer to both images
output1 = conv2d_layer(img1)
output2 = conv2d_layer(img2)
# Calculate the absolute difference between the Conv2D outputs
diff = tf.abs(output1 - output2)
# Plotting the images and Conv2D outputs for visualization
plt.figure(figsize=(10, 5))
plt.subplot(1, 4, 1)
plt.imshow(tf.squeeze(img1), cmap='gray')
plt.title('Image 1')
plt.axis('off')
plt.subplot(1, 4, 2)
plt.imshow(tf.squeeze(img2), cmap='gray')
plt.title('Image 2')
plt.axis('off')
plt.subplot(1, 4, 3)
plt.imshow(tf.squeeze(output1), cmap='gray')
plt.title('Conv2D Image 1')
plt.axis('off')
plt.subplot(1, 4, 4)
plt.imshow(tf.squeeze(diff), cmap='gray')
plt.title('Absolute Difference')
plt.axis('off')
# Display the plot
plt.show()
这段代码使用cnn网络来计算两个图像数组之间的距离