deeplabv3+源码之慢慢解析1 第一章根目录(1)main.py--get_argparser函数

系列文章目录(共五章33节已完结)

第一章deeplabv3+源码之慢慢解析 根目录(1)main.py–get_argparser函数
第一章deeplabv3+源码之慢慢解析 根目录(2)main.py–get_dataset函数
第一章deeplabv3+源码之慢慢解析 根目录(3)main.py–validate函数
第一章deeplabv3+源码之慢慢解析 根目录(4)main.py–main函数
第一章deeplabv3+源码之慢慢解析 根目录(5)predict.py–get_argparser函数和main函数

第二章deeplabv3+源码之慢慢解析 datasets文件夹(1)voc.py–voc_cmap函数和download_extract函数
第二章deeplabv3+源码之慢慢解析 datasets文件夹(2)voc.py–VOCSegmentation类
第二章deeplabv3+源码之慢慢解析 datasets文件夹(3)cityscapes.py–Cityscapes类
第二章deeplabv3+源码之慢慢解析 datasets文件夹(4)utils.py–6个小函数

第三章deeplabv3+源码之慢慢解析 metrics文件夹stream_metrics.py–StreamSegMetrics类和AverageMeter类

第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a1)hrnetv2.py–4个函数和可执行代码
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a2)hrnetv2.py–Bottleneck类和BasicBlock类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a3)hrnetv2.py–StageModule类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a4)hrnetv2.py–HRNet类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(b1)mobilenetv2.py–2个类和2个函数
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(b2)mobilenetv2.py–MobileNetV2类和mobilenet_v2函数
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(c1)resnet.py–2个基础函数,BasicBlock类和Bottleneck类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(c2)resnet.py–ResNet类和10个不同结构的调用函数
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(d1)xception.py–SeparableConv2d类和Block类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(d2)xception.py–Xception类和xception函数
第四章deeplabv3+源码之慢慢解析 network文件夹(2)_deeplab.py–ASPP相关的4个类和1个函数
第四章deeplabv3+源码之慢慢解析 network文件夹(3)_deeplab.py–DeepLabV3类,DeepLabHeadV3Plus类和DeepLabHead类
第四章deeplabv3+源码之慢慢解析 network文件夹(4)modeling.py–5个私有函数(4个骨干网,1个模型载入)
第四章deeplabv3+源码之慢慢解析 network文件夹(5)modeling.py–12个调用函数
第四章deeplabv3+源码之慢慢解析 network文件夹(6)utils.py–_SimpleSegmentationModel类和IntermediateLayerGetter类

第五章deeplabv3+源码之慢慢解析 utils文件夹(1)ext_transforms.py.py–2个翻转类和ExtCompose类
第五章deeplabv3+源码之慢慢解析 utils文件夹(2)ext_transforms.py.py–2个裁剪类和2个缩放类
第五章deeplabv3+源码之慢慢解析 utils文件夹(3)ext_transforms.py.py–旋转类,填充类,张量转化类和标准化类
第五章deeplabv3+源码之慢慢解析 utils文件夹(4)ext_transforms.py.py–ExtResize类,ExtColorJitter类,Lambda类和Compose类
第五章deeplabv3+源码之慢慢解析 utils文件夹(5)loss.py–FocalLoss类
第五章deeplabv3+源码之慢慢解析 utils文件夹(6)scheduler.py–PolyLR类
第五章deeplabv3+源码之慢慢解析 utils文件夹(7)utils.py–去标准化,momentum设定,标准化层锁定和路径创建
第五章deeplabv3+源码之慢慢解析 utils文件夹(8)visualizer.py–Visualizer类(完结)


deeplab v3+源码 慢慢解析系列

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

前期准备和说明

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

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

总体目录

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

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

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. main.py中一共由4个函数组成(get_argparser, get_dataset,validate,main),按源码顺序每个函数分开说。

参数解析,get_argparser函数

提示:看完上个部分所说的argparse包的相关介绍,再看下面的内容。此函数说到底就是解析控制台(Bash命令行)命令。

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。
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值