基于Keras框架搭建Salient Object Detection模型踩坑之路

定下方向,开始干!

接下来将是较长一段时间的踩坑之路,从零开始,读论文,写代码,记录坑点,以防再次掉进去。

持续更新......


1. 敲代码之前需要注意的问题:

决定了,本CV小白想用Keras框架,后端使用TensorFlow,IDE就用Pycharm,最好用,不接受反驳哈哈。

这里安利一本书《Python 深度学习》,以及Keras中文文档,链接:https://keras-cn.readthedocs.io/en/latest/,有这俩,差不多搭建一个简单的无脑模型是够用了的。

另外,如果要长时间做科研,建议给每一个项目单独设置一个Python运行环境,防止你的项目太多了,环境冲突。比如我就用了virtualenv,给个教程,自己写的,巨简单:https://blog.csdn.net/Dorothy_Xue/article/details/84111775。也可以在用Pycharm创建项目时,在解释器那里搞一下。

多读点论文,张张知识,了解当前方向做到啥程度了,起码最新的那些比较受关注的工作要了解一下。


2. coding时踩过的坑,长征之路开启( 手动按一下超大Enter键

1. 首先遇到的问题就是数据集。数据集有好多的,一扫一大堆。那么问题来了,网上荡下来的那么多数据集,每个数据集的文件夹乱七八糟的,你看

                 

 

 

 

 

总而言之呢就是一点不统一,你需要把它弄的规范点,划分一下,手动一张一张来那就太不现实了,还是发挥你的代码能力,就当练练手对不,写个代码划分一下,很快就好了。划分成什么样子呢?这样:

  • train_img, train_gt
  • validation_img, validation_gt
  • test_img, test_gt

又整洁又好看,方便模型调用数据,nice。


2. 对着书搭模型时,书上的一看就懂,用到自己的任务里一写就错,脑阔疼,坑很多,许多没有注意到的事。比如,模型的输入。可能对着书,就是简单的调用一下train_data, train_label这样,因为这些数据在keras中人家都已经给你弄好了,你只知道模型需要接收的输入是张量,要存在Numpy数组中(划重点,这个从来没有搭过模型的人真不一定知道,看了书也容易忽略,比如在下)。

另外!把数据送进模型进行训练之前!要记得!归一化一下!(又是小白踩过的一个大坑)因为读取图片数据得到的范围是在0-255之间,GT也是0和255,但是为了模型训练方便,加速收敛,要归一化,不然就我没归一化过的模型来看,loss竟然是负数,负好几百,精度巨低,跟0没差。所以要预处理一下实验数据!就是除一下255归一化到[0,1]之间就好了,easy。


3. 关于优化器,书上各种安利RMSprop,虽然好,但是前辈说像图像显著性检测就不要用RMSprop了,因为这个在有LSTM这样的结构的模型中表现更好,图像显著性就用Adam就好了。


4. 关于Deconv2D反卷积时卷积核大小要能被步长整除!不然容易出现棋盘效应。给个链接了解一下棋盘效应:https://blog.csdn.net/Dorothy_Xue/article/details/79844990,因为还没正式调效果,就是简单的了解熟悉一下,搭一个简单的模型,所以所以也还没仔细分析原因,但是读过的论文里有提到过这个注意事项。


5. 有时候代码运行着运行着就卡机了,咋肥四咧?内存崩了吧!不过用GPU的话,我觉得奥,最好监控GPU的使用情况,终端就能实现:

$watch -n 1 nvidia-smi

我设置的是每隔1秒显示一次显存情况,嫌弃太短了把命令中的1改成你想要的就好了。(截图时在跑,100%了


6. 有时候数据集会很大,一次全部加载到内存中会导致崩溃,所以可能需要分开训练。这时候就需要再训练当前子数据集的时候,调用上一批子数据集的权重参数等。咋弄咧?怎样实现断点续训功能咧?

用ModelCheckpoint

首先了解一下ModelCheckpoint:

keras.callbacks.ModelCheckpoint( filepath,
    monitor='val_loss',
    verbose=0,
    save_best_only=False,
    save_weights_only=False,
    mode='auto',
    period=1
)

其中,各项参数如下:

  1. filepath:字符串,保存模型路径
  2. monitor:要监控的值,val_acc或者val_loss
  3. verbose:信息展示模式,0是屏蔽,1是打印
  4. save_best_only:设为True,则保存验证集上性能最好的模型
  5. save_weights_only:设为True,则只保存模型权重;否则保存整个模型(包括模型结构、配置信息等)
  6. mode:可以设三种参数“auto”、“min”、“max”,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当检测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。
  7. period:Checkpoint之间间隔的epoch数

接下来是代码实现过程:

checkpoint = ModelCheckpoint('{}'.format(model_save_path) + '/{val_loss:.4f}.h5', verbose=1)

history = m.fit(train_img, train_gt, validation_data=(validation_img, validation_gt),
                    epochs=10, batch_size=1, verbose=1, callbacks=[checkpoint])

8. keras模型中处理彩色图片的顺序为:BGR

这里补充一下各种图像库的花边知识:

  • 除了opencv读入的彩色图片是以RGB的顺序存储外,其他所有图像库读入彩色图片都以RGB存储
  • 除了PIL读入的图片是img类之外,其他库读进来的图片都是numpy矩阵
  • 各大图像库的性能,老大哥当属opencv,无论是速度还是图片操作的全面性,都属于碾压的存在,毕竟它是一个巨大的CV专用库

9. 测试阶段的model.predict(),一次只预测一张图,1*224*224*3(自己定的224*224),不能把测试集一下子都扔到predict()一起预测,写个循环,排好队一个一个来。记得加载图片处理数据时减均值。


10. 加载GT时,注意在读取完GT之后,要加一句

f = cv2.cvtColor(f, cv2.COLOR_RGB2GRAY)  # 将彩色图变成灰度图

完了之后要记得归一化:

f = (f - np.min(f)) / (np.max(f) - np.min(f))

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值