关于24点的C语言代码,能直接使用的,注释最好多一点,以便理解

关于24点的C语言代码,能直接使用的,注释最好多一点,以便理解,第1张

这道题目如果没其他较好的办法就采用暴力穷举解决。根据给定的4个数,得出两棵不同构的语法树。

OO

/ \ / \

OO和 oO

/ \/ \ / \

o o o o o O

/ \

o o

分别得出的逆波兰式为:ooOooOO和ooooOOO,其中o为 *** 作数,O为运算符。然后对这两种形式的逆波兰式进行穷举并计算即可。对于第一种逆波兰式共有4!*4^3=4*3*2*4*4*4=1536种不同情况,第二种逆波兰式也有1536种不同情况。因此,若无解,则共循环测试3072次。

include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <conio.h>

char RPN[7]

char operdata[24][4] = {{0,1,2,3},{0,1,3,2},{0,2,1,3},{0,2,3,1},{0,3,1,2},{0,3,2,1},/* *** 作数的24种不同排列*/

{1,0,2,3},{1,0,3,2},{1,2,0,3},{1,2,3,0},{1,3,0,2},{1,3,2,0},

{2,1,0,3},{2,1,3,0},{2,0,1,3},{2,0,3,1},{2,3,1,0},{2,3,0,1},

{3,1,2,0},{3,1,0,2},{3,2,1,0},{3,2,0,1},{3,0,1,2},{3,0,2,1}

}

char oper[64][3]={{-1,-1,-1},{-1,-1,-2},{-1,-1,-3},{-1,-1,-4},/* *** 作符的64种不同排列*/

{-1,-2,-1},{-1,-2,-2},{-1,-2,-3},{-1,-2,-4}, /*-1~-4分别表示:+ - * / */

{-1,-3,-1},{-1,-3,-2},{-1,-3,-3},{-1,-3,-4},

{-1,-4,-1},{-1,-4,-2},{-1,-4,-3},{-1,-4,-4},

{-2,-1,-1},{-2,-1,-2},{-2,-1,-3},{-2,-1,-4},

{-2,-2,-1},{-2,-2,-2},{-2,-2,-3},{-2,-2,-4},

{-2,-3,-1},{-2,-3,-2},{-2,-3,-3},{-2,-3,-4},

{-2,-4,-1},{-2,-4,-2},{-2,-4,-3},{-2,-4,-4},

{-3,-1,-1},{-3,-1,-2},{-3,-1,-3},{-3,-1,-4},

{-3,-2,-1},{-3,-2,-2},{-3,-2,-3},{-3,-2,-4},

{-3,-3,-1},{-3,-3,-2},{-3,-3,-3},{-3,-3,-4},

{-3,-4,-1},{-3,-4,-2},{-3,-4,-3},{-3,-4,-4},

{-4,-1,-1},{-4,-1,-2},{-4,-1,-3},{-4,-1,-4},

{-4,-2,-1},{-4,-2,-2},{-4,-2,-3},{-4,-2,-4},

{-4,-3,-1},{-4,-3,-2},{-4,-3,-3},{-4,-3,-4},

{-4,-4,-1},{-4,-4,-2},{-4,-4,-3},{-4,-4,-4}

}

void Swap(int &a, int &b)

{

int tmp = a

a = b

b = tmp

}

int compute(char *a) //如果是一个解,则返回1,否则返回0,a是一个逆波兰式

{

int stack[10], top = -1, i, s1, s2

for(i = 0i <7i++)

{

if(a[i] >0 &&a[i] <11) stack[++top] = a[i]

else {

s1 = stack[top--]

s2 = stack[top--]

if(s1 <s2) Swap(s1, s2)

switch(a[i]) {

case -1: stack[++top] = s1 + s2

break

case -2: stack[++top] = s1 - s2

break

case -3: stack[++top] = s1 * s2

break

case -4: if((s1 &&s2) &&(s1 % s2 == 0)) stack[++top] = s1 / s2

else return 0

}

}

}

return (stack[top] == 24)

}

void cout(char *a)

{

int stack[10], top = -1, i, s1, s2

for(i = 0i <7i++)

{

if(a[i] >0 &&a[i] <11) stack[++top] = a[i]

else {

s1 = stack[top--]

s2 = stack[top--]

if(s1 <s2) Swap(s1, s2)

switch(a[i]) {

case -1: stack[++top] = s1 + s2

printf("%d + %d = %d\t", s1, s2, s1+s2)

break

case -2: stack[++top] = s1 - s2

printf("%d - %d = %d\t", s1, s2, s1-s2)

break

case -3: stack[++top] = s1 * s2

printf("%d * %d = %d\t", s1, s2, s1*s2)

break

case -4: if(s1 % s2 == 0) stack[++top] = s1 / s2

printf("%d / %d = %d\t", s1, s2, s1/s2)

}

}

}

}

void main( )

