python 图加载预处理 图片短的俩侧加黑边成正方形

        在训练好的resnet模型进行红绿灯分类测试时发现效果好差,有40%的图片没有分类正确.这就离谱了,验证集明明95%以上的.分析了好多原因最后发现是测试样本和训练验证集合之间的差距.

训练和验证集合样本尺寸都是正方形,如下所示

python 图加载预处理 图片短的俩侧加黑边成正方形_第1张图片

BUT,测试的数据集是这样子的

明眼人应该都已经看到差距啦.

下面就是在加载测试集时候加了个图像预处理步骤,在transform.compose里面

单独执行的代码如下cv2版本的.(一开始搞错了我的数据集是PIL打开图像的)

import cv2
import os
import numpy as np
def get_resize_square(input,output):#,output
    for filename in os.listdir(input):
        image_path=input+'/'+filename
        image=cv2.imread(image_path)
        x=image.shape[1]##宽度
        y=image.shape[0]##高度

        target = max(x,y)
        BLACK=[0, 0, 0]
        a = (target - x) / 2
        b = (target - y) / 2
        constant = cv2.copyMakeBorder(image, int(b), int(b), int(a), int(a), cv2.BORDER_CONSTANT, value=BLACK)
        return constant
if __name__=='__main__':
    input_image_dir=r'/home/xys/CloundShiProjects/traffic_light/trafficlight_classify/t'
    output_dir=r'/home/xys/CloundShiProjects/traffic_light/trafficlight_classify'
    get_resize_square(input_image_dir,output_dir)

最后没办法又写了一个PIL版本的:

from PIL import Image
def preprocess(pil_file):
    w, h = pil_file.size
    target = max(w,h)
    image1 = Image.new("RGB", (target, target))
    if h >= w:
        pad_w = int((target - w) / 2)
        image1.paste(pil_file,(pad_w, 0))
    else:
        pad_h = int((target - h) / 2)
        image1.paste(pil_file, (0, pad_h))
    return image1

if __name__ == "__main__":
    pil_image = Image.open('/home/xys/CloundShiProjects/traffic_light/trafficlight_classify/data/feijidongchedeng/8_516_9c4a497c-c019-48e8-b381-fd3fe247c7a1_1.jpg')
    array_image = preprocess(pil_image)
    array_image.show()
    array_image.save('/home/xys/CloundShiProjects/traffic_light/trafficlight_classify/test-筛选/0.jpg')

这样最终测试结果还算可以!

你可能感兴趣的:(模型训练测试,深度学习,python,opencv,分类,目标检测)