SSD-Tensorflow 工程角度配置

Download from the github

sudo apt-get install git
git clone https://github.com/balancap/SSD-Tensorflow.git

完成以后查看tree -L 2

.

├── caffe_to_tensorflow.py

├── checkpoints

│   ├── ssd_300_vgg.ckpt.data-00000-of-00001

│   └── ssd_300_vgg.ckpt.index

├── COMMANDS.md

├── datasets

│   ├── cifar10.py

│   ├── dataset_factory.py

│   ├── dataset_utils.py

│   ├── imagenet.py

│   ├── init.py

│   ├── pascalvoc_2007.py

│   ├── pascalvoc_2012.py

│   ├── pascalvoc_common.py

│   ├── pascalvoc_to_tfrecords.py

│   └── pycache

├── demo

│   ├── 000001.jpg

│   ├── 000002.jpg

│   ├── 000003.jpg

│   ├── 000004.jpg

│   ├── 000006.jpg

│   ├── 000008.jpg

│   ├── 000010.jpg

│   ├── 000022.jpg

│   ├── dog.jpg

│   ├── eagle.jpg

│   ├── horses.jpg

│   ├── person.jpg

│   └── street.jpg

├── deployment

│   ├── init.py

│   └── model_deploy.py

├── eval_ssd_network.py

├── inspect_checkpoint.py

├── nets

│   ├── caffe_scope.py

│   ├── custom_layers.py

│   ├── inception.py

│   ├── inception_resnet_v2.py

│   ├── inception_v3.py

│   ├── init.py

│   ├── nets_factory.py

│   ├── np_methods.py

│   ├── ssd_common.py

│   ├── ssd_vgg_300.py

│   ├── ssd_vgg_512.py

│   ├── vgg.py

│   └── xception.py

├── notebooks

│   ├── ssd_notebook.ipynb

│   ├── ssd_tests.ipynb

│   └── visualization.py

├── pictures

│   ├── ex1.png

│   └── ex2.png

├── preprocessing

│   ├── inception_preprocessing.py

│   ├── init.py

│   ├── preprocessing_factory.py

│   ├── ssd_vgg_preprocessing.py

│   ├── tf_image.py

│   └── vgg_preprocessing.py

├── README.md

├── tf_convert_data.py

├── tf_extended

│   ├── bboxes.py

│   ├── image.py

│   ├── init.py

│   ├── math.py

│   ├── metrics.py

│   └── tensors.py

├── tf_utils.py

├── train_ssd_network.py

  • 新建tfrecordsmkdir tfrecords
  • 解压ssd.zipunzip ./checkpoint/ssd_300_vgg.ckpt.zip

数据集转化tfrecords格式

首先你要有VOC2007格式的文件,具体怎么制作可以看我以前的博客Faster Rcnn中的说明。

  • 准备转化,需要使用tf_convert_cata.py
./VOC2007/
└── test
├── Annotations
├── ImageSets
├── JPEGImages
├── SegmentationClass
└── SegmentationObject
  • 将datasets中的pascalvoc_2007.py中的类别将20改为你自己的类别
  • 使用(路径可以改变)
DATASET_DIR=./VOC2007/test/
OUTPUT_DIR=./tfrecords
python tf_convert_data.py \
--dataset_name=pascalvoc \
--dataset_dir=${DATASET_DIR} \
--output_name=voc_2007_train \
--output_dir=${OUTPUT_DIR}
  • 遇到的问题1

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

处理:

SSD-Tensorflow/datasets/pascaovoc_to_tfrecords.py

  File "/home/learner/github/SSD-Tensorflow/datasets/pascalvoc_to_tfrecords.py", line 83, in _process_image
image_data = tf.gfile.FastGFile(filename, 'r').read()

r改为rb就可以解决

  • 遇到的问题2

类别没有改为自己的类别:pascalvoc_common.py中记录了所有的种类

