FCN分割网络代码到底怎么预测图片得到结果的,干货在这里!

语言不生动,比较枯燥,但请耐心看完,绝对干货!

FCN到底是怎么检测图片的

分割网络是判断图片中有没有某一种类别,比如图片中又没有椅子或凳子,分割网络核分类网络不同,它的标签是也是图片。最初研究分割网络是碰璧了,一直想不通,现在想通了,分享给大家,完全原创!、

FCN普通的预测代码

out = net(im)
#         print(out.shape, type(out))
        loss = criterion(nn.LogSoftmax(dim=1)(out), label)#dim=0,1,2这代表在第几维的数据对应相加为1.这里相当于把图片的预测结果图片每个对应像素都归一
        # 到0,1之间了

        # backward
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        train_loss += loss.item()

        label_pred = out.max(dim=1)[1].data.cpu().numpy()

分割网络没有连接层,所以FCN的神经网络输出是一个矩阵,也可以说是一个四维的tensor。我们先看看上面代码中的的loss操作。
nn.LogSoftmax就根我注释解释的一样,关建是dim=1,这个是一个需要转折的点。dim=1是表是在tensor的一维上进行归一化0到1,在进行log操作。那这个一维上面是什么呢?,为什么要在一维上操作呢?

  1. 这里的out是一个图片经过卷积后的矩阵,矩阵中的每个数字都是于图片中的像素点有关,所以求loss,也就是像素点的loss,out也可以看成一张图片,有兴趣可以自己显示出来看,而label也是一张图片,当然这两张图片大小相等(为什么相等,要去看看FCN的结构就能理解)
  2. LogSoftmax的归一化其实是将像素点归一化到0和1之间,那我们知道,卷积层的输出通道数是多少,就会输入一张图片,得到与输出通道数相等的几张图片。假如输出了两张图片如下:
0位1 位
2位3位
4位5位
6位7位

我用两个表格来代替out(假设out的维度是(1,2,2,2))的里面的两张图片,1表试是一张图片,2表示由一张图片输出了两张图片,后面则表示2×2的大小。那么在dim=1上LogSoftma也就是将0位和4位这两个像数点让他们相加为1,1位与5位相加为1,依次对应操作,然候再对全部像数点求log,所以在dim=1上操作时因为正好在其上面操作可以把输出图片对应位置的像素点进行处理,用于求loss,我们知道输出图片为2也就是代表2个类别嘛,所以就要把每个类别的输出图片对应的像数点进行处理。

到这也就离FCN灵魂近了一步了后面的 label_pred = out.max(dim=1)[1].data.cpu().numpy()和前面的loss略有不同,更加巧妙。

torch.max是挺灵活的

max是在指定维度上取最大值,并且返回最大值和最大值所在的tensor索引(具体可以取看看torch.max的用法,有很多文章都讲的很好,我这里就不重复讲了)
当然维度上也是dim=1,为什么呢?因为上面讲了。(偷个懒,如果还是不懂给我留言,我再讲的详细点),重点是out.max(dim=1)[1]的[1],我们仍是用上面的表格,求dim=1的最大值也是将两张图片对应的像素点来取最大值,假如我们说0位的像素比4位的大,1位的比5位的大,2位的比6位的大,3位的比7位的大,那执行out.max(dim=1)[1]这段代码后我们会得到这个

00
00

有点头绪没,第一张图片的像数点都比第二张大,得到的是全是0,这是因为第一张图片正是代表类别0,所以我们也就搞清楚了,out.max(dim=1)[1]是用来得到一个矩阵,矩阵的第一个数字是每张输出图片(也就是分别代表类别的图片)第一个像素点之间比较最大值,最大值所属于的那个类别数字。那矩阵的第二个数字也就是对应下去,最大值像素点的所属类别数字,依次类推。实际意义也就是表示对每个像素点都进行了预测,分别判断了每个像素点最有可能是哪个类别图片上的像素点。

还没完,这只是FCN冰山一角!

到这我们清楚了FCN的predicted到是表示的什么,但距离FCN的灵魂还有一大段距离,但我可以给你们一个代码

hist = np.bincount(
        n_class * label_true[mask].astype(int) +
        label_pred[mask], minlength=n_class ** 2).reshape(n_class, n_class)

这段代码是最最近FCN灵魂的,我实在忍不住要说出来了。
具体可以去查查,有很多文章都写得非常详细,强烈建议去理解它,学完它我可以说整个人都变帅了(开个玩笑)我这里就先带你们游览到这了.

学生党一枚,有错误请给我留言,非常感谢!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值