使用Python一步一步搭建一个深度学习GUI【不定时更新】
纪录自己使用pyqt5搭建的一个深度学习模型训练的操作GUI,包含多种网络类型
本文的网络设计大多数来自于 https://github.com/bubbliiiing?tab=repositories,截取其中关键部分,将训练的脚本设计成可视化的操作界面。
第一步是训练已有的网络结构,包含图像分类、语义分割、目标检测和实例分割。
第二步的话,我觉得是可以加载单独的torch模块进行训练或者自定义的网络结构之类的,但是还不知道怎么做,继续学习吧!
第三步,关于预测功能的实现,应该可以包含图像导入处理、视频流处理、作为服务端接收图像将结果返回客户端等功能。
目标:
包含的任务类型和网络框架:
2024-01-25 实现了语义分割DeepLab、UNet、FCN、PSPNet、SegNet模型的训练。添加HRNet和DANet选项,但是还没有实现。
2024-01-29 实现了图像分类AlexNet、DenseNet、GhostsNet、GoogleNet、MobileNet、ResNet、Shufflenet、Swin_Transformer、VGGNet、Vision_Transformer模型多种版本的训练,仅测试了AlexNet可顺利训练,其余的还没有测试。
保留了Inception、SqueezeNet和EfficientNet选项,但是未实现。
2024-02-07 测试了DenseNet、GhostsNet、GoogleNet、MobileNet都可以正常训练,但是GoogleNet无法实现冻结训练。
2024-05-31 重新调整了一下界面
NetworkTypeParams = [
{
"ID": "图像分类",
"Ranges": [
{"NetworkType": "AlexNet", "Version": ["none"], "Backbones": ["none"]},
{"NetworkType": "DenseNet", "Version": ["16", "19"], "Backbones": ["none"]},
{"NetworkType": "GhostsNet", "Version": ["16", "19"], "Backbones": ["none"]},
{"NetworkType": "GoogleNet", "Version": ["16", "19"], "Backbones": ["none"]},
{"NetworkType": "MobileNet", "Version": ["v2", "v3"], "Backbones": ["none"]},
{"NetworkType": "ResNet", "Version": ["18", "34", "50", "101", "152"], "Backbones": ["none"]},
{"NetworkType": "Shufflenet", "Version": ["g1", "g2", "v2_x0_5", "v2_x1_0", "v2_x1_5", "v2_x2_0"], "Backbones": ["none"]},
{"NetworkType": "Swin_Transformer", "Version": ["tiny", "small", "base"], "Backbones": ["none"]},
{"NetworkType": "VGGNet", "Version": ["11", "13", "16", "19", "11_bn", "13_bn", "16_bn", "19_bn"], "Backbones": ["none"]},
{"NetworkType": "Vision_Transformer", "Version": ["vit_b_16"], "Backbones": ["none"]},
{"NetworkType": "Inception", "Version": ["1.0", "2.0"], "Backbones": ["none"]},
{"NetworkType": "SqueezeNet", "Version": ["1.0", "1.1"], "Backbones": ["none"]},
{"NetworkType": "EfficientNet", "Version": ["B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7"], "Backbones": ["none"]}
],
"默认值": {"NetworkType": "AlexNet", "Version": "none", "Backbones": ["none"]}
},
{
"ID": "目标检测",
"Ranges": [
{"NetworkType": "YOLO", "Version": ["v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8"], "Backbones": ["none"]},
{"NetworkType": "Faster R-CNN", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "SSD", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "RetinaNet", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "R-FCN", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "CornerNet", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "CenterNet", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "Other", "Version": ["1.0"], "Backbones": ["none"]}
],
"默认值": {"NetworkType": "YOLO", "Version": "v1", "Backbones": ["none"]}
},
{
"ID": "语义分割",
"Ranges": [
{"NetworkType": "DeepLab", "Version": ["1.0", "2.0", "3.0", "3.0+"], "Backbones": ["mobilenet", "xception"]},
{"NetworkType": "UNet", "Version": ["1.0"], "Backbones": ["vgg", "resnet50"]},
{"NetworkType": "FCN", "Version": ["1.0"], "Backbones": ["resnet34", "vgg16"]},
{"NetworkType": "PSPNet", "Version": ["1.0"], "Backbones": ["mobilenet", "resnet50"]},
{"NetworkType": "SegNet", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "HRNet", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "DANet", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "Other", "Version": ["1.0"], "Backbones": ["none"]}
],
"默认值": {"NetworkType": "DeepLab", "Version": "3.0+", "Backbones": ["none"]}
},
{
"ID": "实例分割",
"Ranges": [
{"NetworkType": "Mask R-CNN", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "FCIS", "Version": ["2.0"], "Backbones": ["none"]},
{"NetworkType": "HTC", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "BlendMask", "Version": ["2.0"], "Backbones": ["none"]},
{"NetworkType": "PolarMask", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "YOLACT", "Version": ["1.0"], "Backbones": ["none"]},
{"NetworkType": "Other", "Version": ["1.0"], "Backbones": ["none"]}
],
"默认值": {"NetworkType": "Mask R-CNN", "Version": "1.0", "Backbones": ["none"]}
}
]
界面设计的大概布局:
2024-01-29:实现了图像分类,好像需要通过脚本对数据集进行划分,那要不要在界面上添加一个数据集拆分的功能呢?先加一个页面进去再说。

