├── .gitignore ├── .gitmodules ├── demo ├── 0061.jpg ├── 0210.jpg ├── 0267.jpg ├── 0272.jpg └── 0279.jpg ├── localization ├── labels.txt ├── locator.py ├── model.lua ├── models │ └── vgg.lua ├── provider.lua └── train.lua ├── main.py ├── model.lua ├── recognition ├── draw_convnet.py ├── labels │ ├── alnum_labels.txt │ └── chinese_labels.txt ├── make_pkl.py ├── models.py ├── recognizer.py └── train.py ├── segmentation └── segmentor.py ├── thesis ├── DeepPR.pdf ├── DeepPR.tex ├── Figure │ ├── AllERs.png │ ├── DetectionDemo.png │ ├── DetectionDemo2.png │ ├── ERTree.png │ ├── ERwithoutChinese.png │ ├── End2EndDemo.png │ ├── End2EndDemo2.png │ ├── FastRCNN.png │ ├── FasterRCNN.png │ ├── GoogleSelfDrivingCar.jpg │ ├── LeNet.png │ ├── LocalizationDemo.png │ ├── LocalizationTestLog.eps │ ├── LocalizationTrainLog.eps │ ├── MaxPooling.jpg │ ├── Neuron.jpg │ ├── ParkingSystem.jpg │ ├── RCNN.png │ ├── RCNNBBoxLoss.eps │ ├── RCNNClsLoss.eps │ ├── RPN.png │ ├── RPNBBoxLoss.eps │ ├── RPNClsLoss.eps │ ├── RecognitionAlnum.png │ ├── RecognitionChinese.png │ ├── ResBlock.png │ ├── ResBlockActual.png │ ├── ResNetTrainError.jpg │ ├── SegmentationDemo.png │ ├── SegmentationDemo2.png │ ├── SystemArch.eps │ ├── logo.pdf │ └── xidian.pdf ├── Makefile ├── Presentation.pdf ├── Presentation.tex ├── ThesisFiles │ ├── Abstract.tex │ ├── Appendix.tex │ ├── Chapters.tex │ ├── RefFile.bib │ └── Thanks.tex ├── Translation.dvi ├── Translation.pdf ├── Translation.tex ├── XDUbib.bst ├── XDUbibunsrt.bst ├── XDUtheme │ ├── logo_xdblue.pdf │ ├── logo_xdred.pdf │ └── waves.pdf ├── XDUthesis.cfg ├── XDUthesis.cls ├── auto │ └── DeepPR.el ├── beamercolorthemeXDUstyle.sty ├── beamerinnerthemeXDUstyle.sty ├── beamerouterthemeXDUstyle.sty ├── beamerthemeXDUstyle.sty ├── 任务书.doc ├── 工作计划.doc ├── 工作计划.pages ├── 工作计划.pdf ├── 毕业设计《软硬件验收表》.pages ├── 毕业设计《软硬件验收表》.pdf ├── 毕业设计(论文)成绩登记表.pages ├── 毕业设计(论文)成绩登记表.pdf └── 计算机学院本科生毕业设计论文修改意见表.pdf └── 考核问题.pptx /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### IPythonNotebook template 3 | # Temporary data 4 | .ipynb_checkpoints/ 5 | ### Python template 6 | # Byte-compiled / optimized / DLL files 7 | __pycache__/ 8 | *.py[cod] 9 | *$py.class 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | env/ 17 | build/ 18 | develop-eggs/ 19 | dist/ 20 | downloads/ 21 | eggs/ 22 | .eggs/ 23 | lib/ 24 | lib64/ 25 | parts/ 26 | sdist/ 27 | var/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | 32 | # PyInstaller 33 | # Usually these files are written by a python script from a template 34 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 35 | *.manifest 36 | *.spec 37 | 38 | # Installer logs 39 | pip-log.txt 40 | pip-delete-this-directory.txt 41 | 42 | # Unit test / coverage reports 43 | htmlcov/ 44 | .tox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *,cover 51 | 52 | # Translations 53 | *.mo 54 | *.pot 55 | 56 | # Django stuff: 57 | *.log 58 | 59 | # Sphinx documentation 60 | docs/_build/ 61 | 62 | # PyBuilder 63 | target/ 64 | ### JetBrains template 65 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio 66 | 67 | *.iml 68 | 69 | ## Directory-based project format: 70 | .idea/ 71 | # if you remove the above rule, at least ignore the following: 72 | 73 | # User-specific stuff: 74 | # .idea/workspace.xml 75 | # .idea/tasks.xml 76 | # .idea/dictionaries 77 | 78 | # Sensitive or high-churn files: 79 | # .idea/dataSources.ids 80 | # .idea/dataSources.xml 81 | # .idea/sqlDataSources.xml 82 | # .idea/dynamic.xml 83 | # .idea/uiDesigner.xml 84 | 85 | # Gradle: 86 | # .idea/gradle.xml 87 | # .idea/libraries 88 | 89 | # Mongo Explorer plugin: 90 | # .idea/mongoSettings.xml 91 | 92 | ## File-based project format: 93 | *.ipr 94 | *.iws 95 | 96 | ## Plugin-specific files: 97 | 98 | # IntelliJ 99 | /out/ 100 | g 101 | # mpeltonen/sbt-idea plugin 102 | .idea_modules/ 103 | 104 | # JIRA plugin 105 | atlassian-ide-plugin.xml 106 | 107 | # Crashlytics plugin (for Android Studio and IntelliJ) 108 | com_crashlytics_export_strings.xml 109 | crashlytics.properties 110 | crashlytics-build.properties 111 | 112 | # 数据文件不上传 113 | images/ 114 | labels.txt 115 | *.t7 116 | *.dat 117 | *.h5 118 | *.pkl 119 | logs/ 120 | logs/* 121 | 122 | # Pages 123 | .pages 124 | 125 | # LaTeX 126 | *.toc 127 | *.bbl 128 | *.blg 129 | *.out 130 | *.aux 131 | *.log 132 | *.bak 133 | *.thm 134 | *.synctex.gz 135 | *.fdb_latexmk 136 | *.fls 137 | *.glo 138 | *.gls 139 | *.ids 140 | *.ilg 141 | *.ind 142 | *.bcf 143 | *.nav 144 | *.snm 145 | *.run.xml 146 | auto/ 147 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "segmentation/erfilter_train"] 2 | path = segmentation/erfilter_train 3 | url = https://github.com/DelightRun/erfilter_train.git 4 | [submodule "detection"] 5 | path = detection 6 | url = https://github.com/DelightRun/py-faster-rcnn.git 7 | [submodule "localization/pytorch"] 8 | path = localization/pytorch 9 | url = https://github.com/hughperkins/pytorch.git 10 | -------------------------------------------------------------------------------- /demo/0061.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/demo/0061.jpg -------------------------------------------------------------------------------- /demo/0210.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/demo/0210.jpg -------------------------------------------------------------------------------- /demo/0267.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/demo/0267.jpg -------------------------------------------------------------------------------- /demo/0272.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/demo/0272.jpg -------------------------------------------------------------------------------- /demo/0279.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/demo/0279.jpg -------------------------------------------------------------------------------- /localization/locator.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # vim:fenc=utf-8 4 | # 5 | # Copyright © 2016 Changxu Wang 6 | # 7 | # Distributed under terms of the MIT license. 8 | 9 | import PyTorchHelpers 10 | 11 | import os 12 | import sys 13 | import cv2 14 | import numpy 15 | 16 | basedir = os.path.dirname(os.path.realpath(__file__)) 17 | model_name = 'model-34.t7' 18 | 19 | Model = PyTorchHelpers.load_lua_class('model.lua', 'Model') 20 | model = Model(model_name) 21 | 22 | def locate(images): 23 | resized_images = [cv2.resize(image, (448, 224)) for image in images] 24 | input_images = numpy.array(resized_images, dtype=numpy.float32) / 255.0 25 | output = model.forward(input_images).asNumpyTensor() 26 | 27 | output_images = [] 28 | for i, image in enumerate(images): 29 | height, width = image.shape[:2] 30 | 31 | keypoints = output[i].reshape((4,2)) 32 | keypoints[:, 0] *= width 33 | keypoints[:, 1] *= height 34 | keypoints = numpy.round(keypoints) 35 | 36 | vertex = numpy.array([[width-1, 0], [width-1, height-1], [0, height-1], [0,0]], dtype=numpy.float32) 37 | 38 | M = cv2.getPerspectiveTransform(keypoints, vertex) 39 | output_images.append(cv2.warpPerspective(image, M, (width, height))) 40 | 41 | return output_images 42 | 43 | if __name__ == '__main__': 44 | from matplotlib import pyplot as plt 45 | 46 | if len(sys.argv) != 2: 47 | print('Usage: python locator.py image') 48 | exit() 49 | 50 | origin = cv2.imread(sys.argv[1]) 51 | output = locate([origin, ])[0] 52 | 53 | f, (ax1, ax2) = plt.subplots(nrows=2, ncols=1) 54 | ax1.imshow(origin[:,:,::-1]) 55 | ax2.imshow(output[:,:,::-1]) 56 | plt.show() 57 | -------------------------------------------------------------------------------- /localization/model.lua: -------------------------------------------------------------------------------- 1 | require 'torch' 2 | require 'nn' 3 | 4 | local Model = torch.class('Model') 5 | 6 | function Model:__init(modelFileName) 7 | self.model = torch.load(paths.concat('.', 'models', modelFileName)) 8 | self.model:float() 9 | self.model:evaluate() 10 | end 11 | 12 | function Model:forward(input) 13 | self.input = input:transpose(4,3):transpose(3,2) 14 | return self.model:forward(self.input) 15 | end 16 | -------------------------------------------------------------------------------- /localization/models/vgg.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | require 'cunn' 3 | require 'cudnn' 4 | local nninit = require 'nninit' 5 | 6 | local cfg = {32, 'M', 64, 'M', 128, 'M', 128, 'M', 256, 256, 'M'} 7 | 8 | local features = nn.Sequential() 9 | 10 | local nInputPlanes = 3 11 | 12 | local width = 448 13 | local height = 224 14 | 15 | do 16 | for k, v in ipairs(cfg) do 17 | if v == 'M' then 18 | features:add(nn.SpatialMaxPooling(2,2,2,2)) 19 | width = width / 2 20 | height = height / 2 21 | else 22 | local nOutputPlanes = v 23 | features:add(nn.SpatialConvolution(nInputPlanes, nOutputPlanes, 3, 3, 1, 1, 1, 1):init('weight', nninit.kaiming)) 24 | features:add(nn.SpatialBatchNormalization(nOutputPlanes)) 25 | features:add(nn.ReLU()) 26 | nInputPlanes = nOutputPlanes 27 | end 28 | end 29 | end 30 | 31 | local regressor = nn.Sequential() 32 | regressor:add(nn.View(nInputPlanes*width*height)) 33 | while nInputPlanes ~= 1 do 34 | local nOutputPlanes = nInputPlanes / 4 35 | regressor:add(nn.Linear(nInputPlanes*width*height, nOutputPlanes*width*height)) 36 | regressor:add(nn.BatchNormalization(nOutputPlanes*width*height)) 37 | regressor:add(nn.ReLU()) 38 | nInputPlanes = nOutputPlanes 39 | end 40 | regressor:add(nn.Linear(width*height, 8)) 41 | 42 | local model = nn.Sequential() 43 | model:add(features):add(regressor) 44 | 45 | model:cuda() 46 | cudnn.convert(model, cudnn) 47 | 48 | print(model) 49 | 50 | model:clearState() 51 | torch.save('vgg.t7', model) 52 | -------------------------------------------------------------------------------- /localization/provider.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | require 'image' 3 | require 'xlua' 4 | 5 | local Provider = torch.class('Provider') 6 | 7 | function Provider:__init() 8 | local train_size = 900 9 | local test_size = 100 10 | 11 | local img_width = 448 12 | local img_height = 224 13 | 14 | if paths.filep('dataset.t7') then 15 | local dataset = torch.load('dataset.t7') 16 | self.trainData = dataset.trainData 17 | self.testData = dataset.testData 18 | else 19 | self.trainData = { 20 | filenames = {}, 21 | keypoints = {}, 22 | X = torch.Tensor(train_size, 3, img_height, img_width), 23 | y = torch.Tensor(train_size, 8), 24 | size = function() return train_size end 25 | } 26 | 27 | self.testData = { 28 | filenames = {}, 29 | keypoints = {}, 30 | X = torch.Tensor(test_size, 3, img_height, img_width), 31 | y = torch.Tensor(test_size, 8), 32 | size = function() return test_size end 33 | } 34 | 35 | local labelfile = io.open(paths.concat(".", "labels.txt"), "r") 36 | local index = 0 37 | for line in labelfile:lines() do 38 | local filename, keypoints_str = unpack(line:split("*")) 39 | index = index + 1 40 | 41 | filename = filename:gsub("^%s*(.-)%s*$", "%1") -- filename:strip() 42 | local keypoints = keypoints_str:split(" ") 43 | 44 | local img = image.load(paths.concat(".", "images", filename..".jpg")) 45 | for i = 1, 7, 2 do 46 | keypoints[i] = tonumber(keypoints[i]) / img:size(3) 47 | end 48 | for i = 2, 8, 2 do 49 | keypoints[i] = tonumber(keypoints[i]) / img:size(2) 50 | end 51 | img = image.scale(img, img_width, img_height) 52 | 53 | if index <= train_size then 54 | self.trainData.filenames[index] = filename..'.jpg' 55 | self.trainData.keypoints[index] = keypoints_str:gsub("^%s*(.-)%s*$", "%1") -- strip 56 | self.trainData.X[index] = img 57 | self.trainData.y[index] = torch.Tensor(keypoints) 58 | else 59 | self.testData.filenames[index - train_size] = filename..'.jpg' 60 | self.testData.keypoints[index - train_size] = keypoints_str:gsub("^%s*(.-)%s*$", "%1") -- strip 61 | self.testData.X[index - train_size] = img 62 | self.testData.y[index - train_size] = torch.Tensor(keypoints) 63 | end 64 | end 65 | io.close(labelfile) 66 | 67 | torch.save('dataset.t7', {trainData=self.trainData, testData=self.testData}) 68 | end 69 | end 70 | -------------------------------------------------------------------------------- /localization/train.lua: -------------------------------------------------------------------------------- 1 | require 'xlua' 2 | require 'optim' 3 | require 'cunn' 4 | require 'cudnn' 5 | require 'cutorch' 6 | require 'provider' 7 | require 'graph' 8 | 9 | local c = require 'trepl.colorize' 10 | 11 | opt = lapp[[ 12 | -s,--save (default "logs") subdirectory to save logs 13 | -b,--batchSize (default 25) batch size 14 | -r,--learningRate (default 0.1) learning rate 15 | -n,--nGPU (default 2) number of GPUs 16 | --epoch_step (default 10) epoch step 17 | --model (default "resnet-34.t7") model file 18 | --max_epoch (default 100) maximum number of iterations 19 | --savename (default "") model save name, nil for don't save 20 | ]] 21 | 22 | print(opt) 23 | 24 | print(c.blue '==>' ..' configuring model') 25 | model = torch.load(paths.concat('.', 'models', opt.model)) 26 | cudnn.convert(model, cudnn) 27 | if opt.nGPU > 1 then 28 | assert(opt.nGPU <= cutorch.getDeviceCount(), 'number of GPUs less than nGPU specified') 29 | local gpus = torch.range(1, opt.nGPU):totable() 30 | local fastest, benchmark = cudnn.fastest, cudnn.benchmark 31 | local dpt = nn.DataParallelTable(1, true, true) 32 | :add(model, gpus) 33 | :threads(function() 34 | local cudnn = require 'cudnn' 35 | cudnn.fastest, cudnn.benchmark = fastest, benchmark 36 | end) 37 | dpt.gradInput = nil 38 | model = dpt:cuda() 39 | end 40 | 41 | print(model) 42 | 43 | print(c.blue '==>' ..' loading data') 44 | provider = Provider() 45 | provider.trainData.X = provider.trainData.X:cuda() 46 | provider.trainData.y = provider.trainData.y:cuda() 47 | provider.testData.X = provider.testData.X:cuda() 48 | provider.testData.y = provider.testData.y:cuda() 49 | 50 | parameters, gradParameters = model:getParameters() 51 | 52 | inputs = torch.CudaTensor(opt.batchSize, 3, 224, 448) 53 | targets = torch.CudaTensor(opt.batchSize, 8) 54 | indices = torch.randperm(provider.trainData.X:size(1)):long():split(opt.batchSize) 55 | 56 | print(c.blue '==>' ..' setting criterion') 57 | criterion = nn.MSECriterion():cuda() 58 | 59 | 60 | print(c.blue '==>' ..' configuring optimizer') 61 | optimState = { 62 | learningRate = opt.learningRate 63 | } 64 | 65 | print('Will save logs at ' ..opt.save) 66 | paths.mkdir(opt.save) 67 | 68 | trainLogger = optim.Logger(paths.concat(opt.save, 'train.log')) 69 | trainLogger:setNames{'training loss: %' } 70 | trainLogger.showPlot = false 71 | 72 | testLogger = optim.Logger(paths.concat(opt.save, 'test.log')) 73 | testLogger:setNames{'test average error: %' } 74 | testLogger.showPlot = false 75 | 76 | function train() 77 | cutorch.synchronize() 78 | 79 | model:training() 80 | 81 | -- drop learning rate every "epoch_step" epochs 82 | if epoch % opt.epoch_step == 0 then optimState.leanringRate = optimState.learningRate/2 end 83 | 84 | print(c.blue '==>'.." online epoch # " .. epoch .. " [batchSize = " .. opt.batchSize .. ']') 85 | 86 | local current_loss = 0 87 | local tic = torch.tic() 88 | for t, v in ipairs(indices) do 89 | xlua.progress(t, #indices) 90 | 91 | inputs:copy(provider.trainData.X:index(1, v)) 92 | targets:copy(provider.trainData.y:index(1, v)) 93 | 94 | cutorch.synchronize() 95 | collectgarbage() 96 | 97 | local feval = function(x) 98 | if x ~= parameters then parameters:copy(x) end 99 | model:zeroGradParameters() 100 | local outputs = model:forward(inputs) 101 | local err = criterion:forward(outputs, targets) -- loss 102 | local gradOutputs = criterion:backward(outputs, targets) 103 | model:backward(inputs, gradOutputs) 104 | 105 | return err, gradParameters 106 | end 107 | 108 | _, fs = optim.adam(feval, parameters, optimState) 109 | 110 | if model.needsSync then 111 | model:syncParameters() 112 | end 113 | 114 | current_loss = current_loss + fs[1] 115 | end 116 | 117 | cutorch.synchronize() 118 | 119 | if trainLogger then 120 | trainLogger:add{current_loss} 121 | trainLogger:style{'-'} 122 | trainLogger:plot() 123 | end 124 | 125 | print(('Train loss: '..c.cyan'%.3f'..'\t time: %.2f s'):format(current_loss, torch.toc(tic))) 126 | end 127 | 128 | min_avg_error = 1 / 0 -- set min_avg_error to inf 129 | best_epoch = 0 130 | function test() 131 | cutorch.synchronize() 132 | model:evaluate() 133 | print(c.blue '==>'.." testing") 134 | 135 | local outputs = torch.Tensor(provider.testData.y:size()):cuda() 136 | for i = 1, provider.testData.X:size(1), opt.batchSize do 137 | outputs:narrow(1, i, opt.batchSize):copy(model:forward(provider.testData.X:narrow(1, i, opt.batchSize))) 138 | cutorch.synchronize() 139 | end 140 | cutorch.synchronize() 141 | 142 | local errors = provider.testData.y - outputs 143 | 144 | local avg_error = errors:abs():max(2):mean() 145 | local max_error, index = errors:abs():max(2):max(1) 146 | max_error = max_error[1][1] 147 | index = index[1][1] 148 | 149 | print(('Best epoch: '..c.cyan'%d'):format(best_epoch)) 150 | print(('Minimum average error: '..c.cyan'%.3f'):format(min_avg_error)) 151 | print(('Test average error: '..c.cyan'%.3f'):format(avg_error)) 152 | print(('Test maximum error: '..c.cyan'%.3f'):format(max_error)) 153 | 154 | print(('Index: '..c.cyan'%d'):format(index)) 155 | 156 | print(('filename: '..c.cyan'%s'):format(provider.testData.filenames[index])) 157 | print(('keypoints: '..c.cyan'%s'):format(provider.testData.keypoints[index])) 158 | print('Expected output: ') 159 | print(provider.testData.y[index]) 160 | print('Actual output: ') 161 | print(outputs[index]) 162 | 163 | if testLogger then 164 | testLogger:add{avg_error} 165 | testLogger:style{'-'} 166 | testLogger:plot() 167 | end 168 | 169 | collectgarbage() 170 | 171 | if avg_error < min_avg_error then 172 | min_avg_error = avg_error 173 | best_epoch = epoch 174 | if opt.savename ~= "" then 175 | -- save model 176 | print('Save current model') 177 | torch.save(paths.concat('.', 'models', opt.savename), model) 178 | end 179 | end 180 | end 181 | 182 | epoch = 1 183 | while epoch <= opt.max_epoch do 184 | train() 185 | test() 186 | epoch = epoch + 1 187 | end 188 | 189 | -- release memory 190 | provider = nil 191 | inputs = nil 192 | targets = nil 193 | indices = nil 194 | model = nil 195 | criterion = nil 196 | collectgarbage() 197 | 198 | function replaceModules(net, orig_class_name, replacer) 199 | local nodes, container_nodes = net:findModules(orig_class_name) 200 | for i = 1, #nodes do 201 | for j = 1, #(container_nodes[i].modules) do 202 | if container_nodes[i].modules[j] == nodes[i] then 203 | local orig_mod = container_nodes[i].modules[j] 204 | container_nodes[i].modules[j] = replacer(orig_mod) 205 | end 206 | end 207 | end 208 | end 209 | 210 | function cudnnNetToCpu(net) 211 | local net_cpu = net:clone():float() 212 | 213 | replaceModules(net_cpu, 'cudnn.SpatialConvolution', 214 | function(orig_mod) 215 | local cpu_mod = nn.SpatialConvolutionMM(orig_mod.nInputPlane, orig_mod.nOutputPlane, 216 | orig_mod.kW, orig_mod.kH, orig_mod.dW, orig_mod.dH, orig_mod.padW, orig_mod.padH) 217 | cpu_mod.weight:copy(orig_mod.weight) 218 | cpu_mod.bias:copy(orig_mod.bias) 219 | return cpu_mod 220 | end) 221 | replaceModules(net_cpu, 'cudnn.SpatialAveragePooling', 222 | function(orig_mod) 223 | return nn.SpatialAveragePooling(orig_mod.kW, orig_mod.kH, orig_mod.dW, orig_mod.dH, orig_mod.padW, orig_mod.padH) 224 | end) 225 | replaceModules(net_cpu, 'cudnn.SpatialMaxPooling', 226 | function(orig_mod) 227 | return nn.SpatialMaxPooling(orig_mod.kW, orig_mod.kH, orig_mod.dW, orig_mod.dH, orig_mod.padW, orig_mod.padH) 228 | end) 229 | replaceModules(net_cpu, 'cudnn.ReLU', function() return nn.ReLU() end) 230 | 231 | return net_cpu 232 | end 233 | 234 | if opt.savename ~= "" then 235 | print(c.blue '==>' ..' compressing best model') 236 | best_model = torch.load(paths.concat('.', 'models', opt.savename)) 237 | if torch.type(best_model) == 'nn.DataParallelTable' then 238 | best_model = best_model:get(1) 239 | end 240 | best_model:clearState() 241 | best_model = cudnnNetToCpu(best_model) 242 | torch.save(paths.concat('.', 'models', opt.savename), best_model) 243 | end 244 | 245 | print(c.blue '==>' ..' result') 246 | print(('Best epoch: '..c.cyan'%d'):format(best_epoch)) 247 | print(('Minimum average error: '..c.cyan'%.3f'):format(min_avg_error)) 248 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import time 4 | import argparse 5 | import matplotlib.pyplot as plt 6 | 7 | import cv2 8 | import numpy 9 | 10 | from detection import detector 11 | from localization import locator 12 | from segmentation import segmentor 13 | from recognition import recognizer 14 | 15 | 16 | if __name__ == '__main__': 17 | parser = argparse.ArgumentParser(description='DeepPR demo') 18 | parser.add_argument('--display', dest='display', 19 | help='Display images', 20 | default=False, action='store_true') 21 | args = parser.parse_args() 22 | 23 | while True: 24 | filepath = str(input('Please input image file path: ')).strip() 25 | 26 | if filepath.lower() == 'exit' or filepath.lower() == 'quit': 27 | plt.close('all') 28 | sys.exit() 29 | 30 | if not os.path.exists(filepath) or not os.path.isfile(filepath): 31 | print('Not valid file path') 32 | continue 33 | 34 | origin_image = cv2.imread(filepath) 35 | 36 | if origin_image is None: 37 | print('Cannot read image') 38 | continue 39 | 40 | start = time.time() 41 | license_images = [image for image, score in detector.detect(origin_image)['license']] 42 | print('Detection time epapsed: %fms' % ((time.time() - start)*1000.0)) 43 | 44 | for license_image in license_images: 45 | seg_start = time.time() 46 | rects, chars = segmentor.segment(license_image) 47 | print('Segmentation time epapsed: %fms' % ((time.time() - seg_start)*1000.0)) 48 | 49 | if len(chars) != 7: 50 | print('Illegal Plate License') 51 | continue 52 | 53 | reg_start = time.time() 54 | result = recognizer.recognize(chars) 55 | print('Recognition time epapsed: %fms' % ((time.time() - reg_start)*1000.0)) 56 | 57 | print(result) 58 | 59 | if args.display: 60 | er_image = license_image.copy() 61 | for rect in rects: 62 | cv2.rectangle(er_image, (rect[0], rect[1]), (rect[0]+rect[2], rect[1]+rect[3]), (0, 0, 255), 3) 63 | chars_image = numpy.hstack(chars) 64 | 65 | plt.close('all') 66 | figure, axis = plt.subplots(nrows=2, ncols=2) 67 | plt.suptitle(''.join(result), size=32) 68 | axis[0][0].imshow(origin_image[:,:,::-1]) 69 | axis[0][1].imshow(license_image[:,:,::-1]) 70 | axis[1][0].imshow(er_image[:,:,::-1]) 71 | axis[1][1].imshow(chars_image, cmap=plt.cm.gray) 72 | plt.show() 73 | 74 | end = time.time() 75 | print('total ime elapsed: %fms' % ((end-start)*1000.0)) 76 | -------------------------------------------------------------------------------- /model.lua: -------------------------------------------------------------------------------- 1 | require 'torch' 2 | require 'nn' 3 | 4 | local Model = torch.class('Model') 5 | 6 | function Model:__init(modelFileName) 7 | self.model = torch.load(paths.concat('.', 'localization', 'models', modelFileName)) 8 | self.model:float() 9 | self.model:evaluate() 10 | end 11 | 12 | function Model:forward(input) 13 | self.input = input:transpose(4,3):transpose(3,2) 14 | return self.model:forward(self.input) 15 | end 16 | -------------------------------------------------------------------------------- /recognition/draw_convnet.py: -------------------------------------------------------------------------------- 1 | """ 2 | Copyright (c) 2016, Gavin Weiguang Ding 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, 12 | this list of conditions and the following disclaimer in the documentation 13 | and/or other materials provided with the distribution. 14 | 15 | 3. Neither the name of the copyright holder nor the names of its contributors 16 | may be used to endorse or promote products derived from this software 17 | without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 | POSSIBILITY OF SUCH DAMAGE. 30 | """ 31 | 32 | 33 | import os 34 | import numpy as np 35 | import matplotlib.pyplot as plt 36 | plt.rcdefaults() 37 | from matplotlib.lines import Line2D 38 | from matplotlib.patches import Rectangle 39 | from matplotlib.collections import PatchCollection 40 | 41 | 42 | NumConvMax = 8 43 | NumFcMax = 20 44 | White = 1. 45 | Light = 0.7 46 | Medium = 0.5 47 | Dark = 0.3 48 | Black = 0. 49 | 50 | 51 | def add_layer(patches, colors, size=24, num=5, 52 | top_left=[0, 0], 53 | loc_diff=[3, -3], 54 | ): 55 | # add a rectangle 56 | top_left = np.array(top_left) 57 | loc_diff = np.array(loc_diff) 58 | loc_start = top_left - np.array([0, size]) 59 | for ind in range(num): 60 | patches.append(Rectangle(loc_start + ind * loc_diff, size, size)) 61 | if ind % 2: 62 | colors.append(Medium) 63 | else: 64 | colors.append(Light) 65 | 66 | 67 | def add_mapping(patches, colors, start_ratio, patch_size, ind_bgn, 68 | top_left_list, loc_diff_list, num_show_list, size_list): 69 | 70 | start_loc = top_left_list[ind_bgn] \ 71 | + (num_show_list[ind_bgn] - 1) * np.array(loc_diff_list[ind_bgn]) \ 72 | + np.array([start_ratio[0] * size_list[ind_bgn], 73 | -start_ratio[1] * size_list[ind_bgn]]) 74 | 75 | end_loc = top_left_list[ind_bgn + 1] \ 76 | + (num_show_list[ind_bgn + 1] - 1) \ 77 | * np.array(loc_diff_list[ind_bgn + 1]) \ 78 | + np.array([(start_ratio[0] + .5 * patch_size / size_list[ind_bgn]) * 79 | size_list[ind_bgn + 1], 80 | -(start_ratio[1] - .5 * patch_size / size_list[ind_bgn]) * 81 | size_list[ind_bgn + 1]]) 82 | 83 | patches.append(Rectangle(start_loc, patch_size, patch_size)) 84 | colors.append(Dark) 85 | patches.append(Line2D([start_loc[0], end_loc[0]], 86 | [start_loc[1], end_loc[1]])) 87 | colors.append(Black) 88 | patches.append(Line2D([start_loc[0] + patch_size, end_loc[0]], 89 | [start_loc[1], end_loc[1]])) 90 | colors.append(Black) 91 | patches.append(Line2D([start_loc[0], end_loc[0]], 92 | [start_loc[1] + patch_size, end_loc[1]])) 93 | colors.append(Black) 94 | patches.append(Line2D([start_loc[0] + patch_size, end_loc[0]], 95 | [start_loc[1] + patch_size, end_loc[1]])) 96 | colors.append(Black) 97 | 98 | 99 | def label(xy, text, xy_off=[0, 4]): 100 | plt.text(xy[0] + xy_off[0], xy[1] + xy_off[1], text, 101 | family='sans-serif', size=8) 102 | 103 | 104 | if __name__ == '__main__': 105 | 106 | fc_unit_size = 2 107 | layer_width = 40 108 | 109 | patches = [] 110 | colors = [] 111 | 112 | fig, ax = plt.subplots() 113 | 114 | 115 | ############################ 116 | # conv layers 117 | size_list = [32, 18, 10, 6, 4] 118 | num_list = [3, 32, 32, 48, 48] 119 | x_diff_list = [0, layer_width, layer_width, layer_width, layer_width] 120 | text_list = ['Inputs'] + ['Feature\nmaps'] * (len(size_list) - 1) 121 | loc_diff_list = [[3, -3]] * len(size_list) 122 | 123 | num_show_list = list(map(min, num_list, [NumConvMax] * len(num_list))) 124 | top_left_list = np.c_[np.cumsum(x_diff_list), np.zeros(len(x_diff_list))] 125 | 126 | for ind in range(len(size_list)): 127 | add_layer(patches, colors, size=size_list[ind], 128 | num=num_show_list[ind], 129 | top_left=top_left_list[ind], loc_diff=loc_diff_list[ind]) 130 | label(top_left_list[ind], text_list[ind] + '\n{}@{}x{}'.format( 131 | num_list[ind], size_list[ind], size_list[ind])) 132 | 133 | 134 | ############################ 135 | # in between layers 136 | start_ratio_list = [[0.4, 0.5], [0.4, 0.8], [0.4, 0.5], [0.4, 0.8]] 137 | patch_size_list = [5, 2, 5, 2] 138 | ind_bgn_list = range(len(patch_size_list)) 139 | text_list = ['Convolution', 'Max-pooling', 'Convolution', 'Max-pooling'] 140 | 141 | for ind in range(len(patch_size_list)): 142 | add_mapping(patches, colors, start_ratio_list[ind], 143 | patch_size_list[ind], ind, 144 | top_left_list, loc_diff_list, num_show_list, size_list) 145 | label(top_left_list[ind], text_list[ind] + '\n{}x{} kernel'.format( 146 | patch_size_list[ind], patch_size_list[ind]), xy_off=[26, -65]) 147 | 148 | 149 | ############################ 150 | # fully connected layers 151 | size_list = [fc_unit_size, fc_unit_size, fc_unit_size] 152 | num_list = [768, 500, 31] 153 | num_show_list = list(map(min, num_list, [NumFcMax] * len(num_list))) 154 | x_diff_list = [sum(x_diff_list) + layer_width, layer_width, layer_width] 155 | top_left_list = np.c_[np.cumsum(x_diff_list), np.zeros(len(x_diff_list))] 156 | loc_diff_list = [[fc_unit_size, -fc_unit_size]] * len(top_left_list) 157 | text_list = ['Hidden\nunits'] * (len(size_list) - 1) + ['Outputs'] 158 | 159 | for ind in range(len(size_list)): 160 | add_layer(patches, colors, size=size_list[ind], num=num_show_list[ind], 161 | top_left=top_left_list[ind], loc_diff=loc_diff_list[ind]) 162 | label(top_left_list[ind], text_list[ind] + '\n{}'.format( 163 | num_list[ind])) 164 | 165 | text_list = ['Flatten\n', 'Fully\nconnected', 'Fully\nconnected'] 166 | 167 | for ind in range(len(size_list)): 168 | label(top_left_list[ind], text_list[ind], xy_off=[-10, -65]) 169 | 170 | ############################ 171 | colors += [0, 1] 172 | collection = PatchCollection(patches, cmap=plt.cm.gray) 173 | collection.set_array(np.array(colors)) 174 | ax.add_collection(collection) 175 | plt.tight_layout() 176 | plt.axis('equal') 177 | plt.axis('off') 178 | plt.show() 179 | fig.set_size_inches(8, 2.5) 180 | 181 | fig_dir = '../thesis/Figure' 182 | fig_ext = '.png' 183 | fig.savefig(os.path.join(fig_dir, 'RecognitionChinese' + fig_ext), 184 | bbox_inches='tight', pad_inches=0) 185 | -------------------------------------------------------------------------------- /recognition/labels/alnum_labels.txt: -------------------------------------------------------------------------------- 1 | 0 2 | 1 3 | 2 4 | 3 5 | 4 6 | 5 7 | 6 8 | 7 9 | 8 10 | 9 11 | A 12 | B 13 | C 14 | D 15 | E 16 | F 17 | G 18 | H 19 | J 20 | K 21 | L 22 | M 23 | N 24 | P 25 | Q 26 | R 27 | S 28 | T 29 | U 30 | V 31 | W 32 | X 33 | Y 34 | Z -------------------------------------------------------------------------------- /recognition/labels/chinese_labels.txt: -------------------------------------------------------------------------------- 1 | 川 2 | 鄂 3 | 赣 4 | 甘 5 | 贵 6 | 桂 7 | 黑 8 | 沪 9 | 冀 10 | 津 11 | 京 12 | 吉 13 | 辽 14 | 鲁 15 | 蒙 16 | 闽 17 | 宁 18 | 青 19 | 琼 20 | 陕 21 | 苏 22 | 晋 23 | 皖 24 | 湘 25 | 新 26 | 豫 27 | 瑜 28 | 粤 29 | 云 30 | 藏 31 | 浙 -------------------------------------------------------------------------------- /recognition/make_pkl.py: -------------------------------------------------------------------------------- 1 | import os 2 | import numpy 3 | import pickle 4 | import cv2 5 | 6 | with open(os.path.join('data', 'trainx.dat'), 'rb') as f: 7 | f.read(16) 8 | X = numpy.array(list(f.read())) 9 | 10 | X = X.reshape(16424, 1, 20, 20).astype('float32') 11 | X /= 255.0 12 | X -= numpy.mean(X, axis = 0) 13 | X /= numpy.std(X, axis = 0) 14 | 15 | chars = ['' for _ in range(65)] 16 | with open(os.path.join('data', 'trainy.dat'), 'rb') as f: 17 | f.read(12) 18 | for i in range(len(chars)): 19 | chars[i] = chr(int.from_bytes(f.read(2), byteorder='little')) 20 | labels = numpy.array(list(f.read())) 21 | 22 | with open(os.path.join('labels', 'alnum_labels.txt'), 'w') as f: 23 | f.write('\n'.join(chars[:34])) 24 | with open(os.path.join('labels', 'chinese_labels.txt'), 'w') as f: 25 | f.write('\n'.join(chars[34:])) 26 | 27 | alnum_indices = numpy.array([i for i in range(labels.shape[0]) if labels[i] <= 33]) 28 | chinese_indices = numpy.array([i for i in range(labels.shape[0]) if not labels[i] <= 33]) 29 | 30 | alnum_X = numpy.asarray([[cv2.resize(X[i][0], (50,50))] for i in alnum_indices]) 31 | alnum_labels = numpy.asarray([labels[i] for i in alnum_indices]) 32 | 33 | print('number of alnum characters: ', alnum_labels.shape[0]) 34 | with open(os.path.join('data', 'alnum_data.pkl'), 'wb') as f: 35 | pickle.dump((alnum_X, alnum_labels), f) 36 | 37 | chinese_X = numpy.asarray([[cv2.resize(X[i][0], (50,50))] for i in chinese_indices]) 38 | chinese_labels = numpy.asarray([labels[i]-34 for i in chinese_indices]) 39 | 40 | print('number of chinese characters: ', chinese_labels.shape[0]) 41 | with open(os.path.join('data', 'chinese_data.pkl'), 'wb') as f: 42 | pickle.dump((chinese_X, chinese_labels), f) 43 | -------------------------------------------------------------------------------- /recognition/models.py: -------------------------------------------------------------------------------- 1 | from keras.models import Sequential 2 | from keras.layers.core import Dense, Dropout, Activation, Flatten 3 | from keras.layers.convolutional import Convolution2D, MaxPooling2D 4 | 5 | nb_filters = 32 6 | nb_pool = 2 7 | nb_conv = 3 8 | 9 | def create_chinese_model(): 10 | model = Sequential() 11 | 12 | model.add(Convolution2D(nb_filters,nb_conv,nb_conv, 13 | border_mode='valid', 14 | input_shape=(1,50,50))) 15 | model.add(Activation('relu')) 16 | model.add(Convolution2D(nb_filters, nb_conv, nb_conv)) 17 | model.add(Activation('relu')) 18 | model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool))) 19 | model.add(Dropout(0.25)) 20 | 21 | model.add(Flatten()) 22 | model.add(Dense(128)) 23 | model.add(Activation('relu')) 24 | model.add(Dropout(0.5)) 25 | model.add(Dense(31)) 26 | model.add(Activation('softmax')) 27 | 28 | model.compile(loss='categorical_crossentropy', 29 | optimizer='adadelta', 30 | metrics=['accuracy']) 31 | 32 | return model 33 | 34 | def create_alnum_model(): 35 | model = Sequential() 36 | 37 | model.add(Convolution2D(nb_filters,nb_conv,nb_conv, 38 | border_mode='valid', 39 | input_shape=(1,50,50))) 40 | model.add(Activation('relu')) 41 | model.add(Convolution2D(nb_filters, nb_conv, nb_conv)) 42 | model.add(Activation('relu')) 43 | model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool))) 44 | model.add(Dropout(0.25)) 45 | 46 | model.add(Flatten()) 47 | model.add(Dense(128)) 48 | model.add(Activation('relu')) 49 | model.add(Dropout(0.5)) 50 | model.add(Dense(34)) 51 | model.add(Activation('softmax')) 52 | 53 | model.compile(loss='categorical_crossentropy', 54 | optimizer='adadelta', 55 | metrics=['accuracy']) 56 | return model 57 | -------------------------------------------------------------------------------- /recognition/recognizer.py: -------------------------------------------------------------------------------- 1 | import os 2 | import numpy 3 | from keras.utils import np_utils 4 | 5 | from . import models 6 | 7 | basedir = os.path.dirname(os.path.realpath(__file__)) 8 | 9 | # chinese_model = models.create_chinese_model() 10 | # chinese_model.load_weights(os.path.join(basedir, 'trained_models', 'chinese_weights.h5')) 11 | # chinese_labels = [line.strip() for line in open(os.path.join(basedir, 'labels', 'chinese_labels.txt'), 'r')] 12 | 13 | alnum_model = models.create_alnum_model() 14 | alnum_model.load_weights(os.path.join(basedir, 'trained_models', 'alnum_weights.h5')) 15 | alnum_labels = [line.strip() for line in open(os.path.join(basedir, 'labels', 'alnum_labels.txt'), 'r')] 16 | 17 | def recognize(chars): 18 | N = len(chars) 19 | width, height = chars[0].shape 20 | 21 | chars = numpy.asarray(chars, dtype=numpy.float32).reshape((N, 1, width, height)) / 255.0 22 | 23 | # chinese_classes = np_utils.probas_to_classes(chinese_model.predict(chars[:1], batch_size=1)) 24 | alnum_classes = np_utils.probas_to_classes(alnum_model.predict(chars[1:], batch_size=6)) 25 | 26 | return ['浙'] + \ 27 | [alnum_labels[cls] for cls in alnum_classes] 28 | 29 | -------------------------------------------------------------------------------- /recognition/train.py: -------------------------------------------------------------------------------- 1 | import os 2 | from six.moves import cPickle 3 | from keras.utils import np_utils 4 | import numpy as np 5 | import cv2 6 | 7 | import models 8 | 9 | nb_epoch = 20 10 | batch_size = 128 11 | 12 | with open(os.path.join('data', 'chinese_data.pkl'), 'rb') as f: 13 | chinese_x,chinese_y = cPickle.load(f, encoding='bytes') 14 | with open(os.path.join('data', 'alnum_data.pkl'), 'rb') as f: 15 | alnum_x,alnum_y = cPickle.load(f, encoding='bytes') 16 | 17 | chinese_y = np_utils.to_categorical(chinese_y, 31) 18 | alnum_y = np_utils.to_categorical(alnum_y, 34) 19 | 20 | model = models.create_chinese_model() 21 | 22 | model.fit(chinese_x, chinese_y, batch_size=batch_size, nb_epoch=nb_epoch, verbose=1, validation_split=0.2) 23 | model.save_weights(os.path.join('trained_models', 'chinese_weights.h5')) 24 | 25 | model = models.create_alnum_model() 26 | 27 | model.fit(alnum_x, alnum_y, batch_size=batch_size, nb_epoch=nb_epoch, verbose=1, validation_split=0.2) 28 | model.save_weights(os.path.join('trained_models', 'alnum_weights.h5')) 29 | -------------------------------------------------------------------------------- /segmentation/segmentor.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | import sys 3 | import os 4 | 5 | import cv2 6 | import numpy as np 7 | from matplotlib import pyplot as plt 8 | 9 | models_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'erfilter_train', 'trained_classifiers') 10 | 11 | def segment(image, minProb1=0.5, minProb2=0.75): 12 | height, width = image.shape[:2] 13 | 14 | # Extract channels to be processed individually 15 | channels = cv2.text.computeNMChannels(image) 16 | channels[3] = cv2.equalizeHist(channels[3]) # equalize Light channel 17 | # Append negative channels to detect ER- (bright regions over dark background) 18 | for channel in channels[:-1]: 19 | channels.append(255-channel) 20 | 21 | erc1 = cv2.text.loadClassifierNM1(os.path.join(models_dir, 'trained_classifierNM1.xml')) 22 | er1 = cv2.text.createERFilterNM1(erc1, 1, 0.0015, 1.0, 0.5, True, 0.1) 23 | 24 | erc2 = cv2.text.loadClassifierNM2(os.path.join(models_dir, 'trained_classifierNM2.xml')) 25 | er2 = cv2.text.createERFilterNM2(erc2, 0.75) 26 | 27 | rects = [] 28 | # Apply the default cascade classifier to each independent channel (could be done in parallel in C++) 29 | for channel in channels: 30 | for region in cv2.text.detectRegions(channel, er1, er2): 31 | rect = cv2.boundingRect(region.reshape(-1,1,2)) 32 | 33 | # filte by height ratio and width-height ratio and x position 34 | if rect[2] > 0.05*width and rect[3] >= 0.2*height and rect[2]*0.3 <= rect[3] < rect[2]*10: 35 | rects.append(rect) 36 | 37 | if len(rects) == 0: 38 | print('Error: cannot detect extremal regions') 39 | return [], [] 40 | 41 | height_mean = np.mean([rect[3] for rect in rects]).tolist() 42 | rects = [rect for rect in rects if abs(rect[3]-height_mean)/height < 0.15] 43 | 44 | # sort by x coordinate 45 | rects.sort(key=lambda r : r[0]) 46 | 47 | def center(rect): 48 | return (round(rect[0] + rect[2]/2), round(rect[1] + rect[3]/2)) 49 | 50 | def center_delta(rectA, rectB): 51 | return (center(rectA)[0]-center(rectB)[0], center(rectA)[1]-center(rectB)[1]) 52 | 53 | bins = [[rects[0]]] 54 | for i in range(1, len(rects)): 55 | if abs(center_delta(rects[i], rects[i-1])[0]) > 0.4*rects[i-1][2]: 56 | bins.append([rects[i]]) 57 | else: 58 | bins[-1].append(rects[i]) 59 | 60 | # sort by number of rects in each bin 61 | bins.sort(key=lambda b : len(b), reverse=True) 62 | # get most posible bins, at most 6 bins 63 | bins = bins[:min(len(bins),6)] 64 | 65 | def rects_max(rects): 66 | # TODO better method to get boundary 67 | x_mins = sorted([rect[0] for rect in rects]) 68 | x_min = x_mins[min(1, len(x_mins)-1)] 69 | y_mins = sorted([rect[1] for rect in rects]) 70 | y_min = y_mins[min(1, len(y_mins)-1)] 71 | 72 | x_maxs = sorted([rect[0]+rect[2] for rect in rects],reverse=True) 73 | x_max = x_maxs[min(1, len(x_maxs)-1)] 74 | y_maxs = sorted([rect[1]+rect[3] for rect in rects],reverse=True) 75 | y_max = y_maxs[min(1, len(y_maxs)-1)] 76 | 77 | return (x_min, y_min, x_max-x_min, y_max-y_min) 78 | 79 | # get avarage size and position of each bin 80 | rects = [rects_max(bin) for bin in bins] 81 | 82 | # sort by x coordinate 83 | rects.sort(key=lambda r : r[0]) 84 | 85 | width_max = np.max([rect[2] for rect in rects]) 86 | height_max = np.max([rect[3] for rect in rects]) 87 | 88 | if len(rects) < 6: 89 | print('Error: only %d chars detected' % len(rects)) 90 | return [], [] 91 | 92 | # get mean center delta in two directions 93 | center_delta_mean = np.mean([center_delta(rects[i], rects[i-1]) for i in range(2,6)], axis=0) 94 | center_delta_mean[0] *= 1.0 # scale in horizon 95 | 96 | char_width = width_max 97 | char_height = height_max 98 | 99 | char_center = tuple((np.array(center(rects[0])) - center_delta_mean).tolist()) 100 | char_rect = (max(int(round(char_center[0]-char_width/2)),0), max(int(round(char_center[1]-char_height/2)),0), char_width, char_height) 101 | 102 | rects.insert(0, char_rect) 103 | 104 | # make rects into image of chars 105 | def make_img(rect): 106 | img = image[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2],:] 107 | img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 108 | height, width = img.shape[:2] 109 | border_color = int(round(img.mean())) 110 | if height >= width: 111 | border_left = int((height - width) / 2) 112 | border_right = height - width - border_left 113 | img = cv2.copyMakeBorder(img, 0, 0, border_left, border_right, cv2.BORDER_CONSTANT, value=border_color) 114 | else: 115 | border_top = int((width - height) / 2) 116 | border_bottom = width - height - border_top 117 | img = cv2.copyMakeBorder(img, border_top, border_bottom, 0, 0, cv2.BORDER_CONSTANT, value=border_color) 118 | return cv2.resize(img, (50, 50)) 119 | 120 | char_imgs = [make_img(rect) for rect in rects] 121 | 122 | return (rects, char_imgs) 123 | 124 | def draw_regions(image, rects): 125 | vis = image.copy() # for visualization 126 | for rect in rects: 127 | cv2.rectangle(vis, (rect[0],rect[1]), (rect[0]+rect[2],rect[1]+rect[3]), (0, 0, 255), 1) 128 | return vis 129 | 130 | if __name__ == '__main__': 131 | if len(sys.argv) < 2: 132 | quit() 133 | 134 | minProb1 = float(sys.argv[2]) if len(sys.argv) >= 3 else 0.5 135 | minProb1 = float(sys.argv[3]) if len(sys.argv) >= 4 else 0.75 136 | 137 | image = cv2.imread(sys.argv[1]) 138 | rects, char_imgs = segment(image) 139 | vis = draw_regions(image, rects) 140 | f, (ax1, ax2) = plt.subplots(nrows=2, ncols=1) 141 | ax1.imshow(cv2.cvtColor(vis, cv2.COLOR_BGR2RGB)) 142 | ax2.imshow(np.hstack(char_imgs), cmap=plt.cm.gray) 143 | plt.show() 144 | -------------------------------------------------------------------------------- /thesis/DeepPR.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/DeepPR.pdf -------------------------------------------------------------------------------- /thesis/DeepPR.tex: -------------------------------------------------------------------------------- 1 | \documentclass[WordOneHalf]{XDUthesis} %[Fandol]%[nologo]%[WordOneHalf]%[Fandol,nologo]%[WordOneHalf,nologo]%[WordOneHalf,Fandol,nologo] 2 | 3 | \title{机动车车牌的实时检测与识别系统} 4 | \author{王昌旭} 5 | \date{\today} 6 | %题目拆分:用于封面 7 | \septitleA{机动车车牌的实时监测}%如果论文题目长度<=11中文字符只需填此项即可B项空着 8 | \septitleB{与识别系统}%如果论文题目长度>11中文字符, 建议拆分为10+x or 11+x 将剩余x个字符填在此处。 9 | \class{031213}%班级号 10 | \schoolnumber{03121300}%学号 11 | \major{计算机科学与技术}%专业 12 | \school{计算机学院}%学院 13 | \supervisor{李辉}%指导老师 14 | 15 | %\usepackage[BoldFont]{xeCJK} 16 | \usepackage[numbers,sort&compress]{natbib} 17 | \setlength{\bibsep}{0pt plus 0.2ex} 18 | 19 | \begin{document} 20 | 21 | % 摘要 22 | \input{ThesisFiles/Abstract} 23 | 24 | % 往PDF属性里面写下关键词信息 25 | \makeatletter 26 | \XDU@setpdf@keywords 27 | %\make@abstract% 28 | % 29 | %\frontmatter 30 | %\tableofcontents% 31 | %\mainmatter 32 | \makeatother 33 | 34 | \maketitle 35 | 36 | % 文章主要部分 37 | \input{ThesisFiles/Chapters} 38 | 39 | % 致谢 40 | \input{ThesisFiles/Thanks} 41 | 42 | %参考文献 43 | \phantomsection%生成该页的链接 44 | \addcontentsline{toc}{chapter}{\bibname} 45 | \bibliographystyle{XDUbibunsrt}%不对参考文献排序% XDUbib%对参考文献排序 46 | \bibliography{ThesisFiles/RefFile}%在正文中必须引用,才能显示对应的参考文献 47 | 48 | % 附录部分 49 | \appendix 50 | \input{ThesisFiles/Appendix} 51 | 52 | \end{document} 53 | 54 | -------------------------------------------------------------------------------- /thesis/Figure/AllERs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/AllERs.png -------------------------------------------------------------------------------- /thesis/Figure/DetectionDemo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/DetectionDemo.png -------------------------------------------------------------------------------- /thesis/Figure/DetectionDemo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/DetectionDemo2.png -------------------------------------------------------------------------------- /thesis/Figure/ERTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/ERTree.png -------------------------------------------------------------------------------- /thesis/Figure/ERwithoutChinese.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/ERwithoutChinese.png -------------------------------------------------------------------------------- /thesis/Figure/End2EndDemo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/End2EndDemo.png -------------------------------------------------------------------------------- /thesis/Figure/End2EndDemo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/End2EndDemo2.png -------------------------------------------------------------------------------- /thesis/Figure/FastRCNN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/FastRCNN.png -------------------------------------------------------------------------------- /thesis/Figure/FasterRCNN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/FasterRCNN.png -------------------------------------------------------------------------------- /thesis/Figure/GoogleSelfDrivingCar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/GoogleSelfDrivingCar.jpg -------------------------------------------------------------------------------- /thesis/Figure/LeNet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/LeNet.png -------------------------------------------------------------------------------- /thesis/Figure/LocalizationDemo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/LocalizationDemo.png -------------------------------------------------------------------------------- /thesis/Figure/LocalizationTestLog.eps: -------------------------------------------------------------------------------- 1 | %!PS-Adobe-2.0 EPSF-2.0 2 | %%Title: /home/lab309/Documents/DeepPR/localization/logs/test.log.eps 3 | %%Creator: gnuplot 4.6 patchlevel 4 4 | %%CreationDate: Fri May 27 16:33:37 2016 5 | %%DocumentFonts: (atend) 6 | %%BoundingBox: 50 50 410 302 7 | %%EndComments 8 | %%BeginProlog 9 | /gnudict 256 dict def 10 | gnudict begin 11 | % 12 | % The following true/false flags may be edited by hand if desired. 13 | % The unit line width and grayscale image gamma correction may also be changed. 14 | % 15 | /Color true def 16 | /Blacktext false def 17 | /Solid false def 18 | /Dashlength 1 def 19 | /Landscape false def 20 | /Level1 false def 21 | /Rounded false def 22 | /ClipToBoundingBox false def 23 | /SuppressPDFMark false def 24 | /TransparentPatterns false def 25 | /gnulinewidth 5.000 def 26 | /userlinewidth gnulinewidth def 27 | /Gamma 1.0 def 28 | /BackgroundColor {-1.000 -1.000 -1.000} def 29 | % 30 | /vshift -46 def 31 | /dl1 { 32 | 10.0 Dashlength mul mul 33 | Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if 34 | } def 35 | /dl2 { 36 | 10.0 Dashlength mul mul 37 | Rounded { currentlinewidth 0.75 mul add } if 38 | } def 39 | /hpt_ 31.5 def 40 | /vpt_ 31.5 def 41 | /hpt hpt_ def 42 | /vpt vpt_ def 43 | /doclip { 44 | ClipToBoundingBox { 45 | newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath 46 | clip 47 | } if 48 | } def 49 | % 50 | % Gnuplot Prolog Version 4.6 (September 2012) 51 | % 52 | %/SuppressPDFMark true def 53 | % 54 | /M {moveto} bind def 55 | /L {lineto} bind def 56 | /R {rmoveto} bind def 57 | /V {rlineto} bind def 58 | /N {newpath moveto} bind def 59 | /Z {closepath} bind def 60 | /C {setrgbcolor} bind def 61 | /f {rlineto fill} bind def 62 | /g {setgray} bind def 63 | /Gshow {show} def % May be redefined later in the file to support UTF-8 64 | /vpt2 vpt 2 mul def 65 | /hpt2 hpt 2 mul def 66 | /Lshow {currentpoint stroke M 0 vshift R 67 | Blacktext {gsave 0 setgray show grestore} {show} ifelse} def 68 | /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R 69 | Blacktext {gsave 0 setgray show grestore} {show} ifelse} def 70 | /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R 71 | Blacktext {gsave 0 setgray show grestore} {show} ifelse} def 72 | /UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def 73 | /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def 74 | /DL {Color {setrgbcolor Solid {pop []} if 0 setdash} 75 | {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def 76 | /BL {stroke userlinewidth 2 mul setlinewidth 77 | Rounded {1 setlinejoin 1 setlinecap} if} def 78 | /AL {stroke userlinewidth 2 div setlinewidth 79 | Rounded {1 setlinejoin 1 setlinecap} if} def 80 | /UL {dup gnulinewidth mul /userlinewidth exch def 81 | dup 1 lt {pop 1} if 10 mul /udl exch def} def 82 | /PL {stroke userlinewidth setlinewidth 83 | Rounded {1 setlinejoin 1 setlinecap} if} def 84 | 3.8 setmiterlimit 85 | % Default Line colors 86 | /LCw {1 1 1} def 87 | /LCb {0 0 0} def 88 | /LCa {0 0 0} def 89 | /LC0 {1 0 0} def 90 | /LC1 {0 1 0} def 91 | /LC2 {0 0 1} def 92 | /LC3 {1 0 1} def 93 | /LC4 {0 1 1} def 94 | /LC5 {1 1 0} def 95 | /LC6 {0 0 0} def 96 | /LC7 {1 0.3 0} def 97 | /LC8 {0.5 0.5 0.5} def 98 | % Default Line Types 99 | /LTw {PL [] 1 setgray} def 100 | /LTb {BL [] LCb DL} def 101 | /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def 102 | /LT0 {PL [] LC0 DL} def 103 | /LT1 {PL [4 dl1 2 dl2] LC1 DL} def 104 | /LT2 {PL [2 dl1 3 dl2] LC2 DL} def 105 | /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def 106 | /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def 107 | /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def 108 | /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def 109 | /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def 110 | /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def 111 | /Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def 112 | /Dia {stroke [] 0 setdash 2 copy vpt add M 113 | hpt neg vpt neg V hpt vpt neg V 114 | hpt vpt V hpt neg vpt V closepath stroke 115 | Pnt} def 116 | /Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V 117 | currentpoint stroke M 118 | hpt neg vpt neg R hpt2 0 V stroke 119 | } def 120 | /Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 121 | 0 vpt2 neg V hpt2 0 V 0 vpt2 V 122 | hpt2 neg 0 V closepath stroke 123 | Pnt} def 124 | /Crs {stroke [] 0 setdash exch hpt sub exch vpt add M 125 | hpt2 vpt2 neg V currentpoint stroke M 126 | hpt2 neg 0 R hpt2 vpt2 V stroke} def 127 | /TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M 128 | hpt neg vpt -1.62 mul V 129 | hpt 2 mul 0 V 130 | hpt neg vpt 1.62 mul V closepath stroke 131 | Pnt} def 132 | /Star {2 copy Pls Crs} def 133 | /BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M 134 | 0 vpt2 neg V hpt2 0 V 0 vpt2 V 135 | hpt2 neg 0 V closepath fill} def 136 | /TriUF {stroke [] 0 setdash vpt 1.12 mul add M 137 | hpt neg vpt -1.62 mul V 138 | hpt 2 mul 0 V 139 | hpt neg vpt 1.62 mul V closepath fill} def 140 | /TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M 141 | hpt neg vpt 1.62 mul V 142 | hpt 2 mul 0 V 143 | hpt neg vpt -1.62 mul V closepath stroke 144 | Pnt} def 145 | /TriDF {stroke [] 0 setdash vpt 1.12 mul sub M 146 | hpt neg vpt 1.62 mul V 147 | hpt 2 mul 0 V 148 | hpt neg vpt -1.62 mul V closepath fill} def 149 | /DiaF {stroke [] 0 setdash vpt add M 150 | hpt neg vpt neg V hpt vpt neg V 151 | hpt vpt V hpt neg vpt V closepath fill} def 152 | /Pent {stroke [] 0 setdash 2 copy gsave 153 | translate 0 hpt M 4 {72 rotate 0 hpt L} repeat 154 | closepath stroke grestore Pnt} def 155 | /PentF {stroke [] 0 setdash gsave 156 | translate 0 hpt M 4 {72 rotate 0 hpt L} repeat 157 | closepath fill grestore} def 158 | /Circle {stroke [] 0 setdash 2 copy 159 | hpt 0 360 arc stroke Pnt} def 160 | /CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def 161 | /C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def 162 | /C1 {BL [] 0 setdash 2 copy moveto 163 | 2 copy vpt 0 90 arc closepath fill 164 | vpt 0 360 arc closepath} bind def 165 | /C2 {BL [] 0 setdash 2 copy moveto 166 | 2 copy vpt 90 180 arc closepath fill 167 | vpt 0 360 arc closepath} bind def 168 | /C3 {BL [] 0 setdash 2 copy moveto 169 | 2 copy vpt 0 180 arc closepath fill 170 | vpt 0 360 arc closepath} bind def 171 | /C4 {BL [] 0 setdash 2 copy moveto 172 | 2 copy vpt 180 270 arc closepath fill 173 | vpt 0 360 arc closepath} bind def 174 | /C5 {BL [] 0 setdash 2 copy moveto 175 | 2 copy vpt 0 90 arc 176 | 2 copy moveto 177 | 2 copy vpt 180 270 arc closepath fill 178 | vpt 0 360 arc} bind def 179 | /C6 {BL [] 0 setdash 2 copy moveto 180 | 2 copy vpt 90 270 arc closepath fill 181 | vpt 0 360 arc closepath} bind def 182 | /C7 {BL [] 0 setdash 2 copy moveto 183 | 2 copy vpt 0 270 arc closepath fill 184 | vpt 0 360 arc closepath} bind def 185 | /C8 {BL [] 0 setdash 2 copy moveto 186 | 2 copy vpt 270 360 arc closepath fill 187 | vpt 0 360 arc closepath} bind def 188 | /C9 {BL [] 0 setdash 2 copy moveto 189 | 2 copy vpt 270 450 arc closepath fill 190 | vpt 0 360 arc closepath} bind def 191 | /C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill 192 | 2 copy moveto 193 | 2 copy vpt 90 180 arc closepath fill 194 | vpt 0 360 arc closepath} bind def 195 | /C11 {BL [] 0 setdash 2 copy moveto 196 | 2 copy vpt 0 180 arc closepath fill 197 | 2 copy moveto 198 | 2 copy vpt 270 360 arc closepath fill 199 | vpt 0 360 arc closepath} bind def 200 | /C12 {BL [] 0 setdash 2 copy moveto 201 | 2 copy vpt 180 360 arc closepath fill 202 | vpt 0 360 arc closepath} bind def 203 | /C13 {BL [] 0 setdash 2 copy moveto 204 | 2 copy vpt 0 90 arc closepath fill 205 | 2 copy moveto 206 | 2 copy vpt 180 360 arc closepath fill 207 | vpt 0 360 arc closepath} bind def 208 | /C14 {BL [] 0 setdash 2 copy moveto 209 | 2 copy vpt 90 360 arc closepath fill 210 | vpt 0 360 arc} bind def 211 | /C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill 212 | vpt 0 360 arc closepath} bind def 213 | /Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto 214 | neg 0 rlineto closepath} bind def 215 | /Square {dup Rec} bind def 216 | /Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def 217 | /S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def 218 | /S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def 219 | /S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def 220 | /S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def 221 | /S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def 222 | /S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill 223 | exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def 224 | /S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def 225 | /S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill 226 | 2 copy vpt Square fill Bsquare} bind def 227 | /S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def 228 | /S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def 229 | /S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill 230 | Bsquare} bind def 231 | /S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill 232 | Bsquare} bind def 233 | /S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def 234 | /S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 235 | 2 copy vpt Square fill Bsquare} bind def 236 | /S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 237 | 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def 238 | /S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def 239 | /D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def 240 | /D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def 241 | /D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def 242 | /D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def 243 | /D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def 244 | /D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def 245 | /D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def 246 | /D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def 247 | /D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def 248 | /D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def 249 | /D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def 250 | /D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def 251 | /D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def 252 | /D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def 253 | /D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def 254 | /D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def 255 | /DiaE {stroke [] 0 setdash vpt add M 256 | hpt neg vpt neg V hpt vpt neg V 257 | hpt vpt V hpt neg vpt V closepath stroke} def 258 | /BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M 259 | 0 vpt2 neg V hpt2 0 V 0 vpt2 V 260 | hpt2 neg 0 V closepath stroke} def 261 | /TriUE {stroke [] 0 setdash vpt 1.12 mul add M 262 | hpt neg vpt -1.62 mul V 263 | hpt 2 mul 0 V 264 | hpt neg vpt 1.62 mul V closepath stroke} def 265 | /TriDE {stroke [] 0 setdash vpt 1.12 mul sub M 266 | hpt neg vpt 1.62 mul V 267 | hpt 2 mul 0 V 268 | hpt neg vpt -1.62 mul V closepath stroke} def 269 | /PentE {stroke [] 0 setdash gsave 270 | translate 0 hpt M 4 {72 rotate 0 hpt L} repeat 271 | closepath stroke grestore} def 272 | /CircE {stroke [] 0 setdash 273 | hpt 0 360 arc stroke} def 274 | /Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def 275 | /DiaW {stroke [] 0 setdash vpt add M 276 | hpt neg vpt neg V hpt vpt neg V 277 | hpt vpt V hpt neg vpt V Opaque stroke} def 278 | /BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M 279 | 0 vpt2 neg V hpt2 0 V 0 vpt2 V 280 | hpt2 neg 0 V Opaque stroke} def 281 | /TriUW {stroke [] 0 setdash vpt 1.12 mul add M 282 | hpt neg vpt -1.62 mul V 283 | hpt 2 mul 0 V 284 | hpt neg vpt 1.62 mul V Opaque stroke} def 285 | /TriDW {stroke [] 0 setdash vpt 1.12 mul sub M 286 | hpt neg vpt 1.62 mul V 287 | hpt 2 mul 0 V 288 | hpt neg vpt -1.62 mul V Opaque stroke} def 289 | /PentW {stroke [] 0 setdash gsave 290 | translate 0 hpt M 4 {72 rotate 0 hpt L} repeat 291 | Opaque stroke grestore} def 292 | /CircW {stroke [] 0 setdash 293 | hpt 0 360 arc Opaque stroke} def 294 | /BoxFill {gsave Rec 1 setgray fill grestore} def 295 | /Density { 296 | /Fillden exch def 297 | currentrgbcolor 298 | /ColB exch def /ColG exch def /ColR exch def 299 | /ColR ColR Fillden mul Fillden sub 1 add def 300 | /ColG ColG Fillden mul Fillden sub 1 add def 301 | /ColB ColB Fillden mul Fillden sub 1 add def 302 | ColR ColG ColB setrgbcolor} def 303 | /BoxColFill {gsave Rec PolyFill} def 304 | /PolyFill {gsave Density fill grestore grestore} def 305 | /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def 306 | % 307 | % PostScript Level 1 Pattern Fill routine for rectangles 308 | % Usage: x y w h s a XX PatternFill 309 | % x,y = lower left corner of box to be filled 310 | % w,h = width and height of box 311 | % a = angle in degrees between lines and x-axis 312 | % XX = 0/1 for no/yes cross-hatch 313 | % 314 | /PatternFill {gsave /PFa [ 9 2 roll ] def 315 | PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate 316 | PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec 317 | TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 318 | clip 319 | currentlinewidth 0.5 mul setlinewidth 320 | /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def 321 | 0 0 M PFa 5 get rotate PFs -2 div dup translate 322 | 0 1 PFs PFa 4 get div 1 add floor cvi 323 | {PFa 4 get mul 0 M 0 PFs V} for 324 | 0 PFa 6 get ne { 325 | 0 1 PFs PFa 4 get div 1 add floor cvi 326 | {PFa 4 get mul 0 2 1 roll M PFs 0 V} for 327 | } if 328 | stroke grestore} def 329 | % 330 | /languagelevel where 331 | {pop languagelevel} {1} ifelse 332 | 2 lt 333 | {/InterpretLevel1 true def} 334 | {/InterpretLevel1 Level1 def} 335 | ifelse 336 | % 337 | % PostScript level 2 pattern fill definitions 338 | % 339 | /Level2PatternFill { 340 | /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} 341 | bind def 342 | /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def 343 | << Tile8x8 344 | /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} 345 | >> matrix makepattern 346 | /Pat1 exch def 347 | << Tile8x8 348 | /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 349 | 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} 350 | >> matrix makepattern 351 | /Pat2 exch def 352 | << Tile8x8 353 | /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 354 | 8 8 L 8 0 L 0 0 L fill} 355 | >> matrix makepattern 356 | /Pat3 exch def 357 | << Tile8x8 358 | /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 359 | 0 12 M 12 0 L stroke} 360 | >> matrix makepattern 361 | /Pat4 exch def 362 | << Tile8x8 363 | /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 364 | 0 -4 M 12 8 L stroke} 365 | >> matrix makepattern 366 | /Pat5 exch def 367 | << Tile8x8 368 | /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 369 | 0 12 M 8 -4 L 4 12 M 10 0 L stroke} 370 | >> matrix makepattern 371 | /Pat6 exch def 372 | << Tile8x8 373 | /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 374 | 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} 375 | >> matrix makepattern 376 | /Pat7 exch def 377 | << Tile8x8 378 | /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 379 | 12 0 M -4 8 L 12 4 M 0 10 L stroke} 380 | >> matrix makepattern 381 | /Pat8 exch def 382 | << Tile8x8 383 | /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L 384 | -4 0 M 12 8 L -4 4 M 8 10 L stroke} 385 | >> matrix makepattern 386 | /Pat9 exch def 387 | /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def 388 | /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def 389 | /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def 390 | /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def 391 | /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def 392 | /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def 393 | /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def 394 | } def 395 | % 396 | % 397 | %End of PostScript Level 2 code 398 | % 399 | /PatternBgnd { 400 | TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 401 | } def 402 | % 403 | % Substitute for Level 2 pattern fill codes with 404 | % grayscale if Level 2 support is not selected. 405 | % 406 | /Level1PatternFill { 407 | /Pattern1 {0.250 Density} bind def 408 | /Pattern2 {0.500 Density} bind def 409 | /Pattern3 {0.750 Density} bind def 410 | /Pattern4 {0.125 Density} bind def 411 | /Pattern5 {0.375 Density} bind def 412 | /Pattern6 {0.625 Density} bind def 413 | /Pattern7 {0.875 Density} bind def 414 | } def 415 | % 416 | % Now test for support of Level 2 code 417 | % 418 | Level1 {Level1PatternFill} {Level2PatternFill} ifelse 419 | % 420 | /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont 421 | dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall 422 | currentdict end definefont pop 423 | /MFshow { 424 | { dup 5 get 3 ge 425 | { 5 get 3 eq {gsave} {grestore} ifelse } 426 | {dup dup 0 get findfont exch 1 get scalefont setfont 427 | [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 428 | get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq 429 | {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 430 | get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div 431 | dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get 432 | show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop 433 | pop aload pop M} ifelse }ifelse }ifelse } 434 | ifelse } 435 | forall} def 436 | /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def 437 | /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } 438 | {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 439 | 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def 440 | /MLshow { currentpoint stroke M 441 | 0 exch R 442 | Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def 443 | /MRshow { currentpoint stroke M 444 | exch dup MFwidth neg 3 -1 roll R 445 | Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def 446 | /MCshow { currentpoint stroke M 447 | exch dup MFwidth -2 div 3 -1 roll R 448 | Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def 449 | /XYsave { [( ) 1 2 true false 3 ()] } bind def 450 | /XYrestore { [( ) 1 2 true false 4 ()] } bind def 451 | Level1 SuppressPDFMark or 452 | {} { 453 | /SDict 10 dict def 454 | systemdict /pdfmark known not { 455 | userdict /pdfmark systemdict /cleartomark get put 456 | } if 457 | SDict begin [ 458 | /Title (/home/lab309/Documents/DeepPR/localization/logs/test.log.eps) 459 | /Subject (gnuplot plot) 460 | /Creator (gnuplot 4.6 patchlevel 4) 461 | /Author (lab309) 462 | % /Producer (gnuplot) 463 | % /Keywords () 464 | /CreationDate (Fri May 27 16:33:37 2016) 465 | /DOCINFO pdfmark 466 | end 467 | } ifelse 468 | end 469 | %%EndProlog 470 | %%Page: 1 1 471 | gnudict begin 472 | gsave 473 | doclip 474 | 50 50 translate 475 | 0.050 0.050 scale 476 | 0 setgray 477 | newpath 478 | (Helvetica) findfont 140 scalefont setfont 479 | BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 480 | 1.000 UL 481 | LTb 482 | 0.13 0.13 0.13 C 1.000 UL 483 | LTa 484 | LCa setrgbcolor 485 | 546 280 M 486 | 6401 0 V 487 | stroke 488 | LTb 489 | 0.13 0.13 0.13 C 546 280 M 490 | 63 0 V 491 | 6338 0 R 492 | -63 0 V 493 | stroke 494 | 462 280 M 495 | [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] 496 | ] -46.7 MRshow 497 | 1.000 UL 498 | LTb 499 | 0.13 0.13 0.13 C 1.000 UL 500 | LTa 501 | LCa setrgbcolor 502 | 546 1003 M 503 | 6401 0 V 504 | stroke 505 | LTb 506 | 0.13 0.13 0.13 C 546 1003 M 507 | 63 0 V 508 | 6338 0 R 509 | -63 0 V 510 | stroke 511 | 462 1003 M 512 | [ [(Helvetica) 140.0 0.0 true true 0 ( 0.5)] 513 | ] -46.7 MRshow 514 | 1.000 UL 515 | LTb 516 | 0.13 0.13 0.13 C 1.000 UL 517 | LTa 518 | LCa setrgbcolor 519 | 546 1726 M 520 | 6401 0 V 521 | stroke 522 | LTb 523 | 0.13 0.13 0.13 C 546 1726 M 524 | 63 0 V 525 | 6338 0 R 526 | -63 0 V 527 | stroke 528 | 462 1726 M 529 | [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] 530 | ] -46.7 MRshow 531 | 1.000 UL 532 | LTb 533 | 0.13 0.13 0.13 C 1.000 UL 534 | LTa 535 | LCa setrgbcolor 536 | 546 2450 M 537 | 6401 0 V 538 | stroke 539 | LTb 540 | 0.13 0.13 0.13 C 546 2450 M 541 | 63 0 V 542 | 6338 0 R 543 | -63 0 V 544 | stroke 545 | 462 2450 M 546 | [ [(Helvetica) 140.0 0.0 true true 0 ( 1.5)] 547 | ] -46.7 MRshow 548 | 1.000 UL 549 | LTb 550 | 0.13 0.13 0.13 C 1.000 UL 551 | LTa 552 | LCa setrgbcolor 553 | 546 3173 M 554 | 6401 0 V 555 | stroke 556 | LTb 557 | 0.13 0.13 0.13 C 546 3173 M 558 | 63 0 V 559 | 6338 0 R 560 | -63 0 V 561 | stroke 562 | 462 3173 M 563 | [ [(Helvetica) 140.0 0.0 true true 0 ( 2)] 564 | ] -46.7 MRshow 565 | 1.000 UL 566 | LTb 567 | 0.13 0.13 0.13 C 1.000 UL 568 | LTa 569 | LCa setrgbcolor 570 | 546 3896 M 571 | 6401 0 V 572 | stroke 573 | LTb 574 | 0.13 0.13 0.13 C 546 3896 M 575 | 63 0 V 576 | 6338 0 R 577 | -63 0 V 578 | stroke 579 | 462 3896 M 580 | [ [(Helvetica) 140.0 0.0 true true 0 ( 2.5)] 581 | ] -46.7 MRshow 582 | 1.000 UL 583 | LTb 584 | 0.13 0.13 0.13 C 1.000 UL 585 | LTa 586 | LCa setrgbcolor 587 | 546 4619 M 588 | 6401 0 V 589 | stroke 590 | LTb 591 | 0.13 0.13 0.13 C 546 4619 M 592 | 63 0 V 593 | 6338 0 R 594 | -63 0 V 595 | stroke 596 | 462 4619 M 597 | [ [(Helvetica) 140.0 0.0 true true 0 ( 3)] 598 | ] -46.7 MRshow 599 | 1.000 UL 600 | LTb 601 | 0.13 0.13 0.13 C 1.000 UL 602 | LTa 603 | LCa setrgbcolor 604 | 546 280 M 605 | 0 4339 V 606 | stroke 607 | LTb 608 | 0.13 0.13 0.13 C 546 280 M 609 | 0 63 V 610 | 0 4276 R 611 | 0 -63 V 612 | stroke 613 | 546 140 M 614 | [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] 615 | ] -46.7 MCshow 616 | 1.000 UL 617 | LTb 618 | 0.13 0.13 0.13 C 1.000 UL 619 | LTa 620 | LCa setrgbcolor 621 | 1186 280 M 622 | 0 4339 V 623 | stroke 624 | LTb 625 | 0.13 0.13 0.13 C 1186 280 M 626 | 0 63 V 627 | 0 4276 R 628 | 0 -63 V 629 | stroke 630 | 1186 140 M 631 | [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] 632 | ] -46.7 MCshow 633 | 1.000 UL 634 | LTb 635 | 0.13 0.13 0.13 C 1.000 UL 636 | LTa 637 | LCa setrgbcolor 638 | 1826 280 M 639 | 0 4339 V 640 | stroke 641 | LTb 642 | 0.13 0.13 0.13 C 1826 280 M 643 | 0 63 V 644 | 0 4276 R 645 | 0 -63 V 646 | stroke 647 | 1826 140 M 648 | [ [(Helvetica) 140.0 0.0 true true 0 ( 20)] 649 | ] -46.7 MCshow 650 | 1.000 UL 651 | LTb 652 | 0.13 0.13 0.13 C 1.000 UL 653 | LTa 654 | LCa setrgbcolor 655 | 2466 280 M 656 | 0 4339 V 657 | stroke 658 | LTb 659 | 0.13 0.13 0.13 C 2466 280 M 660 | 0 63 V 661 | 0 4276 R 662 | 0 -63 V 663 | stroke 664 | 2466 140 M 665 | [ [(Helvetica) 140.0 0.0 true true 0 ( 30)] 666 | ] -46.7 MCshow 667 | 1.000 UL 668 | LTb 669 | 0.13 0.13 0.13 C 1.000 UL 670 | LTa 671 | LCa setrgbcolor 672 | 3106 280 M 673 | 0 4339 V 674 | stroke 675 | LTb 676 | 0.13 0.13 0.13 C 3106 280 M 677 | 0 63 V 678 | 0 4276 R 679 | 0 -63 V 680 | stroke 681 | 3106 140 M 682 | [ [(Helvetica) 140.0 0.0 true true 0 ( 40)] 683 | ] -46.7 MCshow 684 | 1.000 UL 685 | LTb 686 | 0.13 0.13 0.13 C 1.000 UL 687 | LTa 688 | LCa setrgbcolor 689 | 3747 280 M 690 | 0 4339 V 691 | stroke 692 | LTb 693 | 0.13 0.13 0.13 C 3747 280 M 694 | 0 63 V 695 | 0 4276 R 696 | 0 -63 V 697 | stroke 698 | 3747 140 M 699 | [ [(Helvetica) 140.0 0.0 true true 0 ( 50)] 700 | ] -46.7 MCshow 701 | 1.000 UL 702 | LTb 703 | 0.13 0.13 0.13 C 1.000 UL 704 | LTa 705 | LCa setrgbcolor 706 | 4387 280 M 707 | 0 4339 V 708 | stroke 709 | LTb 710 | 0.13 0.13 0.13 C 4387 280 M 711 | 0 63 V 712 | 0 4276 R 713 | 0 -63 V 714 | stroke 715 | 4387 140 M 716 | [ [(Helvetica) 140.0 0.0 true true 0 ( 60)] 717 | ] -46.7 MCshow 718 | 1.000 UL 719 | LTb 720 | 0.13 0.13 0.13 C 1.000 UL 721 | LTa 722 | LCa setrgbcolor 723 | 5027 280 M 724 | 0 4136 V 725 | 0 140 R 726 | 0 63 V 727 | stroke 728 | LTb 729 | 0.13 0.13 0.13 C 5027 280 M 730 | 0 63 V 731 | 0 4276 R 732 | 0 -63 V 733 | stroke 734 | 5027 140 M 735 | [ [(Helvetica) 140.0 0.0 true true 0 ( 70)] 736 | ] -46.7 MCshow 737 | 1.000 UL 738 | LTb 739 | 0.13 0.13 0.13 C 1.000 UL 740 | LTa 741 | LCa setrgbcolor 742 | 5667 280 M 743 | 0 4136 V 744 | 0 140 R 745 | 0 63 V 746 | stroke 747 | LTb 748 | 0.13 0.13 0.13 C 5667 280 M 749 | 0 63 V 750 | 0 4276 R 751 | 0 -63 V 752 | stroke 753 | 5667 140 M 754 | [ [(Helvetica) 140.0 0.0 true true 0 ( 80)] 755 | ] -46.7 MCshow 756 | 1.000 UL 757 | LTb 758 | 0.13 0.13 0.13 C 1.000 UL 759 | LTa 760 | LCa setrgbcolor 761 | 6307 280 M 762 | 0 4136 V 763 | 0 140 R 764 | 0 63 V 765 | stroke 766 | LTb 767 | 0.13 0.13 0.13 C 6307 280 M 768 | 0 63 V 769 | 0 4276 R 770 | 0 -63 V 771 | stroke 772 | 6307 140 M 773 | [ [(Helvetica) 140.0 0.0 true true 0 ( 90)] 774 | ] -46.7 MCshow 775 | 1.000 UL 776 | LTb 777 | 0.13 0.13 0.13 C 1.000 UL 778 | LTa 779 | LCa setrgbcolor 780 | 6947 280 M 781 | 0 4339 V 782 | stroke 783 | LTb 784 | 0.13 0.13 0.13 C 6947 280 M 785 | 0 63 V 786 | 0 4276 R 787 | 0 -63 V 788 | stroke 789 | 6947 140 M 790 | [ [(Helvetica) 140.0 0.0 true true 0 ( 100)] 791 | ] -46.7 MCshow 792 | 1.000 UL 793 | LTb 794 | 0.13 0.13 0.13 C 1.000 UL 795 | LTb 796 | 0.13 0.13 0.13 C 546 4619 N 797 | 546 280 L 798 | 6401 0 V 799 | 0 4339 V 800 | -6401 0 V 801 | Z stroke 802 | LTb 803 | 3746 4829 M 804 | [ [(Helvetica) 140.0 0.0 true true 0 (Test Log)] 805 | ] -46.7 MCshow 806 | 1.000 UP 807 | 1.000 UL 808 | LTb 809 | 0.13 0.13 0.13 C % Begin plot #1 810 | 2.000 UL 811 | LT0 812 | 0.11 0.27 0.60 C LCb setrgbcolor 813 | 6296 4486 M 814 | [ [(Helvetica) 140.0 0.0 true true 0 (test average error: %)] 815 | ] -46.7 MRshow 816 | LT0 817 | 0.11 0.27 0.60 C 6380 4486 M 818 | 399 0 V 819 | 610 4118 M 820 | 674 690 L 821 | 738 536 L 822 | 64 -5 V 823 | 64 5 V 824 | 64 3 V 825 | 64 3 V 826 | 64 3 V 827 | 64 -2 V 828 | 64 2 V 829 | 64 2 V 830 | 64 2 V 831 | 64 -1 V 832 | 64 7 V 833 | 64 -4 V 834 | 64 0 V 835 | 64 0 V 836 | 64 -2 V 837 | 64 -1 V 838 | 64 -2 V 839 | 64 2 V 840 | 64 -3 V 841 | 64 6 V 842 | 64 -4 V 843 | 64 -3 V 844 | 64 -2 V 845 | 64 -1 V 846 | 64 -1 V 847 | 64 -4 V 848 | 64 -2 V 849 | 64 -1 V 850 | 64 9 V 851 | 64 -6 V 852 | 64 0 V 853 | 64 0 V 854 | 64 1 V 855 | 64 1 V 856 | 64 0 V 857 | 64 3 V 858 | 64 -3 V 859 | 64 1 V 860 | 64 -2 V 861 | 64 0 V 862 | 64 1 V 863 | 64 2 V 864 | 64 2 V 865 | 64 -1 V 866 | 64 -14 V 867 | 64 19 V 868 | 65 -22 V 869 | 64 26 V 870 | 64 -14 V 871 | 64 5 V 872 | 64 6 V 873 | 64 -30 V 874 | 64 8 V 875 | 64 32 V 876 | 64 41 V 877 | 64 -69 V 878 | 64 -17 V 879 | 64 -8 V 880 | 64 -17 V 881 | 64 22 V 882 | 64 -10 V 883 | 64 3 V 884 | 64 -8 V 885 | 64 -1 V 886 | 64 21 V 887 | 64 219 V 888 | 64 -229 V 889 | 64 7 V 890 | 64 47 V 891 | 64 -71 V 892 | 64 20 V 893 | 64 1 V 894 | 64 -28 V 895 | 64 98 V 896 | 64 -43 V 897 | 64 21 V 898 | 64 -75 V 899 | 64 212 V 900 | 64 -233 V 901 | 64 244 V 902 | 64 -250 V 903 | 64 252 V 904 | 64 -171 V 905 | 64 141 V 906 | 64 -89 V 907 | 64 -155 V 908 | 64 257 V 909 | 64 -203 V 910 | 64 -6 V 911 | 64 172 V 912 | 64 -225 V 913 | 64 88 V 914 | 64 -41 V 915 | 64 182 V 916 | 64 -174 V 917 | 64 -52 V 918 | 64 47 V 919 | % End plot #1 920 | stroke 921 | 1.000 UL 922 | LTb 923 | 0.13 0.13 0.13 C 546 4619 N 924 | 546 280 L 925 | 6401 0 V 926 | 0 4339 V 927 | -6401 0 V 928 | Z stroke 929 | 1.000 UP 930 | 1.000 UL 931 | LTb 932 | 0.13 0.13 0.13 C stroke 933 | grestore 934 | end 935 | showpage 936 | %%Trailer 937 | %%DocumentFonts: Helvetica 938 | -------------------------------------------------------------------------------- /thesis/Figure/LocalizationTrainLog.eps: -------------------------------------------------------------------------------- 1 | %!PS-Adobe-2.0 EPSF-2.0 2 | %%Title: /home/lab309/Documents/DeepPR/localization/logs/train.log.eps 3 | %%Creator: gnuplot 4.6 patchlevel 4 4 | %%CreationDate: Fri May 27 16:33:37 2016 5 | %%DocumentFonts: (atend) 6 | %%BoundingBox: 50 50 410 302 7 | %%EndComments 8 | %%BeginProlog 9 | /gnudict 256 dict def 10 | gnudict begin 11 | % 12 | % The following true/false flags may be edited by hand if desired. 13 | % The unit line width and grayscale image gamma correction may also be changed. 14 | % 15 | /Color true def 16 | /Blacktext false def 17 | /Solid false def 18 | /Dashlength 1 def 19 | /Landscape false def 20 | /Level1 false def 21 | /Rounded false def 22 | /ClipToBoundingBox false def 23 | /SuppressPDFMark false def 24 | /TransparentPatterns false def 25 | /gnulinewidth 5.000 def 26 | /userlinewidth gnulinewidth def 27 | /Gamma 1.0 def 28 | /BackgroundColor {-1.000 -1.000 -1.000} def 29 | % 30 | /vshift -46 def 31 | /dl1 { 32 | 10.0 Dashlength mul mul 33 | Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if 34 | } def 35 | /dl2 { 36 | 10.0 Dashlength mul mul 37 | Rounded { currentlinewidth 0.75 mul add } if 38 | } def 39 | /hpt_ 31.5 def 40 | /vpt_ 31.5 def 41 | /hpt hpt_ def 42 | /vpt vpt_ def 43 | /doclip { 44 | ClipToBoundingBox { 45 | newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath 46 | clip 47 | } if 48 | } def 49 | % 50 | % Gnuplot Prolog Version 4.6 (September 2012) 51 | % 52 | %/SuppressPDFMark true def 53 | % 54 | /M {moveto} bind def 55 | /L {lineto} bind def 56 | /R {rmoveto} bind def 57 | /V {rlineto} bind def 58 | /N {newpath moveto} bind def 59 | /Z {closepath} bind def 60 | /C {setrgbcolor} bind def 61 | /f {rlineto fill} bind def 62 | /g {setgray} bind def 63 | /Gshow {show} def % May be redefined later in the file to support UTF-8 64 | /vpt2 vpt 2 mul def 65 | /hpt2 hpt 2 mul def 66 | /Lshow {currentpoint stroke M 0 vshift R 67 | Blacktext {gsave 0 setgray show grestore} {show} ifelse} def 68 | /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R 69 | Blacktext {gsave 0 setgray show grestore} {show} ifelse} def 70 | /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R 71 | Blacktext {gsave 0 setgray show grestore} {show} ifelse} def 72 | /UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def 73 | /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def 74 | /DL {Color {setrgbcolor Solid {pop []} if 0 setdash} 75 | {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def 76 | /BL {stroke userlinewidth 2 mul setlinewidth 77 | Rounded {1 setlinejoin 1 setlinecap} if} def 78 | /AL {stroke userlinewidth 2 div setlinewidth 79 | Rounded {1 setlinejoin 1 setlinecap} if} def 80 | /UL {dup gnulinewidth mul /userlinewidth exch def 81 | dup 1 lt {pop 1} if 10 mul /udl exch def} def 82 | /PL {stroke userlinewidth setlinewidth 83 | Rounded {1 setlinejoin 1 setlinecap} if} def 84 | 3.8 setmiterlimit 85 | % Default Line colors 86 | /LCw {1 1 1} def 87 | /LCb {0 0 0} def 88 | /LCa {0 0 0} def 89 | /LC0 {1 0 0} def 90 | /LC1 {0 1 0} def 91 | /LC2 {0 0 1} def 92 | /LC3 {1 0 1} def 93 | /LC4 {0 1 1} def 94 | /LC5 {1 1 0} def 95 | /LC6 {0 0 0} def 96 | /LC7 {1 0.3 0} def 97 | /LC8 {0.5 0.5 0.5} def 98 | % Default Line Types 99 | /LTw {PL [] 1 setgray} def 100 | /LTb {BL [] LCb DL} def 101 | /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def 102 | /LT0 {PL [] LC0 DL} def 103 | /LT1 {PL [4 dl1 2 dl2] LC1 DL} def 104 | /LT2 {PL [2 dl1 3 dl2] LC2 DL} def 105 | /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def 106 | /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def 107 | /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def 108 | /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def 109 | /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def 110 | /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def 111 | /Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def 112 | /Dia {stroke [] 0 setdash 2 copy vpt add M 113 | hpt neg vpt neg V hpt vpt neg V 114 | hpt vpt V hpt neg vpt V closepath stroke 115 | Pnt} def 116 | /Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V 117 | currentpoint stroke M 118 | hpt neg vpt neg R hpt2 0 V stroke 119 | } def 120 | /Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 121 | 0 vpt2 neg V hpt2 0 V 0 vpt2 V 122 | hpt2 neg 0 V closepath stroke 123 | Pnt} def 124 | /Crs {stroke [] 0 setdash exch hpt sub exch vpt add M 125 | hpt2 vpt2 neg V currentpoint stroke M 126 | hpt2 neg 0 R hpt2 vpt2 V stroke} def 127 | /TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M 128 | hpt neg vpt -1.62 mul V 129 | hpt 2 mul 0 V 130 | hpt neg vpt 1.62 mul V closepath stroke 131 | Pnt} def 132 | /Star {2 copy Pls Crs} def 133 | /BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M 134 | 0 vpt2 neg V hpt2 0 V 0 vpt2 V 135 | hpt2 neg 0 V closepath fill} def 136 | /TriUF {stroke [] 0 setdash vpt 1.12 mul add M 137 | hpt neg vpt -1.62 mul V 138 | hpt 2 mul 0 V 139 | hpt neg vpt 1.62 mul V closepath fill} def 140 | /TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M 141 | hpt neg vpt 1.62 mul V 142 | hpt 2 mul 0 V 143 | hpt neg vpt -1.62 mul V closepath stroke 144 | Pnt} def 145 | /TriDF {stroke [] 0 setdash vpt 1.12 mul sub M 146 | hpt neg vpt 1.62 mul V 147 | hpt 2 mul 0 V 148 | hpt neg vpt -1.62 mul V closepath fill} def 149 | /DiaF {stroke [] 0 setdash vpt add M 150 | hpt neg vpt neg V hpt vpt neg V 151 | hpt vpt V hpt neg vpt V closepath fill} def 152 | /Pent {stroke [] 0 setdash 2 copy gsave 153 | translate 0 hpt M 4 {72 rotate 0 hpt L} repeat 154 | closepath stroke grestore Pnt} def 155 | /PentF {stroke [] 0 setdash gsave 156 | translate 0 hpt M 4 {72 rotate 0 hpt L} repeat 157 | closepath fill grestore} def 158 | /Circle {stroke [] 0 setdash 2 copy 159 | hpt 0 360 arc stroke Pnt} def 160 | /CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def 161 | /C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def 162 | /C1 {BL [] 0 setdash 2 copy moveto 163 | 2 copy vpt 0 90 arc closepath fill 164 | vpt 0 360 arc closepath} bind def 165 | /C2 {BL [] 0 setdash 2 copy moveto 166 | 2 copy vpt 90 180 arc closepath fill 167 | vpt 0 360 arc closepath} bind def 168 | /C3 {BL [] 0 setdash 2 copy moveto 169 | 2 copy vpt 0 180 arc closepath fill 170 | vpt 0 360 arc closepath} bind def 171 | /C4 {BL [] 0 setdash 2 copy moveto 172 | 2 copy vpt 180 270 arc closepath fill 173 | vpt 0 360 arc closepath} bind def 174 | /C5 {BL [] 0 setdash 2 copy moveto 175 | 2 copy vpt 0 90 arc 176 | 2 copy moveto 177 | 2 copy vpt 180 270 arc closepath fill 178 | vpt 0 360 arc} bind def 179 | /C6 {BL [] 0 setdash 2 copy moveto 180 | 2 copy vpt 90 270 arc closepath fill 181 | vpt 0 360 arc closepath} bind def 182 | /C7 {BL [] 0 setdash 2 copy moveto 183 | 2 copy vpt 0 270 arc closepath fill 184 | vpt 0 360 arc closepath} bind def 185 | /C8 {BL [] 0 setdash 2 copy moveto 186 | 2 copy vpt 270 360 arc closepath fill 187 | vpt 0 360 arc closepath} bind def 188 | /C9 {BL [] 0 setdash 2 copy moveto 189 | 2 copy vpt 270 450 arc closepath fill 190 | vpt 0 360 arc closepath} bind def 191 | /C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill 192 | 2 copy moveto 193 | 2 copy vpt 90 180 arc closepath fill 194 | vpt 0 360 arc closepath} bind def 195 | /C11 {BL [] 0 setdash 2 copy moveto 196 | 2 copy vpt 0 180 arc closepath fill 197 | 2 copy moveto 198 | 2 copy vpt 270 360 arc closepath fill 199 | vpt 0 360 arc closepath} bind def 200 | /C12 {BL [] 0 setdash 2 copy moveto 201 | 2 copy vpt 180 360 arc closepath fill 202 | vpt 0 360 arc closepath} bind def 203 | /C13 {BL [] 0 setdash 2 copy moveto 204 | 2 copy vpt 0 90 arc closepath fill 205 | 2 copy moveto 206 | 2 copy vpt 180 360 arc closepath fill 207 | vpt 0 360 arc closepath} bind def 208 | /C14 {BL [] 0 setdash 2 copy moveto 209 | 2 copy vpt 90 360 arc closepath fill 210 | vpt 0 360 arc} bind def 211 | /C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill 212 | vpt 0 360 arc closepath} bind def 213 | /Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto 214 | neg 0 rlineto closepath} bind def 215 | /Square {dup Rec} bind def 216 | /Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def 217 | /S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def 218 | /S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def 219 | /S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def 220 | /S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def 221 | /S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def 222 | /S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill 223 | exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def 224 | /S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def 225 | /S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill 226 | 2 copy vpt Square fill Bsquare} bind def 227 | /S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def 228 | /S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def 229 | /S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill 230 | Bsquare} bind def 231 | /S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill 232 | Bsquare} bind def 233 | /S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def 234 | /S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 235 | 2 copy vpt Square fill Bsquare} bind def 236 | /S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 237 | 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def 238 | /S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def 239 | /D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def 240 | /D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def 241 | /D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def 242 | /D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def 243 | /D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def 244 | /D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def 245 | /D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def 246 | /D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def 247 | /D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def 248 | /D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def 249 | /D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def 250 | /D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def 251 | /D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def 252 | /D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def 253 | /D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def 254 | /D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def 255 | /DiaE {stroke [] 0 setdash vpt add M 256 | hpt neg vpt neg V hpt vpt neg V 257 | hpt vpt V hpt neg vpt V closepath stroke} def 258 | /BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M 259 | 0 vpt2 neg V hpt2 0 V 0 vpt2 V 260 | hpt2 neg 0 V closepath stroke} def 261 | /TriUE {stroke [] 0 setdash vpt 1.12 mul add M 262 | hpt neg vpt -1.62 mul V 263 | hpt 2 mul 0 V 264 | hpt neg vpt 1.62 mul V closepath stroke} def 265 | /TriDE {stroke [] 0 setdash vpt 1.12 mul sub M 266 | hpt neg vpt 1.62 mul V 267 | hpt 2 mul 0 V 268 | hpt neg vpt -1.62 mul V closepath stroke} def 269 | /PentE {stroke [] 0 setdash gsave 270 | translate 0 hpt M 4 {72 rotate 0 hpt L} repeat 271 | closepath stroke grestore} def 272 | /CircE {stroke [] 0 setdash 273 | hpt 0 360 arc stroke} def 274 | /Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def 275 | /DiaW {stroke [] 0 setdash vpt add M 276 | hpt neg vpt neg V hpt vpt neg V 277 | hpt vpt V hpt neg vpt V Opaque stroke} def 278 | /BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M 279 | 0 vpt2 neg V hpt2 0 V 0 vpt2 V 280 | hpt2 neg 0 V Opaque stroke} def 281 | /TriUW {stroke [] 0 setdash vpt 1.12 mul add M 282 | hpt neg vpt -1.62 mul V 283 | hpt 2 mul 0 V 284 | hpt neg vpt 1.62 mul V Opaque stroke} def 285 | /TriDW {stroke [] 0 setdash vpt 1.12 mul sub M 286 | hpt neg vpt 1.62 mul V 287 | hpt 2 mul 0 V 288 | hpt neg vpt -1.62 mul V Opaque stroke} def 289 | /PentW {stroke [] 0 setdash gsave 290 | translate 0 hpt M 4 {72 rotate 0 hpt L} repeat 291 | Opaque stroke grestore} def 292 | /CircW {stroke [] 0 setdash 293 | hpt 0 360 arc Opaque stroke} def 294 | /BoxFill {gsave Rec 1 setgray fill grestore} def 295 | /Density { 296 | /Fillden exch def 297 | currentrgbcolor 298 | /ColB exch def /ColG exch def /ColR exch def 299 | /ColR ColR Fillden mul Fillden sub 1 add def 300 | /ColG ColG Fillden mul Fillden sub 1 add def 301 | /ColB ColB Fillden mul Fillden sub 1 add def 302 | ColR ColG ColB setrgbcolor} def 303 | /BoxColFill {gsave Rec PolyFill} def 304 | /PolyFill {gsave Density fill grestore grestore} def 305 | /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def 306 | % 307 | % PostScript Level 1 Pattern Fill routine for rectangles 308 | % Usage: x y w h s a XX PatternFill 309 | % x,y = lower left corner of box to be filled 310 | % w,h = width and height of box 311 | % a = angle in degrees between lines and x-axis 312 | % XX = 0/1 for no/yes cross-hatch 313 | % 314 | /PatternFill {gsave /PFa [ 9 2 roll ] def 315 | PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate 316 | PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec 317 | TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 318 | clip 319 | currentlinewidth 0.5 mul setlinewidth 320 | /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def 321 | 0 0 M PFa 5 get rotate PFs -2 div dup translate 322 | 0 1 PFs PFa 4 get div 1 add floor cvi 323 | {PFa 4 get mul 0 M 0 PFs V} for 324 | 0 PFa 6 get ne { 325 | 0 1 PFs PFa 4 get div 1 add floor cvi 326 | {PFa 4 get mul 0 2 1 roll M PFs 0 V} for 327 | } if 328 | stroke grestore} def 329 | % 330 | /languagelevel where 331 | {pop languagelevel} {1} ifelse 332 | 2 lt 333 | {/InterpretLevel1 true def} 334 | {/InterpretLevel1 Level1 def} 335 | ifelse 336 | % 337 | % PostScript level 2 pattern fill definitions 338 | % 339 | /Level2PatternFill { 340 | /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} 341 | bind def 342 | /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def 343 | << Tile8x8 344 | /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} 345 | >> matrix makepattern 346 | /Pat1 exch def 347 | << Tile8x8 348 | /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 349 | 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} 350 | >> matrix makepattern 351 | /Pat2 exch def 352 | << Tile8x8 353 | /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 354 | 8 8 L 8 0 L 0 0 L fill} 355 | >> matrix makepattern 356 | /Pat3 exch def 357 | << Tile8x8 358 | /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 359 | 0 12 M 12 0 L stroke} 360 | >> matrix makepattern 361 | /Pat4 exch def 362 | << Tile8x8 363 | /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 364 | 0 -4 M 12 8 L stroke} 365 | >> matrix makepattern 366 | /Pat5 exch def 367 | << Tile8x8 368 | /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 369 | 0 12 M 8 -4 L 4 12 M 10 0 L stroke} 370 | >> matrix makepattern 371 | /Pat6 exch def 372 | << Tile8x8 373 | /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 374 | 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} 375 | >> matrix makepattern 376 | /Pat7 exch def 377 | << Tile8x8 378 | /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 379 | 12 0 M -4 8 L 12 4 M 0 10 L stroke} 380 | >> matrix makepattern 381 | /Pat8 exch def 382 | << Tile8x8 383 | /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L 384 | -4 0 M 12 8 L -4 4 M 8 10 L stroke} 385 | >> matrix makepattern 386 | /Pat9 exch def 387 | /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def 388 | /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def 389 | /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def 390 | /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def 391 | /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def 392 | /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def 393 | /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def 394 | } def 395 | % 396 | % 397 | %End of PostScript Level 2 code 398 | % 399 | /PatternBgnd { 400 | TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse 401 | } def 402 | % 403 | % Substitute for Level 2 pattern fill codes with 404 | % grayscale if Level 2 support is not selected. 405 | % 406 | /Level1PatternFill { 407 | /Pattern1 {0.250 Density} bind def 408 | /Pattern2 {0.500 Density} bind def 409 | /Pattern3 {0.750 Density} bind def 410 | /Pattern4 {0.125 Density} bind def 411 | /Pattern5 {0.375 Density} bind def 412 | /Pattern6 {0.625 Density} bind def 413 | /Pattern7 {0.875 Density} bind def 414 | } def 415 | % 416 | % Now test for support of Level 2 code 417 | % 418 | Level1 {Level1PatternFill} {Level2PatternFill} ifelse 419 | % 420 | /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont 421 | dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall 422 | currentdict end definefont pop 423 | /MFshow { 424 | { dup 5 get 3 ge 425 | { 5 get 3 eq {gsave} {grestore} ifelse } 426 | {dup dup 0 get findfont exch 1 get scalefont setfont 427 | [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 428 | get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq 429 | {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 430 | get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div 431 | dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get 432 | show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop 433 | pop aload pop M} ifelse }ifelse }ifelse } 434 | ifelse } 435 | forall} def 436 | /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def 437 | /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } 438 | {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 439 | 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def 440 | /MLshow { currentpoint stroke M 441 | 0 exch R 442 | Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def 443 | /MRshow { currentpoint stroke M 444 | exch dup MFwidth neg 3 -1 roll R 445 | Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def 446 | /MCshow { currentpoint stroke M 447 | exch dup MFwidth -2 div 3 -1 roll R 448 | Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def 449 | /XYsave { [( ) 1 2 true false 3 ()] } bind def 450 | /XYrestore { [( ) 1 2 true false 4 ()] } bind def 451 | Level1 SuppressPDFMark or 452 | {} { 453 | /SDict 10 dict def 454 | systemdict /pdfmark known not { 455 | userdict /pdfmark systemdict /cleartomark get put 456 | } if 457 | SDict begin [ 458 | /Title (/home/lab309/Documents/DeepPR/localization/logs/train.log.eps) 459 | /Subject (gnuplot plot) 460 | /Creator (gnuplot 4.6 patchlevel 4) 461 | /Author (lab309) 462 | % /Producer (gnuplot) 463 | % /Keywords () 464 | /CreationDate (Fri May 27 16:33:37 2016) 465 | /DOCINFO pdfmark 466 | end 467 | } ifelse 468 | end 469 | %%EndProlog 470 | %%Page: 1 1 471 | gnudict begin 472 | gsave 473 | doclip 474 | 50 50 translate 475 | 0.050 0.050 scale 476 | 0 setgray 477 | newpath 478 | (Helvetica) findfont 140 scalefont setfont 479 | BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 480 | 1.000 UL 481 | LTb 482 | 0.13 0.13 0.13 C 1.000 UL 483 | LTa 484 | LCa setrgbcolor 485 | 462 280 M 486 | 6485 0 V 487 | stroke 488 | LTb 489 | 0.13 0.13 0.13 C 462 280 M 490 | 63 0 V 491 | 6422 0 R 492 | -63 0 V 493 | stroke 494 | 378 280 M 495 | [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] 496 | ] -46.7 MRshow 497 | 1.000 UL 498 | LTb 499 | 0.13 0.13 0.13 C 1.000 UL 500 | LTa 501 | LCa setrgbcolor 502 | 462 1003 M 503 | 6485 0 V 504 | stroke 505 | LTb 506 | 0.13 0.13 0.13 C 462 1003 M 507 | 63 0 V 508 | 6422 0 R 509 | -63 0 V 510 | stroke 511 | 378 1003 M 512 | [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] 513 | ] -46.7 MRshow 514 | 1.000 UL 515 | LTb 516 | 0.13 0.13 0.13 C 1.000 UL 517 | LTa 518 | LCa setrgbcolor 519 | 462 1726 M 520 | 6485 0 V 521 | stroke 522 | LTb 523 | 0.13 0.13 0.13 C 462 1726 M 524 | 63 0 V 525 | 6422 0 R 526 | -63 0 V 527 | stroke 528 | 378 1726 M 529 | [ [(Helvetica) 140.0 0.0 true true 0 ( 20)] 530 | ] -46.7 MRshow 531 | 1.000 UL 532 | LTb 533 | 0.13 0.13 0.13 C 1.000 UL 534 | LTa 535 | LCa setrgbcolor 536 | 462 2450 M 537 | 6485 0 V 538 | stroke 539 | LTb 540 | 0.13 0.13 0.13 C 462 2450 M 541 | 63 0 V 542 | 6422 0 R 543 | -63 0 V 544 | stroke 545 | 378 2450 M 546 | [ [(Helvetica) 140.0 0.0 true true 0 ( 30)] 547 | ] -46.7 MRshow 548 | 1.000 UL 549 | LTb 550 | 0.13 0.13 0.13 C 1.000 UL 551 | LTa 552 | LCa setrgbcolor 553 | 462 3173 M 554 | 6485 0 V 555 | stroke 556 | LTb 557 | 0.13 0.13 0.13 C 462 3173 M 558 | 63 0 V 559 | 6422 0 R 560 | -63 0 V 561 | stroke 562 | 378 3173 M 563 | [ [(Helvetica) 140.0 0.0 true true 0 ( 40)] 564 | ] -46.7 MRshow 565 | 1.000 UL 566 | LTb 567 | 0.13 0.13 0.13 C 1.000 UL 568 | LTa 569 | LCa setrgbcolor 570 | 462 3896 M 571 | 6485 0 V 572 | stroke 573 | LTb 574 | 0.13 0.13 0.13 C 462 3896 M 575 | 63 0 V 576 | 6422 0 R 577 | -63 0 V 578 | stroke 579 | 378 3896 M 580 | [ [(Helvetica) 140.0 0.0 true true 0 ( 50)] 581 | ] -46.7 MRshow 582 | 1.000 UL 583 | LTb 584 | 0.13 0.13 0.13 C 1.000 UL 585 | LTa 586 | LCa setrgbcolor 587 | 462 4619 M 588 | 6485 0 V 589 | stroke 590 | LTb 591 | 0.13 0.13 0.13 C 462 4619 M 592 | 63 0 V 593 | 6422 0 R 594 | -63 0 V 595 | stroke 596 | 378 4619 M 597 | [ [(Helvetica) 140.0 0.0 true true 0 ( 60)] 598 | ] -46.7 MRshow 599 | 1.000 UL 600 | LTb 601 | 0.13 0.13 0.13 C 1.000 UL 602 | LTa 603 | LCa setrgbcolor 604 | 462 280 M 605 | 0 4339 V 606 | stroke 607 | LTb 608 | 0.13 0.13 0.13 C 462 280 M 609 | 0 63 V 610 | 0 4276 R 611 | 0 -63 V 612 | stroke 613 | 462 140 M 614 | [ [(Helvetica) 140.0 0.0 true true 0 ( 0)] 615 | ] -46.7 MCshow 616 | 1.000 UL 617 | LTb 618 | 0.13 0.13 0.13 C 1.000 UL 619 | LTa 620 | LCa setrgbcolor 621 | 1111 280 M 622 | 0 4339 V 623 | stroke 624 | LTb 625 | 0.13 0.13 0.13 C 1111 280 M 626 | 0 63 V 627 | 0 4276 R 628 | 0 -63 V 629 | stroke 630 | 1111 140 M 631 | [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] 632 | ] -46.7 MCshow 633 | 1.000 UL 634 | LTb 635 | 0.13 0.13 0.13 C 1.000 UL 636 | LTa 637 | LCa setrgbcolor 638 | 1759 280 M 639 | 0 4339 V 640 | stroke 641 | LTb 642 | 0.13 0.13 0.13 C 1759 280 M 643 | 0 63 V 644 | 0 4276 R 645 | 0 -63 V 646 | stroke 647 | 1759 140 M 648 | [ [(Helvetica) 140.0 0.0 true true 0 ( 20)] 649 | ] -46.7 MCshow 650 | 1.000 UL 651 | LTb 652 | 0.13 0.13 0.13 C 1.000 UL 653 | LTa 654 | LCa setrgbcolor 655 | 2408 280 M 656 | 0 4339 V 657 | stroke 658 | LTb 659 | 0.13 0.13 0.13 C 2408 280 M 660 | 0 63 V 661 | 0 4276 R 662 | 0 -63 V 663 | stroke 664 | 2408 140 M 665 | [ [(Helvetica) 140.0 0.0 true true 0 ( 30)] 666 | ] -46.7 MCshow 667 | 1.000 UL 668 | LTb 669 | 0.13 0.13 0.13 C 1.000 UL 670 | LTa 671 | LCa setrgbcolor 672 | 3056 280 M 673 | 0 4339 V 674 | stroke 675 | LTb 676 | 0.13 0.13 0.13 C 3056 280 M 677 | 0 63 V 678 | 0 4276 R 679 | 0 -63 V 680 | stroke 681 | 3056 140 M 682 | [ [(Helvetica) 140.0 0.0 true true 0 ( 40)] 683 | ] -46.7 MCshow 684 | 1.000 UL 685 | LTb 686 | 0.13 0.13 0.13 C 1.000 UL 687 | LTa 688 | LCa setrgbcolor 689 | 3704 280 M 690 | 0 4339 V 691 | stroke 692 | LTb 693 | 0.13 0.13 0.13 C 3704 280 M 694 | 0 63 V 695 | 0 4276 R 696 | 0 -63 V 697 | stroke 698 | 3704 140 M 699 | [ [(Helvetica) 140.0 0.0 true true 0 ( 50)] 700 | ] -46.7 MCshow 701 | 1.000 UL 702 | LTb 703 | 0.13 0.13 0.13 C 1.000 UL 704 | LTa 705 | LCa setrgbcolor 706 | 4353 280 M 707 | 0 4339 V 708 | stroke 709 | LTb 710 | 0.13 0.13 0.13 C 4353 280 M 711 | 0 63 V 712 | 0 4276 R 713 | 0 -63 V 714 | stroke 715 | 4353 140 M 716 | [ [(Helvetica) 140.0 0.0 true true 0 ( 60)] 717 | ] -46.7 MCshow 718 | 1.000 UL 719 | LTb 720 | 0.13 0.13 0.13 C 1.000 UL 721 | LTa 722 | LCa setrgbcolor 723 | 5002 280 M 724 | 0 4136 V 725 | 0 140 R 726 | 0 63 V 727 | stroke 728 | LTb 729 | 0.13 0.13 0.13 C 5002 280 M 730 | 0 63 V 731 | 0 4276 R 732 | 0 -63 V 733 | stroke 734 | 5002 140 M 735 | [ [(Helvetica) 140.0 0.0 true true 0 ( 70)] 736 | ] -46.7 MCshow 737 | 1.000 UL 738 | LTb 739 | 0.13 0.13 0.13 C 1.000 UL 740 | LTa 741 | LCa setrgbcolor 742 | 5650 280 M 743 | 0 4136 V 744 | 0 140 R 745 | 0 63 V 746 | stroke 747 | LTb 748 | 0.13 0.13 0.13 C 5650 280 M 749 | 0 63 V 750 | 0 4276 R 751 | 0 -63 V 752 | stroke 753 | 5650 140 M 754 | [ [(Helvetica) 140.0 0.0 true true 0 ( 80)] 755 | ] -46.7 MCshow 756 | 1.000 UL 757 | LTb 758 | 0.13 0.13 0.13 C 1.000 UL 759 | LTa 760 | LCa setrgbcolor 761 | 6298 280 M 762 | 0 4136 V 763 | 0 140 R 764 | 0 63 V 765 | stroke 766 | LTb 767 | 0.13 0.13 0.13 C 6298 280 M 768 | 0 63 V 769 | 0 4276 R 770 | 0 -63 V 771 | stroke 772 | 6298 140 M 773 | [ [(Helvetica) 140.0 0.0 true true 0 ( 90)] 774 | ] -46.7 MCshow 775 | 1.000 UL 776 | LTb 777 | 0.13 0.13 0.13 C 1.000 UL 778 | LTa 779 | LCa setrgbcolor 780 | 6947 280 M 781 | 0 4339 V 782 | stroke 783 | LTb 784 | 0.13 0.13 0.13 C 6947 280 M 785 | 0 63 V 786 | 0 4276 R 787 | 0 -63 V 788 | stroke 789 | 6947 140 M 790 | [ [(Helvetica) 140.0 0.0 true true 0 ( 100)] 791 | ] -46.7 MCshow 792 | 1.000 UL 793 | LTb 794 | 0.13 0.13 0.13 C 1.000 UL 795 | LTb 796 | 0.13 0.13 0.13 C 462 4619 N 797 | 462 280 L 798 | 6485 0 V 799 | 0 4339 V 800 | -6485 0 V 801 | Z stroke 802 | LTb 803 | 3704 4829 M 804 | [ [(Helvetica) 140.0 0.0 true true 0 (Training Log)] 805 | ] -46.7 MCshow 806 | 1.000 UP 807 | 1.000 UL 808 | LTb 809 | 0.13 0.13 0.13 C % Begin plot #1 810 | 2.000 UL 811 | LT0 812 | 0.11 0.27 0.60 C LCb setrgbcolor 813 | 6296 4486 M 814 | [ [(Helvetica) 140.0 0.0 true true 0 (training loss: %)] 815 | ] -46.7 MRshow 816 | LT0 817 | 0.11 0.27 0.60 C 6380 4486 M 818 | 399 0 V 819 | 527 4406 M 820 | 592 316 L 821 | 65 -20 V 822 | 64 -2 V 823 | 65 0 V 824 | 65 0 V 825 | 65 0 V 826 | 65 0 V 827 | 65 0 V 828 | 65 0 V 829 | 64 0 V 830 | 65 0 V 831 | 65 0 V 832 | 65 0 V 833 | 65 0 V 834 | 65 0 V 835 | 64 0 V 836 | 65 0 V 837 | 65 0 V 838 | 65 0 V 839 | 65 0 V 840 | 65 0 V 841 | 65 0 V 842 | 64 0 V 843 | 65 0 V 844 | 65 0 V 845 | 65 0 V 846 | 65 0 V 847 | 65 0 V 848 | 65 0 V 849 | 64 0 V 850 | 65 0 V 851 | 65 0 V 852 | 65 0 V 853 | 65 0 V 854 | 65 0 V 855 | 64 0 V 856 | 65 0 V 857 | 65 0 V 858 | 65 0 V 859 | 65 0 V 860 | 65 0 V 861 | 65 0 V 862 | 64 0 V 863 | 65 0 V 864 | 65 0 V 865 | 65 0 V 866 | 65 0 V 867 | 65 0 V 868 | 64 0 V 869 | 65 0 V 870 | 65 0 V 871 | 65 0 V 872 | 65 -1 V 873 | 65 1 V 874 | 65 -1 V 875 | 64 0 V 876 | 65 1 V 877 | 65 0 V 878 | 65 -1 V 879 | 65 0 V 880 | 65 -1 V 881 | 65 2 V 882 | 64 0 V 883 | 65 0 V 884 | 65 -1 V 885 | 65 0 V 886 | 65 0 V 887 | 65 -1 V 888 | 65 1 V 889 | 64 -1 V 890 | 65 0 V 891 | 65 -1 V 892 | 65 0 V 893 | 65 0 V 894 | 65 0 V 895 | 64 -1 V 896 | 65 0 V 897 | 65 0 V 898 | 65 -1 V 899 | 65 0 V 900 | 65 0 V 901 | 65 -1 V 902 | 64 1 V 903 | 65 0 V 904 | 65 0 V 905 | 65 -1 V 906 | 65 0 V 907 | 65 0 V 908 | 64 0 V 909 | 65 0 V 910 | 65 0 V 911 | 65 0 V 912 | 65 0 V 913 | 65 -1 V 914 | 65 1 V 915 | 64 0 V 916 | 65 -1 V 917 | 65 1 V 918 | 65 0 V 919 | % End plot #1 920 | stroke 921 | 1.000 UL 922 | LTb 923 | 0.13 0.13 0.13 C 462 4619 N 924 | 462 280 L 925 | 6485 0 V 926 | 0 4339 V 927 | -6485 0 V 928 | Z stroke 929 | 1.000 UP 930 | 1.000 UL 931 | LTb 932 | 0.13 0.13 0.13 C stroke 933 | grestore 934 | end 935 | showpage 936 | %%Trailer 937 | %%DocumentFonts: Helvetica 938 | -------------------------------------------------------------------------------- /thesis/Figure/MaxPooling.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/MaxPooling.jpg -------------------------------------------------------------------------------- /thesis/Figure/Neuron.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/Neuron.jpg -------------------------------------------------------------------------------- /thesis/Figure/ParkingSystem.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/ParkingSystem.jpg -------------------------------------------------------------------------------- /thesis/Figure/RCNN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/RCNN.png -------------------------------------------------------------------------------- /thesis/Figure/RPN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/RPN.png -------------------------------------------------------------------------------- /thesis/Figure/RecognitionAlnum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/RecognitionAlnum.png -------------------------------------------------------------------------------- /thesis/Figure/RecognitionChinese.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/RecognitionChinese.png -------------------------------------------------------------------------------- /thesis/Figure/ResBlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/ResBlock.png -------------------------------------------------------------------------------- /thesis/Figure/ResBlockActual.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/ResBlockActual.png -------------------------------------------------------------------------------- /thesis/Figure/ResNetTrainError.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/ResNetTrainError.jpg -------------------------------------------------------------------------------- /thesis/Figure/SegmentationDemo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/SegmentationDemo.png -------------------------------------------------------------------------------- /thesis/Figure/SegmentationDemo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/SegmentationDemo2.png -------------------------------------------------------------------------------- /thesis/Figure/logo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/logo.pdf -------------------------------------------------------------------------------- /thesis/Figure/xidian.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Figure/xidian.pdf -------------------------------------------------------------------------------- /thesis/Makefile: -------------------------------------------------------------------------------- 1 | thesis: 2 | latexmk -xelatex -f -interaction=nonstopmode DeepPR 3 | 4 | translation: 5 | latexmk -xelatex -f -interaction=nonstopmode Translation 6 | 7 | presentation: 8 | latexmk -xelatex -f -interaction=nonstopmode Presentation 9 | 10 | clean: 11 | rm -f *.toc *.bbl *.blg *.out *.aux *.log *.bak *.thm *.synctex.gz *.fdb_latexmk *.fls *.glo *.gls *.idx *.ilg *.ind 12 | -------------------------------------------------------------------------------- /thesis/Presentation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Presentation.pdf -------------------------------------------------------------------------------- /thesis/Presentation.tex: -------------------------------------------------------------------------------- 1 | \documentclass[UTF8]{beamer} 2 | \usefonttheme[onlymath]{serif} 3 | 4 | \usepackage[english]{babel} 5 | \usepackage[utf8]{inputenc} 6 | \usepackage[T1]{fontenc} 7 | \usepackage{fixltx2e} 8 | \usepackage{graphicx} 9 | \usepackage{caption} 10 | \usepackage[labelformat=simple, skip=10pt]{subcaption} 11 | \usepackage{grffile} 12 | \usepackage{longtable} 13 | \usepackage{wrapfig} 14 | \usepackage{rotating} 15 | \usepackage[normalem]{ulem} 16 | \usepackage{amsmath} 17 | \usepackage{textcomp} 18 | \usepackage{amssymb} 19 | \usepackage{capt-of} 20 | \usepackage{hyperref} 21 | \usepackage{biblatex} 22 | \usepackage{algorithm,algorithmic} 23 | \usepackage{ctex} 24 | 25 | \usetheme[sidebar]{XDUstyle} 26 | 27 | \bibliographystyle{XDUbibunsrt} 28 | \bibliography{ThesisFiles/RefFile}%在正文中必须引用,才能显示对应的参考文献 29 | 30 | \title{机动车车牌的实时检测与识别系统} 31 | \author[王昌旭]{王昌旭} 32 | \institute[西安电子科技大学\\计算机学院]{西安电子科技大学计算机学院2012级本科生} 33 | \date{\today} 34 | 35 | \begin{document} 36 | 37 | { \xdbg 38 | \begin{frame}[plain, noframenumbering] 39 | \titlepage 40 | \end{frame} 41 | } 42 | 43 | \part{引言} 44 | 45 | \section{研究意义} 46 | \begin{frame} 47 | \frametitle{研究意义} 48 | 机动车车牌识别有着十分广泛的的应用: 49 | 50 | \begin{itemize} 51 | \item 停车场智能管理 52 | \item 停车场自动找车系统 53 | \item 电子警察 54 | \item 无人驾驶汽车 55 | \end{itemize} 56 | \end{frame} 57 | 58 | \begin{frame} 59 | \frametitle{研究意义} 60 | \begin{figure}[ht] 61 | \centering 62 | \subcaptionbox{校门口的停车场门禁系统} 63 | {\includegraphics[width=0.45\linewidth]{./Figure/ParkingSystem.jpg}} 64 | \subcaptionbox{Google 的无人驾驶汽车} 65 | {\includegraphics[width=0.45\linewidth]{./Figure/GoogleSelfDrivingCar.jpg}} 66 | \caption{车牌识别应用举例} 67 | \end{figure} 68 | \end{frame} 69 | 70 | \section{传统方法 VS 深度学习} 71 | 72 | \begin{frame} 73 | \frametitle{传统方法 = 手工特征 + 模型} 74 | 75 | \textcolor{red}{\paragraph{优点}} 76 | \begin{itemize} 77 | \item 速度快,易于实现 78 | \item 便于进行理论分析 79 | \end{itemize} 80 | 81 | \textcolor{red}{\paragraph{缺点}} 82 | \begin{itemize} 83 | \item 依赖大量先验知识及特征工程 84 | \item 对系统设计者要求高 85 | \item 对复杂任务效果不佳 86 | \end{itemize} 87 | \end{frame} 88 | 89 | \begin{frame} 90 | \frametitle{深度学习 = 数据 + 神经网络} 91 | 92 | \textcolor{red}{\paragraph{优点}} 93 | \begin{itemize} 94 | \item 人工干预少 95 | \item 对于复杂任务效果好 96 | \end{itemize} 97 | 98 | \textcolor{red}{\paragraph{缺点}} 99 | \begin{itemize} 100 | \item 对数据的数量和质量要求高 101 | \item 计算量大,速度慢 102 | \item 神经网络为黑箱系统,难以进行有效的数学分析 103 | \end{itemize} 104 | \end{frame} 105 | 106 | \begin{frame} 107 | \frametitle{CNN的结构} 108 | 109 | \begin{figure}[ht] 110 | \includegraphics[width=1.0\linewidth]{./Figure/LeNet.png} 111 | \caption{用于MNIST手写数字识别的LeNet模型} 112 | \end{figure} 113 | \end{frame} 114 | 115 | \section{车牌识别系统结构} 116 | 117 | \begin{frame} 118 | \frametitle{车牌识别系统结构图} 119 | \begin{figure}[ht] 120 | \centering 121 | \includegraphics[height=0.8\textheight]{./Figure/SystemArch.eps} 122 | \end{figure} 123 | \end{frame} 124 | 125 | \part{车牌检测} 126 | 127 | \section{传统方法} 128 | 129 | \begin{frame} 130 | \frametitle{常见的传统方法} 131 | \begin{itemize} 132 | \item 基于车牌形状的方法 133 | \item 基于颜色划分的方法 134 | \item 基于纹理特征的方法 135 | \end{itemize} 136 | \end{frame} 137 | 138 | \begin{frame} 139 | \frametitle{传统方法的优缺点} 140 | 141 | \textcolor{red}{\paragraph{优点}} 142 | \begin{itemize} 143 | \item 算法简单,易于实现 144 | \item 执行速度快 145 | \end{itemize} 146 | 147 | \textcolor{red}{\paragraph{缺点}} 148 | \begin{itemize} 149 | \item 鲁棒性差 150 | \item 特殊情况多 151 | \item 难以适应复杂场合 152 | \end{itemize} 153 | \end{frame} 154 | 155 | \section{Faster R-CNN} 156 | 157 | \begin{frame} 158 | \frametitle{Faster R-CNN简介} 159 | Faster R-CNN全称Faster Region-Convolution Nerual Network,是由微软亚洲研究院 160 | Shaoqing Ren\cite{Ren:2015ug}等人在Fast R-CNN\cite{Girshick:2015ib}及其前身 161 | R-CNN\cite{Girshick:2014jx}的基础上提出的一种通用目标检测算法。 162 | 163 | \textcolor{red}{\paragraph{优点}} 164 | \begin{itemize} 165 | \item 是目前准确率最高的目标检测算法之一 166 | \item 性能优异,能达到准实时级的检测速度 167 | \end{itemize} 168 | 169 | \textcolor{red}{\paragraph{缺点}} 170 | \begin{itemize} 171 | \item 需要大量标注过的训练数据 172 | \item 需要使用GPU加速 173 | \end{itemize} 174 | \end{frame} 175 | 176 | \begin{frame} 177 | \frametitle{Faster R-CNN原理} 178 | 179 | \begin{figure}[ht] 180 | \centering 181 | \includegraphics[height=0.8\textheight]{./Figure/FasterRCNN.png} 182 | \caption{Faster R-CNN结构图}\label{Fig:FasterRCNN} 183 | \end{figure} 184 | \end{frame} 185 | 186 | \section{效果展示} 187 | 188 | \begin{frame} 189 | \frametitle{效果展示} 190 | \begin{figure}[th] 191 | \centering 192 | \subcaptionbox{示例一} 193 | {\includegraphics[height=0.6\textheight, keepaspectratio]{./Figure/DetectionDemo.png}} 194 | \subcaptionbox{示例二} 195 | {\includegraphics[height=0.6\textheight, keepaspectratio]{./Figure/DetectionDemo2.png}} 196 | \caption{使用Faster R-CNN进行车牌检测}\label{Fig:DetectionDemo} 197 | \end{figure} 198 | \end{frame} 199 | 200 | \part{车牌定位} 201 | 202 | \section{传统方法} 203 | 204 | \begin{frame} 205 | \frametitle{常见的传统方法} 206 | 207 | \begin{itemize} 208 | \item 基于边缘检测的定位方法 209 | \item 基于形态学的定位方法 210 | \item 基于颜色划分的定位方法 211 | \end{itemize} 212 | \end{frame} 213 | 214 | \begin{frame} 215 | \frametitle{传统方法的优缺点} 216 | 217 | \textcolor{red}{优点} 218 | \begin{itemize} 219 | \item 简单,容易实现,速度快 220 | \end{itemize} 221 | 222 | \textcolor{red}{缺点} 223 | \begin{itemize} 224 | \item 难以处理的特殊情况多,鲁棒性不强 225 | \item 抗仿射、投影变换的能力差 226 | \end{itemize} 227 | \end{frame} 228 | 229 | \section{使用CNN进行车牌定位} 230 | 231 | \begin{frame} 232 | \frametitle{使用CNN进行车牌定位} 233 | 234 | 我们可以仿照Faster R-CNN的思路,使用CNN对车牌的四个顶点(关键点)坐标进行回归, 235 | 以实现车牌定位,这种方法的优缺点如下: 236 | 237 | \textcolor{red}{优点} 238 | \begin{itemize} 239 | \item 鲁棒性强 240 | \end{itemize} 241 | 242 | \textcolor{red}{缺点} 243 | \begin{itemize} 244 | \item 效果受数据影响大,需要大量标注过的训练数据 245 | \item CNN抗旋转的能力差,因此需要做数据扩充 246 | \item 和车牌检测任务有所重复,可进行合并 247 | \end{itemize} 248 | \end{frame} 249 | 250 | \section{效果展示} 251 | 252 | \begin{frame} 253 | \frametitle{效果展示} 254 | 255 | \begin{figure}[ht] 256 | \centering 257 | \includegraphics[height=0.6\textheight]{./Figure/LocalizationDemo.png} 258 | \caption{车牌定位效果图}\label{Fig:LocalizationDemo} 259 | \end{figure} 260 | \end{frame} 261 | 262 | \part{字符分割} 263 | 264 | \section{传统方法} 265 | 266 | \begin{frame} 267 | \frametitle{常见的传统方法} 268 | 269 | \begin{itemize} 270 | \item 基于直方图投影的分割方法 271 | \item 基于连通域分析的分割方法 272 | \end{itemize} 273 | \end{frame} 274 | 275 | \begin{frame} 276 | \frametitle{传统方法的优缺点} 277 | 278 | \textcolor{red}{优点} 279 | \begin{itemize} 280 | \item 简单,容易实现,速度快 281 | \end{itemize} 282 | 283 | \textcolor{red}{缺点} 284 | \begin{itemize} 285 | \item 基于直方图投影的分割方法要求车牌水平,不能抵抗倾斜等仿射变换 286 | \item 基于连通域分析的分割方法效果依赖于车牌二值化的效果,因此对图像质量要求 287 | 高,鲁棒性差 288 | \end{itemize} 289 | \end{frame} 290 | 291 | \section{基于Class-specific Extremal Region的分割方法} 292 | 293 | \begin{frame} 294 | \frametitle{Extremal Region的定义} 295 | \begin{definition} 296 | 我们首先定义图像的一个Region为图像的一个连续子区域。这里的连续是指,该区域中 297 | 像素点总满足某种邻接关系(本文中均指4-邻接,即一个像素和它的上下左右四个像素 298 | 邻接,除此之外还有8-邻接关系)。 299 | \end{definition} 300 | 301 | \begin{definition} 302 | 我们说一个Region为一个Extremal Region,是指该Region的边界像素值比内部像素值 303 | 高出许多。 304 | \end{definition} 305 | 306 | \begin{block}{备注} 307 | 以上定义仅做说明用途,详细的数学定义请参考论文4.1.1节 308 | \end{block} 309 | \end{frame} 310 | 311 | \begin{frame} 312 | \frametitle{Class-specific Extremal Region简介} 313 | 314 | Neumann等人于2012年提出了一种\cite{Neumann:2012ik}名为Class-specific 315 | Extremal Region(CSER)的方法并成功应用于自然场景中的字符检测与定位问题。 316 | 317 | 该方法的核心思想是使用两个级联AdaBoost分类器对ER进行筛选,从而快速准确地提取图 318 | 像中的字符区域。 319 | 320 | 该方法最终成功在ICDAR Robust Reading竞赛中成功夺取桂冠,充分证明了其有效性。 321 | \end{frame} 322 | 323 | \begin{frame} 324 | \frametitle{使用CSER进行文字检测} 325 | 326 | CSER使用两个级联的AdaBoost分类器对产生的ER候选区域进行筛选: 327 | 328 | \begin{itemize} 329 | \item 第一级分类器使用少而高效的特征进行粗筛选。 330 | \item 第二级分类器在第一级分类器特征的基础上,使用一些更为有效的特征进行进一步筛选。 331 | \end{itemize} 332 | 333 | \begin{block}{备注} 334 | 由于两个分类器使用的特征定义稍显复杂,在此不再赘述,详情请参考论文4.1.2节 335 | \end{block} 336 | \end{frame} 337 | 338 | \begin{frame} 339 | \frametitle{使用CSER进行车牌字符分割} 340 | 341 | 为了进一步去除,假阳性的ER区域,我们在此使用一些车牌的结构信息进行进一步筛选, 342 | 如: 343 | 344 | \begin{itemize} 345 | \item ER相对尺寸 346 | \item ER长宽比 347 | \item ER相对位置关系 348 | \item 其他筛选标准…… 349 | \end{itemize} 350 | 351 | 通过上述方法首先得到6个英文、数字字符区域。 352 | 353 | 然后以此来推断车牌中中文字符的区域。 354 | 355 | 最终便得出所有的车牌字符区域。 356 | \end{frame} 357 | 358 | \section{效果展示} 359 | 360 | \begin{frame} 361 | \frametitle{使用CSER产生候选区域} 362 | 363 | \begin{figure}[ht] 364 | \centering 365 | \includegraphics[height=0.6\textheight]{./Figure/AllERs.png} 366 | \caption{使用CSER提取出的所有候选区}\label{Fig:AllERs} 367 | \end{figure} 368 | \end{frame} 369 | 370 | \begin{frame} 371 | \frametitle{最终效果} 372 | 373 | \begin{figure}[th] 374 | \centering 375 | \includegraphics[height=0.6\textheight, keepaspectratio]{./Figure/SegmentationDemo.png} 376 | \caption{车牌字符分割效果展示}\label{Fig:SegmentationDemo} 377 | \end{figure} 378 | \end{frame} 379 | 380 | \part{字符识别} 381 | 382 | \section{使用CNN进行字符识别} 383 | 384 | \begin{frame} 385 | \frametitle{使用CNN进行字符识别} 386 | 387 | \begin{figure}[ht] 388 | \centering 389 | \subcaptionbox{中文} 390 | {\includegraphics[height=0.25\textheight, keepaspectratio]{./Figure/RecognitionChinese.png}} 391 | \subcaptionbox{英文及数字} 392 | {\includegraphics[height=0.25\textheight, keepaspectratio]{./Figure/RecognitionAlnum.png}} 393 | \caption{字符识别CNN模型} \label{Fig:RecognitionCNN} 394 | \end{figure} 395 | \end{frame} 396 | 397 | \begin{frame} 398 | \frametitle{效果展示} 399 | 400 | \begin{figure}[ht] 401 | \centering 402 | \includegraphics[width=1.0\linewidth]{./Figure/End2EndDemo2.png} 403 | \caption{系统运行效果}\label{Fig:End2EndDemo} 404 | \end{figure} 405 | \end{frame} 406 | 407 | \part{总结与展望} 408 | 409 | \section{总结} 410 | 411 | \begin{frame} 412 | \frametitle{总结} 413 | 414 | 可以看到,基于深度学习的车牌识别系统有着鲁棒性强、人工干预少、可定制性强等传统 415 | 方法无法比拟的优点,有着广阔的前景。 416 | 417 | \begin{block}{备注} 418 | 本毕设所有源码及论文已上传至GitHub:https://github.com/DelightRun/DeepPR 419 | \end{block} 420 | \end{frame} 421 | 422 | \section{展望} 423 | 424 | \begin{frame} 425 | \frametitle{展望} 426 | 427 | 但是我们的系统也有许多可以改进的地方: 428 | \begin{itemize} 429 | \item 使用YOLO\cite{Redmon:2015tl}、SSD\cite{Liu:2015wa}等速度更快的算法替代Faster R-CNN进行车牌检测 430 | \item 将车牌定位整合进车牌检测中 431 | \item 使用CUDA实现CSER方法以提升性能 432 | \item 在字符分割任务中使用非极大抑制剔除冗余的ER区域 433 | \item 等等 434 | \end{itemize} 435 | 这些都有待进一步的研究、实验以进行验证。 436 | \end{frame} 437 | 438 | \part{参考文献} 439 | 440 | \begin{frame}[t, allowframebreaks] 441 | \frametitle{参考文献} 442 | \printbibliography 443 | \end{frame} 444 | 445 | { \xdbg 446 | \begin{frame}[plain, noframenumbering] 447 | \finalpage{{\huge 感谢各位评委老师的观看!}} 448 | \end{frame} 449 | } 450 | 451 | \end{document} -------------------------------------------------------------------------------- /thesis/ThesisFiles/Abstract.tex: -------------------------------------------------------------------------------- 1 | % 中文摘要 2 | \begin{abstract} 3 | 随着近几年中国汽车保有量的持续增加,智能交通系统以及自动驾驶技术俨然已成为十分 4 | 热门的研究领域。而机动车车牌识别技术作为这两项技术的基础和关键,有着十分重要的研 5 | 究意义和应用价值。本文主要对车牌识别系统所涉及的车牌检测、车牌定位、车牌字符分割 6 | 和车牌识别四个子系统展开研究,并运用最新的深度学习技术实现一个简单的车牌识别系统。 7 | 全文工作将分为以下几点: 8 | 9 | 第一,本文首先阐述本课题的研究背景及意义,并简要介绍深度学习技术相较于传统技术的 10 | 异同; 11 | 12 | 第二,本文尝试使用Faster R-CNN技术来进行车牌检测,来克服传统方法严重依 13 | 赖手工特征和手工规则、鲁棒性差等缺点; 14 | 15 | 第三,本文尝试使用CNN 回归车牌顶点坐标的方法以实现车牌定位; 16 | 17 | 第四,车牌字符分割问题可以看做对车牌图片中的文字进行 18 | 提取的问题。本文尝试使用Class-specific Extremal Region的方法进行车牌字符分割; 19 | 20 | 第五,在图像识别领域,目前最理想的方法当属卷积神经网络(简称CNN),它有着更好的 21 | 识别准确率和更强的鲁棒性。因此本系统采用CNN 的方法进行车牌识别。 22 | 23 | 最后,本文总结了深度学习技术及其在车牌识别这一计算机视觉任务上的应用前景,并提出 24 | 对未来的展望。 25 | \end{abstract} 26 | \keywords{车牌检测, 车牌定位, 车牌字符分割, 车牌识别, 深度学习} 27 | 28 | % 英文摘要 29 | \begin{enabstract} 30 | With the continued increase in vehicle ownership in China in recent years, 31 | intelligent transportation system and autopilot technology has became a very 32 | popular research field. As the foundation and key of these two technologies, 33 | the vehicle license plate recognition technology is of great importance in both 34 | research and application. This paper focuses on four 35 | essential subsystem in the vehicle license plate recognition system including 36 | detection, localization, segmentation and recognition. We implement a simple vehicle 37 | license plate recognition systems based on the up to date deep learning 38 | technologies. We summarize the whole work as follows: 39 | 40 | First, we illustrates the certain necessity of the research and implementation 41 | of this vehicle license plate recognition system by describing the background and 42 | significance of the research. 43 | 44 | Second, This paper will 45 | present an approach of vehicle license plate detection based on Faster R-CNN 46 | technology, in order to overcome the shortcomings of traditional 47 | methods such as the dependency of hand-made features as well as the 48 | poor robustness. 49 | 50 | Third, in this paper, we try to localize vehicle license plate by regressing the 51 | vertex positions using CNN. 52 | 53 | Fourth, The vehicle 54 | license plate segmentation problem can be viewed as the problem of detecting 55 | characters from license plate pictures. In this paper, we try to segment license 56 | into character by using Class-specific Extremal Region technology. 57 | 58 | Fifth, in the field of image recognition, there is no doubt that CNN is the 59 | state-of-art approach currently, it has a higher accuracy and a better 60 | robustness. So we adopt the CNN for license plate recognition in our final 61 | system. 62 | 63 | Sixth, through the study of the technologies above, this paper implements a 64 | simple license plate recognition system. In our recognition system, we use RCNN 65 | for detection, CNN regression for location, CSER for character segmentation and 66 | CNN for the final recognition, respectively. 67 | \end{enabstract} 68 | \enkeywords{vehicle license plate detection, vehicle license plate location, 69 | vehicle license character segmentation, vehicle license plate recognition, 70 | deep learning} -------------------------------------------------------------------------------- /thesis/ThesisFiles/Appendix.tex: -------------------------------------------------------------------------------- 1 | \chapter{实验环境} 2 | 3 | \begin{table}[ht] 4 | \centering 5 | \caption{实验用工作站配置}\label{Tab:WorkstationInfo} 6 | \begin{tabular}{|c|c|} 7 | \hline 8 | 操作系统 & Ubuntu Server 14.04 \\ 9 | \hline 10 | CPU & Intel E5-2603 v3 \\ 11 | \hline 12 | 内存 & 32GB DDR3 \\ 13 | \hline 14 | 显卡 & NVIDIA Quardo M5000 x2 \\ 15 | \hline 16 | Python版本 & Python 3.5(Anaconda3 4) \\ 17 | \hline 18 | CUDA 版本 & CUDA 7.5 with CuDNN \\ 19 | \hline 20 | \end{tabular} 21 | \end{table} -------------------------------------------------------------------------------- /thesis/ThesisFiles/RefFile.bib: -------------------------------------------------------------------------------- 1 | %% Created using Papers on Tue, 31 May 2016. 2 | %% http://papersapp.com/papers/ 3 | 4 | @article{Gou:2015du, 5 | author = {Gou, Chao and Wang, Kunfeng and Yao, Yanjie and Li, Zhengxi}, 6 | title = {{Vehicle License Plate Recognition Based on Extremal Regions and Restricted Boltzmann Machines}}, 7 | journal = {IEEE Transactions on Intelligent Transportation Systems}, 8 | year = {2015}, 9 | volume = {PP}, 10 | number = {99}, 11 | pages = {1--12} 12 | } 13 | 14 | @article{Du:2013js, 15 | author = {Du, Shan and Ibrahim, Mahmoud and Shehata, Mohamed and Badawy, Wael}, 16 | title = {{Automatic License Plate Recognition (ALPR): A State-of-the-Art Review}}, 17 | journal = {Circuits and Systems for Video Technology, IEEE Transactions on}, 18 | year = {2013}, 19 | volume = {23}, 20 | number = {2}, 21 | pages = {311--325} 22 | } 23 | 24 | @article{Baya:2008ud, 25 | author = {Baya, H and Essa, A and Tuytelaarsb, T}, 26 | title = {{Speeded-up robust features (SURF)}}, 27 | journal = {Computer Vision and {\ldots}}, 28 | year = {2008} 29 | } 30 | 31 | @article{Lowe:2004kp, 32 | author = {Lowe, David G}, 33 | title = {{Distinctive Image Features from Scale-Invariant Keypoints}}, 34 | journal = {International Journal of Computer Vision}, 35 | year = {2004}, 36 | volume = {60}, 37 | number = {2}, 38 | pages = {91--110} 39 | } 40 | 41 | @article{He:2016tq, 42 | author = {He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian}, 43 | title = {{Identity Mappings in Deep Residual Networks}}, 44 | journal = {arXiv.org}, 45 | year = {2016}, 46 | eprint = {1603.05027v2}, 47 | eprinttype = {arxiv}, 48 | eprintclass = {cs.CV}, 49 | month = mar 50 | } 51 | 52 | @article{Gomez:2014vp, 53 | author = {Gomez, Lluis and Karatzas, Dimosthenis}, 54 | title = {{A Fast Hierarchical Method for Multi-script and Arbitrary Oriented Scene Text Extraction}}, 55 | year = {2014}, 56 | eprint = {1407.7504}, 57 | eprinttype = {arxiv}, 58 | month = jul 59 | } 60 | 61 | @article{Zeiler:2012uw, 62 | author = {Zeiler, Matthew D}, 63 | title = {{ADADELTA: An Adaptive Learning Rate Method}}, 64 | journal = {arXiv.org}, 65 | year = {2012}, 66 | eprint = {1212.5701v1}, 67 | eprinttype = {arxiv}, 68 | eprintclass = {cs.LG}, 69 | month = dec 70 | } 71 | 72 | @article{Nair:2010vq, 73 | author = {Nair, Vinod and Hinton, Geoffrey E}, 74 | title = {{Rectified Linear Units Improve Restricted Boltzmann Machines.}}, 75 | journal = {ICML}, 76 | year = {2010}, 77 | pages = {807--814} 78 | } 79 | 80 | @article{LeCun:1990vp, 81 | author = {Le Cun, B B and Denker, J S and Henderson, D}, 82 | title = {{Handwritten digit recognition with a back-propagation network}}, 83 | journal = {Advances in neural {\ldots}}, 84 | year = {1990} 85 | } 86 | 87 | @article{Girshick:2015ib, 88 | author = {Girshick, Ross B}, 89 | title = {{Fast R-CNN.}}, 90 | journal = {ICCV}, 91 | year = {2015}, 92 | pages = {1440--1448} 93 | } 94 | 95 | @article{Krizhevsky:2012wl, 96 | author = {Krizhevsky, Alex and Sutskever, Ilya and Hinton, Geoffrey E}, 97 | title = {{ImageNet Classification with Deep Convolutional Neural Networks.}}, 98 | journal = {NIPS}, 99 | year = {2012}, 100 | pages = {1106--1114} 101 | } 102 | 103 | @article{Duda:1972eua, 104 | author = {Duda, Richard O and Hart, Peter E}, 105 | title = {{Use of the Hough transformation to detect lines and curves in pictures}}, 106 | journal = {Communications of the ACM}, 107 | year = {1972}, 108 | volume = {15}, 109 | number = {1}, 110 | pages = {11--15}, 111 | month = jan 112 | } 113 | 114 | @article{McCulloch:1943dq, 115 | author = {McCulloch, Warren S and Pitts, Walter}, 116 | title = {{A logical calculus of the ideas immanent in nervous activity}}, 117 | journal = {The bulletin of mathematical biophysics}, 118 | year = {1943}, 119 | volume = {5}, 120 | number = {4}, 121 | pages = {115--133} 122 | } 123 | 124 | @article{Rosenblatt:1958jc, 125 | author = {Rosenblatt, F}, 126 | title = {{The perceptron: A probabilistic model for information storage and organization in the brain.}}, 127 | journal = {Psychological Review}, 128 | year = {1958}, 129 | volume = {65}, 130 | number = {6}, 131 | pages = {386--408}, 132 | month = nov 133 | } 134 | 135 | @article{Neumann:2012ik, 136 | author = {Neumann, Lukas and Matas, Jiri}, 137 | title = {{Real-time scene text localization and recognition}}, 138 | journal = {2012 IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, 139 | year = {2012}, 140 | pages = {3538--3545} 141 | } 142 | 143 | @article{Neumann:2011dy, 144 | author = {Neumann, Lukas and Matas, Jiri}, 145 | title = {{Text Localization in Real-World Images Using Efficiently Pruned Exhaustive Search}}, 146 | journal = {Document Analysis and Recognition ( {\ldots}}, 147 | year = {2011}, 148 | pages = {687--691} 149 | } 150 | 151 | @inproceedings{Girshick:2014jx, 152 | author = {Girshick, Ross and Donahue, Jeff and Darrell, Trevor and Malik, Jitendra}, 153 | title = {{Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation}}, 154 | booktitle = {Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on}, 155 | year = {2014}, 156 | pages = {580--587}, 157 | publisher = {IEEE} 158 | } 159 | 160 | @article{Ren:2015ug, 161 | author = {Ren, Shaoqing and He, Kaiming and Girshick, Ross B and 0001, Jian Sun}, 162 | title = {{Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks.}}, 163 | journal = {NIPS}, 164 | year = {2015}, 165 | pages = {91--99} 166 | } 167 | 168 | @article{Liu:2015wa, 169 | author = {Liu, Wei and Anguelov, Dragomir and Erhan, Dumitru and Szegedy, Christian and Reed, Scott and Fu, Cheng-Yang and Berg, Alexander C}, 170 | title = {{SSD: Single Shot MultiBox Detector}}, 171 | journal = {arXiv.org}, 172 | year = {2015}, 173 | eprint = {1512.02325v2}, 174 | eprinttype = {arxiv}, 175 | eprintclass = {cs.CV}, 176 | month = dec 177 | } 178 | 179 | @article{He:2015tt, 180 | author = {He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian}, 181 | title = {{Deep Residual Learning for Image Recognition}}, 182 | journal = {arXiv.org}, 183 | year = {2015}, 184 | eprint = {1512.03385v1}, 185 | eprinttype = {arxiv}, 186 | eprintclass = {cs.CV}, 187 | month = dec 188 | } 189 | 190 | @article{Redmon:2015tl, 191 | author = {Redmon, Joseph and Divvala, Santosh and Girshick, Ross and Farhadi, Ali}, 192 | title = {{You Only Look Once: Unified, Real-Time Object Detection}}, 193 | journal = {arXiv.org}, 194 | year = {2015}, 195 | eprint = {1506.02640v5}, 196 | eprinttype = {arxiv}, 197 | eprintclass = {cs.CV}, 198 | month = jun 199 | } 200 | 201 | @article{Kingma:2014us, 202 | author = {Kingma, Diederik and Ba, Jimmy}, 203 | title = {{Adam: A Method for Stochastic Optimization}}, 204 | journal = {arXiv.org}, 205 | year = {2014}, 206 | eprint = {1412.6980v8}, 207 | eprinttype = {arxiv}, 208 | eprintclass = {cs.LG}, 209 | month = dec 210 | } 211 | 212 | @article{Gou:2014ds, 213 | author = {Gou, C and Wang, K and Li, B and Wang, F Y}, 214 | title = {{Vehicle license plate recognition based on class-specific ERs and SaE-ELM}}, 215 | journal = {{\ldots} Transportation Systems (ITSC {\ldots}}, 216 | year = {2014} 217 | } 218 | 219 | -------------------------------------------------------------------------------- /thesis/ThesisFiles/Thanks.tex: -------------------------------------------------------------------------------- 1 | \begin{thanksfor} 2 | 在论文完成之时,我要感谢两位指导老师:首先是我毕业设计的指导老师,西安电子科技大 3 | 学的李辉老师,他不 4 | 仅悉心指导我查找文献、撰写论文,还为我提供了实验室环境和工作站;然后我要感谢我的 5 | 研究生导师,浙江大学CAD实验室的蔡登教授,是他为我指明了大方向,并帮助我修正我的 6 | 思路。没有他们的帮助,我的论文也不能进展的如此顺利。 7 | 8 | 在此,祝二位指导老师身体健康、事业有成,桃李满天下。 9 | 10 | 然后,我还要感谢诸多学长对我的悉心指导和帮助,是他们帮我解决了许多技术细节上的问 11 | 题和困惑,帮助我开发完善相关代码。 12 | 13 | 在此,祝学长们学业有成,万事如意。 14 | 15 | 最后,应当感谢崔元顺同学和齐飞老师提供本 \LaTeX 模板,谢谢他们的无私贡献。 16 | \end{thanksfor} -------------------------------------------------------------------------------- /thesis/Translation.dvi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Translation.dvi -------------------------------------------------------------------------------- /thesis/Translation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/Translation.pdf -------------------------------------------------------------------------------- /thesis/Translation.tex: -------------------------------------------------------------------------------- 1 | % Created 2016-05-19 Thu 21:41 2 | \documentclass[UTF8]{article} 3 | \usepackage[utf8]{inputenc} 4 | \usepackage[T1]{fontenc} 5 | \usepackage{fixltx2e} 6 | \usepackage{graphicx} 7 | \usepackage{grffile} 8 | \usepackage{longtable} 9 | \usepackage{wrapfig} 10 | \usepackage{rotating} 11 | \usepackage[normalem]{ulem} 12 | \usepackage{amsmath} 13 | \usepackage{textcomp} 14 | \usepackage{amssymb} 15 | \usepackage{capt-of} 16 | \usepackage{hyperref} 17 | \usepackage{ctex} 18 | \author{王昌旭} 19 | \date{2016 年 3 月 1 日} 20 | \title{自然场景中文字的实时定位与识别} 21 | \begin{document} 22 | 23 | \maketitle 24 | 25 | \section{摘要} 26 | 27 | 本文展示了一种对自然场景中的文字进行实时定位和是别的方法。实时性通过将文字检测任务变为一系列极值区域的选择来实现。 28 | 基于极值区域的检测器对模糊、光照、颜色和纹理变换有着极强的鲁棒性,并能处理低对比度图像。 29 | 30 | 在识别的第一阶段,我们使用对每个极值区域使用一些可在$O(1)$的时间复杂度内被计算出的全新特征来计算该极值区域为一个字符的概率。 31 | 只有那些具有局部极大概率的极值区域区域被选中并进入第二阶段——使用更加复杂的特征来计算更加准确的概率。 32 | 然后我们使用一种十分有效且带有反馈的搜索算法将这些极值区域区域聚合成单词并进行字符分割。最后,我们使用 OCR 的方法对这些字符进行识别。 33 | 34 | 我们在两个公开数据集上对算法进行了评估。在 ICDAR 2011 数据集上,与目前所有以公开的算法相比,我们的方法取得了目前为止最佳的字符定位效果。 35 | 在更具有挑战性的街景数据集上,我们的方法取得了目前为止最高的召回率。 36 | 37 | \section{研究现状} 38 | 39 | 40 | 已有一系列用于解决自然场景中字符定位问题的方法被提出。如Epstein等人提出将图像转 41 | 换为灰度图后使用Canny算子来检测字符边缘。对每个像素,其平行的边缘被用于计算笔画 42 | 粗细,最后具有相似笔画粗细的像素悲剧和为一个个字符。该方法由于其依赖于边缘检测的 43 | 效果,因此对噪声和图像模糊十分敏感。此外还有其他人提出了一种同样使用边缘检测但使 44 | 用不同连通分量的算法。这些方法都可以在ICDAR Robust Reading竞赛结果中找到。 45 | 46 | 只有很少数能同时解决字符定位和识别的算法被提出。比如Wang等人的方法使用滑动窗口来 47 | 寻找独立的字符,然后使用词汇表将字符聚合成单词。这种方法可以可以处理带有噪声的数 48 | 据,但是其效果却受制于词汇表的大小。 49 | 车辆的车牌识别系统已经成为在视频监控领域中一个特殊的热门领域超过10年左右。随着先进的用于交通管理应用的视频车辆检测系统的的到来,车牌识别系统被发现可以适合用在 50 | 相当多的领域内,并非只是控制访问点或收费停车场。现在它可以被集成到视频车辆检测系统,该系统通常安装在需要的地方用于十字路口控制,交通监控等, 51 | 以确定该车辆是否违反交通法规或找到被盗车辆。一些用于识别车牌的技术到目前为止有如BAM(双向联想回忆)神经网络字符识别,模式匹配等技术。应用于系统的技术是基于模式匹配, 52 | 该系统快速,准确足以在相应的请求时间内完成,更重要的是在于阿尔伯塔车牌识别在字母和数字方位确认上的优先发展。由于车牌号码的字体和方位因国家/州/省份的不同而不同 53 | ,该算法需要作相应的修改保持其结构完整,如果我们想请求系统识别这些地方的车牌。 54 | 55 | 还有一类基于极大稳定极值区域(MSER)对字符进行检测的方法,最终并基于MSER完成字符 56 | 分割以进行字符识别。MSER是极值区域的一种特殊情况,其在一段连续的阈值变化中保持面 57 | 积的不变。这类方法有着一般具有十分好的效果,但是却无法在模糊或低对比度的图像上正 58 | 常工作。根据ICDAR 2011 Robust Reading竞赛组织者提供的描述,最终竞赛的赢家正是基 59 | 于MSER的检测算法,但是这种方法还未被公布并且它不包括字符识别。 60 | 61 | 本文提出的方法与基于MSER的方法的不同之处在于,它将测试所有的极值区域(并非MSER的 62 | 一个子集)同时在保持和MSER相同的计算复杂度的基础上减少了内存占用,并可以达到实时 63 | 级的速度。本方法借鉴Zimermann等人的思想,放弃MSER中对极大稳定的要求,并选择一种 64 | 基于分类的极值区域(CSER)。在我们的方法中,实时地选择合适极值区域的工作通过一系列 65 | 级联分类器实现,并在此过程中使用了一些全新的特征,这些特征专门设计用来进行字符检 66 | 测。此外,分类器将被训练输出区域为字符的概率,因此可以被用于提取一个字符的多个分割。 67 | 68 | \section{简介} 69 | 70 | 真实场景中的字符定位和识别在许多计算机视觉技术的应用中都是十分关键的一个环节,如基于文本的图像搜索、街景应用中对商店的标记识别以及虚拟现实系统, 71 | 因此一直是计算机世界研究的热点。在过去的几年中,举行了许多相关竞赛,但即使是目前最好的方法在也只在 ICDAR 2011 竞赛中取得了 62\% 的定位准确率, 72 | 并且该数据集并不能代表真实场景(数据集中的单词全部是水平的,并在图像用占据主要位置,没有投影变换或比较显著的噪声)。 73 | 为了进行车牌识别,需要以下几个基本的步骤: 74 | 1) 牌照定位,定位图片中的牌照位置; 75 | 2) 牌照字符分割,把牌照中的字符分割出来; 76 | 3) 牌照字符识别,把分割好的字符进行识别,最终组成牌照号码。 77 | 车牌识别过程中,牌照颜色的识别依据算法不同,可能在上述不同步骤实现,通常与车牌识别互相配合、互相验证。 78 | 1) 牌照定位 79 | 自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。首先对采集到的视频图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为牌照区域,并将其从图像中分离出来。 80 | 2) 牌照字符分割 81 | 完成牌照区域的定位后,再将牌照区域分割成单个字符,然后进行识别。字符分割一般采用垂直投影法。由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。利用垂直投影法对复杂环境下的汽车图像中的字符分割有较好的效果。 82 | 3) 牌照字符识别方法主要有基于模板匹配算法和基于人工神经网络算法。基于模板匹配算法首先将分割后的字符二值化并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,选择最佳匹配作为结果。基于人工神经网络的算法有两种:一种是先对字符进行特征提取,然后用所获得特征来训练神经网络分配器;另一种方法是直接把图像输入网络,由网络自动实现特征提取直至识别出结果。 83 | 实际应用中,车牌识别系统的识别率还与牌照质量和拍摄质量密切相关。牌照质量会受到各种因素的影响,如生锈、污损、油漆剥落、字体褪色、牌照被遮挡、牌照倾斜、高亮反光、多牌照、假牌照等等;实际拍摄过程也会受到环境亮度、拍摄方式、车辆速度等等因素的影响。这些影响因素不同程度上降低了车牌识别的识别率,也正是车牌识别系统的困难和挑战所在。为了提高识别率,除了不断地完善识别算法还应该想办法克服各种光照条件,使采集到的图像最利于识别。 84 | 85 | 在图像中定位文字区域很可能是一个十分耗费计算资源的任务,因为一幅图像中一共有$2^N$个可能为文字区域的子集($N$为像素数量)。 86 | 因此主流文字定位算法在解决此问题是可分为两种思路。 87 | 88 | 一类方法通过滑动窗口将搜索区域限制在图像的一个子区域内。这类方法将对图像的搜索复杂度降至了$cN$级别,其中$c$是一个常数,代表算法所需处理不同放缩比、长宽比、旋转等变换的种类。 89 | 90 | 另一类方法通过连通分量分析将像素聚合成字符区域,这类方法假定属于同一个字符的像素有着相似的属性。连通分量分析方法又根据使用属性的不同分为许多种(如颜色、比划粗细等)。 91 | 基于连通分量的方法的优点在于其算法复杂度不依赖于文字区域的属性(如尺寸、旋转、字体)等,并且提供了对字符的分割操作以方便进行 OCR。但是这类方法也有其缺点,具体来讲就是对会 92 | 连通分量产生改变的干扰十分敏感,如干扰、阻隔等。 93 | 94 | 在本文中,我们提出了一种端到端的实时文字定位和识别算法,该方法在标准数据集上取得了目前最佳的效果。实时性通过将文字检测任务变为一系列极值区域的选择来实现。 95 | 基于极值区域的检测器对模糊、光照、颜色和纹理变换有着极强的鲁棒性,并能处理低对比度图像。这种算法的复杂度是$O(2pN)$,其中\$p\$表示使用的通道(投影)数。 96 | 97 | 98 | 在识别的第一阶段,我们使用对每个极值区域使用一些可在$O(1)$的时间复杂度内被计算出的全新特征来计算该极值区域为一个字符的概率。 99 | 只有那些具有局部极大概率的极值区域区域被选中并进入第二阶段——使用更加复杂的特征来计算更加准确的概率。 100 | 然后我们使用一种十分有效且带有反馈的搜索算法将这些极值区域区域聚合成单词并进行字符分割。 101 | 102 | 此外,我们提出一种全新的梯度幅度投影来检测图像边缘并计算 极值区域。进一步的测试表明使用梯度投影后,极值区域 检测器能检测出 94.8\%的字符。 103 | 系统架构包含三个相异部分:室外部分,室内部分和通信链路。室外部分是安装摄像头在拍摄图像的不同需要的路口。室内部分是中央控制站, 104 | 从所有这些安装摄像头中,接收,存储和分析所拍摄图像。通信链路就是高速电缆或光纤连接到所有这些相机中央控制站。 几乎所有的算法的开发程度迄今按以下类似的步骤进行。一般的7个处理步骤已被确定为所有号牌识别算法共有。它们是: 触发:这可能是硬件或软件触发。硬件触发是旧的方式,即感应圈用于触发和这个表述了图像通过检测车牌的存在何时应该被捕获。 105 | 硬件触发现在在操作上在许多地方被软件触发取代。在软件触发,图像分为区,通过图像对于分析的车辆的检测的执行。 图像采集:硬件或软件触发启动图像捕捉设备来捕捉和存储图像来进一步的分析。 车辆的存在:这一步是只需要如果在确认一定时间间隔后触发完成不需要知道车辆存在于捕获的图像中。这一步背景图像与捕获的图片作比较, 106 | 并检测是否有任何重大改变。如果没有,拍摄的图像被忽略,否则进入到下一个步骤。 寻找车牌:此步骤是在捕获的图像中定位车牌。一些技术的可用于这一步,例如颜色检测,特征分析,边缘检测等。在捕获的图像中的任何倾斜是纠正在这一步。一旦车牌已被定位,图像即准备进行字符识别。 字符分割:分割可以通过检测浓到淡或者淡到浓的过渡层。车牌中的每个灰色字符产生了一个灰色带。因此,通过检测类似灰度带每个字符可以被分割出来。 识别过程:这是光学字符识别的一步。一些技术可以被用于到这一步包括模式匹配,特征匹配和神经网络分类。 发布过程:这是应用程序的特有的一步。根据应用此步骤可保存已被检测出来的车牌用于交通数据收集,尝试匹配号牌与被盗车辆数据库或在停车场中为认可停车的车辆打开汽车门等等。 107 | 车牌识别系统有两种触发方式,一种是外设触发,另一种是视频触发。 108 | 外设触发工作方式是指采用线圈、红外或其他检测器检测车辆通过信号,车牌识别系统接受到车辆触发信号后,采集车辆图像,自动识别车牌,以及进行后续处理。该方法的优点是触发率高,性能稳定;缺点是需要切割地面铺设线圈,施工量大。 109 | 视频触发方式是指车牌识别系统采用动态运动目标序列图像分析处理技术,实时检测车道上车辆移动状况,发现车辆通过时捕捉车辆图像,识别车牌照,并进行后续处理。视频触发方式不需借助线圈、红外或其他硬件车辆检测器。该方法的优点是施工方便,不需要切割地面铺设线圈,也不需要安装车检器等零部件,但其缺点也十分显著,由于算法的极限,该方案的触发率与识别率较之外设触发都要低很多。 110 | 1)间接法:指通过识别安装在汽车上的IC卡或条形码中所存储的车牌的信息来识别车牌及相关信息。IC卡技术识别准确度高,运行可靠,可以全天候作业,但它整套装置价格昂贵,硬件设备十分复杂,不适用于异地作业;条形码技术具有识别速度快、准确度高、可靠性强以及成本较低等优点,但是对于扫描器要求很高。此外,二者都需要制定出全国统一的标准,并且无法核对车、条形码是否相符,也是技术上存在的缺点,这给在短时间内推广造成困难。 111 | 2)直接法:基于图像的车牌识别技术属于直接法,是一种无源型汽车牌照智能识别方法,能够在无任何专用发送车牌信号的车载发射设备情况下,对运动状态车辆或静止状态车辆的车牌号码进行非接触性信息采集并实时智能识别。与间接法识别系统相比,首先,这种系统节省了设备安置及大量资金,从而提高了经济效益;其次,由于采用了先进的计算机应用技术,所以可提高识别速度,较好地解决实时性问题;再次,它是根据图像进行识别,所以通过人的参与可以解决系统中的识别错误,而其他方法是难以与人交互的。 112 | 直接法一般有图像处理技术,传统模式识别技术及人工神经网络技术。 113 | 1)图像处理技术:运用图像处理技术解决汽车牌照识别的研究最早始于80年代,但国内外均只是就车牌识别中的某一个具体问题进行讨论,并且通常仅采用简单的图像处理技术来解决,并没有形成完整的系统体系,识别过程是使用工业电视摄像机拍下汽车的工前方图像,然后交给计算机进行简单的处理,并且最终仍需要人工干预,例如车辆牌照中省份汉字的识别问题,1985年有人利用常见的图像处理技木方法提出汉字识别的分类是在抽取汉字特征的基础上进行的,根据汉字的投影直方图选取浮动闭值,抽取汉字在竖直方向的峰值,利用树形查表法进行汉字的粗分类;然后根据汉字在水平方向的投影直方图,选取适当闭值,进行量化处理后,形成一个变长链码,再用动态规划法,求出与标准模式链码的最小距离,实现细分米完成汉字省名的自动识别。 114 | 2)传统模式识别技术。传统模式识别技术指结构特征法,统计特征法等。90年代,由于计算机视觉技术的发展,开始出现汽车牌照识别的系统化研究。1990年AS.Johnson等运用计算机视觉技术和图像处理技术实现了车辆牌照的自动识别系统。该系统分为图像分割、特征提取和模板构造、字符识别等三个部分。利用不同闽值对应的直方图不同,经过大量统计实验确定出车牌位置的图像直方图的闽值范围,从而根据特定闽值对应的直方图分割出车牌,再利用预先设置的标准字符模板进行模式匹配识别出字符。 115 | 3)人工神经网络技术。近几年来,计算机及相关技术发达的一些国家开始探讨用人工神经网络技术解决车牌自动识别问题,例如1994年M.M.M.FANHY等就成功地运用了BAM神经网络方法对车牌上的字符进行自动识别,BAM神经网络是由相同神经元构成的双向联想式单层网络,每一个字符模板对应着唯一个BAM矩阵,通过与车牌上的字符比较,识别出正确的车牌号码。 116 | 这种采用BAM神经网络方法的缺点是无映解决识别系统存储容量和处理速度相矛盾的问题。 117 | 118 | \section{本文提出的算法} 119 | 120 | \subsection{极值区域} 121 | 122 | 我们首先定义一幅图像$\mathbf{I}$为一个映射$\mathbf{I} : \mathcal{D} \subset 123 | \mathbb{N}^2 \rightarrow \mathcal{V}$,其中$\mathcal{V}$一般为 124 | $\{0,\cdots,255\}^3$(即一个色彩空间)。然后,我们定义图像的一个通道为 125 | $\mathbf{C} : \mathcal{D} \rightarrow \mathcal{S}$,其中$\mathcal{S}$为一个全序 126 | 集并且存在一个映射$f_c : \mathcal{V} \rightarrow \mathbf{S}$将像素值映射到该全序 127 | 集。我们定义$A$为邻接关系$A \subset \mathcal{D} \times \mathcal{D}$,常见的邻接 128 | 关系有 4-邻接和 8-邻接,在本章的实现中我们使用 4-邻接关系。 129 | 130 | 我们定义图像$I$(或通道$C$)的一个 Region 为$\mathcal{D}$的一个连续子集(所为连续, 131 | 是指$\forall{p_i, p_j \in \mathcal{R}}\, \exists{p_i, q_1, q_2, \cdots, q_n, 132 | p_j} : p_iAq_1, q_1Aq_2,\cdots,q_nAp_j$。我们定义 Region 边界 133 | $\partial{\mathcal{R}}$ 为那些与 Region $\mathcal{R}$邻接却不属于$\mathcal{R}$的像 134 | 素的集合,即$\partial{\mathcal{R}} = \{p \in \mathcal{D} \\ \mathcal{R} : 135 | \exists{q \in \mathcal{R}} : pAq \}$。现在,我们定义 \textit{极值区域} (极值区域) 136 | 为那些边界像素值比内部像素高许多的 Region,写成数学语言即$ \forall{p \in 137 | \mathcal{R}}, q \in \partial{\mathcal{R}} : \mathbf{C}(q) > \theta > \mathbf{C}(p)$,其中 138 | $\theta$为极值区域的阈值。 139 | 140 | 一个阈值为$\theta$的极值区域$r$可以由多个或 141 | 个阈值为$\theta - 1$的极值区域和值为$\theta$的像素和并集:$r = \left( \bigcup{u \in 142 | R_{\theta-1}} \right) \cup \left( \bigcup{p \ in \mathcal{D} : \mathbf{C}(p) 143 | = \theta} \right)$构成,其中$R_{\theta-1}$表示阈值为$\theta_1$的极值区域。 144 | 该性质指出极值区域 间有一种包含关系,一个极值区域可以包含一个或多个后继 极值区域(或没有后继,如果它只包含具有相同值的像素) 145 | 和唯一的前驱 极值区域。 146 | 147 | 在本文中,我们考虑 RGB 和 HSI 色彩空间,并且额外使用一个 \emph{亮度导数} 通道,其中每个像素的导数通过 148 | 该像素及其邻域像素的最大亮度差来表示: 149 | 150 | \[ 151 | \mathbf{C}_{\nabla}(p) = \max_{q \in \mathcal{D} : pAq}{\| \mathbf{C}_{\mathbf{I}}(p) - \mathbf{C}_{\mathbf{I}}(q) \|} 152 | \] 153 | 154 | 实验验证表明 85.6\%的字符可通过在一个通道上的极值区域检测,94.8\%的字符区域可以通过所有通道检测。 155 | 一个字符被认为被成功地检测到,如果极值区域的边界矩形和真实字符边界矩形有 90\%的重合。在我们提出的方法中,我们结合使用亮度(I)、 156 | 亮度导数($\nabla$)、色度(H)和饱和度(S)通道进行实验,并在运行时间和定位准确率之间取得了最佳的平衡。 157 | 158 | \subsection{可增量计算描述子} 159 | 160 | 能够对极值区域进行快速分类的关键在于能快速对每个区域计算其描述子作为分类器的特征。正如 Zimmerman 和 Matas 在他们论文中所提出的, 161 | 我们可以使用一类特殊的描述子,这类描述字可以根据极值区域见的包含关系逐步递增地计算得出。 162 | 163 | 我们使用$R_{\theta-1}$表示阈值为$\theta-1$的 极值区域。一个极值区域 $r \in R_{\theta}$科表示为一系列阈值为$\theta-1$的极值区域的并集并加上一些值为$\theta$的像素。 164 | 我们进一步假设对于每个阈值为$\theta-1$的 极值区域$u \in R_{\theta-1}$其描述子$\phi(u)$已知。为了计算描述子$\phi(r), r \in R_{\theta}$,我们必须结合那些组成$r$的 165 | 极值区域$u \in R_{\theta-1}$的描述子和值为$\theta$的像素,即$\phi(r) = \left( \oplus{\phi(u)} \right) \oplus \left( \oplus{\psi(p)} \right)$,其中$\oplus$表示对描述子进行结合的算子, 166 | $\psi(p)$被称为初始化函数,用于计算给定像素$p$的描述子。我们将那些存在$\psi(p)$ 167 | 和$\oplus$的描述子称为\textit{可增量计算的}。 168 | 169 | 显然,我们可以通过将阈值$\theta$从 0 逐步累加之 255 的方法来计算出所有极值区域的描述子,即计算值为$\theta$的像素的描述子$\psi$并重用那些阈值为$\theta-1$的区域的描述子$\phi$。 170 | 注意,这种性质指出我们只需要在内存中保留前一阈值所对用极值区域区域的描述子,因 171 | 此这种方法相较于基于极大稳定极值区域的方法将极大程度减少内存占用。更进一步,如果我们假设初始化函数$\psi$和结合算子$\oplus$ 172 | 具有常数级别的计算复杂度,则计算所有极值区域区域的算法复杂度仅有$O(N)$。 173 | 174 | 在本文中,我们使用下述描述子: 175 | 176 | \begin{itemize} 177 | \item \textbf{面积} $a$:极值区域 区域的面积(即像素数量)。其初始化函数为一个常数 178 | $\psi(p)=1$,结合算子$\oplus$为数值加法。 179 | \item \textbf{边框} $(x_{min}, y_{min}, x_{max}, y_{max})$:即极值区域边框的右上角和 180 | 左下角。对于坐标为$(x,y)$d 的像素$p$,其初始化函数为四元组$(x,y,x+1,y+1)$,结 181 | 合算子$\oplus$为$(min,min,max,max)$。区域的长和宽可通过$x_{max}-x_{min}$和 182 | $y_{max}-y_{min}$计算得到。 183 | \item \textbf{周长} $p$:即极值区域边缘的长度。初始化函数$\psi(p)$通过新加入值为 184 | $\theta$的像素的位置来绝对周长的改变量,结合算子$\oplus$为数值加法。$\psi(p)$ 185 | 的时间复杂度为$O(1)$,因为一个像素最多只有四个邻居。 186 | \item \textbf{欧拉数$\eta$}:欧拉数是二值图像的一种拓扑特征,为连通域数目和孔洞。 187 | \item \textbf{水平交叉点数$c_i$}:用一个长度为图像高度的向量来保存对应行像素在属 188 | 于极值区域与不属于极值区域 之间转变的次数。初始化函数的的值由在阈值$\mathbf{C}(p)$下像素$p$ 189 | 的左右邻接像素的存在与否来定。结合算子$\oplus$为按元素做加法。$\psi(p)$的计 190 | 算复杂度是个常数(每个像素在水平方向至多只有两个邻居),并且按元素的加法可以 191 | 也具有常数复杂度,因为假定使用的数据结构的随机访问和两端插入操作的复杂度为$O(1)$(如双端队列)。 192 | \end{itemize} 193 | 194 | \subsection{级联分类器} 195 | 196 | 在我们提出的方法中,每个通道被分别进行迭代(原始通道和反色通道)然后检测极值区域。为了 197 | 减少极高的假阳性率以及减少的极值区域,只有那些被分类器认为十分可能是字符的极值区域区域被保留。 198 | 为了提高计算性能,分类阶段被分为两阶段进行。 199 | 200 | 在第一阶段,阈值从0逐步累加至255,对每个极值区域 $r$ 计算其可增量计算描述子并作 201 | 为特征送入分类器,得到该极值区域为字符区域的条件概率$p(r\|字符)$。概率 $p(r\|字 202 | 符)$ 在贯穿所有阈值的极值区域级联推倒中备注总,并且只有那些具有局部极大概率的极 203 | 值区域会被选中(即局部极大概率大于全局阈值 $p_{min}$ 并且局部极大和局部极小的差 204 | 大于$\Delta_{min}$)。 205 | 206 | 在本文中,我们使用一个基于决策树的AdaBoost分类器并使用特征: 207 | 208 | \begin{itemize} 209 | \item \textbf{长宽比}($w/h$) 210 | \item \textbf{compactness}($\sqrt{a}/p$) 211 | \item \textbf{孔洞数}($1-\eta$) 212 | \item \textbf{水平交叉点特征}($\hat{c}=median(\mathbf{c}_{\frac{1}{6}w}, \mathbf{c}_{\frac{3}{6}w}, \mathbf{c}_{\frac{5}{6}w})$) 213 | \end{itemize} 214 | 215 | 因为只有$\mathbf{c}$的一个固定子集被使用,所以具有常数时间复杂度。分类器的输出通 216 | 过对数几率回归得到概率分布函数$p(r\|字符)$。在实验中我们使用参数$p_{min} = 0.2$ 217 | 和$\Delta_{min}=0.1$来获得更高的召回率(95.6\%)。 218 | 219 | 在第二阶段,通过第一阶段的极值区域被分为字符和非字符两类,并使用了有更多欣喜但也 220 | 更耗费计算资源特征。在本文中,使用了一个具有RBF核的SVM分类器。该分类器除了上述第 221 | 一阶段用到的特征外,还是额外使用了如下特征: 222 | 223 | \begin{itemize} 224 | \item \textbf{孔洞面积比$a_h/a$}:其中$a_h$代表ER 区域内孔洞的面积(像素数)。 225 | \item \textbf{凸包面积比$a_c/a$}:其中$a_c$为ER 区域凸包的面积。 226 | \item \textbf{外轮廓拐点数$\kappa$}:代表ER 区域边界凹角与凸角的变化数目。一个字 227 | 符一般只含有数量比较少的外轮廓拐点($kappa < 10$),而非字符区域(如草)则含有 228 | 大量的外轮廓拐点。 229 | \end{itemize} 230 | 231 | 我们注意到,以上所有特征都是放缩不变的,但不是旋转不变的,因此我们的训练集中需要 232 | 包含具有不同旋转角度的字符。 233 | 234 | \section{实验} 235 | 236 | 我们使用大约900个正例和1400个负例来训练上述方法中的分类器,这些样本由人工从ICDAR 237 | 2003训练数据集中提取(用于训练级联分类器)和从字体库中生成(用于训练OCR)。我们 238 | 在两个数据集上使用相同参数测试了我们提出的算法。 239 | 240 | \subsection{ICDAR 2011数据集} 241 | 242 | ICDAR 2011 Robust Reading竞赛数据集包含了1189个单词和6393个字母,共255幅图像。使 243 | 用ICDAR 2011比赛的评估标准,本方法在文本定位问题上达到了64.7\%的召回率,73.1\%的 244 | 准确率和68.7\%的f-测度。 245 | 246 | 本方法相交ICDAR 2011 Robust Reading竞赛的获胜者在召回率上有显著的提升,但是准确 247 | 率(73\%)却相对获胜者(83\%)则更差,因此总的f-测度(69\%)结果不及竞赛获胜者 248 | (71\%)。值得注意的是,ICDAR 2011竞赛作为开放式竞赛,作者只需要提供他们方法的输 249 | 出结果。 250 | 251 | 单词识别的结果无法与其他已知方法进行对比,因为端到端的文本定位和识别并非ICDAR 252 | 2011 Robust Reading竞赛的一部分并且在数据集上没有其他方法提供文本识别结果。 253 | 254 | \subsection{街景文本数据集} 255 | 256 | 街景文本数据集(SVT)包含647个单词和3796个字母,共249张从谷歌街景中提取的图像。 257 | 本数据集更具有挑战性,因为图像中文本具有不同的朝向、字体大小差异更大,并且图像包 258 | 含噪声。真实数据的格式同ICDAR 2011数据集也有所不同——标注只覆盖部分单词。 259 | 再已被标注的单词中,本方法达到了32.9\%的召回率(评估方法与上节相同)。 260 | 文本定位的准确率(19.1\%)并不能算作一个衡量标准,因为标注不完整。值得注意的是, 261 | 许多错误的检测是由于图像中的水印导致的,这也侧面证明了本方法在对抗噪声和低对比度 262 | 时的鲁棒性。 263 | 264 | 本方法只能侧面的同Wang等人提出的方法,他们使用了不同的评估标,得到f-测速度为41\% 265 | (召回率29\%,准确率67\%)。此外,Wang等人的方法需要使用词汇表来对图像中的文本进 266 | 行定位,而我们提出的方法在检测文本时不需要任何关于文本内容的先验知识,因此不会受 267 | 词汇表的限制。 268 | 269 | \section{结论} 270 | 271 | 本文提出了一种端到端的实时文字定位和识别算法。在分类的第一阶段,我们使用一系列全 272 | 新的可在$O(1)$复杂度内被计算出的特征来计算极值区域为字符的概率,并且只有具有局部 273 | 极大概率的极值区域被选中并进入第二阶段,在第二阶段我们使用一些更加耗费计算资源的 274 | 特征进行更准确地分类。实验指出,包括全新的梯度幅度投影后极值区域可以覆盖94.8\% 275 | 的字符。本算法在$800 \times 600$的图像上平均计算时间为0.3s(使用普通PC)。 276 | 277 | 本算法在两个公共数据集上进行了评估。在ICDAR 2011数据集上,该方法在所有已公开的算 278 | 法中取得了目前最好的字符定位效果(召回率64.7\%,准确率73.1\%,f-测度 68.7\%), 279 | 并且我们是在ICAD 2011 Robust Reading 比赛数据集中第一个提交端到端字符识别结果的 280 | 系统(召回率37.2\%,精度37.1\%,f-测度 36.5\%)。 281 | 282 | 在更具有挑战性的街景文字数据集上,文字定位的召回率为32.9\%。但是,我们并没有可以 283 | 进行直接比较的结果,因此也无从得知结果优劣。 284 | 285 | \end{document} -------------------------------------------------------------------------------- /thesis/XDUbibunsrt.bst: -------------------------------------------------------------------------------- 1 | % BibTeX standard bibliography style `XDUbib.bst' 2 | % Copyright (C) 2015 - 2016 Stick Cui , all rights reserved. 3 | 4 | ENTRY 5 | { address 6 | author 7 | booktitle 8 | chapter 9 | edition 10 | editor 11 | howpublished 12 | institution 13 | journal 14 | key 15 | month 16 | note 17 | number 18 | organization 19 | pages 20 | publisher 21 | school 22 | series 23 | title 24 | type 25 | volume 26 | year 27 | lang 28 | day 29 | url 30 | translator 31 | } 32 | {} 33 | { label } 34 | 35 | INTEGERS { output.state before.all mid.sentence after.sentence after.block } 36 | 37 | FUNCTION {init.state.consts} 38 | { #0 'before.all := 39 | #1 'mid.sentence := 40 | #2 'after.sentence := 41 | #3 'after.block := 42 | } 43 | 44 | STRINGS { s t } 45 | 46 | FUNCTION {output.nonnull} 47 | { 's := 48 | output.state mid.sentence = 49 | { ", " * write$ } 50 | { output.state after.block = 51 | { add.period$ write$ 52 | newline$ 53 | "\newblock " write$ 54 | } 55 | { output.state before.all = 56 | 'write$ 57 | { add.period$ " " * write$ } 58 | if$ 59 | } 60 | if$ 61 | mid.sentence 'output.state := 62 | } 63 | if$ 64 | s 65 | } 66 | 67 | FUNCTION {output} 68 | { duplicate$ empty$ 69 | 'pop$ 70 | 'output.nonnull 71 | if$ 72 | } 73 | 74 | FUNCTION {output.check} 75 | { 't := 76 | duplicate$ empty$ 77 | { pop$ "empty " t * " in " * cite$ * warning$ } 78 | 'output.nonnull 79 | if$ 80 | } 81 | 82 | FUNCTION {output.bibitem} 83 | { newline$ 84 | "\bibitem{" write$ 85 | cite$ write$ 86 | "}" write$ 87 | newline$ 88 | "" 89 | before.all 'output.state := 90 | } 91 | 92 | FUNCTION {fin.entry} 93 | { add.period$ 94 | write$ 95 | newline$ 96 | } 97 | 98 | FUNCTION {new.block} 99 | { output.state before.all = 100 | 'skip$ 101 | { after.block 'output.state := } 102 | if$ 103 | } 104 | 105 | FUNCTION {new.sentence} 106 | { output.state after.block = 107 | 'skip$ 108 | { output.state before.all = 109 | 'skip$ 110 | { after.sentence 'output.state := } 111 | if$ 112 | } 113 | if$ 114 | } 115 | 116 | FUNCTION {not} 117 | { { #0 } 118 | { #1 } 119 | if$ 120 | } 121 | 122 | FUNCTION {and} 123 | { 'skip$ 124 | { pop$ #0 } 125 | if$ 126 | } 127 | 128 | FUNCTION {or} 129 | { { pop$ #1 } 130 | 'skip$ 131 | if$ 132 | } 133 | 134 | FUNCTION {new.block.checka} 135 | { empty$ 136 | 'skip$ 137 | 'new.block 138 | if$ 139 | } 140 | 141 | FUNCTION {new.block.checkb} 142 | { empty$ 143 | swap$ empty$ 144 | and 145 | 'skip$ 146 | 'new.block 147 | if$ 148 | } 149 | 150 | FUNCTION {new.sentence.checka} 151 | { empty$ 152 | 'skip$ 153 | 'new.sentence 154 | if$ 155 | } 156 | 157 | FUNCTION {new.sentence.checkb} 158 | { empty$ 159 | swap$ empty$ 160 | and 161 | 'skip$ 162 | 'new.sentence 163 | if$ 164 | } 165 | 166 | FUNCTION {field.or.null} 167 | { duplicate$ empty$ 168 | { pop$ "" } 169 | 'skip$ 170 | if$ 171 | } 172 | 173 | FUNCTION {emphasize} 174 | { duplicate$ empty$ 175 | { pop$ "" } 176 | { "{\em " swap$ * "}" * } 177 | if$ 178 | } 179 | 180 | INTEGERS { nameptr namesleft numnames } 181 | 182 | FUNCTION {format.names} 183 | { 's := 184 | #1 'nameptr := 185 | s num.names$ 'numnames := 186 | numnames 'namesleft := 187 | { namesleft #0 > } 188 | { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't := 189 | nameptr #1 > 190 | { namesleft #1 > 191 | { ", " * t * } 192 | { numnames #2 > 193 | { "," * } 194 | 'skip$ 195 | if$ 196 | t "others" = 197 | {lang empty$ 198 | {" et~al." * } 199 | {" 等" * } 200 | if$ 201 | } 202 | {" and " * t * } 203 | if$ 204 | } 205 | if$ 206 | } 207 | 't 208 | if$ 209 | nameptr #1 + 'nameptr := 210 | namesleft #1 - 'namesleft := 211 | } 212 | while$ 213 | } 214 | 215 | FUNCTION {format.authors} 216 | { author empty$ 217 | { "" } 218 | { author format.names } 219 | if$ 220 | } 221 | 222 | FUNCTION {format.editors} 223 | { editor empty$ 224 | { "" } 225 | { editor format.names 226 | editor num.names$ #1 > 227 | { ", editors" * } 228 | { ", editor" * } 229 | if$ 230 | } 231 | if$ 232 | } 233 | 234 | FUNCTION {format.title} 235 | { title empty$ 236 | { "" } 237 | { title "t" change.case$ } 238 | if$ 239 | } 240 | 241 | FUNCTION {n.dashify} 242 | { 't := 243 | "" 244 | { t empty$ not } 245 | { t #1 #1 substring$ "-" = 246 | { t #1 #2 substring$ "--" = not 247 | { "--" * 248 | t #2 global.max$ substring$ 't := 249 | } 250 | { { t #1 #1 substring$ "-" = } 251 | { "-" * 252 | t #2 global.max$ substring$ 't := 253 | } 254 | while$ 255 | } 256 | if$ 257 | } 258 | { t #1 #1 substring$ * 259 | t #2 global.max$ substring$ 't := 260 | } 261 | if$ 262 | } 263 | while$ 264 | } 265 | 266 | FUNCTION {format.date} 267 | { year empty$ 268 | { month empty$ 269 | { "" } 270 | { "there's a month but no year in " cite$ * warning$ 271 | month 272 | } 273 | if$ 274 | } 275 | { month empty$ 276 | 'year 277 | { year ", " * month * } 278 | if$ 279 | } 280 | if$ 281 | } 282 | 283 | FUNCTION {format.btitle} 284 | { title emphasize 285 | } 286 | 287 | FUNCTION {tie.or.space.connect} 288 | { duplicate$ text.length$ #3 < 289 | { "~" } 290 | { " " } 291 | if$ 292 | swap$ * * 293 | } 294 | 295 | FUNCTION {either.or.check} 296 | { empty$ 297 | 'pop$ 298 | { "can't use both " swap$ * " fields in " * cite$ * warning$ } 299 | if$ 300 | } 301 | 302 | FUNCTION {format.bvolume} 303 | { volume empty$ 304 | { "" } 305 | { "volume" volume tie.or.space.connect 306 | series empty$ 307 | 'skip$ 308 | { " of " * series emphasize * } 309 | if$ 310 | "volume and number" number either.or.check 311 | } 312 | if$ 313 | } 314 | 315 | FUNCTION {format.number.series} 316 | { volume empty$ 317 | { number empty$ 318 | { series field.or.null } 319 | { output.state mid.sentence = 320 | { "number" } 321 | { "Number" } 322 | if$ 323 | number tie.or.space.connect 324 | series empty$ 325 | { "there's a number but no series in " cite$ * warning$ } 326 | { " in " * series * } 327 | if$ 328 | } 329 | if$ 330 | } 331 | { "" } 332 | if$ 333 | } 334 | 335 | FUNCTION {format.edition} 336 | { edition empty$ 337 | { "" } 338 | { 339 | lang empty$ 340 | { output.state mid.sentence = 341 | { edition "l" change.case$ " edition" * } 342 | { edition "t" change.case$ " edition" * } 343 | if$ 344 | } 345 | { "第" edition * "版" *} 346 | if$ 347 | } 348 | if$ 349 | } 350 | 351 | INTEGERS { multiresult } 352 | 353 | FUNCTION {multi.page.check} 354 | { 't := 355 | #0 'multiresult := 356 | { multiresult not 357 | t empty$ not 358 | and 359 | } 360 | { t #1 #1 substring$ 361 | duplicate$ "-" = 362 | swap$ duplicate$ "," = 363 | swap$ "+" = 364 | or or 365 | { #1 'multiresult := } 366 | { t #2 global.max$ substring$ 't := } 367 | if$ 368 | } 369 | while$ 370 | multiresult 371 | } 372 | 373 | FUNCTION {format.pages} 374 | { pages empty$ 375 | { "" } 376 | { pages multi.page.check 377 | { "pages" pages n.dashify tie.or.space.connect } 378 | { "page" pages tie.or.space.connect } 379 | if$ 380 | } 381 | if$ 382 | } 383 | 384 | FUNCTION {format.vol.num.pages} 385 | { volume field.or.null 386 | number empty$ 387 | 'skip$ 388 | { "(" number * ")" * * 389 | volume empty$ 390 | { "there's a number but no volume in " cite$ * warning$ } 391 | 'skip$ 392 | if$ 393 | } 394 | if$ 395 | pages empty$ 396 | 'skip$ 397 | { duplicate$ empty$ 398 | { pop$ format.pages } 399 | { ": " * pages n.dashify * } 400 | if$ 401 | } 402 | if$ 403 | } 404 | 405 | FUNCTION {format.chapter.pages} 406 | { chapter empty$ 407 | 'format.pages 408 | { type empty$ 409 | { "chapter" } 410 | { type "l" change.case$ } 411 | if$ 412 | chapter tie.or.space.connect 413 | pages empty$ 414 | 'skip$ 415 | { ", " * format.pages * } 416 | if$ 417 | } 418 | if$ 419 | } 420 | 421 | FUNCTION {format.in.ed.booktitle} 422 | { booktitle empty$ 423 | { "" } 424 | { editor empty$ 425 | { "In " booktitle emphasize * } 426 | { "In " format.editors * ", " * booktitle emphasize * } 427 | if$ 428 | } 429 | if$ 430 | } 431 | 432 | FUNCTION {empty.misc.check} 433 | { author empty$ title empty$ howpublished empty$ 434 | month empty$ year empty$ note empty$ 435 | and and and and and 436 | key empty$ not and 437 | { "all relevant fields are empty in " cite$ * warning$ } 438 | 'skip$ 439 | if$ 440 | } 441 | 442 | FUNCTION {format.thesis.type} 443 | { type empty$ 444 | 'skip$ 445 | { pop$ 446 | type "t" change.case$ 447 | } 448 | if$ 449 | } 450 | 451 | FUNCTION {format.tr.number} 452 | { type empty$ 453 | { "Technical Report" } 454 | 'type 455 | if$ 456 | number empty$ 457 | { "t" change.case$ } 458 | { number tie.or.space.connect } 459 | if$ 460 | } 461 | 462 | FUNCTION {format.article.crossref} 463 | { key empty$ 464 | { journal empty$ 465 | { "need key or journal for " cite$ * " to crossref " * crossref * 466 | warning$ 467 | "" 468 | } 469 | { "In {\em " journal * "\/}" * } 470 | if$ 471 | } 472 | { "In " key * } 473 | if$ 474 | " \cite{" * crossref * "}" * 475 | } 476 | 477 | FUNCTION {format.crossref.editor} 478 | { editor #1 "{vv~}{ll}" format.name$ 479 | editor num.names$ duplicate$ 480 | #2 > 481 | { pop$ " et~al." * } 482 | { #2 < 483 | 'skip$ 484 | { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = 485 | { " et~al." * } 486 | { " and " * editor #2 "{vv~}{ll}" format.name$ * } 487 | if$ 488 | } 489 | if$ 490 | } 491 | if$ 492 | } 493 | 494 | FUNCTION {format.book.crossref} 495 | { volume empty$ 496 | { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ 497 | "In " 498 | } 499 | { "Volume" volume tie.or.space.connect 500 | " of " * 501 | } 502 | if$ 503 | editor empty$ 504 | editor field.or.null author field.or.null = 505 | or 506 | { key empty$ 507 | { series empty$ 508 | { "need editor, key, or series for " cite$ * " to crossref " * 509 | crossref * warning$ 510 | "" * 511 | } 512 | { "{\em " * series * "\/}" * } 513 | if$ 514 | } 515 | { key * } 516 | if$ 517 | } 518 | { format.crossref.editor * } 519 | if$ 520 | " \cite{" * crossref * "}" * 521 | } 522 | 523 | FUNCTION {format.incoll.inproc.crossref} 524 | { editor empty$ 525 | editor field.or.null author field.or.null = 526 | or 527 | { key empty$ 528 | { booktitle empty$ 529 | { "need editor, key, or booktitle for " cite$ * " to crossref " * 530 | crossref * warning$ 531 | "" 532 | } 533 | { "In {\em " booktitle * "\/}" * } 534 | if$ 535 | } 536 | { "In " key * } 537 | if$ 538 | } 539 | { "In " format.crossref.editor * } 540 | if$ 541 | " \cite{" * crossref * "}" * 542 | } 543 | 544 | 545 | FUNCTION {format.Jtitle} 546 | { title empty$ 547 | { "" } 548 | { title "" * "[{J}]" * "t" change.case$ } 549 | if$ 550 | } 551 | 552 | FUNCTION {article} 553 | { output.bibitem 554 | format.authors "author" output.check 555 | new.block 556 | lang empty$ 557 | {format.title "title" output.check} 558 | {format.Jtitle "title" output.check } 559 | if$ 560 | new.block 561 | lang empty$ 562 | { crossref missing$ 563 | { journal emphasize "journal" output.check 564 | format.date "year" output.check 565 | format.vol.num.pages output 566 | } 567 | { format.article.crossref output.nonnull 568 | format.pages output 569 | } 570 | if$ } 571 | { crossref missing$ 572 | { journal "journal" output.check 573 | format.date "year" output.check 574 | format.vol.num.pages output 575 | } 576 | { format.article.crossref output.nonnull 577 | format.pages output 578 | } 579 | if$} 580 | if$ 581 | new.block 582 | note output 583 | fin.entry 584 | } 585 | 586 | FUNCTION {format.Mbtitle} 587 | { title "" * "[{M}]" * 588 | } 589 | 590 | FUNCTION {format.address} 591 | { 592 | address empty$ 593 | {""} 594 | {address "" * ":" *} 595 | if$ 596 | } 597 | 598 | FUNCTION {format.address.publisher} 599 | { 600 | publisher empty$ 601 | {format.address} 602 | {format.address " " * publisher *} 603 | if$ 604 | } 605 | 606 | FUNCTION {book} 607 | { output.bibitem 608 | author empty$ 609 | { format.editors "author and editor" output.check } 610 | { format.authors output.nonnull 611 | crossref missing$ 612 | { "author and editor" editor either.or.check } 613 | 'skip$ 614 | if$ 615 | } 616 | if$ 617 | new.block 618 | lang empty$ 619 | {format.btitle "title" output.check} 620 | {format.Mbtitle "title" output.check} 621 | if$ 622 | new.block 623 | format.edition output 624 | crossref missing$ 625 | { format.bvolume output 626 | new.block 627 | format.number.series output 628 | new.sentence 629 | format.address.publisher output 630 | } 631 | { new.block 632 | format.book.crossref output.nonnull 633 | } 634 | if$ 635 | format.date "year" output.check 636 | new.block 637 | note output 638 | fin.entry 639 | } 640 | 641 | FUNCTION {booklet} 642 | { output.bibitem 643 | format.authors output 644 | new.block 645 | format.title "title" output.check 646 | howpublished address new.block.checkb 647 | howpublished output 648 | address output 649 | format.date output 650 | new.block 651 | note output 652 | fin.entry 653 | } 654 | 655 | FUNCTION {format.Cpages} 656 | {pages empty$ 657 | {""} 658 | {": " pages n.dashify *} 659 | if$ 660 | } 661 | 662 | FUNCTION {format.date.pages} 663 | { pages empty$ 664 | { format.date } 665 | { format.date format.Cpages * } 666 | if$ 667 | } 668 | 669 | FUNCTION {inbook} 670 | { output.bibitem 671 | author empty$ 672 | { format.editors "author and editor" output.check } 673 | { format.authors output.nonnull 674 | crossref missing$ 675 | { "author and editor" editor either.or.check } 676 | 'skip$ 677 | if$ 678 | } 679 | if$ 680 | new.block 681 | lang empty$ 682 | { format.btitle "title" output.check } 683 | { format.Mbtitle "title" output.check } 684 | if$ 685 | new.block 686 | format.edition output 687 | crossref missing$ 688 | { new.block 689 | format.number.series output 690 | new.sentence 691 | format.address.publisher output 692 | format.bvolume output 693 | } 694 | { 695 | new.block 696 | format.book.crossref output.nonnull 697 | } 698 | if$ 699 | format.date.pages output 700 | new.block 701 | note output 702 | fin.entry 703 | } 704 | 705 | FUNCTION {format.iCtitle} 706 | { title "" * "[{A}]" * 707 | } 708 | 709 | FUNCTION {format.ed.booktitle} 710 | { booktitle empty$ 711 | { "" } 712 | { editor empty$ 713 | { booktitle } 714 | { editor format.names ". " * booktitle * "[{C}]" * } 715 | if$ 716 | } 717 | if$ 718 | } 719 | 720 | FUNCTION {incollection} 721 | { output.bibitem 722 | format.authors "author" output.check 723 | new.block 724 | lang empty$ 725 | {format.title "title" output.check} 726 | {format.iCtitle "title" output.check} 727 | if$ 728 | new.block 729 | lang empty$ 730 | {crossref missing$ 731 | { format.in.ed.booktitle "booktitle" output.check 732 | format.bvolume output 733 | format.number.series output 734 | format.chapter.pages output 735 | new.sentence 736 | publisher "publisher" output.check 737 | address output 738 | format.edition output 739 | format.date "year" output.check 740 | } 741 | { format.incoll.inproc.crossref output.nonnull 742 | format.chapter.pages output 743 | } 744 | if$} 745 | {crossref missing$ 746 | { format.ed.booktitle "booktitle" output.check 747 | new.block 748 | format.edition output 749 | new.sentence 750 | format.address.publisher output 751 | format.bvolume output 752 | format.number.series output 753 | format.date.pages output 754 | } 755 | { format.incoll.inproc.crossref output.nonnull 756 | format.Cpages output 757 | } 758 | if$} 759 | if$ 760 | new.block 761 | note output 762 | fin.entry 763 | } 764 | 765 | FUNCTION {inproceedings} 766 | { output.bibitem 767 | format.authors "author" output.check 768 | new.block 769 | format.title "title" output.check 770 | new.block 771 | crossref missing$ 772 | { format.in.ed.booktitle "booktitle" output.check 773 | format.bvolume output 774 | format.number.series output 775 | format.pages output 776 | address empty$ 777 | { organization publisher new.sentence.checkb 778 | organization output 779 | publisher output 780 | format.date "year" output.check 781 | } 782 | { address output.nonnull 783 | format.date "year" output.check 784 | new.sentence 785 | organization output 786 | publisher output 787 | } 788 | if$ 789 | } 790 | { format.incoll.inproc.crossref output.nonnull 791 | format.pages output 792 | } 793 | if$ 794 | new.block 795 | note output 796 | fin.entry 797 | } 798 | 799 | FUNCTION {conference} { inproceedings } 800 | 801 | FUNCTION {manual} 802 | { output.bibitem 803 | author empty$ 804 | { organization empty$ 805 | 'skip$ 806 | { organization output.nonnull 807 | address output 808 | } 809 | if$ 810 | } 811 | { format.authors output.nonnull } 812 | if$ 813 | new.block 814 | format.btitle "title" output.check 815 | author empty$ 816 | { organization empty$ 817 | { address new.block.checka 818 | address output 819 | } 820 | 'skip$ 821 | if$ 822 | } 823 | { organization address new.block.checkb 824 | organization output 825 | address output 826 | } 827 | if$ 828 | format.edition output 829 | format.date output 830 | new.block 831 | note output 832 | fin.entry 833 | } 834 | 835 | FUNCTION {format.Dtitle} 836 | { title "[{D}]" * 837 | } 838 | 839 | FUNCTION {format.address.school} 840 | { address empty$ 841 | { school empty$ 842 | {""} 843 | {school} 844 | if$ 845 | } 846 | {school empty$ 847 | {address} 848 | {address ": " * school *} 849 | if$} 850 | if$ 851 | } 852 | 853 | FUNCTION {mastersthesis} 854 | { output.bibitem 855 | format.authors "author" output.check 856 | new.block 857 | format.Dtitle "title" output.check 858 | new.block 859 | format.address.school "school" output.check 860 | format.date.pages output 861 | new.block 862 | note output 863 | fin.entry 864 | } 865 | 866 | FUNCTION {misc} 867 | { output.bibitem 868 | format.authors output 869 | title howpublished new.block.checkb 870 | format.title output 871 | howpublished new.block.checka 872 | howpublished output 873 | format.date output 874 | new.block 875 | note output 876 | fin.entry 877 | empty.misc.check 878 | } 879 | 880 | FUNCTION {phdthesis} 881 | { output.bibitem 882 | format.authors "author" output.check 883 | new.block 884 | format.Dtitle "title" output.check 885 | new.block 886 | format.address.school "school" output.check 887 | format.date.pages output 888 | new.block 889 | note output 890 | fin.entry 891 | } 892 | 893 | FUNCTION {proceedings} 894 | { output.bibitem 895 | editor empty$ 896 | { organization output } 897 | { format.editors output.nonnull } 898 | if$ 899 | new.block 900 | format.btitle "title" output.check 901 | format.bvolume output 902 | format.number.series output 903 | address empty$ 904 | { editor empty$ 905 | { publisher new.sentence.checka } 906 | { organization publisher new.sentence.checkb 907 | organization output 908 | } 909 | if$ 910 | publisher output 911 | format.date "year" output.check 912 | } 913 | { address output.nonnull 914 | format.date "year" output.check 915 | new.sentence 916 | editor empty$ 917 | 'skip$ 918 | { organization output } 919 | if$ 920 | publisher output 921 | } 922 | if$ 923 | new.block 924 | note output 925 | fin.entry 926 | } 927 | 928 | FUNCTION {format.Rtitle} 929 | { title "[{R}]" * 930 | } 931 | 932 | FUNCTION {format.address.institution} 933 | { address empty$ 934 | { institution empty$ 935 | {""} 936 | {institution} 937 | if$ 938 | } 939 | {institution empty$ 940 | {address} 941 | {address ":~" * institution *} 942 | if$} 943 | if$ 944 | } 945 | 946 | FUNCTION {techreport} 947 | { output.bibitem 948 | format.authors "author" output.check 949 | new.block 950 | lang empty$ 951 | { 952 | format.title "title" output.check 953 | new.block 954 | format.tr.number output.nonnull 955 | institution "institution" output.check 956 | address output 957 | format.date "year" output.check 958 | } 959 | { 960 | format.Rtitle "title" output.check 961 | new.block 962 | format.address.institution output 963 | format.date.pages output 964 | } 965 | if$ 966 | new.block 967 | note output 968 | fin.entry 969 | } 970 | 971 | FUNCTION {unpublished} 972 | { output.bibitem 973 | format.authors "author" output.check 974 | new.block 975 | format.title "title" output.check 976 | new.block 977 | note "note" output.check 978 | format.date output 979 | fin.entry 980 | } 981 | 982 | FUNCTION {format.url} 983 | { url empty$ 984 | {"Can't get the URL"} 985 | {url} 986 | if$ 987 | } 988 | 989 | FUNCTION {format.times} 990 | { year empty$ 991 | { 992 | month empty$ 993 | { 994 | day empty$ 995 | {""} 996 | {"there's a day but no year and no month in " cite$ * warning$ 997 | day } 998 | if$ 999 | } 1000 | { 1001 | day empty$ 1002 | {"there's a month but no year in " cite$ * warning$ 1003 | month} 1004 | {"there's a month and a day but no year in " cite$ * warning$ 1005 | month "/" * day *} 1006 | if$ 1007 | } 1008 | if$ 1009 | } 1010 | { 1011 | month empty$ 1012 | { 1013 | day empty$ 1014 | 'year 1015 | {"there's a year and a day but no month in " cite$ * warning$ 1016 | year} 1017 | if$ 1018 | } 1019 | { 1020 | day empty$ 1021 | {year "/" * month *} 1022 | {year "/" * month * "/" * day *} 1023 | if$ 1024 | } 1025 | if$ 1026 | } 1027 | if$ 1028 | } 1029 | 1030 | FUNCTION {network} 1031 | { output.bibitem 1032 | format.authors "author" output.check 1033 | new.block 1034 | format.title "title" output.check 1035 | new.block 1036 | format.url output 1037 | new.block 1038 | format.times output 1039 | fin.entry 1040 | } 1041 | 1042 | FUNCTION {format.translator} 1043 | { translator empty$ 1044 | { "" } 1045 | { 1046 | lang empty$ 1047 | { translator format.names 1048 | translator num.names$ #1 > 1049 | { ", translate" * } 1050 | { ", translates" * } 1051 | if$ 1052 | } 1053 | { translator format.names 1054 | translator num.names$ #1 > 1055 | { ", 译" * } 1056 | { ", 译" * } 1057 | if$ 1058 | } 1059 | if$ 1060 | } 1061 | if$ 1062 | } 1063 | 1064 | FUNCTION {trans} 1065 | { output.bibitem 1066 | format.authors "author" output.check 1067 | new.block 1068 | format.Mbtitle "title" output.check 1069 | new.block 1070 | format.translator output 1071 | new.block 1072 | format.address.publisher output 1073 | format.date.pages output 1074 | new.block 1075 | note output 1076 | fin.entry 1077 | } 1078 | 1079 | FUNCTION {default.type} { misc } 1080 | 1081 | MACRO {jan} {"January"} 1082 | 1083 | MACRO {feb} {"February"} 1084 | 1085 | MACRO {mar} {"March"} 1086 | 1087 | MACRO {apr} {"April"} 1088 | 1089 | MACRO {may} {"May"} 1090 | 1091 | MACRO {jun} {"June"} 1092 | 1093 | MACRO {jul} {"July"} 1094 | 1095 | MACRO {aug} {"August"} 1096 | 1097 | MACRO {sep} {"September"} 1098 | 1099 | MACRO {oct} {"October"} 1100 | 1101 | MACRO {nov} {"November"} 1102 | 1103 | MACRO {dec} {"December"} 1104 | 1105 | MACRO {acmcs} {"ACM Computing Surveys"} 1106 | 1107 | MACRO {acta} {"Acta Informatica"} 1108 | 1109 | MACRO {cacm} {"Communications of the ACM"} 1110 | 1111 | MACRO {ibmjrd} {"IBM Journal of Research and Development"} 1112 | 1113 | MACRO {ibmsj} {"IBM Systems Journal"} 1114 | 1115 | MACRO {ieeese} {"IEEE Transactions on Software Engineering"} 1116 | 1117 | MACRO {ieeetc} {"IEEE Transactions on Computers"} 1118 | 1119 | MACRO {ieeetcad} 1120 | {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} 1121 | 1122 | MACRO {ipl} {"Information Processing Letters"} 1123 | 1124 | MACRO {jacm} {"Journal of the ACM"} 1125 | 1126 | MACRO {jcss} {"Journal of Computer and System Sciences"} 1127 | 1128 | MACRO {scp} {"Science of Computer Programming"} 1129 | 1130 | MACRO {sicomp} {"SIAM Journal on Computing"} 1131 | 1132 | MACRO {tocs} {"ACM Transactions on Computer Systems"} 1133 | 1134 | MACRO {tods} {"ACM Transactions on Database Systems"} 1135 | 1136 | MACRO {tog} {"ACM Transactions on Graphics"} 1137 | 1138 | MACRO {toms} {"ACM Transactions on Mathematical Software"} 1139 | 1140 | MACRO {toois} {"ACM Transactions on Office Information Systems"} 1141 | 1142 | MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} 1143 | 1144 | MACRO {tcs} {"Theoretical Computer Science"} 1145 | 1146 | READ 1147 | 1148 | STRINGS { longest.label } 1149 | 1150 | INTEGERS { number.label longest.label.width } 1151 | 1152 | FUNCTION {initialize.longest.label} 1153 | { "" 'longest.label := 1154 | #1 'number.label := 1155 | #0 'longest.label.width := 1156 | } 1157 | 1158 | FUNCTION {longest.label.pass} 1159 | { number.label int.to.str$ 'label := 1160 | number.label #1 + 'number.label := 1161 | label width$ longest.label.width > 1162 | { label 'longest.label := 1163 | label width$ 'longest.label.width := 1164 | } 1165 | 'skip$ 1166 | if$ 1167 | } 1168 | 1169 | EXECUTE {initialize.longest.label} 1170 | 1171 | ITERATE {longest.label.pass} 1172 | 1173 | FUNCTION {begin.bib} 1174 | { preamble$ empty$ 1175 | 'skip$ 1176 | { preamble$ write$ newline$ } 1177 | if$ 1178 | "\begin{thebibliography}{" longest.label * "}" * write$ newline$ 1179 | } 1180 | 1181 | EXECUTE {begin.bib} 1182 | 1183 | EXECUTE {init.state.consts} 1184 | 1185 | ITERATE {call.type$} 1186 | 1187 | FUNCTION {end.bib} 1188 | { newline$ 1189 | "\end{thebibliography}" write$ newline$ 1190 | } 1191 | 1192 | EXECUTE {end.bib} 1193 | -------------------------------------------------------------------------------- /thesis/XDUtheme/logo_xdblue.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/XDUtheme/logo_xdblue.pdf -------------------------------------------------------------------------------- /thesis/XDUtheme/logo_xdred.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/XDUtheme/logo_xdred.pdf -------------------------------------------------------------------------------- /thesis/XDUtheme/waves.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/XDUtheme/waves.pdf -------------------------------------------------------------------------------- /thesis/XDUthesis.cfg: -------------------------------------------------------------------------------- 1 | %% 2 | %% This is file `XDUthesis.cfg', 3 | %% generated with the docstrip utility. 4 | %% 5 | %% The original source files were: 6 | %% 7 | %% XDUthesis.dtx (with options: `cfg') 8 | %% 9 | %% This is a generated file. 10 | %% 11 | %% Copyright (C) 2015-2016 by Stick Cui 12 | %% 13 | %% This file may be distributed and/or modified under the 14 | %% conditions of the LaTeX Project Public License, either version 1.3c 15 | %% of this license or (at your option) any later version. 16 | %% The latest version of this license is in: 17 | %% 18 | %% http://www.latex-project.org/lppl.txt 19 | %% 20 | %% and version 1.3c or later is part of all distributions of LaTeX 21 | %% version 2008/05/04 or later. 22 | %% 23 | %% This is the configuration file of the XDUthesis package with LaTeX2e. 24 | %% 25 | \ProvidesFile{XDUthesis.cfg} 26 | [2016/05/18 0.1.6 Xidian University Thesis Template] 27 | %% 摘要 28 | \abstractname{摘要} 29 | \enabstractname{Abstract} 30 | \newcommand{\XDU@keywordsname}{关键词} 31 | \newcommand{\XDU@enkeywordsname}{Key words} 32 | %% 关键词分隔符 33 | \def\XDU@keywords@separator{\quad } 34 | \def\XDU@enkeywords@separator{\quad } 35 | %% 致谢一章的标题名 36 | \thanksforname{致谢} 37 | %% 代码标题 38 | \renewcommand\lstlistingname{代码} 39 | 40 | %% 代码高亮颜色:如有需要修改rgb值即可 41 | %% rgb = 0.7,0.2,0.2 西电视觉识别系统规定的红色 42 | %% rgb = 0,0.25,0.51 西电视觉识别系统规定的蓝色 43 | \definecolor{XDU@keywordcolor}{rgb}{0.7,0.2,0.2}%% 关键词颜色 44 | \definecolor{XDU@stringcolor}{rgb}{0.84,0.62,0.52}%% 字符串颜色,仿Visual Studio默认配色 45 | \definecolor{XDU@commentcolor}{rgb}{0.15,0.55,0.15}%% 注释的颜色,仿Visual Studio默认配色 46 | %% 代码字体:这个字体族看着舒服,目前还不知道是否符合,论文规范 47 | \def\XDU@codebasicfont{\fontfamily{pcr}\selectfont} 48 | 49 | %% 以下内容勿动 50 | \subject{本科毕业设计论文} 51 | \newcommand{\XDU@classname}{班\quad 级} 52 | \newcommand{\XDU@schoolnumbername}{学\quad 号} 53 | \newcommand{\XDU@titlename}{题\qquad 目} 54 | \newcommand{\XDU@schoolname}{学\qquad 院} 55 | \newcommand{\XDU@majorname}{专\qquad 业} 56 | \newcommand{\XDU@authorname}{学生姓名} 57 | \newcommand{\XDU@supervisorname}{导师姓名} 58 | \newcommand{\XDU@declarename}{毕业设计(论文)诚信声明书} 59 | \newcommand{\XDU@declaretext}{本人声明:本人所提交的毕业论文《\CJKunderline{\XDU@title}》是本人在指导教师指导下独立研究、写作成果,论文中所引用他人的无论以何种方式发布的文字、研究成果,均在论文中加以说明; 60 | 有关教师、同学和其他人员对本文本的写作、修订提出过并为我在论文中加以采纳的意见、建议,均已在我的致谢辞中加以说明并深致谢意。\par 61 | 本文和资料若有不实之处,本人承担一切相关责任。} 62 | 63 | \newcommand{\XDU@authornametitle}{论文作者:} 64 | \newcommand{\XDU@signedname}{(签字)} 65 | \newcommand{\XDU@timename}{时间:} 66 | \newcommand{\XDU@supervisorhasread}{指导教师已阅:} 67 | %% 68 | %% 定理类声明:来自清华大学LaTeX模板 69 | \theoremsymbol{\ensuremath{\square}} 70 | \newtheorem*{proof}{证明} 71 | \theoremstyle{plain} 72 | \theoremsymbol{} 73 | \theoremseparator{:} 74 | \newtheorem{assumption}{假设}[chapter] 75 | \newtheorem{definition}{定义}[chapter] 76 | \newtheorem{proposition}{命题}[chapter] 77 | \newtheorem{lemma}{引理}[chapter] 78 | \newtheorem{theorem}{定理}[chapter] 79 | \newtheorem{axiom}{公理}[chapter] 80 | \newtheorem{corollary}{推论}[chapter] 81 | \newtheorem{exercise}{练习}[chapter] 82 | \newtheorem{example}{例}[chapter] 83 | \newtheorem{remark}{注释}[chapter] 84 | \newtheorem{problem}{问题}[chapter] 85 | \newtheorem{conjecture}{猜想}[chapter] 86 | 87 | %% 字体项,除非是正文字体不是规定的宋体,一般以下项目不需要 88 | %% \setCJKmainfont[BoldFont={STZhongsong},ItalicFont={KaiTi}]{SimSun} 89 | %% \setCJKsansfont{SimHei} 90 | %% \setCJKmonofont{FangSong} 91 | %% \setmainfont{Times New Roman} 92 | %% \setsansfont{Arial} 93 | %% \setmonofont{Courier New} 94 | %% 95 | %% 以下项目均为ctex默认设置,如无特殊需要,无须修改 96 | %% \ctexset{ 97 | %% contentsname = {目录}, 98 | %% listfigurename = {插图},%插图目录 99 | %% listtablename = {表格},%表格目录 100 | %% figurename = {图}, 101 | %% tablename = {表}, 102 | %% indexname = {索引}, 103 | %% appendixname = {附录}, 104 | %% bibname = {参考文献} 105 | %% } 106 | \endinput 107 | %% 108 | %% End of file `XDUthesis.cfg'. 109 | -------------------------------------------------------------------------------- /thesis/XDUthesis.cls: -------------------------------------------------------------------------------- 1 | %% 2 | %% This is file `XDUthesis.cls', 3 | %% generated with the docstrip utility. 4 | %% 5 | %% The original source files were: 6 | %% 7 | %% XDUthesis.dtx (with options: `cls') 8 | %% 9 | %% This is a generated file. 10 | %% 11 | %% Copyright (C) 2015-2016 by Stick Cui 12 | %% 13 | %% This file may be distributed and/or modified under the 14 | %% conditions of the LaTeX Project Public License, either version 1.3c 15 | %% of this license or (at your option) any later version. 16 | %% The latest version of this license is in: 17 | %% 18 | %% http://www.latex-project.org/lppl.txt 19 | %% 20 | %% and version 1.3c or later is part of all distributions of LaTeX 21 | %% version 2008/05/04 or later. 22 | %% 23 | %% To produce the documentation run the original source files ending with `.dtx' 24 | %% through LaTeX. 25 | %% 26 | \NeedsTeXFormat{LaTeX2e}[1999/12/01] 27 | \ProvidesClass{XDUthesis} 28 | [2016/05/18 0.1.6 Xidian University Thesis Template] 29 | \hyphenation{XDU-Thesis} 30 | \def\XDUthesis{X\kern -.1667em\lower .5ex\hbox {D}\kern -.125emU\textit{thesis}{}} 31 | \def\version{0.1.6} 32 | 33 | \newif\if@nologo \@nologofalse %默认使用校徽Logo 34 | \newif\if@Fandol \@Fandolfalse %默认为Windows系统,使用华文中宋作为中易宋体的粗体,否则全部使用Fandol字体族 35 | \newif\if@WordOneHalf \@WordOneHalffalse % 默认为LaTeX下的1.5倍行距 36 | 37 | \DeclareOption{nologo}{\@nologotrue} 38 | \DeclareOption{Fandol}{\@Fandoltrue} 39 | \DeclareOption{WordOneHalf}{\@WordOneHalftrue} 40 | \ProcessOptions\relax 41 | 42 | \RequirePackage{ifthen} 43 | \if@Fandol 44 | \LoadClass[cs4size,a4paper,UTF8,fontset=Fandol]{ctexbook}[2015/05/16] 45 | \setmainfont{Times New Roman} 46 | \else 47 | \LoadClass[cs4size,a4paper,UTF8]{ctexbook}[2015/05/16] 48 | \setCJKmainfont[BoldFont={STZhongsong},ItalicFont={KaiTi}]{SimSun} 49 | \setCJKsansfont{SimHei} 50 | \setCJKmonofont{FangSong} 51 | \setmainfont{Times New Roman} 52 | \setsansfont{Arial} 53 | \setmonofont{Courier New} 54 | \fi 55 | \RequirePackage{ifxetex} 56 | \RequirePackage{xcolor} 57 | \RequirePackage[T1]{fontenc} 58 | \RequirePackage{amsmath,amssymb} 59 | \RequirePackage{graphicx} 60 | \RequirePackage[amsmath,thmmarks,hyperref]{ntheorem} 61 | \RequirePackage[numbers,super,square,sort&compress]{natbib} 62 | \RequirePackage[toc,page,title,titletoc,header]{appendix} 63 | \RequirePackage{listings} 64 | \RequirePackage{CJKfntef} 65 | \RequirePackage{longtable,multirow,hhline,tabularx,array, 66 | makecell,diagbox,colortbl,booktabs} 67 | \RequirePackage[labelsep=quad]{caption}[2011/11/10] 68 | \RequirePackage[labelformat=simple,skip=10pt]{subcaption} 69 | \newcommand{\PreserveBackslash}[1]{\let\temp=\\#1\let\\=\temp} 70 | \newcolumntype{C}[1]{>{\PreserveBackslash\centering}p{#1}} 71 | \newcolumntype{R}[1]{>{\PreserveBackslash\raggedleft}p{#1}} 72 | \newcolumntype{L}[1]{>{\PreserveBackslash\raggedright}p{#1}} 73 | \RequirePackage[bookmarks=true, 74 | linkcolor=black, 75 | citecolor=black, 76 | unicode=true, 77 | colorlinks=true, 78 | pdfborder=001, 79 | linkcolor=black, 80 | citecolor=black, 81 | urlcolor=black, 82 | bookmarksnumbered=true 83 | ]{hyperref} 84 | \RequirePackage[a4paper,left=4cm,right=2cm, 85 | top=3cm,bottom=2cm]{geometry} 86 | \RequirePackage{setspace} 87 | \if@WordOneHalf 88 | \setstretch{1.62}%设置Word下的行距1.5倍 89 | \else 90 | \setstretch{1.5}%设置行距1.5倍 91 | \fi 92 | \RequirePackage{fancyhdr} 93 | \setlength{\headheight}{15pt} 94 | \fancypagestyle{plain}{%为了章首页 95 | \fancyhf{} 96 | \fancyhead[OC]{\zihao{5}\songti\leftmark} %奇数页,章标题 97 | \fancyhead[OR]{\zihao{-5}\thepage} 98 | \fancyhead[EC]{\zihao{5}\songti\XDU@title} %论文题目 99 | \fancyhead[EL]{\zihao{-5}\thepage} 100 | \renewcommand\headrulewidth{0.75pt} 101 | \renewcommand{\footrulewidth}{0pt}} 102 | 103 | \fancypagestyle{myheadings}{%为了摘要 104 | \fancyhf{} 105 | \fancyhead[C]{\zihao{5}\songti\XDU@abstractname} 106 | \renewcommand{\headrulewidth}{0.75pt} 107 | \renewcommand{\footrulewidth}{0pt}} 108 | \fancypagestyle{headings}{%为了abstract 109 | \fancyhf{} 110 | \fancyhead[C]{\zihao{5}\songti\XDU@enabstractname} 111 | \renewcommand{\headrulewidth}{0.75pt} 112 | \renewcommand{\footrulewidth}{0pt}} 113 | 114 | \def\ps@XDU@mulu{% 115 | \let\@oddhead\@empty% 116 | \let\@evenhead\@empty% 117 | \let\@oddfoot\@empty% 118 | \let\@evenfoot\@empty} 119 | 120 | \fancypagestyle{XDU@mulu}{%为了目录 121 | \fancyhf{} 122 | \fancyhead[OC]{\zihao{5}\songti\leftmark} 123 | \fancyhead[OR]{\zihao{-5}\thepage} 124 | \fancyhead[EC]{\zihao{5}\songti\leftmark} 125 | \fancyhead[EL]{\zihao{-5}\thepage} 126 | \renewcommand{\headrulewidth}{0.75pt} 127 | \renewcommand{\footrulewidth}{0pt}} 128 | 129 | \renewcommand\frontmatter{% 130 | \if@openright\cleardoublepage\else\clearpage\fi 131 | \@mainmatterfalse 132 | \pagenumbering{Roman} 133 | \pagestyle{XDU@mulu}} 134 | 135 | \def\ps@XDU@main{% 136 | \let\@oddhead\@empty% 137 | \let\@evenhead\@empty% 138 | \let\@oddfoot\@empty% 139 | \let\@evenfoot\@empty} 140 | 141 | \fancypagestyle{XDU@main}{%为了主体 142 | \fancyhf{} 143 | \fancyhead[OC]{\zihao{5}\songti\leftmark} %奇数页,章标题 144 | \fancyhead[OR]{\zihao{-5}\thepage} 145 | \fancyhead[EC]{\zihao{5}\songti\XDU@title} %论文题目 146 | \fancyhead[EL]{\zihao{-5}\thepage} 147 | \renewcommand\headrulewidth{0.75pt}} 148 | 149 | \renewcommand\mainmatter{% 150 | \if@openright\cleardoublepage\else\clearpage\fi 151 | \@mainmattertrue 152 | \pagenumbering{arabic} 153 | \pagestyle{XDU@main}} 154 | \newcommand\comtinuematter{% 155 | \if@openright\cleardoublepage\else\clearpage\fi 156 | \@mainmattertrue} 157 | 158 | 159 | \RequirePackage{blindtext} 160 | \@newctr{footnote}[page] 161 | \@newctr{mpfootnote}[page] 162 | 163 | \RequirePackage{pifont} 164 | \renewcommand\thefootnote{\ding{\numexpr171+\value{footnote}}} 165 | \renewcommand\thempfootnote{\ding{\numexpr171+\value{mpfootnote}}} 166 | \ctexset{ 167 | chapter/beforeskip = {20pt}, 168 | chapter/format = {\zihao{3}\heiti\centering},%修正章节标题错误加粗问题 169 | section/format = {\zihao{4}\songti\centering}, 170 | subsection/format = {\zihao{-4}\songti} 171 | } 172 | \RequirePackage{titletoc} 173 | \titlecontents{chapter}[0pt]{\bfseries}% 174 | {\thecontentslabel}% 175 | {\hspace*{0pt}}% 176 | {\titlerule*[3bp]{\timesbd{.}}\timesbd{\contentspage}} 177 | \titlecontents{section}[2em]{} 178 | {\contentspush{\thecontentslabel\ }} 179 | {\hspace*{0pt}}% 180 | {\titlerule*[3bp]{.}\contentspage} 181 | \titlecontents{subsection}[4em]{} 182 | {\contentspush{\thecontentslabel\ }} 183 | {\hspace*{0pt}}% 184 | {\titlerule*[3bp]{.}\contentspage} 185 | 186 | \renewcommand\theequation{\ifnum \c@chapter>\z@ 187 | \thechapter-\fi\@arabic\c@equation} 188 | \renewcommand{\thesubfigure}{(\alph{subfigure})} 189 | \renewcommand{\thesubtable}{(\alph{subtable})} 190 | \captionsetup{font={small}}%设置图表标题五号字 191 | \renewcommand{\bibfont}{\small}%设置参考文献字体为五号字 192 | 193 | \DeclareRobustCommand\onlinecite{\@onlinecite} 194 | \def\@onlinecite#1{\begingroup\let\@cite\NAT@citenum\citep{#1}\endgroup} 195 | 196 | \theorembodyfont{\rmfamily\songti} 197 | \theoremheaderfont{\rmfamily\heiti} 198 | \def\XDU@define@term#1{ 199 | \expandafter\gdef\csname #1\endcsname##1{% 200 | \expandafter\gdef\csname XDU@#1\endcsname{##1}} 201 | \csname #1\endcsname{}} 202 | \XDU@define@term{title} 203 | \XDU@define@term{author} 204 | \XDU@define@term{septitleA} 205 | \XDU@define@term{septitleB} 206 | \XDU@define@term{schoolnumber} 207 | \XDU@define@term{school} 208 | \XDU@define@term{major} 209 | \XDU@define@term{class} 210 | \XDU@define@term{supervisor} 211 | \XDU@define@term{thanksforname} 212 | \XDU@define@term{subject} 213 | \XDU@define@term{abstractname} 214 | \XDU@define@term{enabstractname} 215 | \def\XDU@parse@keywords#1{ 216 | \expandafter\gdef\csname XDU@#1\endcsname{} 217 | \expandafter\gdef\csname #1\endcsname##1{ 218 | \@for\reserved@a:=##1\do{ 219 | \expandafter\ifx\csname XDU@#1\endcsname\@empty\else 220 | \expandafter\g@addto@macro\csname XDU@#1\endcsname{ 221 | \ignorespaces\csname XDU@#1@separator\endcsname} 222 | \fi 223 | \expandafter\expandafter\expandafter\g@addto@macro% 224 | \expandafter\csname XDU@#1\expandafter 225 | \endcsname\expandafter{\reserved@a}}}} 226 | \XDU@parse@keywords{keywords} 227 | \XDU@parse@keywords{enkeywords} 228 | \newcommand{\chaptersize}[1][\zihao{3}]{#1} 229 | 230 | \long\@xp\def\@xp\collect@@body\@xp#\@xp1\@xp\end\@xp#\@xp2\@xp{% 231 | \collect@@body{#1}\end{#2}} 232 | \long\@xp\def\@xp\push@begins\@xp#\@xp1\@xp\begin\@xp#\@xp2\@xp{% 233 | \push@begins{#1}\begin{#2}} 234 | \long\@xp\def\@xp\addto@envbody\@xp#\@xp1\@xp{% 235 | \addto@envbody{#1}} 236 | \newcommand{\XDU@@cabstract}[1]{\long\gdef\XDU@cabstract{#1}} 237 | \newenvironment{abstract}{\collect@body\XDU@@cabstract}{} 238 | 239 | \newcommand{\XDU@@eabstract}[1]{\long\gdef\XDU@eabstract{#1}} 240 | \newenvironment{enabstract}{\collect@body\XDU@@eabstract}{} 241 | 242 | \newfontfamily\enheiti{SimHei} % 新加字体族,用于修正封面页标题英文字体非黑体问题,感谢lanthree 同学 243 | \newfontfamily\timesbd{Times New Roman Bold} % 新加字体族,用于修正中文摘要关键词中,英文关键词未加粗问题,感谢lanthree 同学 244 | \def\make@abstract{% 245 | \cleardoublepage% 246 | \pagenumbering{roman} 247 | \pagestyle{myheadings} 248 | \phantomsection 249 | \vspace*{2em} 250 | \centerline{\heiti\chaptersize\XDU@abstractname}\vskip5pt\par% 251 | \vspace*{2em} 252 | \XDU@cabstract% 253 | \par\vspace*{2em}\noindent{\heiti\zihao{-4}\timesbd{\XDU@keywordsname:\XDU@keywords}}% 254 | \vspace*{1em}% 255 | \cleardoublepage% 256 | \pagestyle{headings} 257 | \phantomsection 258 | \vspace*{2em} 259 | \centerline{\timesbd{\chaptersize\XDU@enabstractname}}\vskip5pt\par% 260 | \vspace*{2em} 261 | \XDU@eabstract% 262 | \par\vspace*{2em}\noindent{\timesbd\zihao{-4} 263 | \XDU@enkeywordsname:~\XDU@enkeywords}% 264 | \vspace*{1em}% 265 | \cleardoublepage 266 | } 267 | \def\maketitle{ 268 | \begin{titlepage} 269 | \begin{flushright} 270 | \begin{tabular}{c L{2cm}} 271 | \textbf{\zihao{-4}\XDU@classname} & \uline{~\timesbd{\zihao{-4}\XDU@class}\quad~}\\ 272 | \textbf{\zihao{-4}\XDU@schoolnumbername} & \uline{~\timesbd{\zihao{-4}\XDU@schoolnumber}\quad~}\\ 273 | \end{tabular} 274 | \end{flushright} 275 | \if@WordOneHalf 276 | \if@nologo 277 | \vspace*{4cm} 278 | 279 | \vspace*{2em} 280 | 281 | \vspace*{1cm} 282 | 283 | \vspace*{3em} 284 | 285 | \vspace*{1cm} 286 | \else 287 | \centering\includegraphics[width=0.5\textwidth]{./Figure/xidian.pdf} 288 | 289 | \vspace*{2em} 290 | 291 | \begin{center} 292 | {\centering\heiti{\zihao{0}\XDU@subject}} 293 | \end{center} 294 | 295 | \vspace*{3em} 296 | 297 | \begin{center} 298 | \includegraphics[width=0.25\textwidth]{./Figure/logo.pdf} 299 | \end{center} 300 | \fi 301 | \else 302 | \if@nologo 303 | \vspace*{4cm} 304 | 305 | \vspace*{4em} 306 | 307 | \vspace*{1cm} 308 | 309 | \vspace*{5em} 310 | 311 | \vspace*{1cm} 312 | \else 313 | \centering\includegraphics[width=0.5\textwidth]{./Figure/xidian.pdf} 314 | 315 | \vspace*{4em} 316 | 317 | \begin{center} 318 | {\centering\heiti{\zihao{0}\XDU@subject}} 319 | \end{center} 320 | 321 | \vspace*{5em} 322 | 323 | \begin{center} 324 | \includegraphics[width=0.25\textwidth]{./Figure/logo.pdf} 325 | \end{center} 326 | \fi 327 | \fi 328 | 329 | \vspace*{4em} 330 | 331 | \begin{center} 332 | \begin{tabular}{c C{6.5cm}} 333 | \textbf{\zihao{3}\XDU@titlename} & {\heiti\enheiti\zihao{3}\XDU@septitleA}\\ 334 | \cline{2-2} 335 | & \\ 336 | & {\heiti\enheiti\zihao{3}\XDU@septitleB}\\ 337 | \cline{2-2} 338 | & \\ 339 | \textbf{\zihao{3}\XDU@schoolname} & {\zihao{-3}\XDU@school}\\ 340 | \cline{2-2} 341 | & \\ 342 | \textbf{\zihao{3}\XDU@majorname} & {\zihao{-3}\XDU@major}\\ 343 | \cline{2-2} 344 | &\\ 345 | \textbf{\zihao{3}\XDU@authorname} & {\zihao{-3}\XDU@author}\\ 346 | \cline{2-2} 347 | &\\ 348 | \textbf{\zihao{3}\XDU@supervisorname} & {\zihao{-3}\XDU@supervisor}\\ 349 | \cline{2-2} 350 | \cline{2-2} 351 | \end{tabular} 352 | \end{center} 353 | 354 | \end{titlepage} 355 | 356 | \pagestyle{empty} 357 | \cleardoublepage 358 | 359 | \begin{center} 360 | {\textbf{\zihao{1}\XDU@declarename}} 361 | \end{center} 362 | 363 | \vspace*{3em} 364 | 365 | {\songti{\zihao{4}\XDU@declaretext}} 366 | 367 | \vspace*{8em} 368 | 369 | {\songti\zihao{4}\XDU@authornametitle\CJKunderline{\phantom{\qquad\qquad\qquad\quad}}\XDU@signedname\quad\XDU@timename\@date 370 | 371 | \XDU@supervisorhasread\CJKunderline{\phantom{\qquad\qquad\quad}}\XDU@signedname\quad\XDU@timename\@date} 372 | 373 | \make@abstract% 374 | 375 | \frontmatter 376 | \tableofcontents% 377 | \mainmatter 378 | } 379 | \ifxetex 380 | \lstset{ 381 | showstringspaces=false, 382 | showspaces=false, 383 | tabsize=4, 384 | frame=lines, 385 | basicstyle = \XDU@codebasicfont, 386 | keywordstyle = \color{XDU@keywordcolor}\bfseries, 387 | stringstyle = \color{XDU@stringcolor}\ttfamily, 388 | commentstyle = \color{XDU@commentcolor}\rmfamily\itshape, 389 | identifierstyle=, 390 | columns = flexible, 391 | numbers = left, 392 | numberstyle = \footnotesize 393 | } 394 | \else 395 | \lstset{ 396 | showstringspaces=false, 397 | showspaces=false, 398 | tabsize=4, 399 | frame=lines, 400 | basicstyle = \XDU@codebasicfont, 401 | keywordstyle = \color{XDU@keywordcolor}\bfseries, 402 | stringstyle = \color{XDU@stringcolor}\ttfamily, 403 | commentstyle = \color{XDU@commentcolor}\rmfamily\itshape, 404 | identifierstyle=, 405 | columns = flexible, 406 | numbers = left, 407 | numberstyle = \footnotesize, 408 | extendedchars = false, 409 | escapechar = ` 410 | } 411 | \fi 412 | \ifxetex 413 | \lstdefinestyle{nonumbers} 414 | { 415 | showstringspaces=false, 416 | showspaces=false, 417 | tabsize=4, 418 | frame=lines, 419 | basicstyle = \XDU@codebasicfont, 420 | keywordstyle = \color{XDU@keywordcolor}\bfseries, 421 | stringstyle = \color{XDU@stringcolor}\ttfamily, 422 | commentstyle = \color{XDU@commentcolor}\rmfamily\itshape, 423 | identifierstyle=, 424 | columns = flexible, 425 | numbers = none, 426 | numberstyle = \footnotesize 427 | } 428 | \else 429 | \lstdefinestyle{nonumbers} 430 | { 431 | showstringspaces=false, 432 | showspaces=false, 433 | tabsize=4, 434 | frame=lines, 435 | basicstyle = \XDU@codebasicfont, 436 | keywordstyle = \color{XDU@keywordcolor}\bfseries, 437 | stringstyle = \color{XDU@stringcolor}\ttfamily, 438 | commentstyle = \color{XDU@commentcolor}\rmfamily\itshape, 439 | identifierstyle=, 440 | columns = flexible, 441 | numbers = none, 442 | numberstyle = \footnotesize, 443 | extendedchars = false, 444 | escapechar = ` 445 | } 446 | \fi 447 | \newenvironment{thanksfor}{\backmatter 448 | \chapter{\XDU@thanksforname}}{\comtinuematter} 449 | \def\XDU@setpdf@keywords{ 450 | \hypersetup{ 451 | pdfkeywords={\XDU@keywords} 452 | } 453 | } 454 | \AtBeginDocument{ 455 | \hypersetup{ 456 | pdftitle={\XDU@title}, 457 | pdfauthor={\XDU@author},% 458 | pdfsubject={\XDU@subject}, 459 | pdfcreator={\XDU@author}, 460 | pdfproducer={XDUthesis} 461 | } 462 | } 463 | \AtEndOfClass{\input{XDUthesis.cfg}} 464 | \endinput 465 | %% 466 | %% End of file `XDUthesis.cls'. 467 | -------------------------------------------------------------------------------- /thesis/auto/DeepPR.el: -------------------------------------------------------------------------------- 1 | (TeX-add-style-hook 2 | "DeepPR" 3 | (lambda () 4 | (TeX-add-to-alist 'LaTeX-provided-class-options 5 | '(("XDUthesis" "WordOneHalf"))) 6 | (TeX-add-to-alist 'LaTeX-provided-package-options 7 | '(("natbib" "numbers" "sort&compress"))) 8 | (add-to-list 'LaTeX-verbatim-environments-local "lstlisting") 9 | (add-to-list 'LaTeX-verbatim-macros-with-braces-local "lstinline") 10 | (add-to-list 'LaTeX-verbatim-macros-with-braces-local "path") 11 | (add-to-list 'LaTeX-verbatim-macros-with-braces-local "url") 12 | (add-to-list 'LaTeX-verbatim-macros-with-braces-local "nolinkurl") 13 | (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperbaseurl") 14 | (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperimage") 15 | (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperref") 16 | (add-to-list 'LaTeX-verbatim-macros-with-delims-local "lstinline") 17 | (add-to-list 'LaTeX-verbatim-macros-with-delims-local "path") 18 | (TeX-run-style-hooks 19 | "latex2e" 20 | "ThesisFiles/Abstract" 21 | "ThesisFiles/Chapters" 22 | "ThesisFiles/Thanks" 23 | "ThesisFiles/Appendix" 24 | "XDUthesis" 25 | "XDUthesis10" 26 | "natbib") 27 | (LaTeX-add-bibliographies 28 | "ThesisFiles/RefFile")) 29 | :latex) 30 | 31 | -------------------------------------------------------------------------------- /thesis/beamercolorthemeXDUstyle.sty: -------------------------------------------------------------------------------- 1 | 2 | \NeedsTeXFormat{LaTeX2e} 3 | \ProvidesPackage{beamercolorthemeXDUstyle}[2015/12/27 v0.0.1 The XDUstyle Beamer Theme] 4 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5 | % Theme options and definitions 6 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7 | %%%theme options 8 | \DeclareOptionBeamer{xdred}{\def\beamer@xducolor{xdred}}%缺省默认 9 | \DeclareOptionBeamer{xdblue}{\def\beamer@xducolor{xdblue}} 10 | \DeclareOptionBeamer{sidebar}{\def\beamer@xdusidebar{true}}%缺省无 11 | \ProcessOptionsBeamer 12 | 13 | \def\beamer@xducolorblue{xdblue} 14 | 15 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 | %beamer specific options 17 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 18 | \mode%refers to the first four modes (beamer,handout,second and trans). That is, to all modes except the article mode 19 | { 20 | \ifx\beamer@xducolor\beamer@xducolorblue% 21 | \definecolor{beamer@barcolor}{RGB}{38,81,107}% 冷色系辅助色 22 | \definecolor{beamer@headercolor}{RGB}{0,65,130}% xdblue 23 | \definecolor{beamer@normaltextcolor}{RGB}{0,0,0}% balck 24 | \else% 25 | \definecolor{beamer@barcolor}{RGB}{180,76,76}% 暖色系辅助色 26 | \definecolor{beamer@headercolor}{RGB}{175,33,37}% xdred 27 | \definecolor{beamer@normaltextcolor}{RGB}{0,0,0}% black 28 | \fi% 29 | 30 | \setbeamercolor{structure}{fg=beamer@headercolor} 31 | \setbeamercolor{normal text}{fg=beamer@normaltextcolor,bg=white} 32 | \setbeamercolor{frametitle}{fg=white,bg=beamer@headercolor} 33 | \ifx\beamer@xdusidebar\undefined% 34 | {}% 35 | \else% 36 | \setbeamercolor{XDUsidebar}{fg=gray!50,bg=white}% 37 | \fi% 38 | }%end of beamer specific options 39 | 40 | \mode 41 | -------------------------------------------------------------------------------- /thesis/beamerinnerthemeXDUstyle.sty: -------------------------------------------------------------------------------- 1 | \NeedsTeXFormat{LaTeX2e} 2 | \ProvidesPackage{beamerinnerthemeXDUstyle}[2015/12/27 v0.0.1 The XDUstyle Beamer Theme] 3 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4 | % Theme options and definitions 5 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6 | \RequirePackage{tikz} 7 | \usetikzlibrary{external} 8 | %%%theme options 9 | \DeclareOptionBeamer{xdred}{\def\beamer@xducolor{xdred}} 10 | \DeclareOptionBeamer{xdblue}{\def\beamer@xducolor{xdblue}} 11 | \DeclareOptionBeamer{sidebar}{\def\beamer@sidebar{true}} 12 | \DeclareOptionBeamer{english}{\def\beamer@english{true}} 13 | \ProcessOptionsBeamer 14 | 15 | \newlength{\beamer@plainpagewidth} 16 | \def\beamer@xducolorblue{xdblue} 17 | 18 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 19 | %beamer specific options 20 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 21 | \mode%refers to the first four modes (beamer,handout,second and trans). That is, to all modes except the article mode 22 | { 23 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 24 | %templates 25 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 26 | %title page 27 | \setbeamertemplate{title page}{% 28 | {}\vspace*{\baselineskip} 29 | \ifx\beamer@sidebar\undefined% 30 | \setlength{\beamer@plainpagewidth}{\textwidth} 31 | \else% 32 | \setlength{\beamer@plainpagewidth}{\textwidth+\beamer@leftsidebar}% 33 | \hskip-\beamer@leftsidebar% 34 | \fi% 35 | \begin{minipage}[c][\textheight][c]{\beamer@plainpagewidth} 36 | \ifx\beamer@xducolor\beamer@xducolorblue% 37 | \includegraphics[width=4cm]{XDUtheme/logo_xdblue}% 38 | \else% 39 | \includegraphics[width=4cm]{XDUtheme/logo_xdred}% 40 | \fi% 41 | \vfill 42 | \centering 43 | {\usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle} 44 | 45 | {\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}\insertsubtitle}\vspace*{\baselineskip} 46 | 47 | \begin{beamercolorbox}[wd=\beamer@plainpagewidth,center,sep=\baselineskip]{frametitle}% 48 | {\usebeamerfont{author}\insertauthor}\vspace*{\baselineskip} 49 | 50 | {\usebeamerfont{institute}\insertinstitute}\vspace*{\baselineskip} 51 | 52 | {\usebeamerfont{date}\insertdate}\vspace*{\baselineskip} 53 | \end{beamercolorbox}\vspace*{\baselineskip} 54 | \vfill 55 | {}\vspace*{\baselineskip} 56 | \end{minipage} 57 | } 58 | 59 | %final page 60 | \defbeamertemplate{final page}{text}[1]{% 61 | {}\vspace*{\baselineskip} 62 | \ifx\beamer@sidebar\undefined% 63 | \setlength{\beamer@plainpagewidth}{\textwidth} 64 | \else% 65 | \setlength{\beamer@plainpagewidth}{\textwidth+\beamer@leftsidebar}% 66 | \hskip-\beamer@leftsidebar% 67 | \fi% 68 | \begin{minipage}[c][\textheight][c]{\beamer@plainpagewidth} 69 | \ifx\beamer@xducolor\beamer@xducolorblue% 70 | \includegraphics[width=4cm]{XDUtheme/logo_xdblue}% 71 | \else% 72 | \includegraphics[width=4cm]{XDUtheme/logo_xdred}% 73 | \fi% 74 | \vfill 75 | \centering 76 | \vspace*{-2\baselineskip} 77 | \begin{beamercolorbox}[wd=\textwidth,center,sep=2\baselineskip]{frametitle} 78 | #1 79 | \end{beamercolorbox} 80 | \vfill 81 | {}\vspace*{\baselineskip} 82 | \end{minipage} 83 | } 84 | \newcommand{\finalpage}[1]{% 85 | \setbeamertemplate{final page}[text]{#1} 86 | \usebeamertemplate{final page} 87 | } 88 | 89 | \newcommand{\xdbg}{ 90 | \setbeamertemplate{background}{% 设置背景 91 | \tikzexternaldisable 92 | \begin{tikzpicture}[overlay] 93 | \fill[structure.fg] (0,-\paperheight+3ex) rectangle (2ex,-\paperheight+4ex); 94 | \fill[structure.fg] (0ex,-\paperheight+5ex) rectangle (2ex,-\paperheight+6ex); 95 | \fill[structure.fg] (0ex,-\paperheight+7ex) rectangle (2ex,-\paperheight+8ex); 96 | \fill[structure.fg] (0ex,-\paperheight+9ex) rectangle (2ex,-\paperheight+10ex); 97 | \fill[structure.fg] (0ex,-\paperheight+11ex) rectangle (2ex,-\paperheight+12ex); 98 | \end{tikzpicture}% 99 | \tikzexternalenable 100 | } 101 | } 102 | 103 | % use numbers instead of a picture for the references 104 | \setbeamertemplate{bibliography item}[text] 105 | \setbeamertemplate{caption}[numbered] 106 | \setbeamercovered{transparent} 107 | \ifx\beamer@english\undefined% 108 | \renewcommand{\figurename}{图} 109 | \renewcommand{\tablename}{表} 110 | \renewcommand\refname{参考文献} 111 | \fi% 112 | 113 | %part page 114 | \AtBeginPart{{\xdbg\frame[plain,noframenumbering]{% 115 | {}\vspace*{\baselineskip}% 116 | \ifx\beamer@sidebar\undefined% 117 | \ifx\beamer@xducolor\beamer@xducolorblue% 118 | \includegraphics[width=4cm]{XDUtheme/logo_xdblue}% 119 | \else% 120 | \includegraphics[width=4cm]{XDUtheme/logo_xdred}% 121 | \fi% 122 | \vspace*{-3\baselineskip}% 123 | \partpage 124 | \else% 125 | \hskip-1.6\beamer@height% 126 | \ifx\beamer@xducolor\beamer@xducolorblue% 127 | \includegraphics[width=4cm]{XDUtheme/logo_xdblue}% 128 | \else% 129 | \includegraphics[width=4cm]{XDUtheme/logo_xdred}% 130 | \fi% 131 | \vspace*{-3\baselineskip}% 132 | \hskip-1.6\beamer@height% 133 | \partpage 134 | \fi% 135 | }}} %adds a plain part page as defined below 136 | \defbeamertemplate*{part page}{sidebar theme}{% 137 | \ifx\beamer@sidebar\undefined% 138 | \setlength{\beamer@plainpagewidth}{\textwidth} 139 | \else% 140 | \setlength{\beamer@plainpagewidth}{\textwidth+\beamer@leftsidebar}% 141 | \hskip-\beamer@leftsidebar% 142 | \fi% 143 | \begin{minipage}[c][\textheight][c]{\beamer@plainpagewidth} 144 | \centering 145 | \ifx\beamer@english\undefined% 146 | {\usebeamerfont{title}\usebeamercolor[fg]{author}{第 \Roman{part} 部分}}\vspace*{\baselineskip} 147 | \else% 148 | {\usebeamerfont{title}\usebeamercolor[fg]{author}{Part \Roman{part}}}\vspace*{\baselineskip} 149 | \fi% 150 | 151 | {\usebeamerfont{title}\usebeamercolor[fg]{title}{\insertpart}} 152 | \end{minipage} 153 | } 154 | 155 | }%end of beamer specific options 156 | 157 | \mode -------------------------------------------------------------------------------- /thesis/beamerouterthemeXDUstyle.sty: -------------------------------------------------------------------------------- 1 | 2 | \NeedsTeXFormat{LaTeX2e} 3 | \ProvidesPackage{beamerouterthemeXDUstyle}[2015/12/27 v0.0.1 The XDUstyle Beamer Theme] 4 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5 | % Load required packages 6 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7 | \RequirePackage{tikz} 8 | \usetikzlibrary{external} 9 | \RequirePackage{calc} 10 | 11 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12 | % Theme options and definitions 13 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 14 | %%%theme options 15 | \newlength{\beamer@width} 16 | \setlength{\beamer@width}{2cm} 17 | \DeclareOptionBeamer{width}{\beamer@width=#1} 18 | \DeclareOptionBeamer{sidebar}{\def\beamer@sidebar{true}} 19 | \DeclareOptionBeamer{hideothersubsections}[]{\beamer@nav@subsectionstyle{show/show/hide}} 20 | \DeclareOptionBeamer{hideallsubsections}[]{\beamer@nav@subsectionstyle{hide}} 21 | \DeclareOptionBeamer{hidetitle}{\def\beamer@hidetitle{true}} 22 | \DeclareOptionBeamer{hideauthor}{\def\beamer@hideauthor{true}} 23 | \DeclareOptionBeamer{hideinstitute}{\def\beamer@hideinst{true}} 24 | \DeclareOptionBeamer{shownavsym}{\def\beamer@shownavsym{true}} 25 | \DeclareOptionBeamer{xdred}{\def\beamer@xducolor{xdred}} 26 | \DeclareOptionBeamer{xdblue}{\def\beamer@xducolor{xdblue}} 27 | \DeclareOptionBeamer{sidebar}{\def\beamer@sidebar{true}} 28 | \ProcessOptionsBeamer 29 | 30 | \def\beamer@xducolorblue{xdblue} 31 | %the height of the header is 1.8 times the lineheight of the frame title 32 | \newlength{\beamer@height} 33 | \usebeamerfont{frametitle} %use the frame title font 34 | \setlength{\beamer@height}{1.8\baselineskip} 35 | \reset@font %reset fonts 36 | %width of vertical bar separating the main text from the sidebar 37 | \newlength{\beamer@barwidth} 38 | \setlength{\beamer@barwidth}{2\beamer@height/15} %the bar width depends on the header height (by a factor of 7.5) 39 | 40 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 41 | %beamer specific options 42 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 43 | \mode%refers to the first four modes (beamer,handout,second and trans). That is, to all modes except the article mode 44 | { 45 | \ifx\beamer@sidebar\undefined% 46 | {} 47 | \else% 48 | \ifbeamercolorempty[fg]{XDUsidebar}{% 49 | %define the sidebar color if it is not defined (which may be due to that the XDUsidebar color theme is not loaded) 50 | \setbeamercolor{XDUsidebar}{use={structure,palette sidebar primary},fg=palette sidebar primary.fg,bg=structure.fg} 51 | }{% 52 | % 53 | } 54 | \setbeamersize{sidebar width left=\beamer@width} 55 | \setbeamersize{text margin left=0.5cm,text margin right=0.5cm} 56 | \fi% 57 | 58 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 59 | %templates 60 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 61 | % %headline 62 | \defbeamertemplate*{headline}{XDUstyle theme}{% 63 | \XDUheaderbackground% 64 | } 65 | 66 | %frame title 67 | \defbeamertemplate*{frametitle}{XDUstyle theme}{% 68 | \begin{minipage}[c][\beamer@height][c]{\textwidth-\beamer@height/2} 69 | \begin{flushright} 70 | {\usebeamercolor[fg]{frametitle}\usebeamerfont{frametitle}\insertframetitle\par}% 71 | {\usebeamercolor[fg]{framesubtitle}\usebeamerfont{framesubtitle}\insertframesubtitle\par}% 72 | \end{flushright} 73 | \end{minipage} 74 | \hfill% 75 | } 76 | 77 | \ifx\beamer@sidebar\undefined% 78 | {} 79 | \else% 80 | %sidebar 81 | \defbeamertemplate*{sidebar left}{XDUstyle theme}{% 82 | \XDUsidebarbackground% 83 | \vspace{\beamer@height}% 84 | \vspace{2\baselineskip}\par% 85 | \ifx\beamer@hidetitle\undefined% insert short title 86 | \vspace{-\baselineskip} 87 | \hspace{0.05\beamer@width}% 88 | {% 89 | \usebeamercolor[fg]{title in sidebar} 90 | \usebeamerfont{title in sidebar}% 91 | \insertshorttitle[width={0.9\beamer@width},center,respectlinebreaks] 92 | }% 93 | \hspace{0.05\beamer@width} 94 | \vspace{2\baselineskip}\par% 95 | \fi 96 | \ifx\beamer@hideauthor\undefined% insert short author 97 | \vspace{-\baselineskip} 98 | \hspace{0.05\beamer@width}% 99 | {% 100 | \usebeamercolor[fg]{author in sidebar} 101 | \usebeamerfont{author in sidebar}% 102 | \insertshortauthor[width={0.9\beamer@width},center,respectlinebreaks] 103 | } 104 | \hspace{0.05\beamer@width} 105 | \vspace{\baselineskip}\par% 106 | \fi 107 | \insertverticalnavigation{\beamer@width}% 108 | \strut\vfill% 109 | \ifx\beamer@hideinst\undefined% insert short institute 110 | \vbox{\hspace{0.05\beamer@width}% 111 | {% 112 | \usebeamercolor[fg]{title in sidebar} 113 | \usebeamerfont{subtitle in sidebar}% 114 | \insertshortinstitute[width={0.9\beamer@width},center,respectlinebreaks] 115 | } 116 | \hspace{0.05\beamer@width}% 117 | \vspace*{\baselineskip} 118 | }% 119 | \fi 120 | \ifx\beamer@shownavsym\undefined% insert navigation symbols 121 | %do nothing 122 | \else 123 | % 124 | \fi 125 | } 126 | 127 | % current section in the sidebar 128 | \defbeamertemplate*{section in sidebar}{XDUstyle theme}{% 129 | \vbox{% 130 | \vskip1ex% add some extra space when inserting a new section 131 | \sidebarnavitem{4pt}{section in sidebar}{% 132 | \sidebarcurframe{\insertframenumber}% 133 | \insertsectionhead 134 | } 135 | } 136 | } 137 | 138 | % all section in the sidebar but the current 139 | \defbeamertemplate*{section in sidebar shaded}{XDUstyle theme}{% 140 | \vbox{% 141 | \vskip1ex% add some extra space when inserting a new section 142 | \sidebarnavitem{4pt}{section in sidebar shaded}{\insertsectionhead} 143 | } 144 | } 145 | 146 | % current subsection in the sidebar 147 | \defbeamertemplate*{subsection in sidebar}{XDUstyle theme}{% 148 | \sidebarnavitem{6pt}{subsection in sidebar}{ 149 | \sidebarcurframe{\insertframenumber}% 150 | \insertsubsectionhead 151 | } 152 | } 153 | 154 | % all subsection in the sidebar but the current 155 | \defbeamertemplate*{subsection in sidebar shaded}{XDUstyle theme}{% 156 | \sidebarnavitem{6pt}{subsection in sidebar shaded}{\insertsubsectionhead} 157 | } 158 | 159 | % current subsubsection in the sidebar 160 | \defbeamertemplate*{subsubsection in sidebar}{XDUstyle theme}{% 161 | \sidebarnavitem{8pt}{subsubsection in sidebar}{ 162 | \sidebarcurframe{\insertframenumber}% 163 | \insertsubsubsectionhead 164 | } 165 | } 166 | 167 | % all subsubsection in the sidebar but the current 168 | \defbeamertemplate*{subsubsection in sidebar shaded}{XDUstyle theme}{% 169 | \sidebarnavitem{8pt}{subsubsection in sidebar shaded}{\insertsubsubsectionhead} 170 | } 171 | \fi% 172 | 173 | \ifx\beamer@shownavsym\undefined% insert navigation symbols 174 | \setbeamertemplate{navigation symbols}{% 175 | %disable navigation symbols 176 | } 177 | \fi 178 | 179 | }%end of beamer specific options 180 | 181 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 182 | %Macros used in the theme 183 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 184 | % the fancy header background 185 | \newcommand{\XDUheaderbackground}[0]{% 186 | \tikzexternaldisable 187 | \begin{tikzpicture}[overlay] 188 | 189 | 190 | \coordinate (UC) at (\paperwidth,0); %upper right corner of the slide 191 | \coordinate (LC) at (3ex+3.4cm,-\paperheight); %lower left corner of the slide 192 | \coordinate (BS) at (\paperwidth,-\beamer@height+1ex); %start coordinate of the bar 193 | \coordinate (BE) at (\beamer@width+\beamer@barwidth/2,-\paperheight); %end coordinate of the bar 194 | \coordinate (BF) at (3ex+3.4cm,-\beamer@height); 195 | 196 | \coordinate (IS) at (BS -| BE); %intersection 197 | 198 | \coordinate (XDL1) at (0,0); 199 | \coordinate (XDR1) at (4ex,-\beamer@height/9); 200 | \coordinate (XDL2) at (0,-2\beamer@height/9); 201 | \coordinate (XDR2) at (4ex,-3\beamer@height/9); 202 | \coordinate (XDL3) at (0,-4\beamer@height/9); 203 | \coordinate (XDR3) at (4ex,-5\beamer@height/9); 204 | \coordinate (XDL4) at (0,-6\beamer@height/9); 205 | \coordinate (XDR4) at (4ex,-7\beamer@height/9); 206 | \coordinate (XDL5) at (0,-8\beamer@height/9); 207 | \coordinate (XDR5) at (4ex,-\beamer@height); 208 | 209 | \fill[gray!50] (BF) rectangle (BS); 210 | {\usebeamercolor{frametitle}% 211 | \draw[draw=none,fill=frametitle.bg] (UC) rectangle (IS -| LC); 212 | \draw[draw=none,fill=frametitle.bg] (XDL1) rectangle (XDR1); 213 | \draw[draw=none,fill=frametitle.bg] (XDL2) rectangle (XDR2); 214 | \draw[draw=none,fill=frametitle.bg] (XDL3) rectangle (XDR3); 215 | \draw[draw=none,fill=frametitle.bg] (XDL4) rectangle (XDR4); 216 | \draw[draw=none,fill=frametitle.bg] (XDL5) rectangle (XDR5); 217 | } 218 | 219 | \coordinate (logopos) at ([yshift=\beamer@height/2] IS);%coordinate of the logo 220 | \ifx\beamer@xducolor\beamer@xducolorblue% 221 | \node at (logopos) {\includegraphics[width=3cm]{XDUtheme/logo_xdblue}}; 222 | \else% 223 | \node at (logopos) {\includegraphics[width=3cm]{XDUtheme/logo_xdred}}; 224 | \fi% 225 | \end{tikzpicture}% 226 | \tikzexternalenable 227 | } 228 | 229 | \ifx\beamer@sidebar\undefined% 230 | {} 231 | \else 232 | % the fancy background in the sidebar 233 | \newcommand{\XDUsidebarbackground}[0]{% 234 | \tikzexternaldisable 235 | \begin{tikzpicture}[remember picture,overlay] 236 | \coordinate (BS) at (\paperwidth,-\beamer@height); %start coordinate of the bar 237 | \coordinate (DBS) at (\paperwidth,-\beamer@height-6.5ex); 238 | \coordinate (BE) at (\beamer@width+\beamer@barwidth/2,-\paperheight); %end coordinate of the bar 239 | \coordinate (IS) at (BS -| BE); %intersection 240 | \coordinate (DIS) at (DBS -| BE); 241 | %draw the thick line 242 | {\usebeamercolor{XDUsidebar}% 243 | \draw[color=fg,line width=\beamer@barwidth] (IS) -- (BE); 244 | } 245 | %draw the circle with the total frame number 246 | {\usebeamercolor{palette sidebar primary}% 247 | \usebeamercolor{XDUsidebar}% 248 | \usebeamerfont{subsection in sidebar}% 249 | \node[fill=palette sidebar primary.bg,draw=XDUsidebar.fg,circle,very thick,minimum width=4mm] at ([yshift=2mm] BE) {{\usebeamercolor[fg]{subsection in sidebar}\inserttotalframenumber}}; 250 | \node[fill=palette sidebar primary.bg,draw=XDUsidebar.fg,circle,very thick,minimum width=4mm] at ([yshift=2mm] DIS) {{\usebeamercolor[fg]{subsection in sidebar}1}}; 251 | } 252 | \end{tikzpicture}% 253 | \tikzexternalenable 254 | } 255 | 256 | % sidebar navigation item 257 | \newcommand{\sidebarnavitem}[3]{% 258 | \begin{beamercolorbox}[wd=\beamer@width,leftskip=#1,rightskip=1ex plus1fil,vmode]{#2} 259 | \vbox{}% insert a blank line 260 | #3\par% 261 | \vbox{}% insert a blank line 262 | \vskip-1.5ex% 263 | \end{beamercolorbox} 264 | } 265 | 266 | % current frame number 267 | \newcommand{\sidebarcurframe}[1]{% 268 | \tikzexternaldisable 269 | \begin{tikzpicture}[remember picture,overlay] 270 | \coordinate (CS) at (0,0.8ex); % coordinate of the current section 271 | \coordinate (CF) at (IS |- CS); % coordinate of the current frame number 272 | {% 273 | \usebeamercolor{palette sidebar primary}% 274 | \usebeamercolor{XDUsidebar}% 275 | % \draw[color=bg,line width=\beamer@barwidth] (IS) -| (CF); 276 | \node[fill=palette sidebar primary.bg,draw=XDUsidebar.fg,circle,minimum width=3.5mm,thick] at (CF) {{\fontsize{4}{5}\selectfont{\usebeamercolor[fg]{subsection in sidebar}#1}}}; 277 | } 278 | \end{tikzpicture}% 279 | \tikzexternalenable 280 | } 281 | \fi% 282 | 283 | \mode 284 | -------------------------------------------------------------------------------- /thesis/beamerthemeXDUstyle.sty: -------------------------------------------------------------------------------- 1 | \NeedsTeXFormat{LaTeX2e} 2 | \ProvidesPackage{beamerthemeXDUstyle}[2015/12/27 v0.0.1 The XDUstyle Beamer Theme] 3 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4 | % Load required packages 5 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6 | \RequirePackage{tikz} 7 | \usetikzlibrary{external} 8 | \RequirePackage{calc} 9 | 10 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11 | % Theme options and definitions 12 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13 | %%%theme options 14 | \DeclareOptionBeamer{width}{\PassOptionsToPackage{width=#1}{beamerouterthemeXDUstyle}} 15 | \DeclareOptionBeamer{hideothersubsections}{\PassOptionsToPackage{hideothersubsections}{beamerouterthemeXDUstyle}} 16 | \DeclareOptionBeamer{hideallsubsections}{\PassOptionsToPackage{hideallsubsections}{beamerouterthemeXDUstyle}} 17 | \DeclareOptionBeamer{hidetitle}{\PassOptionsToPackage{hidetitle}{beamerouterthemeXDUstyle}} 18 | \DeclareOptionBeamer{hideauthor}{\PassOptionsToPackage{hideauthor}{beamerouterthemeXDUstyle}} 19 | \DeclareOptionBeamer{hideinstitute}{\PassOptionsToPackage{hideinstitute}{beamerouterthemeXDUstyle}} 20 | \DeclareOptionBeamer{shownavsym}{\PassOptionsToPackage{shownavsym}{beamerouterthemeXDUstyle}} 21 | 22 | \DeclareOptionBeamer{xdred}{% 23 | \PassOptionsToPackage{xdred}{beamercolorthemeXDUstyle}% 24 | \PassOptionsToPackage{xdred}{beamerinnerthemeXDUstyle}% 25 | \PassOptionsToPackage{xdred}{beamerouterthemeXDUstyle}% 26 | } 27 | \DeclareOptionBeamer{xdblue}{% 28 | \PassOptionsToPackage{xdblue}{beamercolorthemeXDUstyle}% 29 | \PassOptionsToPackage{xdblue}{beamerinnerthemeXDUstyle}% 30 | \PassOptionsToPackage{xdblue}{beamerouterthemeXDUstyle}% 31 | } 32 | \DeclareOptionBeamer{english}{% 33 | \PassOptionsToPackage{english}{beamerinnerthemeXDUstyle}% 34 | } 35 | \DeclareOptionBeamer{sidebar}{% 36 | \PassOptionsToPackage{sidebar}{beamercolorthemeXDUstyle}% 37 | \PassOptionsToPackage{sidebar}{beamerinnerthemeXDUstyle}% 38 | \PassOptionsToPackage{sidebar}{beamerouterthemeXDUstyle}% 39 | } 40 | \ProcessOptionsBeamer 41 | 42 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 43 | %beamer specific options 44 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 45 | \mode%refers to the first four modes (beamer,handout,second and trans). That is, to all modes except the article mode 46 | { 47 | \useinnertheme{XDUstyle} 48 | \useoutertheme{XDUstyle} 49 | \usecolortheme{XDUstyle} 50 | }%end of beamer specific options 51 | 52 | \mode -------------------------------------------------------------------------------- /thesis/任务书.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/任务书.doc -------------------------------------------------------------------------------- /thesis/工作计划.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/工作计划.doc -------------------------------------------------------------------------------- /thesis/工作计划.pages: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/工作计划.pages -------------------------------------------------------------------------------- /thesis/工作计划.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/工作计划.pdf -------------------------------------------------------------------------------- /thesis/毕业设计《软硬件验收表》.pages: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/毕业设计《软硬件验收表》.pages -------------------------------------------------------------------------------- /thesis/毕业设计《软硬件验收表》.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/毕业设计《软硬件验收表》.pdf -------------------------------------------------------------------------------- /thesis/毕业设计(论文)成绩登记表.pages: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/毕业设计(论文)成绩登记表.pages -------------------------------------------------------------------------------- /thesis/毕业设计(论文)成绩登记表.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/毕业设计(论文)成绩登记表.pdf -------------------------------------------------------------------------------- /thesis/计算机学院本科生毕业设计论文修改意见表.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/thesis/计算机学院本科生毕业设计论文修改意见表.pdf -------------------------------------------------------------------------------- /考核问题.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelightRun/DeepPR/af2c88460e420046cf05e291560873cbe3400d4b/考核问题.pptx --------------------------------------------------------------------------------