使用深度学习进行图像类任务时,通常网络的输入大小是固定的,最近在进行涉及到文字检测的工作中,由于预处理resize缩小了原图,导致字体变模糊,从而检测失败,后来想到使用overlap来对图像进行缩放裁剪,即先将原图缩放到一定尺寸,再裁剪得到网络的输入。
好了,来说正题,使用yolov3,网络的输入是352x352x3,而输入图像大小为几百上千不等,因此需对原图进行resize,起初直接进行缩放 + 填充,检测的map很低,后来分析发现有些352x352的输入图像中的文字已经很模糊,因此直接缩放的方案不可行,改进后方案如下:
- 原图最大尺寸大于1000,则resize到800x800,再裁剪为9个352x352,overlap为128个像素
- 原图最大尺寸大小500且小于1000,则resize到600x600,再裁剪为4个352x352,overlap为96个像素
- 原图最大尺寸小于500,则resize到352x352。
python实现代码如下,使用了PIL、opencv库,将整个目录下的图像全部做缩放裁剪处理,代码包含如下功能:
- 遍历某一目录的文件
- opencv进行图像载入及保存
- opencv进行缩放裁剪
- PIL进行图像显示
import numpy as np
from PIL import Image
import cv2
import os
#输入bgr通道,并显示图像
def img_show(img):
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #生成numpy数组
print(type(img_rgb), img_rgb.shape)
pil_img = Image.fromarray(img_rgb)
pil_img.show()
#完成图像的等比缩放及黑色填充
def img_resize(cvImageSrc, net_size, width, height):
if (width != net_size or height != net_size):
#宽高的缩放比非常接近时直接进行缩放
if ((net_size / height - net_size / height) < 0.001):
det_mat = cv2.resize(cvImageSrc, (net_size, net_size))
return det_mat
else:
ne