{

char data[4], i, j, k, ch

int flag

srand(time(0))

printf("若退出,请按\'n\'键,否则请按其他键继续\n")

ch = getch( )

while(ch != 'n')

{

flag = 0

for(i = 0i <4i++)

{

data[i] = rand( ) % 10 + 1

printf("%d ", data[i])

}

printf("\n")

for(i = 0i <24 &&!flagi++)

{

RPN[0] = data[operdata[i][0]]

RPN[1] = data[operdata[i][1]]

RPN[3] = data[operdata[i][2]]

RPN[4] = data[operdata[i][3]]

for(j = 0j <64 &&!flagj++)

{

RPN[2] = oper[j][0]

RPN[5] = oper[j][1]

RPN[6] = oper[j][2]

flag = compute(RPN)

if(flag)

{

cout(RPN)

}

}

RPN[0] = data[operdata[i][0]]

RPN[1] = data[operdata[i][1]]

RPN[2] = data[operdata[i][2]]

RPN[3] = data[operdata[i][3]]

for(j = 0j <64 &&!flagj++)

{

RPN[4] = oper[j][0]

RPN[5] = oper[j][1]

RPN[6] = oper[j][2]

flag = compute(RPN)

if(flag)

{

cout(RPN)

}

}

}

if(!flag) printf("无解\n")

printf("若退出,请按\'n\'键,否则请按其他键继续\n")

ch = getch( )

}

}

maskrcnn简单解析 原创

2022-07-08 10:25:19

曙光_deeplove

码龄5年

关注

最近又开始看了一点detectron2框架中的maskrcnn,因此我这里回忆记录一下maskrcnn的基本原理。

一、基础网络架构

以上两个结构图就非常清晰地展示了maskrcnn网络模型的大致情况!

一、backbone

Backbone采用的是ResNet-50或者ResNet-101,作为特征提取器提取特征,我们将输入图像(大小为 H\times W )通过ResNet后,会得到五层特征图,其尺寸大小依次为:

( )

我们知道,低层特征往往含有较多的细节信息(颜色、轮廓、纹理),但包含许多的噪声以及无关信息。而高层特征包含有充分的语义信息(类别、属性等),但空间分辨率却很小,从而导致高层特征上信息丢失较为严重。因此maskrcnn采用了FPN(特征金字塔网络)的结构,来进行特征的融合。

FPN结构中包括自下而上,自上而下和横向连接三个部分。FPN可以同时利用低层特征图的空间信息和高层特征图的语义信息,它的原理很简单,就是把分辨率较小的高层特征首先通过1×1卷积降维(减少计算量),然后上采样至前一个特征图的相同尺寸,再进行逐元素相加,就能得到融合后的特征。

注:

1)自下而上:从下到上的路径,可以明显看出,其实就是简单的特征提取过程,和传统的没有区别。具体就是将ResNet作为骨架网络,根据feature map的大小分为5个stage。stage2,stage3,stage4和stage5各自最后一层输出conv2,conv3,conv4和conv5分别定义为C2,C3,C4,C5,他们相当于原始图片的stride是{4, 8, 16, 32}。需要注意的是,考虑到内存原因,stage1的conv1并没有使用。

2)自上而下和横向连接:自上而下是从最高层开始进行上采样,这里的上采样直接使用的是最近邻上采样,而不是使用反卷积 *** 作,一方面简单,另外一方面可以减少训练参数。横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合。具体就是对 C2,C3,C4,C5

中的每一层经过一个conv 1x1 *** 作(1x1卷积用于降低通道数),无激活函数 *** 作,输出通道全部设置为相同的256通道,然后和上采样的feature map进行加和 *** 作。在融合之后还会再采用3*3的卷积核对已经融合的特征进行处理,目的是消除上采样的混叠效应(aliasing effect)。

实际上,上图少绘制了一个分支:M5经过步长为2的max pooling下采样得到 P6,作者指出使用P6是想得到更大的anchor尺度512×512。但P6是只用在 RPN中用来得到region proposal的,并不会作为后续Fast RCNN的输入。

总结一下,ResNet-FPN作为RPN输入的feature map是

,而作为后续Fast RCNN的输入则是 。

二、RPN

在得到增强后的特征后,下面要讲的就是我们的RPN(Region Proposal Network)。

首先我们得明白什么叫做RPN?顾名思义,RPN就是区域推荐的网络,用于帮助网络推荐感兴趣的区域。

在说这个之前,我们得清楚什么叫做锚点?其实锚点也就是框,我们知道实例分割是要完成对物体的检测、分类、分割三个任务,而检测需要定位,也就是要得到目标的位置。Maskrcnn与fasterrcnn一样都是先生成一系列锚点,然后通过一定的规则来筛选。

各个框的大小由scale和ratio这两个参数来确定的,比如scale =[64],ratio=[0.5,1,1.5] ,则每个像素点可以产生3个不同大小的框。这个三个框是由保持框的面积不变,来通过ratio的值来改变其长宽比,从而产生不同大小的框。

我们在前面通过backbone和fpn得到了增强后的特征,现在就需要在这个特征上来使用我们的RPN结构。

这里需要说明一点,我们要在这几层特征图之间根据region proposal切出ROI进行后续的分类和回归预测。选择哪个feature map来切出这些ROI区域:我们会选择最合适的尺度的feature map来切ROI。具体来说,我们通过一个公式来决定宽w和高h的ROI到底要从哪个特征图来切:

RPN其原理如下:

注:为何是9个框呢?应该是3个ratio,那应该是3个框才对。后面我们讨论认为他这里面应该是scale给了3个,所以才会是九个

注意:上面各层特征图(p2至p6)之间根据region proposal切出ROI进行后续的分类和回归预测。选择哪个feature map来切出这些ROI区域:我们会选择最合适的尺度的feature map来切ROI。具体来说,我们通过一个公式来决定宽w和高h的ROI到底要从哪个特征图来切。

三、ROI Align

Mask RCNN的构建很简单,只是在ROI pooling(实际上用到的是ROIAlign,后面会讲到)之后添加卷积层,进行mask预测的任务。

通过ROI Align(或者说ROI Pooling)可以将输入的各个不同size的ROI进行fixed,官方是fixed大小为7x7。

