jjzjj

搭建自己的语义分割平台deeplabV3+

浅念念52 2024-02-10 原文

文章目录


前言

在上一篇主要了解了语义分割,实例分割,全景分割的区别,以及labelme标注的数据进行转换,这边文章主要是通过deeplabV3+ 构建自己的语义分割平台

一、deeplabV3+


上图所示,是deeplabV3+的主体框架,简单来说就是编码,解码的过程。将输入的图片通过DCNN深度卷积神经网络,获得两个有效的特征层(浅层)(深层)对深层特征层进行ASPP(利用不同膨胀率的膨胀卷积进行特征提取,然后对特征进行堆叠,通过1X1卷积调整通道数,得到最终的特征)将高语义的特征信息经过上采样与浅层特征进行特征融合,在进行3X3的卷积,然后通过1*1卷积进行通道数的调整,调整成num_class(分类数)进行上采样使得最终输出层,宽高与输入图片一样,得到每一个像素点的每一个种类。

二、数据准备

1.我们首先要对数据进行一些处理

JPEGImages 存放的是图片

SegmentationClass 存放的是mask掩码图像

ImageSets 存放是一些txt文件

三、修改代码

1.根目录下的mypath.py文件

2.dataloaders\datasets创建自己的数据集文件hat.py
复制这一路径下的pascal.py文件

3.dataloaders/utils.py


4.dataloaders/__init__.py


5.train.py

四、开始训练

一些主要的参数



然后就可以直接训练了:

也可以搭载服务器进行训练,可以看我之前的文章。

五、测试

训练完成之后,就可以进行测试了,下面直接看代码。

import torch
from modeling.deeplab_v3_50_modify_256 import deeplab_v3_50
import glob
import cv2
import os
from modeling.deeplab import *

from PIL import Image
from torchvision import transforms
from dataloaders.utils import  *
from utils.saver import save_colored_mask
num_class=3

path = 'test_image'
out_path='out_image'

test_images = glob.glob(os.path.join(path,"*.jpg"))

composed_transforms = transforms.Compose([transforms.ToTensor()])
totensor = transforms.ToTensor()

model=DeepLab(num_classes=num_class,backbone='drn')
model.load_state_dict(torch.load(r'D:\xiangmu\deeplaV3_run\run_hat\hat\deeplab-drn\model_best.pth.tar')['state_dict'])
model.eval()

def Normalize(img,mean,std):
    img = np.array(img).astype(np.float32)
    img /= 255.0
    img -= mean
    img /=std
    return img


for test_image in test_images:
    name=os.path.basename(test_image)
    name=name.replace('jpg','png')


    img = Image.open(test_image)
    img_norm = Normalize(img,mean=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225))
    img_resize = cv2.resize(img_norm,(513,513))
    compose = composed_transforms(img_resize).unsqueeze(0)
    out = model(compose)
    pred=torch.argmax(out,1)[0].numpy()
    H,W=img_norm.shape[0],img_norm.shape[1]
    pred_orgin=cv2.resize(pred,(W,H),interpolation=cv2.INTER_NEAREST)
    out_file=os.path.join(out_path,name)
    save_colored_mask(pred_orgin,out_file)
    print('save {} 测试完成'.format(out_file))

测试的结果:

