本文初衷是想自己训练一个人像分割模型,然后使用分割模型进行人像分割。并且为了直观操作,用PyQt来制作界面。
但由于数据集太大,结果只训练迭代到第7轮,测试模型结果不理想。所以这里使用deeplabv3p_xception65_humanseg 人像分割模型。本模型是使用百度自建数据集进行训练,可用于人像分割,支持任意大小的图片输入。
实现功能:输入任意人像图像,自动去除背景并可以指定背景颜色,保存结果图像。
一、界面UI设计:
一个标签用来显示原图,一个标签用来显示结果,三个功能按钮,分别是选择背景颜色、背景去除更换和保存结果图像
二、实现代码:
import sys
import os
from PyQt5 import QtCore,QtGui,QtWidgets
from Ui_removebg import Ui_MainWindow
import cv2
import numpy as np
import paddlehub as hub
class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.btnaction.clicked.connect(self.removebg)
self.btncolor.clicked.connect(self.setcolor)
self.btnsave.clicked.connect(self.saveimg)
self.bgcolor=[255,255,255]
#标签上显示图片
def showimg(self,img,lblimg:QtWidgets.QLabel):
#设置label的大小
lblimg.setFixedSize(self.width()//2-10,self.height()-20)
#转换为QImage格式,并设置label的图片,按比例缩放
qimg=QtGui.QImage(img.data,img.shape[1],img.shape[0],img.shape[1] * 3,QtGui.QImage.Format_BGR888)
lblimg.setPixmap(QtGui.QPixmap.fromImage(qimg).scaled(lblimg.width(),lblimg.height(),QtCore.Qt.KeepAspectRatio))
#设置状态栏显示图片的尺寸
self.statusbar.showMessage('图片尺寸:%d*%d'%(img.shape[1],img.shape[0]))
#设置背景颜色
def setcolor(self):
color=QtWidgets.QColorDialog.getColor()
self.statusbar.showMessage('颜色:%s'%color.name())
self.btncolor.setStyleSheet('QPushButton{background-color:%s}'%color.name())
#返回BGR格式
self.bgcolor=[color.blue(),color.green(),color.red()]
#保存图片
def saveimg(self):
filename=QtWidgets.QFileDialog.getSaveFileName(self,'保存图片','','Image files(*.jpg *.png *.bmp)')
self.statusbar.showMessage(filename[0])
if self.lbldst.pixmap():
self.lbldst.pixmap().save(filename[0])
#cv2.imwrite(filename[0],self.lbldst.pixmap().toImage())
self.statusBar().showMessage('保存完成')
def removebg(self):
#打开文件对话框,选择图片
filename=QtWidgets.QFileDialog.getOpenFileName(self,'选择图片','','Image files(*.jpg *.png *.bmp)')
self.statusbar.showMessage(filename[0])
img=cv2.imread(filename[0])
self.showimg(img,self.lblsrc)
self.statusBar().showMessage('正在分割...')
#交回控制权
QtCore.QCoreApplication.processEvents()
human_seg = hub.Module(name="deeplabv3p_xception65_humanseg")
result = human_seg.segmentation(images=[img])
mask=result[0]["data"]
#去除背景,默认白色
for i in range(mask.shape[0]):
for j in range(mask.shape[1]):
if mask[i,j]==0:
img[i,j,:]=self.bgcolor
#高斯滤波
img=cv2.GaussianBlur(img,(5,5),0)
self.showimg(img,self.lbldst)
self.statusBar().showMessage('分割完成')
if __name__ == '__main__':
app=QtWidgets.QApplication(sys.argv)
mywin=MainWindow()
mywin.setWindowTitle('人像背景去除更换')
mywin.show()
sys.exit(app.exec_())