deeplabv3+源码之慢慢解析main.py(1)--get_argparser函数

news2024/11/26 10:20:49

deeplab v3+源码 慢慢解析系列

  1. 本带着一些孩子们做,但本硕能独立看下来的学生不多。
  2. 和孩子们一起再学一遍吧。
  3. 希望孩子们和我自己都能坚持写下去吧。
  4. 网上资料太多了,但不够慢,都是速成,没有足够的解释和补充,希望这次够慢,够清楚吧。

前期准备和说明

提示:源码众多,此次选这个版本pytorch版

  1. 已经会python了(有编写代码的基础)。
  2. 了解深度学习和语义分割都是什么,特别是卷积核、填充等基本概念都已明确。
  3. 本次尽量不讲原理,尽量只说代码。
  4. 每次只说一个函数,进度足够慢,尽量足够简单。

总体目录

提示:下载解压后,总体结构如下,计划是一次说一个代码的一个函数。
在这里插入图片描述

  1. 总体上readme.md说的挺详细的,没必要就翻译一事浪费言语,请自行解决。
  2. requirements.txt的环境,也可自行选择版本吧,具备基本工程经验可以调整即可。
  3. 第一篇从main.py开始。拿到代码,想运行,下载完数据,配置好datasets文件夹,按readme.md操作即可(网络或者b站视频众多,不重复进行这些了)。直接进入代码。

main.py导入

提示:你过去写得最好的一段代码是什么? 请用代码块贴出来
例如:

#以下是基本操作
from tqdm import tqdm
import network
import utils
import os
import random
import argparse   #这个是本篇所讲重点
import numpy as np

#以下是数据部分所需
from torch.utils import data
from datasets import VOCSegmentation, Cityscapes
from utils import ext_transforms as et
from metrics import StreamSegMetrics

#以下是神经网络所需
import torch
import torch.nn as nn

#以下是可视化和图片操作所需
from utils.visualizer import Visualizer
from PIL import Image
import matplotlib
import matplotlib.pyplot as plt
  1. 导入部分,大致分块注释,按此理解即可。
  2. 关于argparse这个包,这篇说的很清楚,建议先看,不再赘述。
  3. 之后按源码顺序每个函数分开说。

参数解析,get_argparser函数

提示:看完上个部分所说的argparse包的相关介绍,再看下面的内容。

