feitiandemiaomi / seg-for-fun

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

CCF遥感影像地块分割

Team:paddle针不戳

初赛(Top2) 复赛(Top1)
A榜 0.73418844 0.71751271
B榜 0.74324144 0.71104908

说明

  • 2020 CCF BDCI 遥感地块分割比赛Top1解决方案
  • 方案介绍见知乎专栏2020 CCF BDCI 地块分割Top1方案 & 语义分割trick整理
  • 基于PaddleSeg静态图版本开发,现已推出正式2.0动态图版本,建议使用新版动态图,改写更加方便。方案及代码仅供参考,不建议实际运行训练脚本(狗头)
  • 模型和结果见image目录下的README.md。打比赛时由于并未限制模型规模、推理效率,模型融合时把所有的模型都用上了。实际上相同的网络结构,不同规模的模型,融合后提升很小,部分甚至对performance有损害。再者,TTA时尺度放缩影响不大,不同的翻转即可很好提升融合结果

数据目录

|-- data
	|-- user_data
    	|-- 处理后数据
	    |-- 模型文件
	    |-- 中间预测
    |-- prediction_result
	    |-- result.zip
    |-- code
	    |-- 这里是docker执行时需要的代码(main.sh为程序入口)
    |-- raw_data
        |-- 比赛的数据集文件(train_data.zip, img_testA.zip, img_testB.zip)
    |--README.md

仓库结构

核心代码位于code目录,在PaddleSeg基础上开发

  1. main.sh为程序入口,根据下面算法运行介绍运行训练,见main.sh注释
  2. 主要修改pdseg目录下文件,下面分别介绍复现代码相关文件以及无关文件
  3. 相关文件:
    1. modeling/hrnet.py在原hrnet结构上加入SE/CBAM/SCSE attention结构,以及xavier初始化
    2. tools目录封装了数据集生成以及后处理等文件
      1. generate_my_dataset.py生成数据集核心文件,见README.md,包括正负样本划分、重采样、二分类样本增强等
      2. binary_class_voting.py生成二分类模型测试结果,方便后续快速投票,减少遍历
      3. invert_binary_class_results.py变换二分类TTA测试后结果
      4. multi_class_voting.py生成多分类模型测试结果,方便后续快速投票,减少遍历
      5. invert_multi_class_results.py变换多分类TTA测试后结果
      6. post_processing.py对结果进行投票以及后处理
    3. data_aug_lkc.py中封装了一些调用albumentations库写的数据增强,并修改了reader.py读取并混合正负样本
    4. utils/config.py中对config进行了相应的修改
    5. train.py做出了相应修改,以存储不同结果
  4. 无关文件
    1. cq_iou.py计算测试结果,针对验证集用,计算iouacc
    2. param_avg.py进行模型参数融合,无用
    3. vis_tta.py直接进行团投票,无用

算法运行

cd ./code目录运行bash main.sh会依次执行下面文件,默认false关闭训练、测试以及模型voting过程,仅开启后处理过程,如有需要可自行打开。

训练时注意是否正常开启训练,可能会因为数据集路径问题(yaml文件、数据集txt等)导致读取文件失败,直接跳过训练进行测试(PaddleSeg遇到异常不中断,需手动debug)

# 安装依赖
pip install -r ./requirements.txt

# ./exp/prepare_dataset.sh划分训练集与验证集,对数据进行预处理(划分正负样本、原数据重采样、生成二分类数据)
if  [ ! -d ../user_data/dataset ]; then
    mkdir ../user_data/dataset
fi
bash ./exp/prepare_dataset.sh

# ./exp/train_multi_class.sh和./exp/train_binary_class.sh分别训练多分类模型与二分类模型
if  [ ! -d ../user_data/saved_model ]; then
    mkdir ../user_data/saved_model
fi
if  [ ! -d ../user_data/saved_log ]; then
    mkdir ../user_data/saved_log
fi
# 默认false关闭模型训练
bash ./exp/train_multi_class.sh false
bash ./exp/train_binary_class.sh false

# ./exp/test_multi_class.sh和./exp/test_binary_class.sh分别测试多分类模型与二分类模型
# 默认false关闭模型测试
bash ./exp/test_multi_class.sh false false
bash ./exp/test_binary_class.sh false false

# ./exp/generate_results.sh对测试结果进行voting融合、后处理以及打包
# 第一个默认false关闭模型融合与后处理,第二个默认true打包输出结果
bash ./exp/generate_results.sh false true

上述程序会自动运行如下脚本

  1. ./exp/prepare_dataset.sh解压压缩包并划分训练集与验证集,对数据进行预处理(划分正负样本、原数据重采样、生成二分类数据)

    # 解压压缩包并划分训练集与验证集
    ...
    # 划分类4类5正负样本, 原数据类4类5重采样, 生成类0类3类4二分类数据
    ...
  2. ./exp/train_multi_class.sh./exp/train_binary_class.sh分别训练多分类模型与二分类模型

    # 训练多分类模型
    ...
    # 训练二分类模型
    ...
  3. ./exp/test_multi_class.sh./exp/test_binary_class.sh分别测试多分类模型与二分类模型

    # 测试多分类模型
    ...
    # TTA结果恢复
    ...
    # 测试二分类模型
    ...
    # TTA结果恢复
    ...
  4. ./exp/generate_results.sh对测试结果进行voting融合、后处理以及打包

    # 全分类模型voting融合
    ...
    # 二分类模型voting融合
    ...
    # 后处理
    ...
    # 结果打包
    ...

About

License:Apache License 2.0


Languages

Language:Python 81.7%Language:Shell 11.5%Language:C++ 3.5%Language:Java 2.5%Language:CMake 0.8%