如何使用Keras对图像指定区域而非整幅图像执行图像分类?
问题解答
这个需求完全可以实现,不需要改动你现有Keras序列分类器的结构,仅需要在模型输入前增加对应区域的裁剪预处理步骤即可,核心实现逻辑如下:
- 首先统一目标位置的参数格式,通常位置参数用边界框
(x_min, y_min, x_max, y_max)(左上角坐标+右下角坐标)或者(x_center, y_center, width, height)(中心坐标+宽高)定义,先转换为裁剪需要的坐标范围 - 对原图按坐标裁剪出指定区域后,需要和你训练分类器时的预处理逻辑完全对齐:包括尺寸缩放、归一化、通道顺序调整(RGB/BGR)、均值减除等操作
- 把预处理完成的裁剪区域新增batch维度后,直接输入现有分类器调用
model.predict()即可得到对应区域的分类结果
你可以参考下面的极简示例代码适配自己的场景:
import cv2 import numpy as np # 替换为你训练模型时的输入尺寸和预处理规则 TARGET_INPUT_SIZE = (224, 224) PREPROCESS_SCALE = 1/255.0 def predict_specified_region(original_image, bbox, trained_model): # bbox默认格式为(x_min, y_min, x_max, y_max) x_min, y_min, x_max, y_max = bbox # 裁剪目标区域 target_roi = original_image[y_min:y_max, x_min:x_max] # 对齐训练预处理逻辑 processed_roi = cv2.resize(target_roi, TARGET_INPUT_SIZE) * PREPROCESS_SCALE # 增加batch维度后输入模型预测 model_input = np.expand_dims(processed_roi, axis=0) prediction_result = trained_model.predict(model_input, verbose=0) return prediction_result
注意:如果你的分类器训练时依赖整图上下文特征做分类判断,直接裁剪后的区域预测准确率可能会有小幅下降,这种情况你可以用裁剪后的目标区域样本对模型做少量微调适配,就能恢复到接近原模型的准确率水平。
内容的提问来源于stack exchange,提问作者Ankit Sachan
相关产品推荐
相关产品推荐