def get_argparser():
    parser = argparse.ArgumentParser()

    # Datset Options
    #指定数据集位置,'./datasets/data',后期可以根据自己数据集位置修改。
    parser.add_argument("--data_root", type=str, default='./datasets/data',
                        help="path to Dataset")       
                        
    #指定使用的数据集数据集,此处是['voc', 'cityscapes'],默认'voc',可以改为自己的数据集                    
    parser.add_argument("--dataset", type=str, default='voc',
                        choices=['voc', 'cityscapes'], help='Name of dataset') 
                        
     #数据类别,如VOC默认21类
    parser.add_argument("--num_classes", type=int, default=None,
                        help="num classes (default: None)")              

    # Deeplab Options
    #在network.modeling中提供可选择的模型,如本套代码提供deeplab V3和V3+每种6个具体模型,都是基于4类骨干网的选择(hrnetv2的2个,resnet的2个,mobilenet的1个,xception的1个)。
    available_models = sorted(name for name in network.modeling.__dict__ if name.islower() and \
                              not (name.startswith("__") or name.startswith('_')) and callable(
                              network.modeling.__dict__[name])
                              )                       
    
    # 具体特征提取的(骨干网)模型,此处可选'model' (choose from 'deeplabv3_hrnetv2_32', 'deeplabv3_hrnetv2_48', 'deeplabv3_mobilenet', 'deeplabv3_resnet101', 'deeplabv3_resnet50', 'deeplabv3_xception', 
                    #'deeplabv3plus_hrnetv2_32', 'deeplabv3plus_hrnetv2_48', 'deeplabv3plus_mobilenet', 'deeplabv3plus_resnet101', 'deeplabv3plus_resnet50', 'deeplabv3plus_xception')
    parser.add_argument("--model", type=str, default='deeplabv3plus_mobilenet',
                        choices=available_models, help='model name')    
                    
    #部署剪枝会用到,一开始不用看。ASPP层卷积用
    parser.add_argument("--separable_conv", action='store_true', default=False,
                        help="apply separable conv to decoder and aspp")      
    parser.add_argument("--output_stride", type=int, default=16, choices=[8, 16])

    # Train Options
    #要使用训练,不选
    parser.add_argument("--test_only", action='store_true', default=False) 
    #保存则开启   
    parser.add_argument("--save_val_results", action='store_true', default=False,
                        help="save segmentation results to \"./results\"")  
    #迭代次数                       
    parser.add_argument("--total_itrs", type=int, default=30e3,
                        help="epoch number (default: 30k)")  
    #学习率   
    parser.add_argument("--lr", type=float, default=0.01,
                        help="learning rate (default: 0.01)")    
    parser.add_argument("--lr_policy", type=str, default='poly', choices=['poly', 'step'],
                        help="learning rate scheduler policy")
    parser.add_argument("--step_size", type=int, default=10000)
    #裁剪验证集
    parser.add_argument("--crop_val", action='store_true', default=False,
                        help='crop validation (default: False)')        
    parser.add_argument("--batch_size", type=int, default=16,
                        help='batch size (default: 16)')
    parser.add_argument("--val_batch_size", type=int, default=4,
                        help='batch size for validation (default: 4)')
    #限制图像输入的大小,此处裁剪为513.                    
    parser.add_argument("--crop_size", type=int, default=513)     
    parser.add_argument("--ckpt", default=None, type=str,
                        help="restore from checkpoint")
    parser.add_argument("--continue_training", action='store_true', default=False)
     #focal_loss是一个动态缩放的交叉熵损失,通过一个动态缩放因子,可以动态降低训练过程中易区分样本的权重,从而将重心快速聚焦在那些难区分的样本
    parser.add_argument("--loss_type", type=str, default='cross_entropy',
                        choices=['cross_entropy', 'focal_loss'], help="loss type (default: False)")
                       
    parser.add_argument("--gpu_id", type=str, default='0',
                        help="GPU ID")
    #权重衰减
    parser.add_argument("--weight_decay", type=float, default=1e-4,
                        help='weight decay (default: 1e-4)')      
    parser.add_argument("--random_seed", type=int, default=1,
                        help="random seed (default: 1)")
    parser.add_argument("--print_interval", type=int, default=10,
                        help="print interval of loss (default: 10)")
    parser.add_argument("--val_interval", type=int, default=100,
                        help="epoch interval for eval (default: 100)")
    parser.add_argument("--download", action='store_true', default=False,
                        help="download datasets")

    # PASCAL VOC Options
    parser.add_argument("--year", type=str, default='2012',
                        choices=['2012_aug', '2012', '2011', '2009', '2008', '2007'], help='year of VOC')

    # Visdom options                    #可视化选项,默认不用,但挺好用的。
    parser.add_argument("--enable_vis", action='store_true', default=False,
                        help="use visdom for visualization")
    parser.add_argument("--vis_port", type=str, default='13570',
                        help='port for visdom')
    parser.add_argument("--vis_env", type=str, default='main',
                        help='env for visdom')
    parser.add_argument("--vis_num_samples", type=int, default=8,
                        help='number of samples for visualization (default: 8)')
    return parser

Tips

  1. 解析参数函数很有用,尤其是初期只运行代码时,让你能快速理解readme中第3部分的那些命令。逐一对照参数名字理解即可,如下:
python main.py --model deeplabv3plus_mobilenet --enable_vis --vis_port 28333 --gpu_id 0 --year 2012_aug --crop_val --lr 0.01 --crop_size 513 --batch_size 16 --output_stride 16
  1. 函数中很多参数,在验证性尝试中可能用不上,但没关系,入门学习,要有耐心,第一个函数也就结束了。
  2. 下一个函数是数据集函数get_dataset。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EC200u-cn-4G模块连接OneNet上传GPS定位数据(MQTT协议)

一、前言 这篇文章介绍EC200U-CN 4G模块通过MQTT协议上传GPS数据到OneNet平台,完成地图数据显示的过程。 当前的主控芯片采用MC9S12XS128MAA,通过串口连接EC200U-CN实现联网功能,通过内置的MQTT协议指令,将采集的GPS数据上传到OneNet平台,联合百度地图实现位置显示。 下…

C#(四十七)之关于流的异常

一:Try-catch-finally 声明文件对象要在 Try-catch-finally 结构体外边声明 声明在try中的对象有作用域问题,其并不能影响finally中的程序 在catch中显示程序错误代码。 在finally中释放程序,关闭文件流。 二:using语句 1&a…

启动失败之JDK版本配置不一致

一、java: 警告: 源发行版 17 需要目标发行版 17 1.1.原因 :JDK 版本不对。 这里可以看到,项目需要的是JDK17,而我这里用的是JDK1.8。 1.2.修改 这里有两种操作,一种是修改项目版本,一种是修改JDK版本。无论是哪一种&#xff0…

NSS [SWPUCTF 2022 新生赛]xff

NSS [SWPUCTF 2022 新生赛]xff postman一把梭。

