最近试了很多显著检测的深度学习方法,仍然没有解决我想解决的问题,但是还是记录一下吧
这里使用的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.数据准备
数据文件夹结构
一级目录
注意这里面那三个.conf文件,其实就是数据的list,可以只要train和test,代码里没有用到valid,但是我还是生成了,生成代码我后面会放,后缀.conf是直接改.txt来的
train和valid内容类似,都是图像+空格+标签,注意这里面是一部分路径和main.py文件里给的image_root拼起来刚好是相对路径
二级目录
三级目录
注意图像名称和标签的名称应该是一样的,方便后面
这个项目简单到基本不改东西,这点很友好
2.训练
main.py文件,只改了前三个路径,就是测试自己的数据集用的数据,其他的就是训练参数了,可以先用默认的,另外注意那个batchsize只能是1,原因在源码链接的issue里有提到,是为了测试的时候可以输入任意尺寸的图像,https://github.com/backseason/PoolNet/issues/52
solver.py,这个文件只改了预测输出的名字和图像一样,方便后面精度评价
训练命令: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)