Image Cascade Network (ICNet)

Image Cascade Network(ICNet)主要用于图像实时语义分割。相较于其他压缩算法的方法,ICNet即考虑了速度,也考虑了准确性。ICNet的主要思想是将输入图像变换为不同的分辨率,然后用不同计算复杂度的子网络计算不同分辨率的输入,然后将结果合并。ICNet由三个子网络组成,计算复杂度高的网络处理低分辨率输入,计算复杂度低的网络处理分辨率高的网络,通过这种方式在高分辨率图像的准确性和低复杂网络的效率之间获得平衡。

整个网络结构如下:

文件结构:

#解压数据文件
! tar xf data/data9270/iccv09Data.tar -C data

数据格式:

#图像预处理,生成train_list.txt和eval_list.txt
! cd work/ && python DataPartition.py
#下载预训练的ICNet模型,并保存在pretrained model 目录下
! wget https://paddle-icnet-models.bj.bcebos.com/model_1000.tar.gz
! mkdir pretrained\model
!tar xzf model_1000.tar.gz -C pretrained\model
! rm model_1000.tar.gz
--2020-05-10 09:25:20--  https://paddle-icnet-models.bj.bcebos.com/model_1000.tar.gz
Resolving paddle-icnet-models.bj.bcebos.com (paddle-icnet-models.bj.bcebos.com)... 182.61.200.195, 182.61.200.229
Connecting to paddle-icnet-models.bj.bcebos.com (paddle-icnet-models.bj.bcebos.com)|182.61.200.195|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 25005084 (24M) [application/x-gzip]
Saving to: ‘model_1000.tar.gz’model_1000.tar.gz   100%[===================>]  23.85M  42.4MB/s    in 0.6s    2020-05-10 09:25:20 (42.4 MB/s) - ‘model_1000.tar.gz’ saved [25005084/25005084]mkdir: cannot create directory ‘pretrained model’: File exists
#模型训练,训练中具有需要用的超参数可以在config.py脚本中进行修改,这里为了展示方便
#加载了paddle model zoo提供的预训练参数,并且值训练了一个epoch
! python train.py
2020-03-31 15:24:31,687-INFO: train params:{'data_dir': 'data/iccv09Data/', 'batch_size': 10, 'use_gpu': False, 'train_model_dir': 'train model', 'infer_model_dir': 'infer model', 'pretrained_model_dir': 'pretrained model/model_1000', 'eval_file_path': 'data/eval_list.txt', 'continue_train': True, 'paddle_flag': True, 'num_classes': 8, 'weight_decay': 4e-05, 'base_lr': 0.001, 'num_epochs': 1, 'total_step': 4000, 'image_shape': (3, 240, 320), 'enable_ce': False, 'bn_momentum': 0.9997, 'dropout_keep_prop': 0.9, 'default_norm_type': 'gn', 'decode_channel': 48, 'encode_channel': 256, 'default_epsilon': 0.001, 'default_group_number': 32, 'depthwise_use_cudnn': False, 'is_train': True, 'data_augmentation_config': {'use_augmentation': False, 'min_resize': 0.8, 'max_resize': 4, 'crop_size': 240}}
2020-03-31 15:24:31,687 - train.py[line:94] - INFO: train params:{'data_dir': 'data/iccv09Data/', 'batch_size': 10, 'use_gpu': False, 'train_model_dir': 'train model', 'infer_model_dir': 'infer model', 'pretrained_model_dir': 'pretrained model/model_1000', 'eval_file_path': 'data/eval_list.txt', 'continue_train': True, 'paddle_flag': True, 'num_classes': 8, 'weight_decay': 4e-05, 'base_lr': 0.001, 'num_epochs': 1, 'total_step': 4000, 'image_shape': (3, 240, 320), 'enable_ce': False, 'bn_momentum': 0.9997, 'dropout_keep_prop': 0.9, 'default_norm_type': 'gn', 'decode_channel': 48, 'encode_channel': 256, 'default_epsilon': 0.001, 'default_group_number': 32, 'depthwise_use_cudnn': False, 'is_train': True, 'data_augmentation_config': {'use_augmentation': False, 'min_resize': 0.8, 'max_resize': 4, 'crop_size': 240}}
2020-03-31 15:24:31,792-INFO: ***************已读入预先训练的模型,并准备继续训练***************
2020-03-31 15:24:31,792 - train.py[line:40] - INFO: ***************已读入预先训练的模型,并准备继续训练***************
2020-03-31 15:24:31,792-INFO: ***************训练开始***************
2020-03-31 15:24:31,792 - train.py[line:99] - INFO: ***************训练开始***************
2020-03-31 15:25:02,903-INFO: epoch: 0 step: 100/400 loss:3.8958182334899902 loss_sub4:2.100172519683838 loss_sub24:2.630321979522705 loss_sub124:2.507661819458008 period:2.61 sec,
2020-03-31 15:25:02,903 - train.py[line:125] - INFO: epoch: 0 step: 100/400 loss:3.8958182334899902 loss_sub4:2.100172519683838 loss_sub24:2.630321979522705 loss_sub124:2.507661819458008 period:2.61 sec,
2020-03-31 15:25:32,771-INFO: epoch: 0 step: 200/400 loss:3.2978177070617676 loss_sub4:1.9303418397903442 loss_sub24:2.2254467010498047 loss_sub124:2.0987844467163086 period:2.51 sec,
2020-03-31 15:25:32,771 - train.py[line:125] - INFO: epoch: 0 step: 200/400 loss:3.2978177070617676 loss_sub4:1.9303418397903442 loss_sub24:2.2254467010498047 loss_sub124:2.0987844467163086 period:2.51 sec,
2020-03-31 15:26:02,700-INFO: epoch: 0 step: 300/400 loss:3.4040658473968506 loss_sub4:2.045391798019409 loss_sub24:2.357220411300659 loss_sub124:2.1339149475097656 period:2.47 sec,
2020-03-31 15:26:02,700 - train.py[line:125] - INFO: epoch: 0 step: 300/400 loss:3.4040658473968506 loss_sub4:2.045391798019409 loss_sub24:2.357220411300659 loss_sub124:2.1339149475097656 period:2.47 sec,
2020-03-31 15:26:32,632-INFO: epoch: 0 step: 400/400 loss:3.0009219646453857 loss_sub4:2.1474075317382812 loss_sub24:2.130000114440918 loss_sub124:1.8053367137908936 period:2.50 sec,
2020-03-31 15:26:32,632 - train.py[line:125] - INFO: epoch: 0 step: 400/400 loss:3.0009219646453857 loss_sub4:2.1474075317382812 loss_sub24:2.130000114440918 loss_sub124:1.8053367137908936 period:2.50 sec,
2020-03-31 15:26:39,906-INFO: 0's epoch_total_time: 107.08 sec && mean_loss: 3.516557527142902
2020-03-31 15:26:39,906 - train.py[line:130] - INFO: 0's epoch_total_time: 107.08 sec && mean_loss: 3.516557527142902
2020-03-31 15:26:39,906-INFO: 暂时存储第0个epoch的训练结果
2020-03-31 15:26:39,906 - train.py[line:133] - INFO: 暂时存储第0个epoch的训练结果
2020-03-31 15:26:40,134-INFO: ***************训练完成***************
2020-03-31 15:26:40,134 - train.py[line:135] - INFO: ***************训练完成***************
#模型固化
! python freeze.py
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/executor.py:782: UserWarning: The following exception is not an EOF exception."The following exception is not an EOF exception.")
Traceback (most recent call last):File "freeze.py", line 17, in <module>fluid.io.load_persistables(exe, train_path, freeze_program)File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/io.py", line 917, in load_persistablesfilename=filename)File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/io.py", line 742, in load_varsfilename=filename)File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/io.py", line 794, in load_varsexecutor.run(load_prog)File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/executor.py", line 783, in runsix.reraise(*sys.exc_info())File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/six.py", line 693, in reraiseraise valueFile "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/executor.py", line 778, in runuse_program_cache=use_program_cache)File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/executor.py", line 831, in _run_impluse_program_cache=use_program_cache)File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/executor.py", line 905, in _run_programfetch_var_name)
paddle.fluid.core_avx.EnforceNotMet: --------------------------------------------
C++ Call Stacks (More useful to developers):
--------------------------------------------
0   std::string paddle::platform::GetTraceBackString<char const*>(char const*&&, char const*, int)
1   paddle::platform::EnforceNotMet::EnforceNotMet(std::__exception_ptr::exception_ptr, char const*, int)
2   paddle::operators::LoadOpKernel<paddle::platform::CPUDeviceContext, float>::Compute(paddle::framework::ExecutionContext const&) const
3   std::_Function_handler<void (paddle::framework::ExecutionContext const&), paddle::framework::OpKernelRegistrarFunctor<paddle::platform::CPUPlace, false, 0ul, paddle::operators::LoadOpKernel<paddle::platform::CPUDeviceContext, float>, paddle::operators::LoadOpKernel<paddle::platform::CPUDeviceContext, double>, paddle::operators::LoadOpKernel<paddle::platform::CPUDeviceContext, int>, paddle::operators::LoadOpKernel<paddle::platform::CPUDeviceContext, signed char>, paddle::operators::LoadOpKernel<paddle::platform::CPUDeviceContext, long> >::operator()(char const*, char const*, int) const::{lambda(paddle::framework::ExecutionContext const&)#1}>::_M_invoke(std::_Any_data const&, paddle::framework::ExecutionContext const&)
4   paddle::framework::OperatorWithKernel::RunImpl(paddle::framework::Scope const&, paddle::platform::Place const&, paddle::framework::RuntimeContext*) const
5   paddle::framework::OperatorWithKernel::RunImpl(paddle::framework::Scope const&, paddle::platform::Place const&) const
6   paddle::framework::OperatorBase::Run(paddle::framework::Scope const&, paddle::platform::Place const&)
7   paddle::framework::Executor::RunPreparedContext(paddle::framework::ExecutorPrepareContext*, paddle::framework::Scope*, bool, bool, bool)
8   paddle::framework::Executor::Run(paddle::framework::ProgramDesc const&, paddle::framework::Scope*, int, bool, bool, std::vector<std::string, std::allocator<std::string> > const&, bool, bool)------------------------------------------
Python Call Stacks (More useful to users):
------------------------------------------File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/framework.py", line 2525, in append_opattrs=kwargs.get("attrs", None))File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/io.py", line 774, in load_varsattrs={'file_path': os.path.join(dirname, new_var.name)})File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/io.py", line 742, in load_varsfilename=filename)File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/io.py", line 917, in load_persistablesfilename=filename)File "freeze.py", line 17, in <module>fluid.io.load_persistables(exe, train_path, freeze_program)----------------------
Error Message Summary:
----------------------
Error: Cannot open file train model/conv1_1_3_3_s2.w_0 for load op at (/paddle/paddle/fluid/operators/load_op.h:38)[operator < load > error]
#使用test数据集的一幅图像进行模型推断,并将分割结果保存在根目录下
#展示了原始图像以及分割后的结果,实际应用中只使用result24作为最终的分割结果
#本示例只微调了一个epoch,所以infer的分割结果不是很好
!python infer.py
%matplotlib inline
import matplotlib.pyplot as plt
img1 = plt.imread('origin.png')
img2 = plt.imread('result124.png')
img3 = plt.imread('result4.png')
fig = plt.figure()
ax = fig.add_supplot(221)
ax.imshow(img1)
ax.set_title('origin')
ax.axis('off')
ax = fig.add_subplot(222)
ax.imshow(img2)
ax.set_title('result124')
ax.axis('off')
ax = fig.add_subplot(223)
ax.imshow(img3)
ax.set_title('result24')
ax.axis('off')
ax = fig.add_subplot(224)
ax.imshow(img4)
ax.set_title('result4')
ax.axis('off')
plt.show()

