Я написал некоторый код, который использует while l oop для перебора изображения размером 1000x1000 пикселей в патчах 50x50 пикселей и загружает ранее обученный классификатор для прогнозирования класса каждого патча 50x50. Если метка патча равна «0», я хочу нарисовать прямоугольник на этом патче, так что в конце все патчи с меткой «0» будут выделены.
import tensorflow as tf
from tensorflow.keras.models import Sequential
import os
import numpy as np
from skimage import io, segmentation, data, color, img_as_float
import cv2
## load keras model
model = tf.keras.models.load_model('./model.h5')
## load image
im = skimage.io.imread('/path/to/image.png')[:,:,0:3]
im_x = im.shape[0]
im_y = im.shape[1]
## rescale image to range 0 to 1
im_rescaled = skimage.img_as_float(im.copy())
x = 0
y = 0
output = im.copy()
alpha = 0.3
while ( y + 50 ) <= im_y:
while ( x + 50 ) <= im_x:
overlay = im.copy()
patch = im_rescaled[x:x+50, y:y+50]
patch_reshaped = np.reshape(patch, ((1, 50, 50, 3)))
y_new = model.predict_classes(patch_reshaped)
if y_new == 0:
overlay = cv2.rectangle(overlay, (x, y), (x+50, y+50), (0, 255, 255), -1)
output = cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output)
x += 50
x = 0
y += 50
skimage.io.imsave('./overlay.png', output)
Однако на выходе получается просто необработанное изображение: