相信大家对 Unet 论文中的 weight map 并不陌生。但是我翻遍 github上的几个 Unet 经典实现(包括论文开源的 caffe 版本),都没有找到损失加权图的实现代码。我今天尝试着实现了一下,得到了与论文中几乎一致的结果,分享给大家。转载请在文首注明出处,尊重原创,谢谢


作 者: 月牙眼的楼下小黑
联 系: zhanglf_tmac (WeChat)
声 明: 欢迎转载本文中的图片或文字,请说明出处


1. 实验图片的获取和加载

我没有论文中的数据集,我只是简单地从 pdf 中截取了示例图,并用 win10 自带的画图软件另存为单通道 bmp 文件。

实验图片

我习惯用 skimage 库的 io 函数加载图片:

from skimage import io
import matplotlib.pyplot as pltgt = io.imread('bin_img.bmp')
gt = 1 * (gt >0)
plt.figure(figsize = (10,10))
plt.imshow(gt)
plt.show()

实验图的加载

2. 获得 class weight map

根据 unet 论文, class_weight_map 的作用是: to balance the class frequencies。 我们分别统计前景(即细胞)和 背景的像素数目 , 取倒数并归一化作为 class map。 这只是一种简单的做法,读者亦可设计更复杂的类别平衡权重计算机制。

import numpy as np# 【1】计算细胞和背景的像素频率
c_weights = np.zeros(2)
c_weights[0] = 1.0 / ((gt == 0).sum())
c_weights[1] = 1.0 / ((gt == 1).sum())# 【2】归一化
c_weights /= c_weights.max()# 【3】得到 class_weight map(cw_map)
cw_map = np.where(gt==0, c_weights[0], c_weights[1])
plt.figure(figsize = (10,10))
plt.imshow(cw_map)
plt.show()

class_weight_map

3. 连通域分析

对每个实例(即每个细胞),我们需要获取只包含该实例的掩码。例如,如果一幅图像中有 2个细胞: 细胞 a, 细胞 b, 我们需要获得只包含细胞 a 的二值掩码图 msk1, 以及只包含细胞 b 的二值掩码图 msk2。所以我们需要对原图像进行连通域分析。

我们调用 skimage.measure下的 label函数实现二值图像的连通区域标记:

skimage.measure.label(image, connectivity= None) : connectivity=1代表4邻接, 2代表 8邻接

该函数会返回跟 image同等大小的标记矩阵,不同值的数字代表不同的连通域。

from skimage import measure,color#【4】连通域分析,并彩色化
cells = measure.label(gt, connectivity=2)
cells_color = color.label2rgb(cells , bg_label = 0,  bg_color = (0, 0, 0))
plt.figure(figsize = (20,20))
plt.imshow(cells_color)
plt.show()

连通域分析并彩色化

4. 得到 distance_weight_map

解释代码是一件非常困难的事,有必要把公式再贴一遍,请读者对照代码和公式理解:

对一幅图像,我们可以得到一个二值掩码集合 :

{ msk1, msk2, ...mski,...mskn }

每个掩码只包含一个细胞 。 我们对每个二值掩码进行 距离变化, 使用 opencv 中的 distanceTransform 函数即可轻易实现。我们得到一个距离变换后的浮点图集合:

{dist1, dist2, ..., disti,...distn }, 其中 disti = distanceTransform(mski)

我们要求的 d1_map, 即公式中的 d1(x), 在 (i,j) 处的值为 :

d1_map(i,j) = min (dist1(i,j), dist2(i,j), ...distn(i,j))

笔者不知道求一个集合中 次最小 的数学运算符是什么,暂且用 mins 代替吧, 即对一个集合 amins(a) = min (a - {min(a)})

那么 d2_map, 即公式中的 d2(x), 在 (i,j) 处的值为 :

d2_map(i,j) = mins (dist1(i,j), dist2(i,j), ...distn(i,j))

得到 d1_map 和 d2_map, 我们不难获得对应公式中的第二项的 distance_weight_map

import cv2#【5】计算得到 distance weight map (dw_map)
w0 = 10
sigma = 5
dw_map = np.zeros_like(gt)
maps = np.zeros((gt.shape[0], gt.shape[1], cells.max()))
if cells.max()>=2:for i in range(1, cells.max() + 1):maps[:,:,i-1] =  cv2.distanceTransform(1- (cells == i ).astype(np.uint8), cv2.DIST_L2, 3)maps = np.sort(maps, axis = 2)d1 = maps[:,:,0]d2 = maps[:,:,1]dis = ((d1 + d2)**2) / (2 * sigma * sigma)dw_map = w0*np.exp(-dis) * (cells == 0)
plt.figure(figsize = (10,10))
plt.imshow(dw_map, cmap = 'jet')
plt.show()