! python eval.py

2020-05-10 09:39:55,406-WARNING: Caution! paddle.fluid.memory_optimize() is deprecated and not maintained any more, since it is not stable!
This API would not take any memory optimizations on your Program now, since we have provided default strategies for you.
The newest and stable memory optimization strategies (they are all enabled by default) are as follows:
1. Garbage collection strategy, which is enabled by exporting environment variable FLAGS_eager_delete_tensor_gb=0 (0 is the default value).
2. Inplace strategy, which is enabled by setting build_strategy.enable_inplace=True (True is the default value) when using CompiledProgram or ParallelExecutor.

eval done! total image number is 105; mean iou:0.15527974830242292

参考链接:

论文链接:ICNet for Real-Time Semantic Segmentation on High-Resolution Images

博客链接:ICNet for Real-Time Semantic Segmentation on High-Resolution Images

ICNet图像实时语义分割相关推荐

  1. 【语义分割系列】ICNET(实时语义分割)理论以及代码实现

    git地址:https://github.com/Tramac/awesome-semantic-segmentation-pytorch 包括: FCN ENet PSPNet ICNet Deep ...

  2. 实时语义分割--ICNet for Real-Time Semantic Segmentation on High-Resolution Images

    ICNet for Real-Time Semantic Segmentation on High-Resolution Images https://hszhao.github.io/project ...

  3. 轻量级实时语义分割:ICNet BiSeNet

    轻量级实时语义分割:ICNet & BiSeNet ICNet 贡献 Image Cascade Network Cascade Label Guidance Structure Compar ...

  4. Real_time实时语义分割网络 SegNet, ENet, ICNet, BiSeNet,ShelfNet

    1. SegNet 论文地址:A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation 本不应该将segnet作 ...

  5. 实时语义分割算法大盘点

    本文转载自计算机视觉工坊 语义分割论文 语义图像分割是计算机视觉中发展最快的领域之一,有着广泛的应用.在许多领域,如机器人和自动驾驶汽车,语义图像分割是至关重要的,因为它提供了必要的上下文,以采取行动 ...

  6. 【论文阅读--实时语义分割】BiSeNet V2: Bilateral Network with Guided Aggregation

    摘要 低层细节和高层语义对于语义分割任务都是必不可少的.然而,为了加快模型推理的速度,目前的方法几乎总是牺牲低级细节,这导致了相当大的精度下降.我们建议将这些空间细节和分类语义分开处理,以实现高精度和 ...

  7. BiSeNet:用于实时语义分割的双边分割网络-7min精简论文阅读系列-Leon

    BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation BiSeNet:用于实时语义分割的双边分割网络 ...

  8. BCPNet:用于实时语义分割的双向上下文传播网络

    论文地址:https://arxiv.org/pdf/2005.11034.pdf 代码地址:暂无 空间细节和上下文相关性是语义分割的两类关键信息.一般来说,空间细节最可能存在于浅层,而上下文关联最可 ...

  9. 轻量级实时语义分割:Guided Upsampling Network for Real-Time Semantic Segmentation

    轻量级实时语义分割:Guided Upsampling Network for Real-Time Semantic Segmentation 介绍 网络设计 Guided unsampling mo ...

