advancedeast认识

  1. 传统的EAST的约束:长文本识别效果不理想
  2. EAST的损失函数是类平衡交叉熵损失和smoothL1损失

score分数很高,应该跟loss很小有关,所以不能小于一个阈值,把图缩小没有效果

小于0.9的重新检测与识别

vgg方案不是很可行,因为他们的感受野都是3×3(考虑感受野,可以把最后一层换成7×7,或者更大)

基于回归框anchor的方法,减少精度损失,尽量回归出文本框

作者在EAST网络框架的基础上巧妙地设计了基于文本边界框的损失函数,将长文本检测的问题转换为检测文本头部和尾部边界区的问题

2,AdvancedEAST增加了一个头尾部分加权平均求四个顶点,后置处理

1,输入图片的尺寸:256\384\512\640\736

2,经过主干网络backbone,可以选取(PVANet原论文,VGG16http://www.360doc.com/content/17/0719/14/10408243_672570496.shtml,resnet50\100\150\200)均为提取各个尺度feature map(原图大小的1/32 1/16 1/8 1/4)然后应用规则(放大,缩小)对这些特征进行融合,融合之后的特征进行1X1卷积(减少计算量和通道数)

3,输出:点在文本中的置信度score map,vertex code(第一通是否是边界元素的置信度,第二通0表示头部元素,1表示尾部元素),vertex geo四通表示的是当前点坐标的xy偏移量

 

修改:10:05

1可视化出loss,val_loss

2数据减少到1000了,

 

 

 

 

训练准备:

1数据的准备,已准备,命名格式调整images/img_xxx.jpg  labels/img_xxx.txt

选取:ICDAR2015标注格式符合(1000张=900+100)(四个顶点坐标+一个文本内容)

文件名称有差异,可进行调整。(已调整)

编码格式有问题,vs编码出的文件为带有BOM的utf-8文件,需要转换为不带BOM的文件(已转换)

2改变设置参数,调参(目前没有进行调参)

复制当前的环境chineseocr(使用cpu进行的训练)为textdect,进行gpu的调试,gpu利用率低20%左右

实时检测gpu:watch nvidia-smi

原因:数据量太少,batchsize是否太小

杀死进程的命令kill -9 PID,中断的进程继续:kill -HUP PID

复制命令是:conda create -n chineseocr –clone textdect

3运行python preprocess.py,设置图片的尺寸256\384\512\640\736

4 python label.py

5 训练入口:python3 advanced_east.py(基层)

预训练模型:

east_model_weights_3T736.h5(icpr2018数据集9000images,合成图片)

vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5

6预测代码

python predict.py –path=./demo/img_364.jpg   –threshold=0.9也可以不加参数python predict.py

问题:

1,VGG16和VGG19输入和输出一样吗?resnet的优缺点是?

19比16多3个卷积层,结构简洁。缺点是有3个全连接层,计算量大,可以选择去掉全连接层,改用卷基层或者是卷积核数量尺寸等去修正,层数的深入可以提取更多的特征,但是一味的增加层数,会导致性能的下降,19层之后再增加一层就会导致性能的下降。而Resnet网络作者则想到了常规计算机视觉领域常用的residual representation的概念,并进一步将它应用在了CNN模型的构建当中,于是就有了基本的residual learning的block。它通过使用多个有参层来学习输入输出之间的残差表示,而非像一般CNN网络(如Alexnet/VGG等)那样使用有参层来直接尝试学习输入、输出之间的映射。实验表明使用一般意义上的有参层来直接学习残差比直接学习输入、输出间映射要容易得多(收敛速度更快),也有效得多(可通过使用更多的层来达到更高的分类精度)。当下Facebook提出的可有效生成多尺度特征表达的FPN网络也可通过将Resnet作为其发挥能力的基础网络从而得到一张图片最优的CNN特征组合集合。《Deep Residual Learning for Image Recognition, He-Kaiming, 2015》增到1022层的话,效果会下降。

2,头部和尾部的确定方法是?平均的是?

Advanced EAST的损失函数设计的主要思想是将文字框检测视为边界区预测,黄色部分为头部边界区像素,绿色部分为尾部边界区像素,如何在标签文件给出的顶点坐标里分割出头部像素和尾部像素,文件label.py实现,首先是调整文本框各点顺序为默认格式(v1 v2 v3 v4依次为左上右上右下左下,顺时针顺序),采用numpy中的argsort函数处理,找到最小的xy坐标值v1,连接v1和其他三个点,求斜率的中位数的点为v3,直观上认为v2在直线上方,v4在直线下方,最后再确定一次v1v4的顺序,比较v1v3v2v4的斜率。调整好顺序之后就是判断像素点是否在框内?point_inside_of_quad有文本框的四个顶点坐标确定文本框是扁平的还是瘦高的,确定长边和短边,沿着长边向内移动shrink by 0.6,沿着短边向内移动shrink by 0.2,(radio0.2,论文中为0.3)缩进shrink_edge。确定头部和尾部的方法是加入阈值(头:0-0.1,尾:0.9-1.0),加权平均方法:quad(pv)=求和(scope*pv)/求和score

3,为什么不够成4个点就不显示?

四边形,能不能缺少点的去补充一下

4,短文本不是很友好了,能不能在预测文本之后再处理一次

 

代码分析:

preprocess.py

函数入口是:preprocess()先判断是否存在照片和标注路径等问题,然后调整图片的大小resize,然后是reorder_vertexes排出标注的四边形的顶点的顺序(涉及一个算法,点排序),划线,文本框线,缩小后的文本框线,头尾部的各个线框等。统计输出train图片和标注数量,然后将图片随机排列shuffle(),tqdm循环打印一个可扩展的进度条信息,用户只需要封装任意的迭代器即可,tqdm(iterator)

label.py

函数入口是:process_label(),

shrink()缩小radio四边形框,50-53计算两点之间的距离公式,r矩阵是以四边形的四边长度进行排序的,diff矩阵保存的是两点的差,计算每条边的倾斜角,叫上epsilon:1e-4,防止垂直的时候影响计算。对长边进行shrink,函数为shrink_edge(),对短边进行shrink,shrink_edge()传入的参数:shrink_ridio=0.2,edge=0短 or 1长,r,thera四边形四边的倾斜角矩阵,shrink之后的是new_xy_list

point_inside_of_quad()判断像素点是否在文本框内,point_inside_of_nth_quad(),点需在框内才能进行此函数的验证,像素在0.2-0.6之间的是边像素。循环判断x,y,重新保存标注文件gt.npy,最终需要判断出的是头部标黄色,中部为红色,尾部为绿色。

缩进这个有好有坏,

advanced_east.py

调用网络East(),编译loss,optimizer,加载初始权重文件,合适的生成器参数文件cfg,保存模型和权重文件。调用了data_generator.py的gen()函数,需要的是bacth_size,是否是验证集等,随机获取图片名字,加载其标注文件。

函数keras的fit对于小型的数据集这个函数就可以了,不需要数据增强,fit_generator和train_on_batch函数:这三个函数可以完成相同的任务,本实验选用的是fit_generator()自然场景中的数据通常需要数据增强来避免过拟合并增加模型的泛化能力,首先是初始化aug,这是一个keras ImageDateGenerator对象,用于数据的增强,随机平移,调整大小等,数据增强意味着数据不再是静态的,而是动态的,不断变化的。

keras在使用fit_generator()该函数训练模型的过程:显示调用生成器函数本实验为data_generator.py的gen()函数,生成一批大小为BS???的数据,这个函数接受批量数据,执行反向传播,并更新模型中的权重,重复该过程直到达到期望的epoch数量

keras.callbacks其中一个参数1:EarlyStopping(patience=0,verbose=0)patience没有进步的训练轮数,之后停止,verbose是详细的信息模式,第二个参数2:ModelCheckpoint(filepath,monitor,verbose,save_best_only=False,save_weights_only=Flase,mode=’auto’,period=1),将每个epoth后的保存模型到filepath,monitor为监视的值,period:checkpoint之间的间隔的epoch数

Network.py。。。。。

类East,east_network(),cfg.feature_layers_num:输出之前的总层数,cfg文件中定义原论文中为(3,0,-1)现在是(5,1,1),定义input_img层,然后是VGG16的两个block1_conv1,block1_conv2参数被冻结,训练时不被改变。

https://blog.csdn.net/qq_38262266/article/details/100096292

提取

定义了一个east_detect[inside_score,side_v_code,side_v_coord三个conv2D层]

losses.py

自定义损失函数https://www.spaces.ac.cn/archives/4493

一个是四边形的loss,一个是像素点的loss

smooth_l1_loss,标注框和预测框

quad_loss,y_true与y_pred

quad_norm,g_true

nms.py

(1)把每个像素先上下连接成若干列region_neigbor,然后左右连接成若干个region_group(2)遍历每个group,取其中的每个像素,判断其头尾像素并根据头尾像素预测头尾坐标值,同时把头尾像素概率(第三通道值)分开叠加–头部区域像素叠加给头顶点,尾部区域像素叠加给尾顶点。(3)最后求出边界点的均值(此处均值不是绝对的平均,是头尾概率的加权和偏置平均)(4)把边界的坐标均值(正常四个点,八个值)返回,并返回每个顶点的概率和(第2步的叠加值)(5)nms结束(6)到predict.py里边,判断若这个group的四个顶点概率和有存在等于0的,即不够四个顶点,则舍去这个group。最后留下的group即为预测出来的最终文字区域。舍弃的部分,三个点的可以组个三角形,或者是对应成四个点

predict.py???

parse_args()获取图片路径,并输出

检测出一边的,就是有一个短边的矩形,没有另一边的想办法把另一边???

参数的可视化:

运行代码是:

TensorBoardcallback = keras.callbacks.TensorBoard(

    log_dir=’./logs’,

    histogram_freq=1, batch_size=32,

    write_graph=True, write_grads=False, write_images=True,

    embeddings_freq=0, embeddings_layer_names=None,

    embeddings_metadata=None, embeddings_data=None, update_freq=500

)

运行命令:tensorboard logdir=logs文件的path

下面是参数介绍:

log_dir: 用来保存被 TensorBoard 分析的日志文件的文件名。

histogram_freq: 对于模型中各个层计算**值和模型权重直方图的频率(训练轮数中)。 如果设置成 0 ,直方图不会被计算。对于直方图可视化的验证数据(或分离数据)一定要明确的指出。

write_graph: 是否在 TensorBoard 中可视化图像。 如果 write_graph 被设置为 True,日志文件会变得非常大。

write_grads: 是否在 TensorBoard 中可视化梯度值直方图。 histogram_freq 必须要大于 0 。

batch_size: 用以直方图计算的传入神经元网络输入批的大小。

write_images: 是否在 TensorBoard 中将模型权重以图片可视化。

embeddings_freq: 被选中的嵌入层会被保存的频率(在训练轮中)。

embeddings_layer_names: 一个列表,会被监测层的名字。 如果是 None 或空列表,那么所有的嵌入层都会被监测。

embeddings_metadata: 一个字典,对应层的名字到保存有这个嵌入层元数据文件的名字。 查看 详情 关于元数据的数据格式。 以防同样的元数据被用于所用的嵌入层,字符串可以被传入。

embeddings_data: 要嵌入在 embeddings_layer_names 指定的层的数据。 Numpy 数组(如果模型有单个输入)或 Numpy 数组列表(如果模型有多个输入)。 Learn ore about embeddings。

update_freq: ‘batch’ 或 ‘epoch’ 或 整数。当使用 ‘batch’ 时,在每个 batch 之后将损失和评估值写入到 TensorBoard 中。同样的情况应用到 ‘epoch’ 中。如果使用整数,例如 10000,这个回调会在每 10000 个样本之后将损失和评估值写入到 TensorBoard 中。注意,频繁地写入到 TensorBoard 会减缓你的训练。

原文链接:https://blog.csdn.net/zhangpeterx/article/details/90762586

Loss的理解

点在文本框内的置信度score map,vertex code(第一通是否是边界元素的置信度,第二通0表示头部元素,1表示尾部元素),vertex geo

首先用交叉熵损失平衡正负样本,加入权值,这样可以避免梯度消失

损失分为三部分:1,点是否在文本框内的损失;预测出的和标注的进行交叉熵的计算,判断两个分布的class_balanced_sigmoid_cross_entropy公式:

-β*y_hat* log(sigmoid(y)) -(1-β) * (1 – y_hat) * log(1 – sigmoid(y))

 -1 * (beta * labels * tf.log(predicts + cfg.epsilon) + (1 – beta) * (1 – labels) * tf.log(1 – predicts + cfg.epsilon))思想就是引入新的权值β实现正负样本loss的平衡,从而实现对不同正负样本的平衡。

  1. 是否是边界点上的损失;平衡正负样本,获得正负样本的交叉熵,获得正样本=1的第二位的权值,side_vertex_code_loss = tf.reduce_sum(tf.reduce_sum(pos + neg, axis=-1) * positive_weights) / (

 tf.reduce_sum(positive_weights) + cfg.epsilon)正负样本相加x正样本的权值\正样本

  1. 两个坐标点的损失,一个像素的损失+结合起来的损失

L1损失函数:最小化绝对误差,因此L1损失对异常点有较好的适应更鲁棒,不可导,有多解解的稳定性不好。关于L1损失函数的不连续的问题,可以通过平滑L1损失函数代替:

预测结果后处理:

Y=east_detect.predict(x),得到的y的内容是[:,:,:3]后一维是7个结果,(012为是否在内?是否为边界?是否为头尾?以及头或尾坐标点)

0位置判断是否为activate pixels,满足的送去nms去极大值抑制得到分数较高的和nms之后的quad。重新设置图片的大小,然后在缩小的图片上画框,按比列选颜色画头尾

召回率和精确度函数定义,在编译阶段加入即可。

def recall(y_true, y_pred):

  true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))

  possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))

  recall = true_positives / (possible_positives + K.epsilon())

  return recall

