python 复现 Unet 论文中的 Weight Map
相信大家对 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 代替吧, 即对一个集合 a
, mins(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相关推荐
- Python重绘论文中的数据图
Python绘制论文数据图 前言 论文中经常会借鉴别的图,但复制别人论文的图,有侵权的嫌疑.为此需要重新更改图片.利用python进行绘制高质量的平滑曲线图.python里面绘制折线图,曲线图的模块是 ...
- 【Python基础】pandas中apply与map的异同
◆ ◆ ◆ ◆ ◆ 前言 pandas作为数据处理与分析的利器,它的江湖地位非同小可.在我们数据处理与分析过程中,有时候需要对某一列的每一个值都进行处理,这时候推荐大家使用apply或者map. 但 ...
- python画笔的尺寸_Matplotlib 常用画图命令总结:使用 Python 在论文中画出一手漂亮的数据图...
介绍 本文不是一篇详尽的.从简到繁的 Maplotlib 画图教程,而是用各种例子快速直观地让读者上手 Matplotlib 画图中的一些常用的.基础的操作.本文不对各种数据图(折线图.柱状图等)作介 ...
- python画三维立体图-如何在论文中画出漂亮的插图?
----2020.08.07增---- 看到评论区有人说"没代码没教程所以没帮助"-- 好吧,我寻思链接.参考资料都在回答中给出来了呀(可能不够明显?) 于是,重新整理.注释了一下 ...
- python filter map区别_python中filter、map、reduce的区别
python中有一些非常有趣的函数,今天也来总结一下,不过该类的网上资料也相当多,也没多少干货,只是习惯性将一些容易遗忘的功能进行整理. lambda 为关键字.filter,map,reduce为内 ...
- 关于对《弹道导弹攻防对抗的建模与仿真》一书中部分章节模型的Python复现
Attack-Defense Attack-Defense是对<弹道导弹攻防对抗的建模与仿真>(Attack-Defense Counterwork Modeling and Simula ...
- python 论文插图_如何在python论文中画出漂亮的插图?-from知乎
如何在论文中画出漂亮的插图? 经常看到别人论文中画出各种绚烂的插图,我想知道这些图都是用一些什么样的软件画出来的.比如下面给出的几张,好吧,我承认有的并不那么绚烂,但用什么样的软件比较合适呢?具体答案 ...
- 【语义分割系列:七】Attention Unet 论文阅读翻译笔记 医学图像 python实现
Attention U-Net 2018 CVPR Ozan Oktay, Jo Schlemper, Loic Le Folgoc, Matthew Lee Attention U-Net: Lea ...
- 如何从论文中实现算法复现(译)
原文地址:http://codecapsule.com/2012/01/18/how-to-implement-a-paper/ 作者:Emmanuel Goossaert 翻译:Joseph Arn ...
最新文章
- CentOS 5.1下安装Opensim
- Codeforces 1291 Round #616 (Div. 2) B
- C++string容器应用举例
- HTML绿色风格农业科技公司网站源码
- python 直方图每个bin中的值_使用python中的matplotlib进行绘图分析数据
- 【flutter环境问题】Downloading Dart SDK Flutter engine时卡着不动
- CPU 缓存一致性协议 MESI
- 微服务自动化部署(ansible playbook)干货之--zookeeper部署
- 数据分析可视化图表mysql_50个最有价值的数据可视化图表
- 终级免杀之PcShare Vs KV2006
- 关于 NFT 和版权的纠结真相
- Thread多线程-(最容易被问到的面试题)
- 离散信号的周期性判定,C++实现
- 印度内阁小组讨论华为投资 通信部表示支持
- 小故事让你秒懂“资产证券化”
- debian nvidia 安装_在 Debian 上安装 Nvidia 显卡驱动启用 Nvenc
- java导出excel 方式_java导出Excel通用方法
- 微信小程序—自定义组件
- element-ui dialog(多弹框、嵌套弹框)被蒙版遮住
- 【FPGA实例】基于FPGA的DDS信号发生器设计