最新文章

  1. 【Python】Python中令人头疼的变量作用域问题,终于弄清楚了
  2. android studio第一次配置flutter(2019年12月)
  3. struts2 用form取值时出现的错误
  4. C++ 数组在内存中的分配
  5. 6万人同时离场,竟然一点都不挤?原来用了这个神器
  6. pytorch中的expand()和expand_as()函数--扩展张量中某维数据的尺寸
  7. python 复数幂_python基础学习——运算符(1)
  8. markdown实现公式内实现换行(简单版)\\
  9. html配色插件,【插件技巧】设计师必备配色max插件
  10. 笔记本电脑触摸板操作
  11. 学习C#的一点一滴(20)
  12. 三种网络模型(OSI七层参考模型、TCP/IP参考模型、五层参模型)
  13. 为自己加油,祝福我吧,朋友
  14. 【壁纸】 Kali Linux 2019.13 原版壁纸
  15. < pre >标签 定义预格式化的文本
  16. java——博弈算法实现井字棋游戏
  17. android音视频播放器开发百度云,Android 播放端 SDK
  18. 诺基亚(Nokia)E7-00联通定制版移动上网的方法(暴力推荐)
  19. 计算机毕业设计Java夕阳红养老院系统(源码+系统+mysql数据库+Lw文档)
  20. UCOSIII移植STM32(Cotex-M4)HAL库相关问题

热门文章

  1. 更改powerdesigner的关系Notation的显示方式方法
  2. 【day2c/c++入门题目-这样的水仙花数你见过吗?】
  3. 简单几行代码,python制作美图秀秀软件!
  4. hdu5468 A Puzzled Elena (容斥原理)
  5. 视频教程-Python数据分析与挖掘-Python
  6. 雷神笔记本无法打开虚拟化(vt-x)
  7. 蒙落卡洛求定积分(可视化概率分布图)
  8. Windows智能卡登录系统网络版,服务器集中管理
  9. linux usb hub 流程,Linux usb hub 处理
  10. 奶粉php和opo区别,什么是奶粉中的“二代OPO”,你知道这3个优点吗?