3.1 原始ROI Pooling的问题

在Faster-RCNN中ROI Pooling的过程如下图所示:

注意:可以看到上图有两次量化误差,第一次是从图像坐标系转到特征图坐标系:665/32=20.78,取整20的时候出现量化误差;第二次是从特征图坐标系转到特征图中的ROI坐标系:20/7=2.86,取整到2则出现量化误差。

输入图片的大小为800x800,其中狗这个目标框的大小为665x665,经过VGG16网络之后获得的特征图尺寸为800/32 x 800/32 = 25 x 25,其中32代表VGG16中的5次下采样(步长为2)。同样地,对于狗这个目标我们将其对应到特征图上得到的结果是:

665/32 \times 665/32 = 20.78\times 20.78 = 20 \times 20

,因为坐标要保留整数所以这里引入了第一个量化误差即舍弃了目标框在特征图上对应长宽的浮点数部分。

然后我们需要将这个20\times 20的ROI区域映射为7x7的ROI特征图,根据ROI Pooling的计算方式,其结果就是:

20/7 \times 20/7 = 2.86\times 2.86 = 2 \times 2

即同样执行取整 *** 作后ROI特征区域的尺寸为2x2,这里引入了第二次量化误差!

注意:这里表达的“整 *** 作后ROI特征区域的尺寸为2x2”可能很多人会误会最后经过roi pooling的特征图大小是2x2,其实这是误会的,最后经过roi pooling的特征图大小是7x7大小的。而这个2x2是我们的池化区域视野!即每次在这2x2区域大小进行池化,直至扫描完整个20x20的区域!

从上面的分析可以看出,这两次量化误差会导致原始图像中的像素和特征图中的像素进行对应时出现偏差,例如上面将2.86量化为2的时候就引入了0.86的偏差,这个偏差映射回原图就是:

0.86\times 32 = 27.52,可以看到这个像素偏差是很大的!

3.2 ROIAlign

引自:(链接)为了缓解ROI pooling的量化误差过大的问题,hekaiming等人提出了ROIAlign,ROIAligin没有使用量化 *** 作,而是使用了双线性插值。它充分的利用原图中的虚拟像素值如27.52四周的四个真实存在的像素值来共同决定目标图中的一个像素值,即可以将27.52和类似的非整数坐标值像素对应的输出像素值估计出来。这一过程如下图所示:

其中feat.map就是VGG16或者其他Backbone网络获得的特征图。黑色实线表示的是ROI划分方式,(最后输出的特征图大小为2\times 2),然后就使用双线性插值的方式来估计这些蓝色点的像素值,最后得到输出,然后再在橘红色的区域中执行Pooling *** 作最后得到2\times 2的输出特征图。可以看到这个过程相对于ROI Pooling没有引入任何量化 *** 作即原图中的像素和特征图中的像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。

详细地讲解ROI Align *** 作。虚线部分表示feature map,实线表示ROI,这里将ROI切分成2x2的单元格。如果采样点数是4,那我们首先将每个单元格子均分成四个小方格(如红色线所示),每个小方格中心就是采样点。这些采样点的坐标通常是浮点数,所以需要对采样点像素进行双线性插值(如四个箭头所示),就可以得到该像素点的值了。然后对每个单元格内的四个采样点进行maxpooling,就可以得到最终的ROIAlign的结果。

在未引入RoIAlign前,网络中采用的是ROIPooling,采用它的目的是将不同尺寸的ROI特征图转换为相同尺寸的特征图,然后与后续的全连接层连接,但是这里因为使用了两次量化 *** 作,因此会引入两次的量化误差,而RoIAlign是采用了双线性插值算法,因此不会引入量化误差,这样映射到原始图片中像素点对应的原始位置时就不会引入偏差。

为了得到为了得到固定大小(7X7)的feature map,ROIAlign不使用量化 *** 作,然后对于浮点数,采用“双线性插值”算法进行计算,这样可以规避量化误差。双线性插值是一种图像缩放算法,它充分的利用了原图中虚拟点(比如20.56这个浮点数,像素位置都是整数值,没有浮点值)四周的四个真实存在的像素值来共同决定目标图中的一个像素值,即可以将20.56这个虚拟的位置点对应的像素值估计出来。

其中双线性插值的图示和公式如下。

双线性插值计算(x1,y1),(x2,y2)两点间任意一点的公式,这里可以看做是R1的表达式:

同理利用双线性插值计算出R1和R2这两个点的表达式:

然后对于R1和R2两点又可以继续使用双线性插值计算它们中间P点的表达式:

最终用双线性插值计算出的P点的表达公式如下,它是利用周边四个已知的坐标点值计算而来:

双线性插值的物理意义如下图所示:

由上图可知可以得到, 双线性插值本质上是目标像素所相邻的四个像素, 分别以像素对应的对角像素与目标像素的构成的矩形区域为权重,像素大小为值的加权和。

四、网络结构

引自:【从零开始学Mask RCNN】一,原理回顾&&项目文档翻译 - 知乎

4.1 概述

为了证明次网络的通用性,论文构造了多种不同结构的Mask R-CNN,具体为使用不同的Backbone网络以及是否将用于边框识别和Mask预测的上层网络分别应用于每个ROI。对于Backbone网络,Mask R-CNN基本使用了之前提出的架构,同时添加了一个全卷积的Mask(掩膜)预测分支。Figure3展示了两种典型的Mask R-CNN网络结构,左边的是采用ResNet或者ResNext做网络的backbone提取特征,右边的网络采用FPN网络做Backbone提取特征,最终作者发现使用ResNet-FPN作为特征提取的backbone具有更高的精度和更快的运行速度,所以实际工作时大多采用右图的完全并行的mask/分类回归。

