############## A. 创建conda环境 ##############
# 参考：https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/get_started.md#installation
# 1. 可选
conda create --name openmmlab python=3.8 -y
conda activate openmmlab

# 2. 安装必备组件
sudo apt-get install jq # bash解析json工具
pip install ftfy regex tensorboard wandb seaborn fvcore
pip install weave -no-compile
wandb login

# 3. 查看是否有nvidia-smi、Cuda版本，没有的话，安装cuda12.X
如果没有nvidia-smi需要重新安装驱动
nvcc --version

# 4. 安装和CUDA 版本对应的 pytorch
官网：https://pytorch.org/get-started/locally/官网：https://pytorch.org/get-started/locally/
检查是否安装成功：
python
import torch # 如果pytorch安装成功即可导入
print(torch.cuda.is_available()) # 查看CUDA是否可用
print(torch.cuda.device_count()) # 查看可用的CUDA数量
print(torch.version.cuda) # 查看CUDA的版本号

# 5. 使用 MIN 安装 MMCV.
pip install -U openmim
mim install mmengine
pip install mmcv==2.2.0 # -f https://download.openmmlab.com/mmcv/dist/cu121/torch2.4/index.html

# 6. 安装 MMSegmentation.
# git clone -b main https://github.com/open-mmlab/mmsegmentation.git # 不需要下载了
cd mmsegmentation 或 cd Seg_All_In_One_MMSeg
pip install -v -e .
# V1. 安装无cuda算子的mmcv如果发现mmcv版本超了，需要mmcv<2.2.0
pip uninstall mmcv-full 或 pip uninstall mmcv
pip install mmcv==2.1.0
# V2. 安装带有cuda算子的mmcv-full # 参考：https://mmcv.readthedocs.io/en/latest/get_started/build.html
git clone https://github.com/open-mmlab/mmcv.git
cd mmcv
# 可选
git checkout tags/v2.1.0 # 切换到 2.1.0 版本
MMCV_WITH_OPS=1 pip install -r requirements/optional.txt # 它告诉编译脚本要构建 mmcv-full 的版本
pip install -e . -v
python .dev_scripts/check_installation.py # 检查安装是否成功
### 额外下载 ####
mim install mmdet
sudo apt-get update && sudo apt-get install libgl1

# 7. 检查安装是否正确
# 下载测试数据及代码
mim download mmsegmentation --config pspnet_r50-d8_4xb2-40k_cityscapes-512x1024 --dest .
python demo/image_demo.py demo/demo.png configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth --device cuda:0 --out-file result.jpg
# 查看是否有输出，并且删除相关输出内容
ls | grep result.jpg
rm pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth result.jpg

############## B.0. 定义 Train 训练程序 ##############
1. 观察 ./configs/Alg_name 目录下的算法配置文件，查看算法构成，查看是否有预训练模型
观察 ./configs/_base_/models/Alg_name.py 的模型文件
2. 有预训练模型则修改 ./My_All_In_One/0_Initial_Save_All_Model_locally.py 加入下载；
修改 ./My_All_In_One/Initial_Alg_Program/Initial_Alg_Select_Tool.py 加入选项；
3. 参考 ./My_All_In_One/2_Alg_Program 生成属于自己的 my_Alg_name.py 文件

############## B.1. 定义 Alg 训练算法 ##############
1. 观察需要修改的是哪个部分./mmseg/models/backbones 或 decode_heads 或 losses 或 necks 等
2. 将需改后的模型放入文件夹中
3. 修改其中的 __init__.py 文件，加入对应类名
4. 在 ./configs/_base_/models 中修改对应算法基础配置 e.g. my_bisenetv2_A1.py
5. 在 ./configs/Alg_name 中修改对应算法配置 e.g. my_bisenetv2_A1_XXX.py
6. python setup.py install # 注册数据集

############## B. Train 训练程序 ##############
# 0. 下载必要模型权重
cd Seg_All_In_One_MMSeg
python 0_Initial_Save_All_Model_locally.py

# 1. 准备数据集（使用脚本）
cd Seg_All_In_One_MMSeg/1_Data_Parameter
参考重新定义脚本：my_dataset_model.json # 定义脚本
cd Seg_All_In_One_MMSeg
python 1_Initial_Data_All_data_from_1_Data_Parameter-V2.py
python setup.py install # 注册数据集
# 1. 自定义数据集（不推荐）
参考：mmseg/datasets/stare.py && configs/_base_/datasets/stare.py
参考：mmseg/datasets/my_dataset_model.py && configs/_base_/datasets/my_dataset_model.py

# 2. 初始化算法（使用脚本）
python ./My_All_In_One/2_Initial_Alg_All_data_from_2_Alg_Program-V2.py # 会自动输出训练程序
# 2. 自定义算法（人工定义）
训练执行代码：configs/alg_name/alg_name_XXX.py
底层骨架代码：mmseg/models/backbones/alg_name.py && mmseg/models/backbones/__init__.py
底层schedules代码：mmseg/configs/_base_/schedules
# 新建算法、新建数据集后重新设置索引
python setup.py install # 运行此命令即可解决

# 3. 训练后删除不符合标准的pth（节省空间）
# 修改其中的 target_directory 、 运行两次
python ./My_All_In_One/3_Find_And_Delete_Special_Epoch.py

# 4. 训练后移动算法
bash ./My_All_In_One/3_Tool_Copy_Result_To_Hardisk.sh

############## C. Predict 推理程序 ##############
# 1. 预测模型 参数量、FLOPs、FPS
CUDA_VISIBLE_DEVICES=0 python My_All_In_One/4_1_predict_params_FLOPs_FPS_V2.py
# 2. 预测模型 指标
CUDA_VISIBLE_DEVICES=0 python My_All_In_One/4_2_predict_matrics_from_log_V2.py 
# 3. 生成模型结果
CUDA_VISIBLE_DEVICES=0 python My_All_In_One/4_3_predict_draw_pictures_and_tabels.py
# 4. 训练损失摘录
CUDA_VISIBLE_DEVICES=3 python My_All_In_One/4_4_extract_loss_and_best_miou.py

############## D. 其他注意事项 ##############
1. 将vis_backends、visualizer相关hook定义放在./My_All_In_One/Initial_Alg_Program/Initial_Alg_Gen_Tool.py 的write_config_to_file函数中了# 批量将参数内容写入文件 # V2 加入训练过程可视化 TODO