车牌识别代码学习笔记

一、Faster R-CNN

tf.ConfigProto()

log_device_placement = True :是(否)打印设备分配日志
allow_soft_placement = True :如果你指定的设备不存在,允许TF自动分配设备
tf.ConfigProto(log_device_placement = True, allow_soft_placement = True)

def train(self):
    # Create session
    tfconfig = tf.ConfigProto(allow_soft_placement=True)
    tfconfig.gpu_options.allow_growth = True
    #使用allow_growth option,刚一开始分配少量的GPU容量,然后按需慢慢的增加,由于不会释放内存,所以会导致碎片per_process_gpu_memory_fraction
    #由于碎片存在,所以剩余显存总量足够,却无法分配
    #尝试注释掉上条语句,重新运行train,仍不够分配。。
    sess = tf.Session(config=tfconfig)

设置GPU/CPU

/CUDA_VISBLE_DEVICES = 0      python your.py #使用GPU0/CUDA_VISBLE_DEVICES = 0,1   python your.py #使用GPU0,1
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2" #设置使用的GPU
# os.environ["CUDA_VISIBLE_DEVICES"] = "-1" #设置采用CPU

tf.app.flags.FLAGS

tf.app.flags 模块是Tensorflow提供的功能,用于为Tensorflow程序实现命令行标志。也就是 tf.app.flags.FLAGS 用于命令行运行代码时传递参数。

#test.py
import tensorflow as tf

FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string('network', "vgg16", "The network to be used as backbone")
tf.app.flags.DEFINE_float('learning_rate', 0.001, "Learning rate")
print(FLAGS.network,FLAGS.learning_rate)

命令行运行

...\Faster-RCNN-TensorFlow-Python3>python test.py
vgg16 0.001
...>python test.py --network resnet --learning_rate 0.2
resnet 0.2

imdb.set_proposal_method(“gt”)

def set_proposal_method(self, method):
    method = eval('self.' + method + '_roidb')	#method绑定到self.xx_roidb函数
    self.roidb_handler = method # 改设self.roidb_handler函数为method函数

python无函数重载,后定义的函数会覆盖前面定义的

inds = np.where(dets[:, -1] >= thresh)[0]

np.where(condition)输出满足条件元素的坐标
这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。
所以inds为符合条件的各元素的第一维坐标构成的列表(maybe即相应序号)

二、Lenet-5

每次操作都是对一个batch的数据进行的

tf.get_variable()

tf.get_variable()获取已存在的变量(要求不仅名字,而且初始化方法等各个参数都一样),如果不存在,就新建一个;可以用各种初始化方法,不用明确指定值。

conv1_weights = tf.get_variable("weight",
                                        [CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_DEEP],
                                        initializer=tf.truncated_normal_initializer(stddev=0.1))

三个参数分别为
name:新变量或现有变量的名称。
shape:新变量或现有变量的形状。
ininializer:如果创建了则用它来初始化变量。

tf.truncated_normal_initializer(),例,见上

ARGS:
mean:一个python标量或一个标量张量。要生成的随机值的均值。
stddev:一个python标量或一个标量张量。要生成的随机值的标准偏差。
seed:一个Python整数。用于创建随机种子。查看 tf.set_random_seed 行为。
dtype:数据类型。只支持浮点类型。

tf.constant_initializer()

ARGS:
value: Python标量、值列表或元组,或n维Numpy数组。value参数值初始化变量的所有元素
dtype: 数据类型
verify_shape: 布尔值,用于验证value的形状。为真时(即验证value的形状),如果value的形状与初始化张量的形状不兼容,初始化器将抛出错误

tf.nn.conv2d()

