|
import os |
|
import io |
|
import numpy as np |
|
import matplotlib.pyplot as plt |
|
from PIL import Image |
|
import paddle |
|
from paddle.nn import functional as F |
|
import random |
|
from paddle.io import Dataset |
|
from visualdl import LogWriter |
|
from paddle.vision.transforms import transforms as T |
|
import warnings |
|
import cv2 as cv |
|
from PIL import Image |
|
import re |
|
warnings.filterwarnings("ignore") |
|
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE" |
|
|
|
class SeparableConv2D(paddle.nn.Layer): |
|
def __init__(self, |
|
in_channels, |
|
out_channels, |
|
kernel_size, |
|
stride=1, |
|
padding=0, |
|
dilation=1, |
|
groups=None, |
|
weight_attr=None, |
|
bias_attr=None, |
|
data_format="NCHW"): |
|
super(SeparableConv2D, self).__init__() |
|
|
|
self._padding = padding |
|
self._stride = stride |
|
self._dilation = dilation |
|
self._in_channels = in_channels |
|
self._data_format = data_format |
|
|
|
|
|
filter_shape = [in_channels, 1] + self.convert_to_list(kernel_size, 2, 'kernel_size') |
|
self.weight_conv = self.create_parameter(shape=filter_shape, attr=weight_attr) |
|
|
|
|
|
filter_shape = [out_channels, in_channels] + self.convert_to_list(1, 2, 'kernel_size') |
|
self.weight_pointwise = self.create_parameter(shape=filter_shape, attr=weight_attr) |
|
self.bias_pointwise = self.create_parameter(shape=[out_channels], |
|
attr=bias_attr, |
|
is_bias=True) |
|
|
|
def convert_to_list(self, value, n, name, dtype=np.int): |
|
if isinstance(value, dtype): |
|
return [value, ] * n |
|
else: |
|
try: |
|
value_list = list(value) |
|
except TypeError: |
|
raise ValueError("The " + name + |
|
"'s type must be list or tuple. Received: " + str( |
|
value)) |
|
if len(value_list) != n: |
|
raise ValueError("The " + name + "'s length must be " + str(n) + |
|
". Received: " + str(value)) |
|
for single_value in value_list: |
|
try: |
|
dtype(single_value) |
|
except (ValueError, TypeError): |
|
raise ValueError( |
|
"The " + name + "'s type must be a list or tuple of " + str( |
|
n) + " " + str(dtype) + " . Received: " + str( |
|
value) + " " |
|
"including element " + str(single_value) + " of type" + " " |
|
+ str(type(single_value))) |
|
return value_list |
|
|
|
def forward(self, inputs): |
|
conv_out = F.conv2d(inputs, |
|
self.weight_conv, |
|
padding=self._padding, |
|
stride=self._stride, |
|
dilation=self._dilation, |
|
groups=self._in_channels, |
|
data_format=self._data_format) |
|
|
|
out = F.conv2d(conv_out, |
|
self.weight_pointwise, |
|
bias=self.bias_pointwise, |
|
padding=0, |
|
stride=1, |
|
dilation=1, |
|
groups=1, |
|
data_format=self._data_format) |
|
|
|
return out |
|
class Encoder(paddle.nn.Layer): |
|
def __init__(self, in_channels, out_channels): |
|
super(Encoder, self).__init__() |
|
|
|
self.relus = paddle.nn.LayerList( |
|
[paddle.nn.ReLU() for i in range(2)]) |
|
self.separable_conv_01 = SeparableConv2D(in_channels, |
|
out_channels, |
|
kernel_size=3, |
|
padding='same') |
|
self.bns = paddle.nn.LayerList( |
|
[paddle.nn.BatchNorm2D(out_channels) for i in range(2)]) |
|
|
|
self.separable_conv_02 = SeparableConv2D(out_channels, |
|
out_channels, |
|
kernel_size=3, |
|
padding='same') |
|
self.pool = paddle.nn.MaxPool2D(kernel_size=3, stride=2, padding=1) |
|
self.residual_conv = paddle.nn.Conv2D(in_channels, |
|
out_channels, |
|
kernel_size=1, |
|
stride=2, |
|
padding='same') |
|
|
|
def forward(self, inputs): |
|
previous_block_activation = inputs |
|
|
|
y = self.relus[0](inputs) |
|
y = self.separable_conv_01(y) |
|
y = self.bns[0](y) |
|
y = self.relus[1](y) |
|
y = self.separable_conv_02(y) |
|
y = self.bns[1](y) |
|
y = self.pool(y) |
|
|
|
residual = self.residual_conv(previous_block_activation) |
|
y = paddle.add(y, residual) |
|
|
|
return y |
|
class Decoder(paddle.nn.Layer): |
|
def __init__(self, in_channels, out_channels): |
|
super(Decoder, self).__init__() |
|
|
|
self.relus = paddle.nn.LayerList( |
|
[paddle.nn.ReLU() for i in range(2)]) |
|
self.conv_transpose_01 = paddle.nn.Conv2DTranspose(in_channels, |
|
out_channels, |
|
kernel_size=3, |
|
padding=1) |
|
self.conv_transpose_02 = paddle.nn.Conv2DTranspose(out_channels, |
|
out_channels, |
|
kernel_size=3, |
|
padding=1) |
|
self.bns = paddle.nn.LayerList( |
|
[paddle.nn.BatchNorm2D(out_channels) for i in range(2)] |
|
) |
|
self.upsamples = paddle.nn.LayerList( |
|
[paddle.nn.Upsample(scale_factor=2.0) for i in range(2)] |
|
) |
|
self.residual_conv = paddle.nn.Conv2D(in_channels, |
|
out_channels, |
|
kernel_size=1, |
|
padding='same') |
|
|
|
def forward(self, inputs): |
|
previous_block_activation = inputs |
|
|
|
y = self.relus[0](inputs) |
|
y = self.conv_transpose_01(y) |
|
y = self.bns[0](y) |
|
y = self.relus[1](y) |
|
y = self.conv_transpose_02(y) |
|
y = self.bns[1](y) |
|
y = self.upsamples[0](y) |
|
|
|
residual = self.upsamples[1](previous_block_activation) |
|
residual = self.residual_conv(residual) |
|
|
|
y = paddle.add(y, residual) |
|
|
|
return y |
|
class PetNet(paddle.nn.Layer): |
|
def __init__(self, num_classes): |
|
super(PetNet, self).__init__() |
|
|
|
self.conv_1 = paddle.nn.Conv2D(3, 32, |
|
kernel_size=3, |
|
stride=2, |
|
padding='same') |
|
self.bn = paddle.nn.BatchNorm2D(32) |
|
self.relu = paddle.nn.ReLU() |
|
|
|
in_channels = 32 |
|
self.encoders = [] |
|
self.encoder_list = [64, 128, 256] |
|
self.decoder_list = [256, 128, 64, 32] |
|
|
|
for out_channels in self.encoder_list: |
|
block = self.add_sublayer('encoder_{}'.format(out_channels), |
|
Encoder(in_channels, out_channels)) |
|
self.encoders.append(block) |
|
in_channels = out_channels |
|
|
|
self.decoders = [] |
|
|
|
for out_channels in self.decoder_list: |
|
block = self.add_sublayer('decoder_{}'.format(out_channels), |
|
Decoder(in_channels, out_channels)) |
|
self.decoders.append(block) |
|
in_channels = out_channels |
|
|
|
self.output_conv = paddle.nn.Conv2D(in_channels, |
|
num_classes, |
|
kernel_size=3, |
|
padding='same') |
|
|
|
def forward(self, inputs): |
|
y = self.conv_1(inputs) |
|
y = self.bn(y) |
|
y = self.relu(y) |
|
|
|
for encoder in self.encoders: |
|
y = encoder(y) |
|
|
|
for decoder in self.decoders: |
|
y = decoder(y) |
|
|
|
y = self.output_conv(y) |
|
return y |
|
IMAGE_SIZE = (512, 512) |
|
num_classes = 2 |
|
network = PetNet(num_classes) |
|
model = paddle.Model(network) |
|
|
|
optimizer = paddle.optimizer.RMSProp(learning_rate=0.001, parameters=network.parameters()) |
|
layer_state_dict = paddle.load("mymodel.pdparams") |
|
opt_state_dict = paddle.load("optimizer.pdopt") |
|
|
|
network.set_state_dict(layer_state_dict) |
|
optimizer.set_state_dict(opt_state_dict) |
|
|
|
def FinalImage(mask,image): |
|
|
|
|
|
|
|
|
|
th = cv.threshold(mask,140,255,cv.THRESH_BINARY)[1] |
|
blur = cv.GaussianBlur(th,(33,33), 15) |
|
heatmap_img = cv.applyColorMap(blur, cv.COLORMAP_OCEAN) |
|
Blendermap = cv.addWeighted(heatmap_img, 0.5, image, 1, 0) |
|
return Blendermap |
|
|
|
import gradio as gr |
|
def Showsegmentation(image): |
|
mask = paddle.argmax(network(paddle.to_tensor([((image - 127.5) / 127.5).transpose(2, 0, 1)]))[0], axis=0).numpy() |
|
mask=mask.astype('uint8')*255 |
|
immask=cv.resize(mask, (512, 512)) |
|
image=cv.resize(image,(512,512)) |
|
blendmask=FinalImage(immask,image) |
|
return blendmask |
|
|
|
gr.Interface(fn=Showsegmentation, inputs="image", outputs="image").launch(share=True) |
|
|