def precision(y_true, y_pred):

  true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))

  predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))

  precision = true_positives / (predicted_positives + K.epsilon())

  return precision

East_network.compile(optimizer=’adam’, loss=’自定义损失函数名称’, metrics=[‘accuracy’, precision, recall])

East_network.compile(optimizer=Adam(lr=0.0001), loss=[focal_loss],
metrics=[‘accuracy’,fbeta_score] )

源模型损失函数是quad_loss

试用损失函数iou,震荡

试用损失函数是mean_squared_logarithmic_error或msle,

在VGG网络中就证明了使用小卷积核叠加来取代大卷积核可以起到减少参数同时达到大卷积核同样大小感受野的功效。但是通过叠加小卷积核来扩大感受野只能线性增长,公式为(kernelSize−1)∗layers+1(kernelSize−1)∗layers+1,,也就是线性增长,而空洞卷积可以以指数级增长感受野

Version:1.0 StartHTML:0000000107 EndHTML:0000011074 StartFragment:0000000127 EndFragment:0000011056

Conv2D

Definition : Conv2D(**kwargs)

2D convolution layer (e.g. spatial convolution over images).

This layer creates a convolution kernel that is convolved with the layer input to produce a tensor of outputs. If use_bias is True, a bias vector is created and added to the outputs. Finally, if activation is not None, it is applied to the outputs as well.