data_format:表示输入的格式,有两种分别为:“NHWC”和“NCHW”,默认为“NHWC”,即batch数,高,宽,通道数
input:输入是一个4维格式的(图像)数据 shape由上一参数决定,此处即NHWC
filter:卷积核是一个4维格式的数据,shape表示为:[高,宽,深度(即input的通道数), 卷积核个数]
strides:表示步长:一个长度为4的一维列表,每个元素跟data_format互相对应,表示在data_format每一维上的移动步长,输入为“NHWC”,则strides=[batch,in_height,in_width,in_channels],其中 batch 和 in_channels 要求一定为1,即只能在一个样本的一个通道上的特征图上进行移动
padding:表示填充方式:“SAME”表示采用填充的方式,简单地理解为以0填充边缘.当stride为1时,输入和输出的维度相同;“VALID”表示采用不填充的方式,多余地进行丢弃。

conv1 = tf.nn.conv2d(input_tensor, conv1_weights,
                             strides=[1, 1, 1, 1], padding='SAME')

tf.train.exponential_decay()

ARGS:
learning_rate:初始学习率
global_step:当前迭代次数
decay_steps:衰减速度(在迭代到该次数时学习率衰减为earning_rate * decay_rate)
decay_rate:学习率衰减系数,通常介于0-1之间。
staircase=False:(默认值为False,当为True时,(global_step/decay_steps)则被转化为整数) ,选择不同的衰减方式。
name=None

staircase若为true则每隔decay_steps步对学习率进行一次更新,若为false则每一步都更新

# 定义学习率 
#学习率在每迭代55000 / BATCH_SIZE次迭代中,逐渐衰减为55000 / BATCH_SIZE次前的LEARNING_RATE_DECAY倍(r=r*LEARNING_RATE_DECAY)
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, global_step, 55000 / BATCH_SIZE, LEARNING_RATE_DECAY)

tf.add_to_collection() 、 tf.losses

#全连接层的权重需要加入正则化
tf.add_to_collection('losses', regularizer(fc1_weights))    # 将tensor对象放入同一个集合
tf.add_to_collection(tf.GraphKeys.LOSSES, regularizer(fc2_weights))#同上
# 也可通过tf.get_variable()和tf.variable_scope()的regularizer参数,直接将正则化损失添加到GraphKeys.REGULARIZATION_LOSSES

tf.losses.softmax_cross_entropy(onehot_labels=input_labels, logits=out) 
#tf.losses定义的loss函数都会自动添加到tf.GraphKeys.LOSSES,不需要add_loss()。最终,上面三个损失函数都在tf.GraphKeys.LOSSES中

loss = tf.losses.get_total_loss(add_regularization_losses=True)#可得loss和
# 也可通过 loss = tf.add_n(tf.get_collection('losses')) 求和



# 假如需要保存y,以便在预测时使用
tf.add_to_collection('pred_network', y)
 # tf.get_collection() 返回一个list. 但是这里只要第一个参数即可
 y = tf.get_collection('pred_network')[0]

tf.contrib.layers.l2_regularizer(lambda)

L2 正则化公式:原来的损失函数+lambda*权重参数的平方和,参见https://blog.csdn.net/red_stone1/article/details/80755144
tf.contrib.layers.l1regularizer(lambda)返回一个函数,用于计算给定参数的L2正则化项的值,见上(将全连接层权重参数的来l2正则化项加入到losses)

REGULARAZTION_RATE = 0.0001
regularizer = tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE)
out = model_Lenet5.inference(input_images, True, regularizer)

tf.reduce_mean(tf.cast(tf.equal(tf.argmax(out, 1),tf.argmax(input_labels, 1)),tf.float32))

tf.argmax(input_labels, 1) 得到每个label中最大值对应索引构成的列表

test = np.array([		# 4条one_hot形式的label
[0,0,0,1,0],
[0,1,0,0,0], 
[0,0,1,0,0], 
[0,0,0,0,1]])
np.argmax(test, 1)   #输出:array([3, 1, 2, 4]

tf.equal() 逐元素比较,得到长度为n的(Ture/False)一维数组(同实参的维度)
tf.cast() 转换tensor的数据类型,从bool到float32,得0/1构成的长度为n的一维数组(1的个数即正确分类的个数)
reduce_mean(input_tensor,axis=None,keep_dims=False,name=None,reduction_indices=None) 计算tensor在某一维度的平均值(axis若不指定,则计算所有元素平均值),得准确率(正确分类的个数/总数)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值