Mysql高级教程第二章

SQL Alias(别名) 通过使用 SQL,可以为列名称和表名称指定别名(Alias)。 SQL Alias 表的 SQL Alias 语法 SELECT column_name(s) FROM table_name AS alias_name 列的 SQL Alias 语法 SELECT column_name AS alia…

UG NX二次开发(C#)-建模-根据特征获取体(或者关联体)

文章目录 1、前言2、创建块特征与UIStyler2.1 创建两个长方体2.2 创建一个UIStyler3、添加获取体的代码1、前言 UG NX的建模是基于特征建模的,比如块、圆柱体、合并操作等等都是特征,都有特征对象,对于具有体的特征,其可以通过NXOpen二次开发技术实现二者的转换,也可以通…

error: exportArchive: No signing certificate \“Mac Development\“ found

error: exportArchive: No signing certificate “Mac Development” found UNIAPP打包又遇到这个问题了, 证书过期续期的时候又遇到这个问题了(之前遇到过解决了,时间长忘了),记录一下,报错信息 error: exportArchive: No signing certificate \"Mac Development\"…

url, uri, urn的区别

URI URI是统一资源标识符(Uniform Resource Identifier)的缩写。它用于标识网络上的逻辑或物理资源。URL和URN是URI的子类型。URL用于定位资源,而URN用于命名资源。 一个URI由以下部分组成 scheme:[//authority]path[?query][#fragment] …

UDP客户端和服务器

UDP客户端,也就是首先主动发送数据的一方,也就是发起服务请求的一方。 UDP服务器,也就是首先等待接收数据,并对接收的数据进行处理,返回计算结果的一方,也就是提供服务的一方。 涉及的函数 ssize_t recvfr…

实现Linux 视频聊天、远程桌面(源码,支持信创环境,可与Windows版、安卓版互通)

有朋友在下载并了解了《C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)》中提供的源码后,留言给我说,这个视频会议有点复杂了,代码比较多,看得有些费劲。问…

嵌入式系统标志的策略和技巧

当在嵌入式系统中使用标志时,可以考虑以下优化措施: 图像压缩:由于嵌入式系统通常具有有限的存储空间,可以使用图像压缩算法来减小标志的文件大小。常见的压缩算法包括JPEG、PNG等,可以根据系统的要求选择合适的压缩算…

Gradle多模块项目搭建完整教程,模块互相依赖,基于springboot开发

1.父项目创建,【com.fdw.hibernate】 2.子项目创建,【com.fdw.study】【com.fdw.parent】 3.最终结构目录 4. 父工程build.gradle plugins {id java }allprojects {// 指定需要的插件// 指定语言apply plugin: java//指定编辑器apply plugin: idea// 配…

漏洞复现Tomcat系列弱口令、CVE-2017-12615、CVE-2020-1938

文章目录 提提神tomcat8 弱口令介绍:复现: Tomcat PUT方法任意写文件漏洞(CVE-2017-12615)介绍:复现: Tomcat AJP 文件包含漏洞(CVE-2020-1938)介绍:复现: 提…

c#/c++ 通过系统api监视文件变化的问题

再分享个比较经典的案例,在很多场景下,我们都要去监视某个文件夹下的文件变化,在创建、修改或删除的时候触发一些行为。众所周知,c#有个实现类叫FileSystemWatcher,可以用来监视目录包括子目录下文件的变化&#xff0c…

亚马逊云科技,定义了生成式AI的生产力

众所周知,要把大模型转化为生产力,AI模型、算力和数据会是难以逾越的门槛。新的目标已经出现,我们是否有了足够强大的AI基础设施?在6月28日上海举行的峰会上,亚马逊云科技展示了这样的能力。 从掀起AI画图热潮的Stabil…

【深度学习笔记】深层神经网络

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记,视频由网易云课堂与 deeplearning.ai 联合出品,主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习,视频的链接如下: 神经网络和…

select 框添加树结构(todu)

1. 案例: 2. 代码 下班了,明天写

蓝桥杯专题-真题版含答案-【马虎的算式】【振兴中华】【黄金连分数】【打印十字图】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

day27-MySQL拓展

0目录 第六章 MySQL拓展 1.MySQL拓展 1.1 事务定义:事务就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有sql都将被取消执行。 1.2 事务ACID原则 (1)原子性 一个事务要么全部提交成功,要么全部…

「深度学习之优化算法」(九)群搜索算法

1. 群搜索算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   群搜索算法(Group Search Optimizer)是一种基于发现者,跟随者,游荡者模型而产生的算法。算法模型较为复杂,提出时间也不长,对于其的深度研究相对较少,但也有一定的应用研究。   在群搜索算法…