4.2 ResNet-FPN (Feature Pyramid Network )

(1)FPN

FPN结构中包括自下而上,自上而下和横向连接三个部分,如下图所示。这种结构可以将各个层级的特征进行融合,使其同时具有强语义信息和强空间信息。

(2) ResNet-FPN

FPN实际上是一种通用架构,可以结合各种骨架网络使用,比如VGG,ResNet等。(这里用的就是ResNet-FPN)

1)自下而上:从下到上路径。可以明显看出,其实就是简单的特征提取过程,和传统的没有区别。具体就是将ResNet作为骨架网络,根据feature map的大小分为5个stage。stage2,stage3,stage4和stage5各自最后一层输出conv2,conv3,conv4和conv5分别定义为C2,C3,C4,C5,他们相对于原始图片的stride是{4,8,16,32}。需要注意的是,考虑到内存原因,stage1的conv1并没有使用。

2)自上而下和横向连接:自上而下是从最高层开始进行上采样,这里的上采样直接使用的是最近邻上采样,而不是使用反卷积 *** 作,一方面简单,另外一方面可以减少训练参数。横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合。具体就是对C2,C3,C4,C5中的每一层经过一个conv 1x1 *** 作(1x1卷积用于降低通道数),无激活函数 *** 作,输出通道全部设置为相同的256通道,然后和上采样的feature map进行加和 *** 作。在融合之后还会再采用3*3的卷积核对已经融合的特征进行处理,目的是消除上采样的混叠效应(aliasing effect)。

实际上,上图少绘制了一个分支:M5经过步长为2的max pooling下采样得到 P6,使用P6是想得到更大的anchor尺度512×512。但P6是只用在 RPN中用来得到region proposal的,并不会作为后续Fast RCNN的输入。

总结一下,ResNet-FPN作为RPN输入的feature map是[P2,P3,P4,P5,P6],而作为后续Fast RCNN的输入则是 [P2,P3,P4,P5] 。

(3)ResNet-FPN+Fast RCNN

将ResNet-FPN和Fast RCNN进行结合,实际上就是Faster RCNN的了,但与最初的Faster RCNN不同的是,FPN产生了特征金字塔[P2,P3,P4,P5,P6],而并非只是一个feature map。金字塔经过RPN之后会产生很多region proposal。这些region proposal是分别由P2,P3,P4,P5,P6经过RPN产生的,但用于输入到Fast RCNN中的是[P2,P3,P4,P5],也就是说要在[P2,P3,P4,P5]中根据region proposal切出ROI进行后续的分类和回归预测。选择哪个feature map来切出这些ROI区域:我们会选择最合适的尺度的feature map来切ROI。具体来说,我们通过一个公式来决定宽w和高h的ROI到底要从哪个Pk来切:

这里224表示用于预训练的ImageNet图片的大小。k0 表示面积为w*h=224*224的ROI所应该在的层级。作者将 k0设置为4,也就是说w*h=224*224的ROI应该从 P4中切出来。假设ROI的scale小于224(比如说是112 * 112),k=k0-1=4-1=3,就意味着要从更高分辨率的P3中产生。另外,k值会做取整处理,防止结果不是整数。

(4)ResNet-FPN+Fast RCNN+mask (得到了最终的Mask RCNN)

总结: (1).骨干网络ResNet-FPN,用于特征提取,另外,ResNet还可以是:ResNet-50,ResNet-101,ResNeXt-50,ResNeXt-101;

(2).头部网络,包括边界框识别(分类和回归)+mask预测。头部结构见下图:

Mask R-CNN中的改进:Faster R-CNN存在的问题是:特征图与原始图像是不对准的(mis-alignment),所以会影响检测精度。而Mask R-CNN提出了RoIAlign的方法来取代ROI pooling,RoIAlign可以保留大致的空间位置。

五、损失函数

Mask分支针对每个ROI区域产生一个K\times m\times m的输出特征图,即K\times m\times m的二值掩模图像,其中K代表目标种类数。Mask-RCNN在Faster-RCNN的基础上多了一个ROIAligin和Mask预测分支,因此Mask R-CNN的损失也是多任务损失,可以表示为如下公式:

L = L_{cls} + L_{box} + L_{mask}

其中L_{cls}表示预测框的分类损失,L_{box}表示预测框的回归损失,L_{mask}表示Mask部分的损失。

对于预测的二值掩膜输出,论文对每一个像素点应用sigmoid函数,整体损失定义为平均二值交叉损失熵。引入预测K个输出的机制,允许每个类都生成独立的掩膜,避免类间竞争。这样做解耦了掩膜和种类预测。不像FCN的做法,在每个像素点上应用softmax函数,整体采用的多任务交叉熵,这样会导致类间竞争,最终导致分割效果差。

下图更清晰的展示了Mask-RCNN的Mask预测部分的损失计算,来自知乎用户vision:

六、训练

在Faster-RCNN中,如果ROI区域和GT框的IOU>0.5,则ROI是正样本,否则为负样本。

L_{mask}只在正样本上定义,而Mask的标签是ROI和它对应的Ground Truth Mask的交集。其他的一些训练细节如下:

采用image-centric方式训练,将图片的长宽较小的一边缩放到800像素。

每个GPU的mini-batch=2,每张图片有N个采样ROIs,其中正负样本比例为1:3。