当前运行的效果

没能把控制台的输出完全的转到界面上,**显示的字符不能和控制台那样对齐,另外tqdm的进度也转移不了 **
2024-02-06 通过设置xml格式可以对齐显示了,添加style="white-space: pre-wrap;实现空格显示。
validFormat = '<pre style="white-space: pre-wrap;"><span style="color: deepskyblue;">{}</span></pre>'
warningFormat = '<pre style="white-space: pre-wrap;"><span style="color: orange;">{}</span></pre>'
errorFormat = '<pre style="white-space: pre-wrap;"><span style="color: red;">{}</span></pre>'
def slot_print(self, msg, FormatFlag=1):
if FormatFlag == 1:
self.loginfo_textEdit.append(validFormat.format(msg))
elif FormatFlag == 2:
self.loginfo_textEdit.append(warningFormat.format(msg))
elif FormatFlag == 3:
self.loginfo_textEdit.append(errorFormat.format(msg))

皮肤样式更换

* {
/*设置所有控件的字体大小*/
font-size: 16px;
}
QMainWindow {
background-color:#1e1d23;
}
QWidget#central_widget {
border: 1px solid;
border-top-color: #6E6BE2;
}
QDialog {
background-color:#1e1d23;
}
QColorDialog {
background-color:#1e1d23;
}
QTextEdit {
background-color:#1e1d23;
color: #a9b7c6;
/* 设置行高 */
line-height: 1.2; /* 1.5 倍行高 */
font: normal normal 20px "隶书";
}
QPlainTextEdit {
selection-background-color:#007b50;
background-color:#1e1d23;
border-style: solid;
border-top-color: transparent;
border-right-color: transparent;
border-left-color: transparent;
border-bottom-color: transparent;
border-width: 1px;
color: #a9b7c6;
}
QPushButton,QToolButton{
border-style: solid;
border-top-color: #42404d;
border-right-color: #42404d;
border-left-color: #42404d;
border-bottom-color: #42404d;
border-width: 1px;
border-style: solid;
color: #a9b7c6;
padding: 2px;
background-color: #1e1d23;
}
QPushButton::default{
border-style: inset;
border-top-color: #686479;
border-right-color: #686479;
border-left-color: #686479;
border-bottom-color: #686479;
border-width: 1px;
color: #a9b7c6;
padding: 2px;
background-color: #1e1d23;
}
QToolButton:hover,QPushButton:hover{
border-style: solid;
border-top-color: #686479;
border-right-color: #686479;
border-left-color: #686479;
border-bottom-color: #686479;
border-bottom-width: 2px;
border-style: solid;
color: #FFFFFF;
padding-bottom: 1px;
background-color: #1e1d23;
}
QPushButton:pressed{
border-style: solid;
border-top-color: transparent;
border-right-color: transparent;
border-left-color: transparent;
border-bottom-color: #37efba;
border-bottom-width: 2px;
border-style: solid;
color: #FFFFFF;
padding-bottom: 1px;
background-color: #1e1d23;
}
QPushButton:disabled{
border-style: solid;
border-top-color: transparent;
border-right-color: transparent;
border-left-color: transparent;
border-bottom-color: #808086;
border-bottom-width: 2px;
border-style: solid;
color: #808086;
padding-bottom: 1px;
background-color: #1e1d23;
}
QLineEdit {
border-width: 1px; border-radius: 4px;
border-color: rgb(58, 58, 58);
border-style: inset;
padding: 0 8px;
color: #a9b7c6;
background:#1e1d23;
selection-background-color:#007b50;
selection-color: #FFFFFF;
}
QLabel {
color: #a9b7c6;
qproperty-alignment: AlignRight;
}
QLCDNumber {
color: #37e6b4;
}
QProgressBar {
text-align: center;
color: rgb(240, 240, 240);
border-width: 1px;
border-radius: 10px;
border-color: rgb(58, 58, 58);
border-style: inset;
background-color:#1e1d23;
}
QProgressBar::chunk {
background-color: #04b97f;
border-radius: 5px;
}
QMenuBar#menubar {
background-color: #1e1d23;
border: 1px solid;
border-top-color: #6E6BE2 ;
}
QMenuBar::item {
color: #a9b7c6;
spacing: 3px;
padding: 1px 4px;
background: #1e1d23;
}
QMenuBar::item:selected {
background:#1e1d23;
color: #FFFFFF;
}
QMenu::item:selected {
border-style: solid;
border-top-color: transparent;
border-right-color: transparent;
border-left-color: #04b97f;
border-bottom-color: transparent;
border-left-width: 2px;
color: #FFFFFF;
padding-left:15px;
padding-top:4px;
padding-bottom:4px;
padding-right:7px;
background-color: #1e1d23;
}
QMenu::item {
border-style: solid;
border-top-color: transparent;
border-right-color: transparent;
border-left-color: transparent;
border-bottom-color: transparent;
border-bottom-width: 1px;
border-style: solid;
color: #a9b7c6;
padding-left:17px;
padding-top:4px;
padding-bottom:4px;
padding-right:7px;
background-color: #1e1d23;
}
QMenu{
background-color:#1e1d23;
}
QTabWidget {
color:rgb(0,0,0);
background-color:#1e1d23;
}
QTabWidget::tab-bar {
alignment: center;
}
QTabWidget::pane {
border-color: rgb(77,77,77);
background-color:#1e1d23;
border-style: solid;
border-width: 1px;
border-radius: 6px;
}
QTabBar::tab {
border-style: solid;
border-top-color: transparent;
border-right-color: transparent;
border-left-color: transparent;
border-bottom-color: transparent;
border-bottom-width: 1px;
border-style: solid;
color: #808086;
padding: 3px;
margin-left:3px;
background-color: #1e1d23;
}
QTabBar::tab:selected, QTabBar::tab:last:selected, QTabBar::tab:hover {
border-style: solid;
border-top-color: transparent;
border-right-color: transparent;
border-left-color: transparent;
border-bottom-color: #04b97f;
border-bottom-width: 2px;
border-style: solid;
color: #FFFFFF;
padding-left: 3px;
padding-bottom: 2px;
margin-left:3px;
background-color: #1e1d23;
}
QCheckBox {
color: #a9b7c6;
padding: 2px;
}
QCheckBox:disabled {
color: #808086;
padding: 2px;
}
QCheckBox:hover {
border-radius:4px;
border-style:solid;
padding-left: 1px;
padding-right: 1px;
padding-bottom: 1px;
padding-top: 1px;
border-width:1px;
border-color: rgb(87, 97, 106);
background-color:#1e1d23;
}
QCheckBox::indicator:checked {
height: 10px;
width: 10px;
border-style:solid;
border-width: 1px;
border-color: #04b97f;
color: #a9b7c6;
background-color: #04b97f;
}
QCheckBox::indicator:unchecked {
height: 10px;
width: 10px;
border-style:solid;
border-width: 1px;
border-color: #04b97f;
color: #a9b7c6;
background-color: transparent;
}
QRadioButton {
color: #a9b7c6;
background-color: #1e1d23;
padding: 1px;
}
QRadioButton::indicator:checked {
height: 10px;
width: 10px;
border-style:solid;
border-radius:5px;
border-width: 1px;
border-color: #04b97f;
color: #a9b7c6;
background-color: #04b97f;
}
QRadioButton::indicator:!checked {
height: 10px;
width: 10px;
border-style:solid;
border-radius:5px;
border-width: 1px;
border-color: #04b97f;
color: #a9b7c6;
background-color: transparent;
}
QStatusBar {
color:#027f7f;
}
QSpinBox {
color: #a9b7c6;
background-color: #1e1d23;
}
QDoubleSpinBox {
color: #a9b7c6;
background-color: #1e1d23;
}
QTimeEdit {
color: #a9b7c6;
background-color: #1e1d23;
}
QDateTimeEdit {
color: #a9b7c6;
background-color: #1e1d23;
}
QDateEdit {
color: #a9b7c6;
background-color: #1e1d23;
}
QComboBox {
color: #a9b7c6;
background: #1e1d23;
}
QComboBox#mysql_table_selector {
color: #a9b7c6;
background: #1e1d23;
border-color: #04b97f;
}
QComboBox:editable {
background: #1e1d23;
color: #a9b7c6;
selection-background-color: #1e1d23;
}
QComboBox QAbstractItemView {
color: #a9b7c6;
background: #1e1d23;
selection-color: #FFFFFF;
selection-background-color: #1e1d23;
}
QComboBox:!editable:on, QComboBox::drop-down:editable:on {
color: #a9b7c6;
background: #1e1d23;
}
QFontComboBox {
color: #a9b7c6;
background-color: #1e1d23;
}
QToolBox {
color: #a9b7c6;
background-color: #1e1d23;
}
QToolBox::tab {
color: #a9b7c6;
background-color: #1e1d23;
}
QToolBox::tab:selected {
color: #FFFFFF;
background-color: #1e1d23;
}
QScrollArea {
color: #1e1d23;
background-color: #1e1d23;
}
QSlider::groove:horizontal {
height: 5px;
background: #04b97f;
}
QSlider::groove:vertical {
width: 5px;
background: #04b97f;
}
QSlider::handle:horizontal {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f);
border: 1px solid #5c5c5c;
width: 14px;
margin: -5px 0;
border-radius: 7px;
}
QSlider::handle:vertical {
background: qlineargradient(x1:1, y1:1, x2:0, y2:0, stop:0 #b4b4b4, stop:1 #8f8f8f);
border: 1px solid #5c5c5c;
height: 14px;
margin: 0 -5px;
border-radius: 7px;
}
QSlider::add-page:horizontal {
background: white;
}
QSlider::add-page:vertical {
background: white;
}
QSlider::sub-page:horizontal {
background: #04b97f;
}
QSlider::sub-page:vertical {
background: #04b97f;
}
QGroupBox {
background-color:#1e1d23;
/* 边框 */
border: 2px solid rgb(77,77,77);;
/* 倒角 */
border-radius: 4px;
/* 就像墙上挂着的两个相框,margin指的是相框与相框的距离
padding指的是每个相框里照片与相框边框的距离 */
margin-top: 20px;
}
/* 标题设置 */
QGroupBox::title {
/* 位置 */
subcontrol-origin: margin;
subcontrol-position: top center;
/* 内边框,上下和左右 */
/*padding: 10px 15px;*/
/* 颜色 */
/*background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #FF0ECE, stop: 1 #FFFFFF);*/
color: #FFFFFF;
}
/*表格的一种美化方式*/
QTableWidget
{
background: #303033;
}
QTableWidget::item
{
color:rgba(255,255,255,150);
background: #303033;
text-align:center;
}
QTableWidget::item:hover
{
color:#FFFFFF;
background: #4B4B4D;
}
QTableWidget::item:selected
{
color:#FFFFFF;
background: #4B4B4D;
}
QHeaderView::section,QTableCornerButton:section
{
text-align:center;
padding:3px;
margin:0px;
color:#DCDCDC;
border:1px solid #242424;
border-left-width:0px;
border-right-width:1px;
border-top-width:0px;
border-bottom-width:1px;
background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464,stop:1 #525252);
}
QHeaderView::section:selected
{
color:#FFFFFF;
border:1px solid #242424;
}
QScrollBar:vertical{
width:8px;
border-style:flat;
border-radius: 4px;
border:0px;
background: #19191A;
}
QScrollBar::handle:vertical{
background: rgba(255,255,255,0.50);
border-radius: 4px;
width:8px;
min-height:91px;
border-style:flat;
}
QScrollBar::handle:vertical::hover{
background: rgba(255,255,255,0.90);
border-radius: 4px;
width:8px;
}
QScrollBar::handle:vertical::pressed{
background: rgba(255,255,255,0.90);
border-radius:4px;
width:8px;
}
QScrollBar::sub-page:vertical {
background: #19191A;
border-style:flat;
}
QScrollBar::add-page:vertical {
background: #19191A;
border-style:flat;
}
QScrollBar::add-line:vertical{
background: #19191A;
}
QScrollBar::sub-line:vertical {
background: #19191A;
}
QScrollBar:horizontal{
height:8px;
border-style:flat;
border-radius: 4px;
border:0px;
background: #19191A;
}
QScrollBar::handle:horizontal{
background: rgba(255,255,255,0.50);
border-radius: 4px;
height:8px;
min-width:91px;
border-style:flat;
}
QScrollBar::handle:horizontal::hover{
background: rgba(255,255,255,0.90);
border-radius: 4px;
height:8px;
}
QScrollBar::handle:horizontal::pressed{
background: rgba(255,255,255,0.90);
border-radius:4px;
height:8px;
}
QScrollBar::sub-page:horizontal {
background: #19191A;
border-style:flat;
}
QScrollBar::add-page:horizontal {
background: #19191A;
border-style:flat;
}
QScrollBar::sub-line:horizontal {
background: #19191A;
}
QScrollBar::add-line:horizontal{
background: #19191A;
}
QVBoxLayout {
background-color: rgba(255,255,255,0.90);
}
QDateTimeEdit{
background:transparent;
border:1px solid rgb(82,143,199);
border-radius:2px;
min-height:26px;
max-height:26px;
}
QCalendarWidget{
background-color:#FFFFFF;
border: 1px solid #1e1d23;
}
QCalendarWidget QAbstractItemView:enabled{
color:#1e1d23;
background-color:#ffffff;
selection-color: white;
selection-background-color:#1e1d23;
}
QCalendarWidget QSpinBox#qt_calendar_yearedit{
background:#1e1d23;
height:24px;
width:100px;
selection-background-color:#1e1d23;
}
QCalendarWidget QToolButton{
background-color:#FFFFFF;
height:24px;
width:100px;
color:#1e1d23;
}
QCalendarWidget QToolButton:hover{
border: 1px solid #1e1d23;
}
QCalendarWidget QToolButton::menu-indicator#qt_calendar_monthbutton{
subcontrol-position: right center;
subcontrol-origin: padding;
}
QCalendarWidget QToolButton QMenu{
background-color:#FFFFFF;
width:125px;
border:1px solid #1e1d23;
}
QCalendarWidget QToolButton QMenu::item:selected{
color:#FFFFFF;
background:#1e1d23;
}
皮肤的使用方法
if name == “main”:
app = QApplication(sys.argv)
ui = MainCode()
styleFile = r’.\skin_qss\MyQSS.qss’
qssStyle = CommonHelper.readQss(styleFile)
ui.setStyleSheet(qssStyle)
ui.show()
sys.exit(app.exec_())
更多推荐
所有评论(0)