基于深度学习的显著性检测用于遥感影像地物提取初探(PoolNet)

最近试了很多显著检测的深度学习方法,仍然没有解决我想解决的问题,但是还是记录一下吧
这里使用的GitHub链接:https://github.com/backseason/PoolNet
这个复现起来还是挺简单的,效果感觉还行,希望有人可以用得着,反正我用不着("-.-")
下面是一个建筑提取的初步结果,其实我不是用来提取建筑的,但是既然都跑了,我就想看看建筑是不是可以,现在看来,建筑是可以的。
下面这个数据集就是马萨诸塞州数据集里面那个建筑的数据,我前面的文章分享过,可以去翻一下。
测试图像:
图像
预测结果:
初步结果
精度评定:

acc:  0.849883312649197
acc_cls:  0.8799366873868133
iou:  [0.81840415 0.53590918]
miou:  0.6771566691591816
fwavacc:  0.7656302856979325
class_accuracy:  0.5473170400062259
class_recall:  0.8021286694686464
accuracy:  0.795915404362465
f1_score:  0.6506652116424203

感觉还行吧,这是随便跑的,而且显著性检测公共数据集和遥感数据集的差异还是蛮大的,需要的话可以试着调一下效果。
下面是更改的的地方
1.数据准备
数据文件夹结构
一级目录
结构1
注意这里面那三个.conf文件,其实就是数据的list,可以只要train和test,代码里没有用到valid,但是我还是生成了,生成代码我后面会放,后缀.conf是直接改.txt来的
在这里插入图片描述
train和valid内容类似,都是图像+空格+标签,注意这里面是一部分路径和main.py文件里给的image_root拼起来刚好是相对路径
训练列表
拼

二级目录
在这里插入图片描述
三级目录
结构3
结构4
注意图像名称和标签的名称应该是一样的,方便后面

这个项目简单到基本不改东西,这点很友好
2.训练
main.py文件,只改了前三个路径,就是测试自己的数据集用的数据,其他的就是训练参数了,可以先用默认的,另外注意那个batchsize只能是1,原因在源码链接的issue里有提到,是为了测试的时候可以输入任意尺寸的图像,https://github.com/backseason/PoolNet/issues/52
main
solver.py,这个文件只改了预测输出的名字和图像一样,方便后面精度评价
solver
训练命令:python main.py --arch resnet --train_root ./Data/ --train_list ./Data/build/build_train.conf
训练的时候会自动创建存储模型的位置,存储间隔在参数里可以自己改
位置

模型
3预测
预测命令:python main.py --mode=‘test’ --model=‘results/run-1/models/final.pth’ --test_fold=‘results/run-1-sal-e’ --sal_mode=‘e’
命令里面给模型和自己想存的路径就好,这个–sal_mode='e’就是和最前面main.py文件改的地方对应的

别的就没什么了,也没什么要注意的地方,很方便。
下面是我复现的代码和数据,别忘了点赞再离开,数据都给了!
链接:https://pan.baidu.com/s/1RwDiaslaGfvgUS556hm1Mw
提取码:2t28
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V5的分享

修改:
评价代码出来的精度不一致,应该是参数顺序不对,用下面的代码试试
错误

def eval_func(label_path, predict_path):
    pres = os.listdir(predict_path)
    labels = []
    predicts = []
    for im in pres:
        if im[-4:] == '.png':
            label_name = im.split('.')[0] + '.png'
            lab_path = os.path.join(label_path, label_name)
            pre_path = os.path.join(predict_path, im)
            label = cv2.imread(lab_path,0)
            pre = cv2.imread(pre_path,0)
            label[label>0] = 1
            pre[pre>0] = 1
            label = np.uint8(label)
            pre = np.uint8(pre)
            labels.append(label)
            predicts.append(pre)
    el = IOUMetric(2)
    acc, acc_cls, iou, miou, fwavacc = el.evaluate(predicts,labels)
    print('acc: ',acc)
    print('acc_cls: ',acc_cls)
    print('iou: ',iou)
    print('miou: ',miou)
    print('fwavacc: ',fwavacc)

    pres = os.listdir(predict_path)
    init = np.zeros((2,2))
    for im in pres:
        lb_path = os.path.join(label_path, im)
        pre_path = os.path.join(predict_path, im)
        lb = cv2.imread(lb_path,0)
        pre = cv2.imread(pre_path,0)
        lb[lb>0] = 1
        pre[pre>0] = 1
        lb = np.uint8(lb)
        pre = np.uint8(pre)
        lb = lb.flatten()
        pre = pre.flatten()
        confuse = confusion_matrix(lb, pre)
        init += confuse

    precision = init[1][1]/(init[0][1] + init[1][1]) 
    recall = init[1][1]/(init[1][0] + init[1][1])
    accuracy = (init[0][0] + init[1][1])/init.sum()
    f1_score = 2*precision*recall/(precision + recall)
    print('class_accuracy: ', precision)
    print('class_recall: ', recall)
    print('accuracy: ', accuracy)
    print('f1_score: ', f1_score)

猜你喜欢

转载自blog.csdn.net/qq_20373723/article/details/112686207