在8个gpu上进行训练,batch_size=2,迭代160k次,初始学习率0.02,在第120k次迭代时衰减10倍,weight_decay=0.0001,momentum=0.9。

七、测试

试阶段,采用的proposals的数量分别为300(Faster-RCNN)和1000(FPN)

在这些proposals上,使用bbox预测分支配合后处理nms来预测box。然后使用Mask预测分支对最高score的100个检测框进行处理。

可以看到这里和训练时Mask预测并行处理的方式不同,这里主要是为了加速推断效率。然后,Mask网络分支对每个ROI预测K个掩膜图像,但这里只需要使用其中类别概率最大的那个掩膜图像就可以了,并将这个掩膜图像resize回ROI大小,并以0.5的阈值进行二值化。

参考:

1、令人拍案称奇的Mask RCNN - 知乎

2、MaskRCNN结构详解 - 知乎

3、【从零开始学Mask RCNN】一,原理回顾&&项目文档翻译 - 知乎

4、目标检测与分割之MaskRCNN代码结构流程全面梳理+总结 - 知乎

5、实例分割算法(mask rcnn)总结 - 知乎

6、Mask Rcnn 网络结构总结 | jiajie

7、MaskRCNN网络结构 - 知乎

8、实例分割算法(mask rcnn)总结 - 知乎

9、源码解读:Faster RCNN的细节(三) - 知乎

10、Mask R-CNN网络结构理解_画外人易朽的博客-CSDN博客_maskrcnn网络结构

11、MaskRCNN源码解析1:整体结构概述_业余狙击手19的博客-CSDN博客_maskrcnn源码详解

12、目标检测与分割之MaskRCNN代码结构流程全面梳理+总结 - 知乎

13、MaskRCNN源码解析2:特征图与anchors生成_业余狙击手19的博客-CSDN博客

14、MaskRCNN源码解析1:整体结构概述_业余狙击手19的博客-CSDN博客_maskrcnn源码详解

15、锚框(anchor box)/先验框(prior bounding box)概念介绍及其生成_是苍啊!的博客-CSDN博客_anchor box

目录1 拼音2 英文参考3 疾病别名4 疾病代码5 疾病分类6 疾病概述7 疾病描述8 症状体征9 疾病病因10 病理生理11 诊断检查12 鉴别诊断13 治疗方案14 并发症15 预后及预防16 流行病学附:1 肾 *** 坏死相关药物 1 拼音

shèn rǔ tóu huài sǐ

2 英文参考

necrosis of renal papillae

necrotizing renal papillitis

renal papillary necrosis

RPN

3 疾病别名

坏死性 *** 炎,肾髓质坏死,medullary necrosis of kidney,medullarynecrosis of kidney

4 疾病代码

ICD:N15.8

5 疾病分类

肾脏内科

6 疾病概述

肾 *** 坏死(Renal Papillary Necrosis,RPN) 又称坏死性 *** 炎或肾髓质坏死,其本质是肾 *** 及其邻近的肾髓质发生缺血性坏死。女性多于男性。发病多见于较大年龄组,平均年龄53 岁,超过90%的病例发病年龄在40岁以上,半数病例在60 岁以上。儿童罕见慢性经过的肾 *** 坏死。

常见临床表现是在尿路梗阻或严重的小管间质性肾病的基础上发生的发热、血尿、急性腰痛、尿路绞痛和尿路梗阻,少数表现为急性肾功能衰竭、慢性肾功能衰竭或尿浓缩功能损害。在部分病例伴有尿路上皮肿瘤。

7 疾病描述

肾 *** 坏死(Renal Papillary Necrosis,RPN) 又称坏死性 *** 炎或肾髓质坏死,其本质是肾 *** 及其邻近的肾髓质发生缺血性坏死。本病可发生在多种疾病,主要是引起慢性小管间质性肾病的疾病,这些慢性小管间质性肾病时肾脏内髓带病变常较严重。其基本病变是肾脏血循环受损,引起一个或多个肾锥体远端的局限性或弥漫性缺血坏死。常见临床表现是在尿路梗阻或严重的小管间质性肾病的基础上发生的发热、血尿、急性腰痛、尿路绞痛和尿路梗阻,少数表现为急性肾功能衰竭、慢性肾功能衰竭或尿浓缩功能损害。在部分病例伴有尿路上皮肿瘤。在受损的肾 *** ,病变有清楚的界限,早期阶段见到凝固性坏死,这些特点与梗死(infarction)的病理变化非常相似。本病于1877 年由von Friedreich 首先报道,1948 年Gunther 报道1 例29岁病人,并指出肾 *** 坏死可见于许多疾病,如糖尿病、尿路梗阻、止痛药肾病、肾盂肾炎、镰状细胞病、肾结核、巨球蛋白血症、流行性出血热等,其中以糖尿病合并肾盂肾炎的发生率最高,占肾 *** 坏死病因的50%~60%。

8 症状体征