When using this layer as the first layer in a model, provide the keyword argument input_shape (tuple of integers, does not include the sample axis), e.g. input_shape=(128, 128, 3) for 128×128 RGB pictures in data_format=”channels_last”.

# Arguments

filters: Integer, the dimensionality of the output space

(i.e. the number of output filters in the convolution).

kernel_size: An integer or tuple/list of 2 integers, specifying the

height and width of the 2D convolution window. Can be a single integer to specify the same value for all spatial dimensions.

strides: An integer or tuple/list of 2 integers,

specifying the strides of the convolution along the height and width. Can be a single integer to specify the same value for all spatial dimensions. Specifying any stride value != 1 is incompatible with specifying any dilation_rate value != 1.

padding: one of “valid” or “same” (case-insensitive).

Note that “same” is slightly inconsistent across backends with strides != 1, as described [here](https://github.com/keras-team/keras/pull/9473#issuecomment-372166860)

data_format: A string,

one of “channels_last” or “channels_first”. The ordering of the dimensions in the inputs. “channels_last” corresponds to inputs with shape (batch, height, width, channels) while “channels_first” corresponds to inputs with shape (batch, channels, height, width). It defaults to the image_data_format value found in your Keras config file at ~/.keras/keras.json. If you never set it, then it will be “channels_last”.

dilation_rate: an integer or tuple/list of 2 integers, specifying

the dilation rate to use for dilated convolution. Can be a single integer to specify the same value for all spatial dimensions. Currently, specifying any dilation_rate value != 1 is incompatible with specifying any stride value != 1.

activation: Activation function to use

(see [activations](../activations.md)). If you don’t specify anything, no activation is applied (ie. “linear” activation: a(x) = x).

use_bias: Boolean, whether the layer uses a bias vector. kernel_initializer: Initializer for the kernel weights matrix

(see [initializers](../initializers.md)).

bias_initializer: Initializer for the bias vector

(see [initializers](../initializers.md)).

kernel_regularizer: Regularizer function applied to

the kernel weights matrix (see [regularizer](../regularizers.md)).

bias_regularizer: Regularizer function applied to the bias vector

(see [regularizer](../regularizers.md)).

activity_regularizer: Regularizer function applied to

the output of the layer (its “activation”). (see [regularizer](../regularizers.md)).

kernel_constraint: Constraint function applied to the kernel matrix

(see [constraints](../constraints.md)).

bias_constraint: Constraint function applied to the bias vector

(see [constraints](../constraints.md)).

# Input shape

4D tensor with shape: (batch, channels, rows, cols) if data_format is “channels_first” or 4D tensor with shape: (batch, rows, cols, channels) if data_format is “channels_last”.

# Output shape

4D tensor with shape: (batch, filters, new_rows, new_cols) if data_format is “channels_first” or 4D tensor with shape: (batch, new_rows, new_cols, filters) if data_format is “channels_last”. rows and cols values might have changed due to padding.

>>>>>———g-if——————————– 4

调用h函数else的concat

>>>>>———g-else——————————– 3

———g-else——————————–<<<<<< 3

调用h函数else的concat

>>>>>———g-else——————————– 2

———g-else——————————–<<<<<< 2

调用h函数else的concat

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–f[1]vgg16block5的输出512

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———h-else——————————–h-else循环一直在进行】第一层

i: 2

>>>>>———g-else——————————– 1 f[1]vgg16block5上采样为 2 512

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–f[1]输出为的尺寸block5_pool_3吗?512

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

g以前为Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)【f[1]】

 

