1、# Path to Shapes trained weights
SHAPES_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_shapes.h5")

https://blog.csdn.net/u011574296/article/details/79903232    -- 训练自己的数据集
# Save weights,Typically not needed because callbacks save after every epoch,Uncomment to save manually
# model_path = os.path.join(MODEL_DIR, "mask_rcnn_shapes.h5")
# model.keras_model.save_weights(model_path)

2、cv2.copyMakeBorder(image, top=0, bottom=h-height, left=0, right=w-width,
                               borderType= cv2.BORDER_REFLECT101, value=[0,0,0] )
https://jingyan.baidu.com/article/e73e26c096074e24adb6a736.html
扩充图像的边界

3、去文本中句子开头与结尾的符号的。因为在文本中每行开头都有个"/n",代表换行。
for line in file:
line.strip().split()
这样就把每行的每个字符一个个分开,变成一个list。

4、
x = FixedBatchNormalization(axis=bn_axis, name='bn_conv1')(x)
https://blog.csdn.net/qq_34564612/article/details/79089482
公式如下:
y=γ(x-μ)/σ+β
其中x是输入,y是输出,μ是均值,σ是方差,γ和β是缩放(scale)、偏移(offset)系数。
一般来讲,这些参数都是基于channel来做的,比如输入x是一个16*32*32*128(NWHC格式)的feature map,那么上述参数都是128维的向量。其中γ和β是可有可无的,有的话,就是一个可以学习的参数(参与前向后向),没有的话,就简化成y=(x-μ)/σ。而μ和σ,在训练的时候,使用的是batch内的统计值,测试/预测的时候,采用的是训练时计算出的滑动平均值。
https://www.cnblogs.com/hrlnw/p/7227447.html

5、
python中的super( test, self).__init__()
首先找到test的父类(比如是类A),然后把类test的对象self转换为类A的对象,然后“被转换”的类A对象调用自己的__init__函数

6、
from __future__ import print_function
from __future__ import absolute_import
Python提供了__future__模块,把下一个新版本的特性导入到当前版本,于是我们就可以在当前版本中测试一些新版本的特性。

7、
考虑一批32个样本,其中每个样本是一个由16个维度组成的10个向量的序列。该层的批输入形状然后(32, 10, 16)。
可以这么理解,输入数据是一个特征方程,X1+X2+...+X10=Y,从矩阵的角度看,拿出未知数,就是10个向量,每个向量有16个维度,这16个维度是评价Y的16个特征方向。
TimeDistributed层的作用就是把Dense层应用到这10个具体的向量上,对每一个向量进行了一个Dense操作,假设是下面这段代码:
model = Sequential()model.add(TimeDistributed(Dense(8), input_shape=(10, 16)))
输出还是10个向量,但是输出的维度由16变成了8,也就是(32,10,8)。
事实上,TimeDistributed层给予了模型一种一对多,多对多的能力,增加了模型的维度。
https://blog.csdn.net/u012193416/article/details/79477220

8、

手工设置递归调用深度,方式为 import sys sys.setrecursionlimit(1000000) #例如这里设置为一百万

9、

https://yq.aliyun.com/articles/44851

from optparse import OptionParser
parser = OptionParser()
Python  有两个内建的模块用于处理命令行参数:一个是  getopt,另一个是  optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。

10、

https://blog.csdn.net/sxingming/article/details/52164249

pickle.dump(obj, file[, protocol])
序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。
pickle.load(file)
反序列化对象。将文件中的数据解析为一个Python对象。
其中要注意的是,在load(file)的时候,要让python能够找到类的定义,否则会报错

11、

numpy.random.randint(low, high=None, size=None, dtype='l')
size : int or tuple of ints, optional
Output shape. If the given shape is, e.g., (m, n, k), then m * n * k samples are drawn. Default is None, in which case a single value is returned.

12、