肾 *** 坏死按起病急缓可分为急性、亚急性和慢性,按病理部位可分为肾髓质型和肾 *** 型。病人年龄多在40 岁以上,女性多于男性。儿童罕见慢性经过的肾 *** 坏死,但有低氧血症、脱水或败血症引起急性肾 *** 坏死的报道。肾 *** 坏死的临床表现取决于坏死累及的部位、受累的 *** 数及坏死发展的速度。急性肾 *** 坏死常在上述慢性疾病的基础上突然起病,寒战高热,肉眼血尿或不同程度血尿及脓尿,多伴有尿路 *** 征和腰痛等急性肾盂肾炎的表现,如肾 *** 坏死组织脱落或血块阻塞输尿管则引起绞痛及少尿甚至无尿,严重双侧广泛性肾 *** 坏死者可出现急性肾功能衰竭,病情进展迅速,预后差,病人多死于败血症或急性肾衰竭的并发症,这类病人往往由于严重的全身情况而使局部症状不明显,尤当病人有糖尿病、尿路梗阻及心血管病变时,更不易及时诊断,临床上此型居多;亚急性者病情不如前者严重或迅速,病程较长,可达数周或数月,坏死的 *** 脱落产生尿路梗阻,肾绞痛较多见,并有排尿困难等肾组织坏死、脱落、经过尿路的症状,以及少尿和进行性肾功能不全;慢性型多在慢性间质性肾炎的基础上发生,起病隐袭,病程可达数年,临床上表现类似慢性间质性肾炎或反复发作性慢性肾盂肾炎,并出现肾小管功能障碍,如多尿、夜尿、尿浓缩功能及酚红排泌率降低,尿酸化功能障碍而引起肾小管酸中毒等,可有持续镜下血尿和脓尿以及进行性肾功能减退,终致慢性肾衰竭、尿毒症;也可无临床症状,多偶然在排泄性尿路造影时,或在死后尸体解剖时被发现。部分病例常伴有尿路上皮肿瘤。

9 疾病病因

本病多伴发于严重肾盂肾炎、糖尿病、尿路梗阻、止痛剂肾病特别是含非那西丁(Phenacetin)的制剂或中毒,亦可见于血管病变、移植肾排异、镰状细胞性贫血、高尿酸血症、巨球蛋白血症、过敏反应、休克、过度使用血管收缩药物如去甲肾上腺素等,另有报道称长期无脂饮食也可发生肾 *** 坏死。引起肾 *** 坏死的病因包括:

1.糖尿病 糖尿病是最常见的与肾 *** 坏死相关的疾病,占大宗报道的RPN病例的50%~60%。肾 *** 坏死复发的病例多数为糖尿病患者。一项静脉肾盂造影研究结果显示:在接受检查的胰岛素依赖型糖尿病患者中,25%有肾 *** 坏死。

2.梗阻性肾病 在大宗报道中,梗阻性肾病占RPN 病因的15%~40%。

3.肾盂肾炎 严重的肾盂肾炎是肾 *** 坏死的常见病因之一,特别是发生在糖尿病或尿路梗阻患者的肾盂肾炎。由于感染既可以是肾 *** 坏死的病因,也常常并发于RPN,又可继发于糖尿病,因此感染在肾 *** 坏死病因中所占的比例难于确定。

4.镇痛药滥用 镇痛药滥用,特别是含有非那西汀的镇痛合剂以及大剂量的其他镇痛药的应用,可引起肾 *** 坏死。在美国,镇痛药占RPN 病因的15%~20%;而在镇痛药滥用普遍的国家,镇痛药可占RPN 病因的70%。接受镇痛药治疗的儿童也可发生肾 *** 坏死。

5.血管炎

(1)移植肾血管炎:移植肾排斥引起的血管炎可使供应 *** 的血管阻塞,导致 *** 缺血坏死。此外,患者原发疾病如糖尿病、镰刀细胞血红蛋白病等,也可引起移植肾 *** 坏死。

(2)Wegner 肉芽肿。

(3)坏死性血管炎:包括结节性多动脉炎、变应性血管炎、微血管炎等。

6.镰状细胞血红蛋白病。

7.肝脏疾病 肝脏疾病,尤其是酒精性肝病,可引起肾 *** 坏死。 *** 型也叫全 *** 坏死,以 *** 的坏死、分界和分离为特点。坏死早期可见 *** 肿胀,黏膜正常,肾盏正常。进行性坏死则使黏膜丧失,造影见 *** 不规则,边沿模糊。随着坏死 *** 的分离,开始形成窦,肾盂造影见窦成弧形。当整个坏死 *** 与正常组织分离开时,造影可见围绕窦内坏死 *** 的环形影。在少数病例,坏死 *** 脱落至肾盂,可在尿中发现。但在多数病例,坏死的 *** 不脱落,而是被吸收或保持在远处,之后坏死的 *** 被钙化或形成结石的核心。如坏死 *** 被吸收或脱落,造影可见正常 *** 部位形成“杵状肾盏”;如坏死 *** 在原处被钙化,造影可见围绕窦内坏死 *** 的环形影。脱落的坏死 *** ,以及由此形成的结石,可造成尿路梗阻。

肾 *** 坏死可局限于少数几个 *** 或发生在许多 *** ,可累及单侧或双侧肾脏,多数患者双肾受累。有报道在一侧肾脏发生RPN 的患者,在之后的4 年内发生另一侧肾脏的 *** 坏死。

10 病理生理

肾 *** 坏死的主要发病机制可能是由于各种病因所致的肾髓质血流量不足,导致缺血性坏死。如糖尿病引起的微血管病变或镰状细胞病引起的血流障碍等。