python 复现 Unet 论文中的 Weight Map相关推荐

  1. Python重绘论文中的数据图

    Python绘制论文数据图 前言 论文中经常会借鉴别的图,但复制别人论文的图,有侵权的嫌疑.为此需要重新更改图片.利用python进行绘制高质量的平滑曲线图.python里面绘制折线图,曲线图的模块是 ...

  2. 【Python基础】pandas中apply与map的异同

    ◆ ◆ ◆  ◆ ◆ 前言 pandas作为数据处理与分析的利器,它的江湖地位非同小可.在我们数据处理与分析过程中,有时候需要对某一列的每一个值都进行处理,这时候推荐大家使用apply或者map. 但 ...

  3. python画笔的尺寸_Matplotlib 常用画图命令总结:使用 Python 在论文中画出一手漂亮的数据图...

    介绍 本文不是一篇详尽的.从简到繁的 Maplotlib 画图教程,而是用各种例子快速直观地让读者上手 Matplotlib 画图中的一些常用的.基础的操作.本文不对各种数据图(折线图.柱状图等)作介 ...

  4. python画三维立体图-如何在论文中画出漂亮的插图?

    ----2020.08.07增---- 看到评论区有人说"没代码没教程所以没帮助"-- 好吧,我寻思链接.参考资料都在回答中给出来了呀(可能不够明显?) 于是,重新整理.注释了一下 ...

  5. python filter map区别_python中filter、map、reduce的区别

    python中有一些非常有趣的函数,今天也来总结一下,不过该类的网上资料也相当多,也没多少干货,只是习惯性将一些容易遗忘的功能进行整理. lambda 为关键字.filter,map,reduce为内 ...

  6. 关于对《弹道导弹攻防对抗的建模与仿真》一书中部分章节模型的Python复现

    Attack-Defense Attack-Defense是对<弹道导弹攻防对抗的建模与仿真>(Attack-Defense Counterwork Modeling and Simula ...

  7. python 论文插图_如何在python论文中画出漂亮的插图?-from知乎

    如何在论文中画出漂亮的插图? 经常看到别人论文中画出各种绚烂的插图,我想知道这些图都是用一些什么样的软件画出来的.比如下面给出的几张,好吧,我承认有的并不那么绚烂,但用什么样的软件比较合适呢?具体答案 ...

  8. 【语义分割系列:七】Attention Unet 论文阅读翻译笔记 医学图像 python实现

    Attention U-Net 2018 CVPR Ozan Oktay, Jo Schlemper, Loic Le Folgoc, Matthew Lee Attention U-Net: Lea ...

  9. 如何从论文中实现算法复现(译)

    原文地址:http://codecapsule.com/2012/01/18/how-to-implement-a-paper/ 作者:Emmanuel Goossaert 翻译:Joseph Arn ...

最新文章

  1. CentOS 5.1下安装Opensim
  2. Codeforces 1291 Round #616 (Div. 2) B
  3. C++string容器应用举例
  4. HTML绿色风格农业科技公司网站源码
  5. python 直方图每个bin中的值_使用python中的matplotlib进行绘图分析数据
  6. 【flutter环境问题】Downloading Dart SDK Flutter engine时卡着不动
  7. CPU 缓存一致性协议 MESI
  8. 微服务自动化部署(ansible playbook)干货之--zookeeper部署
  9. 数据分析可视化图表mysql_50个最有价值的数据可视化图表
  10. 终级免杀之PcShare Vs KV2006
  11. 关于 NFT 和版权的纠结真相
  12. Thread多线程-(最容易被问到的面试题)
  13. 离散信号的周期性判定,C++实现
  14. 印度内阁小组讨论华为投资 通信部表示支持
  15. 小故事让你秒懂“资产证券化”
  16. debian nvidia 安装_在 Debian 上安装 Nvidia 显卡驱动启用 Nvenc
  17. java导出excel 方式_java导出Excel通用方法
  18. 微信小程序—自定义组件
  19. element-ui dialog(多弹框、嵌套弹框)被蒙版遮住
  20. 【FPGA实例】基于FPGA的DDS信号发生器设计

热门文章

  1. 精灵盛典电脑模拟器服务器怎么修改,精灵盛典ios电脑版
  2. 编写程序,输入各类型变量按相应格式输出
  3. 团队工具_「管理工具」部门有效管理的5个工具,打造高效团队
  4. 关于素数常用结论--威尔逊定理、欧拉定理、费马小定理、米勒罗宾算法
  5. Android跨平台编译 —— BOOST
  6. ListView滑动位置精准记忆
  7. 如何 判断 设备 是否 连接 上 了 wifi
  8. Windows Socket 编程_ 简单的服务器/客户端程序 .
  9. 将一个链表按逆序排列
  10. iOS在label中显示表情