Python Pytorch中带边界的PIL图像的有效增强

Python Pytorch中带边界的PIL图像的有效增强,python,image,pytorch,python-imaging-library,Python,Image,Pytorch,Python Imaging Library,我正在尝试对一些评估图像具有以下两种类型之一的边界的图像进行分类:白色矩形或黑色圆形 因此,我想看看是否可以通过随机增加一些带有边框的训练图像来提高模型的性能。这些图像作为PIL图像加载,我正在使用Pytorch 目前,我有以下代码: 等级边界变压器(火炬模块): 定义初始值(自身,黑色p=0.05,白色p=0.01,白色边框p=0.05): """ Args: black_p(float):添加黑色圆边框的概率 白色p(浮动):在以下情况下添加白色矩形边框的概率: 未添加黑色圆圈边框 白边属性

我正在尝试对一些评估图像具有以下两种类型之一的边界的图像进行分类:白色矩形或黑色圆形

因此,我想看看是否可以通过随机增加一些带有边框的训练图像来提高模型的性能。这些图像作为PIL图像加载,我正在使用Pytorch

目前,我有以下代码:

等级边界变压器(火炬模块):
定义初始值(自身,黑色p=0.05,白色p=0.01,白色边框p=0.05):
"""
Args:
black_p(float):添加黑色圆边框的概率
白色p(浮动):在以下情况下添加白色矩形边框的概率:
未添加黑色圆圈边框
白边属性(浮动):要在关系中添加的白边比例
到img。如果为0.1,将添加白色边框
图像的10%到每一侧。
"""
super()。\uuuu init\uuuuu()
self.white\u p=白色
self.black\u p=黑色
断言白色边框属性<0.5,“不能添加大于完整图像的白色边框”
self.white\u border\u prop=白色\u border\u prop
self.black_索引=无
self.to_tensor=transforms.ToTensor()
self.to_pil=transforms.ToPILImage()
def白色方形边框(自身,img):
"""
Args:
img(PIL图像):输入图像。
返回:
PIL图像:白色矩形边框图像。
"""
img_张量=自-至-张量(img).至(设备)
_,宽度,高度=img_张量。大小()
h_border=int(self.white_border_prop*width)
v_border=int(self.white_border_prop*高度)
#按顺序设置左、右、上、下边框
img_张量[:,:h_边界,:]=1.0
img_张量[:,宽度-h_边界:,:]=1.0
img_张量[:,:,:v_边界]=1.0
img_张量[:,:,高度-v_边框:]=1.0
返回自我到pil(img张量)
def_计算_黑色_索引(自、暗):
"""
Args:
dim(int):图像的高度和宽度
返回:
无,但将self.black_索引设置为大小为(3,dim,dim)的张量
其中值在圆外为真,在圆内为假。
"""
黑色指数=火炬零点([3,尺寸,尺寸],数据类型=布尔)
中心=火炬张量([dim//2,dim//2])
最大长度=火炬张量(尺寸**2.0)
对于范围内的x(尺寸):
对于范围内的y(变暗):
vec=中心-火炬张量([x,y])
是否在圆外=(vec*vec).sum()>max\u len
黑色指数[:,x,y]=在圆外
self.black\u索引=black\u索引
def黑色圆圈边框(自身,img):
"""
Args:
img(PIL图像):输入图像。
返回:
PIL图像:黑色圆形边框图像。
"""
img_张量=自张量(img)
_,宽度,高度=img_张量。大小()
如果self.black_索引为无:
self.black_索引=self._计算_black_索引(宽度)
img_张量[自黑指数]=0.0
返回自我到pil(img张量)
def前进(自身、img):
"""
Args:
img(PIL图像):输入图像。
返回:
PIL图像:带边框的图像。
"""
如果火炬等级(1)
虽然这似乎是可行的,但它的速度也非常缓慢(使训练时间比没有增援的训练时间长3-4倍)。我怀疑这是由于先转换成张量,然后再转换成π


如何编写代码以高效的方式完成类似的事情?

我可能遗漏了一些东西,但为什么需要将其转换为张量,然后再转换回PIL?我猜你的数据最终会被转换成张量,放入pytorch神经网络中,那么是什么阻止你在你的
组合中的
传感器
转换后应用这个转换呢?顺便说一句,您可以删除对
nn.Module
的继承,并将
转发
替换为
\uuuuu调用
,以便能够像使用任何其他pythor模块一样使用此对象。原因是,我有一些转换后,要求图像是在PIL格式,而不是张量。谢谢你提供的
\uuuuu call\uuuuu
提示。顺便说一句,我对PyTorch一无所知,但是如果你想在图像中添加边框,这可能会有所帮助。。。您可以尝试不使用
pytorch
而使用
numpy
执行相同的操作。