本病的发生与肾脏髓质锥体血供的解剖生理特点及肾缺血、髓质 *** 血管病变与感染有关。肾脏血流量的85%~90%分布在皮质,髓质仅占10%~15%,越近肾 *** 血供越少,且皆源于髓旁肾单位的出球小动脉经直小血管而来,受髓质中溶质浓度和渗透压梯度的影响,血液黏稠度逐渐增高,血流缓慢,是为缺血性坏死的常见部位;伴发的基础疾病如糖尿病、止痛剂肾病、高尿酸血症等本身即可引起慢性间质性肾炎和肾小血管病变,止痛剂肾病、镰状细胞性贫血、巨球蛋白血症等致 *** 区受高浓度酸性物质 *** 及血液异常高黏滞,尿路梗阻时肾盂、肾盏及肾小管内压增加,这些因素均可导致髓质 *** 部严重缺血和坏死,兼之病全身及局部对细菌侵袭易感性增加,容易并发肾脏与泌尿道感染,进一步加重肾锥体血供障碍和组织坏死。临床发现约半数以上肾 *** 坏死病例存在两种或更多(如糖尿病合并尿路感染)的致病因素,易患因素越多,发生率越高。

11 诊断检查

诊断:本病诊断主要根据病史、症状、尿液中找到脱落的肾 *** 坏死组织以及X线检查结果,并应与非坏死型急性肾盂肾炎、肾结核、肾结石及放线菌病鉴别方可诊断。诊断标准为:

1.有慢性间质性肾炎、肾盂肾炎、集合管出口受阻、上尿路梗阻等病变。

2.尿液检查可见坏死的 *** 组织。

3.IVP 肾 *** 部位有环状阴影或缺损,髓质或 *** 钙化阴影,肾影缩小和轮廓不规则。在有引起肾 *** 坏死的原发疾病的患者,特别是在尿路梗阻或严重的小管间质性肾病的基础上,出现发热、血尿、急性腰痛、尿路绞痛和尿路梗阻,或长期多尿和夜尿,应考虑到肾 *** 坏死。糖尿病患者出现长期多尿和夜尿,不应笼统考虑为糖尿病性多尿,应注意发生肾 *** 坏死的可能。表现为长期多尿和夜尿的病例应与其他慢性小管间质性肾病(包括肾髓质囊性病)、肾小管酸中毒、尿崩症等进行鉴别。逆行或顺行肾盂造影是本病主要诊断手段。肾活检可帮助排除肾小球肾炎和其他间质性肾炎。在尿中找到坏死的肾 *** 可确诊RPN,在可疑病例应收集全部尿液,用滤纸或纱网过滤,寻找 *** 组织。应对肾 *** 坏死患者进行糖尿病、血管炎、尿路梗阻、酒精性肝病、镰状细胞血红蛋白病、静脉血栓等病因检查。对于以感染为病因的肾 *** 坏死患者,应进一步检查引起感染的原发病,如糖尿病、尿路梗阻等。镇痛剂肾病(AN)肾 *** 坏死与反流性肾病(RN)肾 *** 坏死的鉴别诊断见表1。

严重的肾盂肾炎,治疗效果不佳,肾功能进行性恶化者,应考虑本病的可能,尤其是合并糖尿病、尿路梗阻以及有长期服用镇痛药病史的患者可能性更大。

实验室检查:

1.尿液化验 有血尿,肉眼血尿占20%,显微血尿为20%~40%;如大量血尿合并失血性贫血者,需要做肾切除手术。50%~60%的患者发生白细胞尿;80%的患者存在中度蛋白尿。菌尿可出现泌尿系感染者,菌尿呈阳性。尿中找到脱落的肾 *** 坏死组织。

2.急、慢性肾衰竭则有相应的化验改变(参见“急性、慢性肾衰竭”)。

其他辅助检查:

1.B 超检查 其检查的价值有限,除非在梗阻性肾病,其引起肾 *** 坏死或继发的坏死 *** 残留在肾盏。

2.X 线检查

(1)KUB 平片:早期放射线学检查可能是阴性。静脉肾盂造影发现造影剂进入未完全脱落的肾 *** 周围,和(或)肾 *** 区发现有杵状或斑状充盈点,造影剂进入 *** 脱落后的空洞内,和(或)肾小盏边缘有“虫蚀样”改变。

(2)X 线检查表现为:

① *** 坏死型:最早是肾盏穹窿部比较模糊,进而由于肾盏穹窿部形成盲管,两个盲管逐渐联合,造影时呈现“弓形”或“环形”影像;坏死的肾 *** 脱入肾盂内出现充盈缺损,而 *** 出现棒状空腔,坏死 *** 在输尿管内产生充盈缺损及近端扩张、坏死 *** 周围有钙盐沉着时,在平片上可见环形钙化影。

②髓质坏死型:当坏死组织深在锥体之内、未与肾盏沟通时,造影无改变,而瘘管形成与肾盏相通后才出现上述现象。

(3)IVP 是本病最有价值的诊断方法:

①肾 *** 部位有环状阴影或缺损。

②髓质或 *** 钙化阴影。

③肾影缩小和轮廓不规则。

12 鉴别诊断

肾 *** 坏死需与慢性梗阻性肾病、结核、髓质海绵肾和其他引起髓质钙化的疾病作鉴别;表现为长期多尿和夜尿的病例应与其他慢性小管间质性肾病(包括肾髓质囊性病)、肾小管酸中毒、尿崩症等进行鉴别。如髓质囊肿病,其表现是对称性受累,常合并肾功能显著下降。反流性肾病,放射线学明确证实输尿管受累,且在儿童期有反流的病史。肾脏肿瘤,其发生在单侧,而肾 *** 坏死往往是双侧性病变。肾结核可通过抗酸杆菌培养区别这两类疾病。

13 治疗方案

1.本病治疗的适应证包括各种糖尿病、血管炎、梗阻性肾病、酒精性肝病、镇痛药肾病、镰状细胞病、巨球蛋白血症、肾结核、流行性出血热、肾盂肾炎或静脉血栓等原发疾病,以及肾 *** 坏死、脱落引发的血尿、腰痛、肾绞痛、少尿、氮质潴留及肾衰竭。

