基于Pytorch框架的深度学习HRnet网络人像语义分割系统源码

本文主要是介绍基于Pytorch框架的深度学习HRnet网络人像语义分割系统源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  第一步:准备数据

头发分割数据,总共有5711张图片,里面的像素值为0和1,所以看起来全部是黑的,不影响使用

第二步:搭建模型

计算机视觉领域有很多任务是位置敏感的,比如目标检测、语义分割、实例分割等等。为了这些任务位置信息更加精准,很容易想到的做法就是维持高分辨率的feature map,事实上HRNet之前几乎所有的网络都是这么做的,通过下采样得到强语义信息,然后再上采样恢复高分辨率恢复位置信息(如下图所示),然而这种做法,会导致大量的有效信息在不断的上下采样过程中丢失。而HRNet通过并行多个分辨率的分支,加上不断进行不同分支之间的信息交互,同时达到强语义信息和精准位置信息的目的。

recover high resolution

思路在当时来讲,不同分支的信息交互属于很老套的思路(如FPN等),我觉得最大的创新点还是能够从头到尾保持高分辨率,而不同分支的信息交互是为了补充通道数减少带来的信息损耗,这种网络架构设计对于位置敏感的任务会有奇效。

第三步:代码

1)损失函数为:交叉熵损失函数

2)网络代码:

import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as Ffrom .backbone import BN_MOMENTUM, hrnet_classificationclass HRnet_Backbone(nn.Module):def __init__(self, backbone = 'hrnetv2_w18', pretrained = False):super(HRnet_Backbone, self).__init__()self.model    = hrnet_classification(backbone = backbone, pretrained = pretrained)del self.model.incre_modulesdel self.model.downsamp_modulesdel self.model.final_layerdel self.model.classifierdef forward(self, x):x = self.model.conv1(x)x = self.model.bn1(x)x = self.model.relu(x)x = self.model.conv2(x)x = self.model.bn2(x)x = self.model.relu(x)x = self.model.layer1(x)x_list = []for i in range(2):if self.model.transition1[i] is not None:x_list.append(self.model.transition1[i](x))else:x_list.append(x)y_list = self.model.stage2(x_list)x_list = []for i in range(3):if self.model.transition2[i] is not None:if i < 2:x_list.append(self.model.transition2[i](y_list[i]))else:x_list.append(self.model.transition2[i](y_list[-1]))else:x_list.append(y_list[i])y_list = self.model.stage3(x_list)x_list = []for i in range(4):if self.model.transition3[i] is not None:if i < 3:x_list.append(self.model.transition3[i](y_list[i]))else:x_list.append(self.model.transition3[i](y_list[-1]))else:x_list.append(y_list[i])y_list = self.model.stage4(x_list)return y_listclass HRnet(nn.Module):def __init__(self, num_classes = 21, backbone = 'hrnetv2_w18', pretrained = False):super(HRnet, self).__init__()self.backbone       = HRnet_Backbone(backbone = backbone, pretrained = pretrained)last_inp_channels   = np.int(np.sum(self.backbone.model.pre_stage_channels))self.last_layer = nn.Sequential(nn.Conv2d(in_channels=last_inp_channels, out_channels=last_inp_channels, kernel_size=1, stride=1, padding=0),nn.BatchNorm2d(last_inp_channels, momentum=BN_MOMENTUM),nn.ReLU(inplace=True),nn.Conv2d(in_channels=last_inp_channels, out_channels=num_classes, kernel_size=1, stride=1, padding=0))def forward(self, inputs):H, W = inputs.size(2), inputs.size(3)x = self.backbone(inputs)# Upsamplingx0_h, x0_w = x[0].size(2), x[0].size(3)x1 = F.interpolate(x[1], size=(x0_h, x0_w), mode='bilinear', align_corners=True)x2 = F.interpolate(x[2], size=(x0_h, x0_w), mode='bilinear', align_corners=True)x3 = F.interpolate(x[3], size=(x0_h, x0_w), mode='bilinear', align_corners=True)x = torch.cat([x[0], x1, x2, x3], 1)x = self.last_layer(x)x = F.interpolate(x, size=(H, W), mode='bilinear', align_corners=True)return x

第四步:统计一些指标(训练过程中的loss和miou)

第五步:搭建GUI界面

第六步:整个工程的内容

有训练代码和训练好的模型以及训练过程,提供数据,提供GUI界面代码

代码见:基于Pytorch框架的深度学习HRnet网络人像语义分割系统源码

有问题可以私信或者留言,有问必答

这篇关于基于Pytorch框架的深度学习HRnet网络人像语义分割系统源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124401

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”