g: (None, None, None, 512) Tensor(“up_sampling2d_294/ResizeNearestNeighbor:0″, shape=(?, ?, ?, 512), dtype=float32)

f: (None, None, None, 512) 2 Tensor(“block4_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-else——————————–<<<<<h-else循环一直在进行】第一层

>>>>>———h-else——————————–

i: 3

>>>>>———g-else——————————– 2

———g-else——————————–<<<<<< 2

调用h函数else的concat

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———h-else——————————–

i: 2

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

g: (None, None, None, 512) Tensor(“up_sampling2d_298/ResizeNearestNeighbor:0”, shape=(?, ?, ?, 512), dtype=float32)

f: (None, None, None, 512) 2 Tensor(“block4_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-else——————————–<<<<<

>>>>>———g-else——————————– 2

———g-else——————————–<<<<<< 2

调用h函数else的concat

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———h-else——————————–

i: 2

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

g: (None, None, None, 512) Tensor(“up_sampling2d_302/ResizeNearestNeighbor:0″, shape=(?, ?, ?, 512), dtype=float32)

f: (None, None, None, 512) 2 Tensor(“block4_pool_30/MaxPool:0″, shape=(?, ?, ?, 512), dtype=float32)

———h-else——————————–<<<<<

g: (None, None, None, 128) Tensor(“up_sampling2d_299/ResizeNearestNeighbor:0″, shape=(?, ?, ?, 128), dtype=float32)

f: (None, None, None, 256) 3 Tensor(“block3_pool_30/MaxPool:0″, shape=(?, ?, ?, 256), dtype=float32)

———h-else——————————–<<<<<

>>>>>———h-else——————————–

i: 4

>>>>>———g-else——————————– 3

———g-else——————————–<<<<<< 3

调用h函数else的concat

>>>>>———g-else——————————– 2

———g-else——————————–<<<<<< 2

调用h函数else的concat

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———h-else——————————–

i: 2

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

g: (None, None, None, 512) Tensor(“up_sampling2d_307/ResizeNearestNeighbor:0″, shape=(?, ?, ?, 512), dtype=float32)

f: (None, None, None, 512) 2 Tensor(“block4_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-else——————————–<<<<<

>>>>>———h-else——————————–

i: 3

>>>>>———g-else——————————– 2

———g-else——————————–<<<<<< 2

调用h函数else的concat

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———h-else——————————–

i: 2

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

g: (None, None, None, 512) Tensor(“up_sampling2d_311/ResizeNearestNeighbor:0″, shape=(?, ?, ?, 512), dtype=float32)

f: (None, None, None, 512) 2 Tensor(“block4_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-else——————————–<<<<<

>>>>>———g-else——————————– 2

———g-else——————————–<<<<<< 2

调用h函数else的concat

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———h-else——————————–

i: 2

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

g: (None, None, None, 512) Tensor(“up_sampling2d_315/ResizeNearestNeighbor:0″, shape=(?, ?, ?, 512), dtype=float32)

f: (None, None, None, 512) 2 Tensor(“block4_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-else——————————–<<<<<

g: (None, None, None, 128) Tensor(“up_sampling2d_312/ResizeNearestNeighbor:0“, shape=(?, ?, ?, 128), dtype=float32)

f: (None, None, None, 256) 3 Tensor(“block3_pool_30/MaxPool:0”, shape=(?, ?, ?, 256), dtype=float32)

———h-else——————————–<<<<<

>>>>>———g-else——————————– 3

———g-else——————————–<<<<<< 3

调用h函数else的concat

>>>>>———g-else——————————– 2

———g-else——————————–<<<<<< 2

调用h函数else的concat

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———h-else——————————–

i: 2

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

g: (None, None, None, 512) Tensor(“up_sampling2d_320/ResizeNearestNeighbor:0”, shape=(?, ?, ?, 512), dtype=float32)

f: (None, None, None, 512) 2 Tensor(“block4_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-else——————————–<<<<<

>>>>>———h-else——————————–

i: 3

>>>>>———g-else——————————– 2

———g-else——————————–<<<<<< 2

调用h函数else的concat

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———h-else——————————–

i: 2

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

g: (None, None, None, 512) Tensor(“up_sampling2d_324/ResizeNearestNeighbor:0”, shape=(?, ?, ?, 512), dtype=float32)

f: (None, None, None, 512) 2 Tensor(“block4_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-else——————————–<<<<<

>>>>>———g-else——————————– 2

———g-else——————————–<<<<<< 2

调用h函数else的concat

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———h-else——————————–

i: 2

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

>>>>>———g-else——————————– 1

———g-else——————————–<<<<<< 1

>>>>>———h-if——————————–

self.f[i],i= 1 Tensor(“block5_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-if——————————–<<<<<<

g: (None, None, None, 512) Tensor(“up_sampling2d_328/ResizeNearestNeighbor:0”, shape=(?, ?, ?, 512), dtype=float32)

f: (None, None, None, 512) 2 Tensor(“block4_pool_30/MaxPool:0”, shape=(?, ?, ?, 512), dtype=float32)

———h-else——————————–<<<<<

g: (None, None, None, 128) Tensor(“up_sampling2d_325/ResizeNearestNeighbor:0”, shape=(?, ?, ?, 128), dtype=float32)

f: (None, None, None, 256) 3 Tensor(“block3_pool_30/MaxPool:0”, shape=(?, ?, ?, 256), dtype=float32)

———h-else——————————–<<<<<

g: (None, None, None, 64) Tensor(“up_sampling2d_316/ResizeNearestNeighbor:0”, shape=(?, ?, ?, 64), dtype=float32)

f: (None, None, None, 128) 4 Tensor(“block2_pool_30/MaxPool:0”, shape=(?, ?, ?, 128), dtype=float32)

———h-else——————————–<<<<<

———g-if——————————–<<<<<<< 4

east_output Tensor(“conv2d_325/Relu:0”, shape=(?, ?, ?, 32), dtype=float32)

inside_score Tensor(“inside_score_17/BiasAdd:0”, shape=(?, ?, ?, 1), dtype=float32)

side_v_code Tensor(“side_vertex_code_17/BiasAdd:0”, shape=(?, ?, ?, 2), dtype=float32)

side_v_coord Tensor(“side_vertex_coord_17/BiasAdd:0”, shape=(?, ?, ?, 4), dtype=float32)

east_detect Tensor(“east_detect_17/concat:0”, shape=(?, ?, ?, 7), dtype=float32)

 

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注