segformer
【注册数据集与训练】
1.使用labelme打标签。
标签的种类和BGR颜色、图像的扩展名在【D:\projects\code\SegFormer-master\mmseg\datasets\insulate.py】
和 【D:\projects\code\labelme_main\labels_insulate.txt】
(数据集)中修改,作为labelme2voc/coco.py的输入。
多个类的修改:D:\projects\code\SegFormer-master\mmseg\datasets\__init__.py
和D:\projects\code\SegFormer-master\local_configs\_base_\datasets\insulate_class1.py
(数据集相对路径)
和D:\projects\code\SegFormer-master\local_configs\segformer\B1\segformer.b1.512x512.ade.160k-insulate.py
注:可使用D:\projects\code\f\f_remove_BMPwithoutJSON.py
移除文件夹中没有对应json文件的bmp图像。也可创造标签为空的json。
2.将json转换为voc和coco的数据类型。
运行 修改"–input_dir",“–output_dir”,"–labels"参数,用【D:\projects\code\labelme_main\general_json2yolo.py】
。【D:\projects\code\json2yolo-master\labelme2voc.py】
得到.txt标签文件。 (老版本需要在coco生成的annotation.json文件中删掉所有的JPEGImage\ 才能运行。)
划分脚本 parser.add_argument(‘–annotation_path’, default=os.path.join(dataroot, ‘JPEGImages’), type=str, help=‘input xml label path’) # 从Labels改成JPEGImages可不用生成txt和coco。训练只需要原图和掩膜。
3.配置数据的根目录文件夹后划分数据集。
(配置路径参考【D:\projects\code\SegFormer-master\local_configs\_base_\datasets\insulate_0913.py】
。)
在自定义根目录后下手动配置文件夹:【JPEGImages中存所有bmp/png(注意不能是jpg,用于训练),可来自voc所得文件夹。只支持一种格式,因为mmseg\datasets中有限制),【labels中存所有txt,原在labels/annotations里)】 ,【SegmentationClass(来自voc所得文件夹的SegmentationClassPng,为用于训练的掩膜)】
使用【spilt_train.py】
和【spilt_test.py】
划分数据集。修改【spilt_train.py】
中的annotation_path。
可运行D:\projects\code\f\f_copy_LabelImages_testset.py
,将属于测试集的带标签图像从voc文件夹复制到原始测试集同级路径,方便测试后对比
4.训练。
配置【tool/train.py】
的’–work-dir’。
检查【mmseg\datasets\insulate.py和__init__.py】
注:数据集(包括data_root源数据和dataset_type标签类型)
‘–config’已在【D:\projects\code\SegFormer-master\local_configs\segformer\B1\segformer.b1.512x512.ade.160k-insulate.py】
中的_base_ 列表的【D:\projects\code\SegFormer-master\local_configs\_base_\datasets\insulate_0915_class1.py】
中设置。
‘…/…/base/schedules/schedule_160k_adamw.py’ 设置checkpoint,如模型保存周期等,D:\projects\code\SegFormer-master\tools\benchmark.py的’–log-interval’设置日志间隔。
注:.\SegFormer-master\local_configs\_base_\models\segformer.py
修改类别的损失权重。类别数(class_weight列表长度)需和.\SegFormer-master\local_configs\SegFormer\B1\SegFormer.b1.512x512.ade.160k-insulate.py中num_classes一致。(现不确定)
若报错类似:
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 20-21: truncated \xXX escape
可能是因为转义字符r在这个项目中对\x不起作用。c:\user同理,可以通过改为’/'解决。
预训练:【tool/train.py】
中,有:
if args.resume_from is not None:
cfg.resume_from = args.resume_from
【测试】
【tool/test.py】
parser.add_argument('--config', default=r'',help='test config file path')
和train中的config一致。
颜色渲染修改:
D:\projects\code\SegFormer-master\mmseg\datasets\insulate.py
batch_size修改:
data = dict(samples_per_gpu=2)
PALETTE = [[120, 120, 120], [0, 255, 0]]
指标:
D:\projects\code\SegFormer-master\mmseg\core\evaluation\metrics.py (五层调用)
float: Overall accuracy on all images.
ndarray: Per category accuracy, shape (num_classes, ).
ndarray: Per category evalution metrics, shape (num_classes, ).
def total_intersect_and_union(results,
若测试ok品,
则修改D:\projects\code\SegFormer-master\local_configs\segformer\B1\segformer.b1.512x512.ade.160k-insulate_selectOK.py和D:\projects\code\SegFormer-master\local_configs_base_\datasets\insulate_selectOK.py并在test.py中调用,
test=dict(
type=dataset_type,
data_root=data_root,
img_dir='',
# split=r'D:\projects\insulate\jinan\0915\ok\ok_XiAn.txt',
split=r'D:\projects\insulate\jinan\noOil\0915\ok\ok.txt',
ann_dir='SegmentationClass',
pipeline=test_pipeline)
split中存放test图像的文件名(不含扩展名),使用D:\projects\code\f\f_imgsname2txt.py得到该txt文件。
注 看前景类的指标(背景占比大)
single_gpu_test函数用于结果可视化,可输出其他调试信息。
dataset = build_dataset(cfg.data.test)
# 输出mmseg.datasets图像文件名
for img_info in dataset.img_infos:
filename = img_info['filename']
print(filename)
最后
Creating a custom model to detect your objects is an iterative process
of collecting and organizing images, labeling your objects of
interest, training a model, deploying it into the wild to make
predictions, and then using that deployed model to collect examples of
edge cases to repeat and improve.