2.本病的治疗原则主要是针对病因治疗原发病,消除诱发因素,改善肾脏血供,减轻不适症状,促进肾脏修复。治疗方案包括尽量寻找基础疾病,控制基础疾病的发展,消除诱因;活血化瘀,疏通肾内循环,增加肾脏血流量,改善髓质血供;解痉、止痛、止血等对症治疗;肾功能不全的采用血液净化治疗。

3.治疗方案

(1)积极治疗基础疾病:如有糖尿病,积极控制血糖、血脂、血压;有尿路梗阻的早日解除梗阻;服用镇痛药者尽快停用镇痛药;镰状细胞病或巨球蛋白血症者要治疗原发病、稀释血液、减少血液黏稠度。

(2)积极控制感染:无论是原有肾盂肾炎的基础疾病,还是在其他疾病基础上新发的肾盂肾炎,都要用强有力的抗生素积极控制感染。有复杂因素的要尽快消除,如结石、血块、坏死组织块引起的尿路梗阻以及留置的导尿管。有药敏结果的参照药敏结果,无药敏结果的可先选用对革兰阴性杆菌疗效比较好、肾毒性比较小的第叁代头孢抗生素。如肾功能尚可,也可选用第叁代喹诺酮类抗生素。

(3)增加肾脏血流量:肾 *** 坏死的病理基础是以肾 *** 为中心的肾髓质血流障碍、缺血,因此应该活血化瘀、疏通肾内循环、增加肾脏血流量、改善髓质血供、减轻肾脏损害。可用低分子右旋糖酐加复方丹参注射液静脉点滴,静脉应用适量的肝素或尿激酶,以及小剂量的多巴胺、双嘧达莫、维生素E 等。具体用法、用量可根据血液黏稠度、血管d性等血液流变学指标决定。还可在早期于局部给予肾区透热、肾囊周围封闭以及肌肉或皮下注射双氢麦角堿0.3~0.6mg,每天或隔天1 次,以改善肾 *** 血供。血尿明显时暂时不用上述方法。禁用非甾体类抗炎药,因这类药物可抑制前列环素的合成,减少肾脏血流量。

(4)解痉、止痛、止血:肾 *** 坏死组织脱落时,常出现血尿;出血明显时,应予以止血治疗;大量出血时,应输注新鲜血或浓缩红细胞;坏死组织、血块阻塞输尿管时,可出现肾绞痛,可给予阿托品、哌替啶等解痉、止痛;还可插入输尿管导管用尿激酶冲洗肾盂或留置引流,并可由此注入抗生素;如无水钠潴留,鼓励病人多饮水,加强输液,促使坏死组织或血块排出。

(5)血液净化治疗:双侧广泛肾 *** 坏死,出现急性肾衰竭时,按急性肾衰竭处理,必要时行血液净化治疗。

(6)其他治疗:脱落的 *** 常能自动排出,偶尔需要外科手术。对发生持续大量血尿的个别严重病例需要行肾切除治疗

①对单侧急性肾 *** 坏死,如呈暴发性感染,或 *** 坏死大量血尿不止,或引起严重梗阻者,可作病肾切除。

②对过敏反应所致者可给予肾上腺皮质激素治疗。

③合并水电解质酸堿平衡紊乱、高血压时,积极纠正紊乱、控制血压。

14 并发症

持续肾小管酸中毒可引起进行性肾功能减退,终致慢性肾衰竭、尿毒症;严重双侧广泛性肾 *** 坏死者可出现急性肾功能衰竭。

15 预后及预防

预后:由于肾 *** 不能再生,因此本病预后主要取决于发病时肾 *** 损害的严重程度。引起肾 *** 坏死的原发病因能否去除,也决定着肾 *** 坏死的预后。对感染和梗阻的有效治疗可防止本病的进展。

预防:主要是积极寻找原发疾病并及时给予有效治疗。争取时间尽早恢复肾功能,以防病情发展致肾 *** 坏死阶段。已有明确诊断的病人,更应充分休息,抓紧中西医结合治疗以延缓肾功能恶化。

16 流行病学

本病是一种严重的肾间质疾病,其发病率澳大利亚最高,约为4%,在美国其发生率为0.16%~0.25%,我国报道较少,具体数字不很清楚。女性多于男性。发病多见于较大年龄组,平均年龄53 岁,超过90%的病例发病年龄在40岁以上,半数病例在60 岁以上。儿童罕见慢性经过的肾 *** 坏死。但有低氧血症、脱水或败血症引起急性肾 *** 坏死的报道。

肾 *** 坏死相关药物 去痛片

脱性皮炎、 *** 糜烂等。长期服用非那西丁可引起肾 *** 坏死、间质性肾炎并发生急性肾功能衰竭,甚至可能诱...

阿司匹林肠溶片

对乙酰氨基酚长期大量同用有引起肾脏病变包括肾 *** 坏死、肾癌或膀胱癌的可能。(2)与任何可引起低凝血酶...

卡巴匹林钙散

乙酰氨基酚长期大量同用有引起肾脏病变(包括肾 *** 坏死、肾癌或膀胱癌)的可能。(2)与任何可引起低凝血...

阿司匹林泡腾片

乙酰氨基酚长期大量同用有引起肾脏病变包括:肾 *** 坏死、肾癌或膀眺癌的可能。(2)与任何可引起低凝血酶...

阿司匹林片


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11437594.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存