有关搭建自己的语义分割平台deeplabV3+的更多相关文章

  1. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

  2. ruby - 使用 cedet 语义 wisent-ruby - 2

    我刚刚开始按照包括AlexOtt在内的各种指南设置cedet。这是我的init文件中目前的内容。(require'cedet)(semantic-load-enable-code-helpers);;imenubreaksifIdon'tenablethis(global-semantic-highlight-func-mode1)(global-semantic-tag-folding-mode)我非常喜欢代码折叠,因为语义比hideshow等包更了解代码我想对ruby​​进行相同的折叠。我知道cedet还可以做其他事情,但我现在只是试一试。所以我在contrib/文件夹中看到了wi

  3. ruby - 如何构建自己的自定义 session 存储类? - 2

    默认情况下,session存储在浏览器cookie(:cookie_store)中,但您也可以指定其他包含的存储之一(:active_record_store、:mem_cache_store或您自己的自定义类。请提供我构建自定义类的方式config.action_controller.session_store=:your_customer_class 最佳答案 MaurícioLinhares是正确的,但是,我想添加一些细节,因为我认为您需要实现哪些方法并不明显。你可以继承自ActionDispatch::Session::Ab

  4. ruby - 为什么 Gemfile 语义版本控制运算符 (~>) 会产生与一个数字不一致的结果? - 2

    gemspec语义版本控制运算符~>(又名twiddle-wakka,又名pessimistic运算符)允许限制gem版本但允许进行一些升级。我经常看到它可以读作:"~>3.1"=>"Anyversion3.x,butatleast3.1""~>3.1.1"=>"Anyversion3.1.x,butatleast3.1.1"但是有了一个数字,这条规则就失效了:"~>3"=>"Anyversionx,butatleast3"*NOTTRUE!*"~>3"=>"Anyversion3.x"*True.Butwhy?*如果我想要“任何版本3.x”,我可以只使用“~>3.0”,这是一致的。就

  5. 如何使用手机远程访问自己的电脑? - 2

    手机访问电脑后AnyViewer可以做什么? 您成功将手机连接到Windows电脑后,然后您可以做任何您想做的事情,例如:查看文件和运行应用程序。电源管理:在远程会话中,点击电源管理,您可以看到三个项目:锁定、重启和关机,供您在不同情况下管理计算机。如果您需要暂时离开远程会话,可以锁定计算机。如果计算机死机,您可以重新启动它,然后再次连接。如果您已完成计算机上的所有工作,您可以使用手机远程关闭它。更改图像质量:当电脑和手机的网络都处于良好状态时,您可以选择高图像质量以获得更好的体验。当网络状况不佳时,您可以选择低图像质量以获得更流畅的操作。     显示桌面:我们无法在手机上按Windows+

  6. ruby - 用逗号将字符串分割成数组,除非逗号在引号内 - 2

    给定一个Ruby数组字符串,其中一些项目在引号中包含逗号:my_string.inspect#=>"\"hey,you\",21"我怎样才能得到一个数组:["hey,you","21"] 最佳答案 Ruby标准CSV库的.parse_csv就是这样做的。require'csv'"\"hey,you\",21".parse_csv#=>["hey,you","21"] 关于ruby-用逗号将字符串分割成数组,除非逗号在引号内,我们在StackOverflow上找到一个类似的问题:

  7. ruby - OpenSSL 验证来自自己 CA 的证书 - 2

    大家好,感谢您花时间阅读本文。我需要验证由我自己的CA颁发的证书,我有一个证书。我怎样才能做相当于openssl的openssl验证-CAfile在Ruby代码中?OpenSSL的RDoc在这方面不是很有帮助。我试过:require'openssl'ca=OpenSSL::X509::Certificate.new(File.read('ca-cert.pem'))lic=OpenSSL::X509::Certificate.new(File.read('cert.pem'))putslic.verify(ca)但我得到:test.rb:7:in`verify':wrongargume

  8. ruby - 为什么我可以在 Ruby 中将一个 undefined variable 赋值给它自己并得到 nil? - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Whya=aisnilinRuby?我们应该说,在Ruby中使用undefinedvariable是“奇怪的现象”。是这样的:#irbsessionfollows#foo#undefinedlocalvariableormethod'foo'bar#samefor'bar'foo=bar#stillsamefor'bar'foo=foo#nil-HUH?foo#isnowsettonil!?为什么我可以在Ruby中将一个undefinedvariable赋值给自身并得到nil?请注意,我在这里使用的是Ruby

  9. ruby - 如何在 heroku 中使用自己的 mysql 数据库服务器? - 2

    我想使用托管在我自己服务器上的mysql数据库。我已经更改了DATABASE_URL和SHARED_DATABASE_URL配置变量以指向我的服务器,但它仍在尝试连接到heroku的amazonaws服务器。我该如何解决? 最佳答案 根据Herokudocumentation,更改DATABASE_URL是正确的方法。Ifyouwouldliketohaveyourrailsapplicationconnecttoanon-Herokuprovideddatabase,youcantakeadvantageofthissamemec

  10. NFT交易平台开发 创建NFT数字藏品平台 - 2

    为什么需要NFT市场?NFTMarketplace允许用户购买、出售、交易、查看或创建自己的NFT,就像他们需要一个市场来购买物理或数字世界中的大多数产品一样。几乎每个人都可以进入NFT市场,但要做到这一点,用户必须满足以下要求:一个NFT市场用户账户,允许您在给定平台上购买NFT。你需要一个与区块链兼容的加密钱包来购买NFT。NFTMarketplace非常重要,因为它连接了买卖双方,并为用户提供了多种工具来快速创建自己的NFT。艺术家可以在市场上列出要出售的NFT,买家可以通过投标过程探索市场并购买物品。NFT市场开发过程解释创建NFT市场是一个耗时的过程,需要编程知识和理解。那么搭建NF

随机推荐