
最近突然的就喜欢上"学猫叫" 这首歌了,真的是说不上为什么,就是不断的单曲循环了呀,哎呀呀,我们一起学猫叫,一起喵喵喵....
学完猫叫,继续工作了,今天的主题,主要记录下一个实验心得把,没什么难点,最近真的是和这个图像杠上 了,一个不注意,图像预处理的结果就让你整个过程白费力
假设现在你要训练一个模型,识别图像中的对象是什么(分类问题),数据由图像和图像的mask图组成,也就是mask就是图像的label,现在处理的方法是,根据mask区域,裁剪图像中的区域进行训练,在训练的时候我需要设置对图像进行随机旋转(数据增强,做AI的都知道,一般都需要做增强),这个时候就分两个情况:
- 图像旋转, mask图不旋转
- 图像,mask同步旋转
我最开始的方法就是只是图像旋转,mask不旋转,然后求mask的外接正方形(不清楚的同学可以参考https://www.jianshu.com/p/9ab6ad90c834),根据正方形坐标裁剪原图去训练,这样训练模型也能有很好的精度,但是根据实际的数据情况,有些数据对于很小的差异也很明显,如果旋转角度大的话,裁剪的图像内容差距更明显了,这时候训练数据质量上就不是那么好了
下面举个两个实际的例子,绿色线表示mask图不旋转,蓝色线表示mask也旋转,
旋转15度角裁剪:

旋转45度角裁剪:

明显可以看到,mask图不旋转的时候,随着旋转角度增加,裁剪的特征区域并不完整,如果特征区域本身就很小的话,那能裁剪到的真实特征就更小了
不想吐槽自己了,这么小的问题自己开始处理数据的时候都没注意到,谨以此篇,记录自己的傻蛋时刻,emmmmmmm...
附上代码,有兴趣的同学可以自己传入一张图片测试一下效果
import cv2
import numpy as np
import matplotlib.pylab as plt
def coors(mask_arr):
gray = cv2.cvtColor(mask_arr, cv2.COLOR_BGR2GRAY)
# 寻找轮廓
bimg, contours, c = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
rectangle_coor = []
for cidx, cnt in enumerate(contours):
x0, y0, w, h = cv2.boundingRect(cnt)
rectangle_coor.append([x0, y0, x0 + w, y0 + h])
return rectangle_coor
def rorate_mask(test_img, test_mask, angle=45):
"""
图像和mask图都旋转
:param test_img: str,测试图像
:param test_mask: str,测试图像的mask
:param angle: int,旋转整数
:return: list,mask区域的外接正方形坐标[xmin,ymin,w,h]
"""
img = cv2.imread(test_img)
img = img[:,:,::-1]
img_shape = img.shape
mask = cv2.imread(test_mask)
h,w = img_shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
tta_img = cv2.warpAffine(img, M, (w, h)) # 旋转原图
tta_mask = cv2.warpAffine(mask, M, (w, h)) # 旋转mask
coor = coors(tta_mask)
return tta_img, coor
def origin_mask(test_img, test_mask, angle=45):
"""
图像旋转, mask不旋转
:param test_img: str,测试图像
:param test_mask: str,测试图像的mask
:param angle: int,旋转整数
:return: list,mask区域的外接正方形坐标[xmin,ymin,w,h]
"""
img = cv2.imread(test_img)
img = img[:,:,::-1]
img_shape = img.shape
mask = cv2.imread(test_mask)
h,w = img_shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
tta_img = cv2.warpAffine(img, M, (w, h)) # 旋转原图
coor = coors(mask)
return tta_img, coor
def show_img():
tta_img, coors = rorate_mask
# tta_img, coors = origin_mask
for i, coor in enumerate(coors[0]):
cv2.rectangle(tta_img, (coor[0], coor[1]), (coor[2], coor[3]), (0, 0, 255), 2)
fig, axes = plt.subplots(nrows=1, ncols=2,
figsize=(16, 12))
fig.subplots_adjust(hspace=0.5, wspace=0.3)
plt.subplot(2, 2, 1)
plt.imshow(tta_img)
plt.title("origin picture")
在科学面前,还是实验大于想象把,emmmmmm......
回家学猫叫去了...
网友评论