SSD-Tensorflow/datasets/pascalvoc_common.py

将该文件中VOC_LABELS中的label改成你的label就好了,其中none需要保留,其他的根据样子都可以改变。

  • 修改图片读取类型
  1. image_format =b'JPEG'

  2. filename = directory + DIRECTORY_IMAGES + name + '.jpg'中 jpg 可以修改读取图片的类型

  3. datasets文件夹下``pascalvoc_to_tfrecords.pySAMPLES_PER_FILES = 1`,这里可以修改每个tfrecords中有几个图片

  • 编写脚本(位于SSD-Tensorflow下),批量测试
#!/bin/bash
#this is a shell script to convert pascal VOC datasets into tf-records only
#directory where the original dataset is stored
DATASET_DIR=./VOC2007/test/ #VOC数据保存的文件夹(VOC的目录格式未改变)
#output directory where to store TFRecords files
OUTPUT_DIR=./tfrecords #自己建立的保存tfrecords数据的文件夹 python3 ./tf_convert_data.py \
--dataset_name=pascalvoc \
--dataset_dir=${DATASET_DIR} \
--output_name=voc_2007_train \
--output_dir=${OUTPUT_DIR}

训练模型(pre-train)

首先必须有预训练模型,上边我们解压的那个就是预训练模型。

  • 修改train_ssd_network.py中154行最大训练步数,将None修改为合适的步长

mkdir logs

DATASET_DIR=./tfrecords
TRAIN_DIR=./logs/
CHECKPOINT_PATH=./checkpoints/ssd_300_vgg.ckpt
python train_ssd_network.py \
--train_dir=${TRAIN_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=pascalvoc_2007 \
--dataset_split_name=train \
--model_name=ssd_300_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--save_summaries_secs=60 \
--save_interval_secs=600 \
--weight_decay=0.0005 \
--optimizer=adam \
--learning_rate=0.001 \
--batch_size=32

train_ssd_network.py,网络参数配置,若需要改,再此文件中进行修改

修改如下边中的数字600,可以改变训练多长时间保存一次模型

tf.app.flags.DEFINE_integer(
'save_summaries_secs', 600,
'The frequency with which summaries are saved, in seconds.')
tf.app.flags.DEFINE_integer(
'save_interval_secs', 600,
'The frequency with which the model is saved, in seconds.')
  • nets/ssd_vgg_300.py (因为使用此网络结构) ,修改87 和88行的类别
 default_params = SSDParams(
img_shape=(300, 300),
num_classes=21, #根据自己的数据修改为类别+1
no_annotation_label=21, #根据自己的数据修改为类别+1
feat_layers=['block4', 'block7', 'block8', 'block9', 'block10', 'block11'],
feat_shapes=[(38, 38), (19, 19), (10, 10), (5, 5), (3, 3), (1, 1)],
anchor_size_bounds=[0.15, 0.90],
# anchor_size_bounds=[0.20, 0.90],
  • train_ssd_network.py,修改类别120行,GPU占用量,学习率,batch_size等
tf.app.flags.DEFINE_integer(
'num_classes', 21, 'Number of classes to use in the dataset.')
#根据自己的数据修改为类别+1
  • eval_ssd_network.py 修改类别,66行
# =========================================================================== #
# Main evaluation flags.
# =========================================================================== #
tf.app.flags.DEFINE_integer(
'num_classes', 21, 'Number of classes to use in the dataset.')
#根据自己的数据修改为类别+1
  • datasets/pascalvoc_2007.py 根据自己的训练数据修改整个文件
TRAIN_STATISTICS = {
'none': (0, 0),
'aeroplane': (238, 306), #238图片书, 306目标总数
'bicycle': (243, 353),
'bird': (330, 486),
'boat': (181, 290),
'bottle': (244, 505),
'bus': (186, 229),
'car': (713, 1250),
'cat': (337, 376),
'chair': (445, 798),
'cow': (141, 259),
'diningtable': (200, 215),
'dog': (421, 510),
'horse': (287, 362),
'motorbike': (245, 339),
'person': (2008, 4690),
'pottedplant': (245, 514),
'sheep': (96, 257),
'sofa': (229, 248),
'train': (261, 297),
'tvmonitor': (256, 324),
'total': (5011, 12608), //5011 为训练的图片书,12608为目标总数
}
TEST_STATISTICS = {
'none': (0, 0),
'aeroplane': (1, 1),
'bicycle': (1, 1),
'bird': (1, 1),
'boat': (1, 1),
'bottle': (1, 1),
'bus': (1, 1),
'car': (1, 1),
'cat': (1, 1),
'chair': (1, 1),
'cow': (1, 1),
'diningtable': (1, 1),
'dog': (1, 1),
'horse': (1, 1),
'motorbike': (1, 1),
'person': (1, 1),
'pottedplant': (1, 1),
'sheep': (1, 1),
'sofa': (1, 1),
'train': (1, 1),
'tvmonitor': (1, 1),
'total': (20, 20),
}
SPLITS_TO_SIZES = {
'train': 5011, #训练数据量
'test': 4952, #测试数据量
}
SPLITS_TO_STATISTICS = {
'train': TRAIN_STATISTICS,
'test': TEST_STATISTICS,
}
NUM_CLASSES = 20 #类别,根据自己数据的实际类别修改(不包含背景)

训练方案一

从vgg开始训练其中某些层的参数

# 通过加载预训练好的vgg16模型,对“voc07trainval+voc2012”进行训练
# 通过checkpoint_exclude_scopes指定哪些层的参数不需要从vgg16模型里面加载进来
# 通过trainable_scopes指定哪些层的参数是需要训练的,未指定的参数保持不变,若注释掉此命令,所有的参数均需要训练
DATASET_DIR=/home/doctorimage/kindlehe/common/dataset/VOC0712/
TRAIN_DIR=.././log_files/log_finetune/train_voc0712_20170816_1654_VGG16/
CHECKPOINT_PATH=../checkpoints/vgg_16.ckpt python3 ../train_ssd_network.py \
--train_dir=${TRAIN_DIR} \ #训练生成模型的存放路径
--dataset_dir=${DATASET_DIR} \ #数据存放路径
--dataset_name=pascalvoc_2007 \ #数据名的前缀
--dataset_split_name=train \
--model_name=ssd_300_vgg \ #加载的模型的名字
--checkpoint_path=${CHECKPOINT_PATH} \ #所加载模型的路径
--checkpoint_model_scope=vgg_16 \ #所加载模型里面的作用域名
--checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
--trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
--save_summaries_secs=60 \ #每60s保存一下日志
--save_interval_secs=600 \ #每600s保存一下模型
--weight_decay=0.0005 \ #正则化的权值衰减的系数
--optimizer=adam \ #选取的最优化函数
--learning_rate=0.001 \ #学习率
--learning_rate_decay_factor=0.94 \ #学习率的衰减因子
--batch_size=24 \
--gpu_memory_fraction=0.9 #指定占用gpu内存的百分比

训练方案二

从自己预训练好的模型开始训练(依然可以指定要训练哪些层)

(当你的模型通过vgg训练的模型收敛到大概o.5mAP的时候,可以进行这一步的fine-tune)

# 通过加载预训练好的vgg16模型,对“voc07trainval+voc2012”进行训练
# 通过checkpoint_exclude_scopes指定哪些层的参数不需要从vgg16模型里面加载进来
# 通过trainable_scopes指定哪些层的参数是需要训练的,未指定的参数保持不变
DATASET_DIR=/home/doctorimage/kindlehe/common/dataset/VOC0712/
TRAIN_DIR=.././log_files/log_finetune/train_voc0712_20170816_1654_VGG16/
CHECKPOINT_PATH=./log_files/log_finetune/train_voc0712_20170712_1741_VGG16/model.ckpt-253287 python3 ../train_ssd_network.py \
--train_dir=${TRAIN_DIR} \ #训练生成模型的存放路径
--dataset_dir=${DATASET_DIR} \ #数据存放路径
--dataset_name=pascalvoc_2007 \ #数据名的前缀
--dataset_split_name=train \
--model_name=ssd_300_vgg \ #加载的模型的名字
--checkpoint_path=${CHECKPOINT_PATH} \ #所加载模型的路径
--checkpoint_model_scope=vgg_16 \ #所加载模型里面的作用域名
--checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
--trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
--save_summaries_secs=60 \ #每60s保存一下日志
--save_interval_secs=600 \ #每600s保存一下模型
--weight_decay=0.0005 \ #正则化的权值衰减的系数
--optimizer=adam \ #选取的最优化函数
--learning_rate=0.001 \ #学习率
--learning_rate_decay_factor=0.94 \ #学习率的衰减因子
--batch_size=24 \
--gpu_memory_fraction=0.9 #指定占用gpu内存的百分比

从自己训练的ssd_300_vgg模型开始训练ssd_512_vgg的模型

  因此ssd_300_vgg中没有block12,又因为block7,block8,block9,block10,block11,中的参数张量两个网络模型中不匹配,因此ssd_512_vgg中这几个模块的参数不从ssd_300_vgg模型中继承,因此使用checkpoint_exclude_scopes命令指出。

     因为所有的参数均需要训练,因此不使用命令--trainable_scopes
 #/bin/bash
DATASET_DIR=/home/data/xxx/imagedata/xing_tf/train_tf/
TRAIN_DIR=/home/data/xxx/model/xing300512_model/
CHECKPOINT_PATH=/home/data/xxx/model/xing300_model/model.ckpt-60000 #加载的ssd_300_vgg模型
python3 ./train_ssd_network.py \
--train_dir=${TRAIN_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=pascalvoc_2007 \
--dataset_split_name=train \
--model_name=ssd_512_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--checkpoint_model_scope=ssd_300_vgg \
--checkpoint_exclude_scopes=ssd_512_vgg/block7,ssd_512_vgg/block7_box,ssd_512_vgg/block8,ssd_512_vgg/block8_box, ssd_512_vgg/block9,ssd_512_vgg/block9_box,ssd_512_vgg/block10,ssd_512_vgg/block10_box,ssd_512_vgg/block11,ssd_512_vgg/b lock11_box,ssd_512_vgg/block12,ssd_512_vgg/block12_box \
#--trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block1 0,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_3 00_vgg/block10_box,ssd_300_vgg/block11_box \
--save_summaries_secs=28800 \
--save_interval_secs=28800 \
--weight_decay=0.0005 \
--optimizer=adam \
--learning_rate_decay_factor=0.94 \
--batch_size=16 \
--num_classes=4 \
-gpu_memory_fraction=0.8 \

训练方案3

# 注释掉CHECKPOINT_PATH,不提供初始化模型,让模型自己随机初始化权重,从头训练
# 删除checkpoint_exclude_scopes和trainable_scopes,因为是从头开始训练
# CHECKPOINT_PATH=./log_files/log_finetune/train_voc0712_20170712_1741_VGG16/model.ckpt-253287 python3 ../train_ssd_network.py \
--train_dir=${TRAIN_DIR} \ #训练生成模型的存放路径
--dataset_dir=${DATASET_DIR} \ #数据存放路径
--dataset_name=pascalvoc_2007 \ #数据名的前缀
--dataset_split_name=train \
--model_name=ssd_300_vgg \ #加载的模型的名字
#--checkpoint_path=${CHECKPOINT_PATH} \ #所加载模型的路径,这里注释掉
#--checkpoint_model_scope=vgg_16 \ #所加载模型里面的作用域名
--save_summaries_secs=60 \ #每60s保存一下日志
--save_interval_secs=600 \ #每600s保存一下模型
--weight_decay=0.0005 \ #正则化的权值衰减的系数
--optimizer=adam \ #选取的最优化函数
--learning_rate=0.00001 \ #学习率
--learning_rate_decay_factor=0.94 \ #学习率的衰减因子
--batch_size=32

验证

首先将测试数据转换为tfrecords
 #!/bin/bash
DATASET_DIR=./VOC2007/test #VOC数据保存的文件夹(VOC的目录格式未改变) #output directory where to store TFRecords files
OUTPUT_DIR=/home/xxx/imagedata/xingshizheng_tf #自己建立的保存tfrecords数据的文件夹 python ./tf_convert_data.py \
--dataset_name=pascalvoc \
--dataset_dir=${DATASET_DIR} \
--output_name=voc_2007_test \ #注意修改为test
--output_dir=${OUTPUT_DIR}

建立一个sh,用于验证的信息存储

    #!/bin/bash
DATASET_DIR=./tfrecords/ #保存的转换为tfrcodes格式的数据
EVAL_DIR=./logs/ # Directory where the results are saved to
CHECKPOINT_PATH=./checkpoints/ssd_vgg_300.ckpt #换为自己训练的模型
python3 ./eval_ssd_network.py \
--eval_dir=${EVAL_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=pascalvoc_2007 \
--dataset_split_name=test \
--model_name=ssd_300_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--batch_size=1

利用ssd_notebook.ipynb显示训练测试模型的结果

# Restore SSD model

将ckpt_filename=‘ ’路径进行修改

# Test on some demo image and visualize output

将path=‘ ’路径进行修改为自己的

  • 注意事项

    • –dataset_name=pascalvoc_2007 、–dataset_split_name=train、–model_name=ssd_300_vgg这三个参数不要随便取,是比较固定的判断值
    • 如果不想使用预训练的模型,需要将--checkpoint_path=${CHECKPOINT_PATH} \注释掉即可
    • 有时候运行脚本会报错,可能是之前依次运行导致显存占满。
      1. 在TRAIN_DIR路径下会产生四中文件:

          1. checkpoint :文本文件,包含所有model.ckpt-xxxx,相当于是不同时间节点生成的所有ckpt文件的一个索引。
          2. model.ckpt-2124.data-000000-of-000001:模型文件,保存模型的权重
          3. model.ckpt-2124.meta:图文件,保存模型的网络图
          4. model.ckpt-2124.index : 这个没搞太清楚
          5. graph.pbtxt: 用protobuf格式保存的模型的图

错误

InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [16] rhs shape= [84]
[[Node: save_1/Assign_4 = Assign[T=DT_FLOAT, _class=["loc:@ssd_300_vgg/block10_box/conv_cls/biases"], use_locking=true, validate_shape=true, _device="/job:localhost/replica:0/task:
0/device:CPU:0"](ssd_300_vgg/block10_box/conv_cls/biases, save_1/RestoreV2_4)]]

添加上:

--checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
--trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \

如果遇到这种情况,那么将checkpoint中的内容删除或者备份就好了

Reference

https://blog.csdn.net/liuyan20062010/article/details/78905517

https://blog.csdn.net/weixin_39881922/article/details/80569803

https://blog.csdn.net/weixin_39881922/article/details/80569803

https://blog.csdn.net/ei1990/article/details/75282855

https://blog.csdn.net/yu734390853/article/details/79481660

SSD-Tensorflow 从工程角度进行配置的更多相关文章

  1. Google TensorFlow for GPU安装、配置大坑

    Google TensorFlow for GPU安装.配置大坑 从本周一开始(12.05),共4天半的时间,终于折腾好Google TensorFlow for GPU版本,其间跳坑无数,摔得遍体鳞 ...

  2. vue工程权限怎么配置?

    vue工程权限怎么配置? router.beforeEach((to, from, next) => { }):方法的to参数能拿到router设置的对象信息,如: { path: " ...

  3. TensorFlow安装及jupyter notebook配置

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:TensorFlow安装及jupyter notebook配置     本文地址:http:/ ...

  4. STM32F072从零配置工程-自定义时钟配置详解

    从自己的板子STM32F407入手,参考官方的SystemInit()函数: 核心在SetSysClock()这个函数,官方默认是采用HSE(设定为8MHz)作为PLL锁相环的输入输出168MHz的S ...

  5. 整合多个maven工程时Spring配置加载JDBC问题

    问题叙述: 两个工程都通过JDBC访问mysql数据库,各自运行OK, 但合并成一个maven工程后,发现前一个工程访问数据库异常,貌似拿不到自己的DAO. 解决办法: 发现这两个工程的xml配置中, ...

  6. 痞子衡嵌入式:MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异. 恩智浦 SW 团队每个季度都会公布 SDK.Tool ...

  7. 【目标检测】SSD+Tensorflow 300&512 配置详解

    SSD_300_vgg和SSD_512_vgg weights下载链接[需要科学上网~]: Model Training data Testing data mAP FPS SSD-300 VGG-b ...

  8. vs2010 vc++ 统一修改所有工程的目录配置

    vs2005和vs2008中都是通过 工具-选项-项目和解决方案-VC++目录,设置 头文件include .库文件lib.可执行文件dll的路径,以便在引用dll动态链接库文件时,可以查找到该文件的 ...

  9. stm32f107vc在IAR环境下,引用库函数的工程文件的配置方法

    stm32做开发很方便的一个原因是大家可以稍稍放松对于硬件寄存器等的设置,因为stm32有了非常丰富和实用的库函数,外设文件等等,所以我们在使用的时候可以更加关注程序开发的过程和逻辑关系.但是,在开发 ...

随机推荐

  1. 关于hql语句的一些问题

    1.student is not mapped问题: 在执行显示数据库数据的时候出错 大概提示说: errors: s.entr_Id student is not mapped 碰到这种情况一般是: ...

  2. idea创建maven多应用工程

    新建一个project ,名称为ismp,新建三个module,一个公共依赖module common,一个web module adminweb,一个java后台类 user; 目录结构如下: 如果 ...

  3. Thinkphp --- 入口文件

    通常入口文件是 index.php <?php define('APP_DEBUG',true); //define('BIND_MODULE','Home'); 这句代码会自动生成Home模块 ...

  4. POJ 2240 Arbitrage【Bellman_ford坑】

    链接: http://poj.org/problem?id=2240 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...

  5. Oracle Schema Objects——PARTITION

    Oracle Schema Objects 表分区 表- - 分区( partition )TABLE PARTITION 一段时间给出一个分区,这样方便数据的管理. 可以按照范围range分区,列表 ...

  6. 40个DBA日常维护的SQL脚本

    1.查询碎片程度高的表 条件为什么block>100,因为一些很小的表,只有几行数据实际大小很小,但是block一次性分配就是5个(11g开始默认一次性分配1M的block大小了,见create ...

  7. java 入门基础学习

    问题一:java编写的源代码为什么能在windows/linux/macOS操作系统运行?运行原理是什么?为什么说它是跨平台的? 从jdk/jvm/jre说起 1.JDK简介 https://blog ...

  8. Python开发【模块】:内置模块

    内置模块 1.__import__ # import app目录下的kingadmin.py文件 for app in conf.settings.INSTALLED_APPS: __import__ ...

  9. Scrapy框架(3)

    一.如何提升scrapy框架的爬取效率 增加并发: 默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_REQUESTS = 100,并发设 ...

  10. mysql 取当前日期对应的周一或周日

    select subdate(curdate(),date_format(curdate(),'%w')-1)//获取当前日期在本周的周一 select subdate(curdate(),date_ ...