from keras import backend
backend.set_image_dim_ordering('th')
检查 ~/.keras/keras.json文件
if "image_dim_ordering": is "th" and "backend": "theano", your input_shape must be (channels, height, width)
if "image_dim_ordering": is "tf" and "backend": "tensorflow", your input_shape must be (height

13、
https://blog.csdn.net/qq_16949707/article/details/53418912
python numpy.expand_dims的用法

 14、

https://blog.csdn.net/qq_34564612/article/details/78881689
RPN
https://blog.csdn.net/sloanqin/article/details/51545125
首先,输入图片大小是 224*224*3(这个3是三个通道,也就是RGB三种)然后第一层的卷积核维度是 7*7*3*96 (所以大家要认识到卷积核都是4维的,在caffe的矩阵计算中都是这么实现的);
-->注意图片的第三个维度与卷积核第三个维度的关系
https://zhuanlan.zhihu.com/p/28585873
把bbox中的x1,x2,y1,y2分别通过缩放匹配到resize以后的图像。这里记做gta,尺寸为(num_of_bbox,4)。
-》对应resize后的bbox/bbox = resize之后的图/原图

for ix in range(output_width):     
   # x-coordinates of the current anchor box 
   x1_anc = downscale * (ix + 0.5) - anchor_x / 2
-》ix对应特征图上的每一个像素点,x1—anc对应到resize后的图的像素点

gt是预测出来的原图上的bbox在resize后图片上的bbox  -- 原图与resize后图片的比例
anchor是特征图上的anchor在resize后图片上的anchor  -- 特征图与resize后图片的比例

生成了num_anchors数量的channel,每个channel包含特征图(w*h)个sigmoid激活值,表明该anchor是否可用,与我们刚刚计算的y_rpn_cls对应。同样的方法,得到x_regr与刚刚计算的y_rpn_regr对应。

if len(neg_locs[0]) + num_pos > num_regions:
 val_locs = random.sample(range(len(neg_locs[0])), len(neg_locs[0]) - num_pos)
 y_is_box_valid[0, neg_locs[0][val_locs], neg_locs[1][val_locs], neg_locs[2][val_locs]]
-》neg远大于pos,所以将随机抽样到的neg-pos个的bbox设置为0

 

https://blog.csdn.net/JNingWei/article/details/78847696
RPN之后,proposal 成为 RoI (感兴趣区域) ,被输入 RoIPooling 或 RoIAlign 中进行 size上的归一化。当然,这些都是 RPN网络 之后 的操作了,严格来说并 不属于 RPN 的范围 了。

.k个proposal即k个reference boxes,每一个reference box又可以用一个scale,一个aspect_ratio和sliding window中的锚点唯一确定.所以,我们在后面说一个anchor,你就理解成一个anchor box 或一个reference box.作者在论文中定义k=9,即3种scales和3种aspect_ratio确定出当前sliding window位置处对应的9个reference boxes, 4*k个reg-layer的输出和2*k个cls-layer的score输出.对于一幅W*H的feature map,对应W*H*k个锚点.

 

y_rpn_cls = np.concatenate([y_is_box_valid, y_rpn_overlap], axis=1)
y_rpn_regr = np.concatenate([np.repeat(y_rpn_overlap, 4, axis=1), y_rpn_regr], axis=1)

这里是因为region proposal过程针对每一个锚点的每一个anchor都是有输出的,其实有很多anchor是不可用的,在y_is_box_valid那个array里面有记录。那么我们在计算loss时,也是不计算这些anchor的。因此我们在输出时,将与输出等形状的y_is_box_valid array拼接起来,计算loss时做一个对应元素的乘法,就可以舍去这些anchor产生的loss了。所以regr那里要将y_is_box_valid repeat 4倍,再与输出concatenate起来。

 

15、

https://blog.csdn.net/Seven_year_Promise/article/details/69360488  Resnet图片加参数

16、

 ap = average_precision_score(T[key], P[key])
        print('{} AP: {}'.format(key, ap))
        all_aps.append(ap)
    print('mAP = {}'.format(np.mean(np.array(all_aps))))
--https://blog.csdn.net/u011501388/article/details/77962401  mAP的概念~序列

17、

problems:
padding的深度
from keras.models import Model