Browse Source

add lite

pull/1/MERGE
jackyu 6 years ago
parent
commit
490c7f7dcb
4 changed files with 611 additions and 12 deletions
  1. +397
    -0
      .idea/workspace.xml
  2. +164
    -0
      HyperLPRLite.py
  3. +50
    -12
      README.md
  4. BIN
      model/ocr_plate_all_gru.h5

+ 397
- 0
.idea/workspace.xml View File

@@ -0,0 +1,397 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="3404577b-bc9d-4705-bfd4-ff104b268f2d" name="Default" comment="" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="pipline.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/hyperlpr/pipline.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="791">
<caret line="190" column="30" selection-start-line="190" selection-start-column="30" selection-end-line="190" selection-end-column="30" />
<folding>
<element signature="e#14#27#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="utf_8.py" pinned="false" current-in-tab="true">
<entry file="file:///System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="160">
<caret line="15" selection-start-line="15" selection-end-line="15" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="batch.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/batch.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file leaf-file-name="8e4937d6.png" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/cache/finemapping/8e4937d6.png">
<provider selected="true" editor-type-id="images" />
</entry>
</file>
<file leaf-file-name="2_.jpg" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/images_rec/2_.jpg">
<provider selected="true" editor-type-id="images" />
</entry>
</file>
<file leaf-file-name="HyperLprGUI.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/HyperLprGUI.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-8962" />
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>print</find>
</findStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/hyperlpr/e2e.py" />
<option value="$PROJECT_DIR$/hyperlpr/finemapping_vertical.py" />
<option value="$PROJECT_DIR$/hyperLPR_tiny.py" />
<option value="$PROJECT_DIR$/benchmark.py" />
<option value="$PROJECT_DIR$/HyperLPRLite.py" />
<option value="$PROJECT_DIR$/demo.py" />
</list>
</option>
</component>
<component name="ProjectFrameBounds">
<option name="x" value="1168" />
<option name="y" value="497" />
<option name="width" value="1440" />
<option name="height" value="827" />
</component>
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="HyperLPR" type="b2602c69:ProjectViewProjectNode" />
<item name="HyperLPR" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="HyperLPR" type="b2602c69:ProjectViewProjectNode" />
<item name="HyperLPR" type="462c0819:PsiDirectoryNode" />
<item name="images_rec" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="HyperLPR" type="b2602c69:ProjectViewProjectNode" />
<item name="HyperLPR" type="462c0819:PsiDirectoryNode" />
<item name="model" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="settings.editor.selected.configurable" value="vcs.Git" />
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="RunManager" selected="Python.demo">
<configuration name="HyperLprGUI" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="HyperLPR" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/HyperLprGUI.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
</configuration>
<configuration name="demo" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="HyperLPR" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/demo.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
</configuration>
<configuration name="hyperLPR_tiny" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="HyperLPR" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/HyperLPRLite.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
</configuration>
<configuration name="upload" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="HyperLPR" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/upload.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
</configuration>
<list>
<item itemvalue="Python.upload" />
<item itemvalue="Python.HyperLprGUI" />
<item itemvalue="Python.hyperLPR_tiny" />
<item itemvalue="Python.demo" />
</list>
<recent_temporary>
<list>
<item itemvalue="Python.demo" />
<item itemvalue="Python.hyperLPR_tiny" />
<item itemvalue="Python.HyperLprGUI" />
<item itemvalue="Python.upload" />
</list>
</recent_temporary>
</component>
<component name="SvnConfiguration">
<configuration>$USER_HOME$/.subversion</configuration>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="3404577b-bc9d-4705-bfd4-ff104b268f2d" name="Default" comment="" />
<created>1523462206021</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1523462206021</updated>
</task>
<servers />
</component>
<component name="ToolWindowManager">
<frame x="1168" y="497" width="1440" height="827" extended-state="0" />
<layout>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.25" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="bottom" id="Event Log" side_tool="true" />
<window_info anchor="bottom" id="Run" order="2" visible="true" weight="0.32934928" />
<window_info anchor="bottom" id="Version Control" />
<window_info anchor="bottom" id="Python Console" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Terminal" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info id="Favorites" side_tool="true" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="right" id="Commander" order="0" weight="0.4" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Message" order="0" />
</layout>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/upload.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="345">
<caret line="40" column="20" selection-start-line="40" selection-start-column="20" selection-end-line="40" selection-end-column="20" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/hyperlpr/detect.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1140">
<caret line="76" selection-end-line="76" />
<folding>
<element signature="e#1#11#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/LICENSE">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/hyperlpr/e2emodel.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="15">
<caret line="1" selection-start-line="1" selection-end-line="4" />
<folding>
<element signature="e#1#31#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/hyperlpr/e2e.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="428">
<caret line="41" column="29" lean-forward="true" selection-start-line="33" selection-end-line="41" selection-end-column="29" />
<folding>
<element signature="e#14#44#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/hyperlpr/finemapping_vertical.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="135">
<caret line="9" selection-start-line="9" selection-end-line="46" selection-end-column="16" />
<folding>
<element signature="e#14#97#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file:///Library/Python/2.7/site-packages/keras/engine/training.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="160">
<caret line="143" selection-start-line="143" selection-end-line="143" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/hyperlpr/plateStructure.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/0_rough.jpg">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/0.jpg">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/images_rec/2_.jpg">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/images_rec/006vT0dkzy73eTACbIh15.jpg">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/cache/finemapping/8e4937d6.png">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/batch.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/hyperlpr/pipline.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="791">
<caret line="190" column="30" selection-start-line="190" selection-start-column="30" selection-end-line="190" selection-end-column="30" />
<folding>
<element signature="e#14#27#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/HyperLprGUI.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-8962" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/HyperLPRLite.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="158">
<caret line="150" column="33" selection-start-line="150" selection-start-column="8" selection-end-line="150" selection-end-column="33" />
<folding>
<element signature="e#1#11#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/demo.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="47" column="21" selection-start-line="47" selection-start-column="21" selection-end-line="47" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file:///System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="160">
<caret line="15" selection-start-line="15" selection-end-line="15" />
</state>
</provider>
</entry>
</component>
<component name="masterDetails">
<states>
<state key="ScopeChooserConfigurable.UI">
<settings>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>

+ 164
- 0
HyperLPRLite.py View File

@@ -0,0 +1,164 @@
#coding=utf-8
import cv2
import numpy as np
from keras import backend as K
from keras.models import *
from keras.layers import *

chars = [u"京", u"沪", u"津", u"渝", u"冀", u"晋", u"蒙", u"辽", u"吉", u"黑", u"苏", u"浙", u"皖", u"闽", u"赣", u"鲁", u"豫", u"鄂", u"湘", u"粤", u"桂",
u"琼", u"川", u"贵", u"云", u"藏", u"陕", u"甘", u"青", u"宁", u"新", u"0", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"A",
u"B", u"C", u"D", u"E", u"F", u"G", u"H", u"J", u"K", u"L", u"M", u"N", u"P", u"Q", u"R", u"S", u"T", u"U", u"V", u"W", u"X",
u"Y", u"Z",u"港",u"学",u"使",u"警",u"澳",u"挂",u"军",u"北",u"南",u"广",u"沈",u"兰",u"成",u"济",u"海",u"民",u"航",u"空"
]

class LPR():
def __init__(self,model_detection,model_finemapping,model_seq_rec):
self.watch_cascade = cv2.CascadeClassifier(model_detection)
self.modelFineMapping = self.model_finemapping()
self.modelFineMapping.load_weights(model_finemapping)
self.modelSeqRec = self.model_seq_rec(model_seq_rec)

def computeSafeRegion(self,shape,bounding_rect):
top = bounding_rect[1] # y
bottom = bounding_rect[1] + bounding_rect[3] # y + h
left = bounding_rect[0] # x
right = bounding_rect[0] + bounding_rect[2] # x + w
min_top = 0
max_bottom = shape[0]
min_left = 0
max_right = shape[1]
if top < min_top:
top = min_top
if left < min_left:
left = min_left
if bottom > max_bottom:
bottom = max_bottom
if right > max_right:
right = max_right
return [left,top,right-left,bottom-top]

def cropImage(self,image,rect):
x, y, w, h = self.computeSafeRegion(image.shape,rect)
return image[y:y+h,x:x+w]

def detectPlateRough(self,image_gray,resize_h = 720,en_scale =1.08 ,top_bottom_padding_rate = 0.05):
if top_bottom_padding_rate>0.2:
print "error:top_bottom_padding_rate > 0.2:",top_bottom_padding_rate
exit(1)
height = image_gray.shape[0]
padding = int(height*top_bottom_padding_rate)
scale = image_gray.shape[1]/float(image_gray.shape[0])
image = cv2.resize(image_gray, (int(scale*resize_h), resize_h))
image_color_cropped = image[padding:resize_h-padding,0:image_gray.shape[1]]
image_gray = cv2.cvtColor(image_color_cropped,cv2.COLOR_RGB2GRAY)
watches = self.watch_cascade.detectMultiScale(image_gray, en_scale, 2, minSize=(36, 9),maxSize=(36*40, 9*40))
cropped_images = []
for (x, y, w, h) in watches:
x -= w * 0.14
w += w * 0.28
y -= h * 0.15
h += h * 0.3
cropped = self.cropImage(image_color_cropped, (int(x), int(y), int(w), int(h)))

cropped_images.append([cropped,[x, y+padding, w, h]])
return cropped_images

def fastdecode(self,y_pred):
results = ""
confidence = 0.0
table_pred = y_pred.reshape(-1, len(chars)+1)
res = table_pred.argmax(axis=1)
for i,one in enumerate(res):
if one<len(chars) and (i==0 or (one!=res[i-1])):
results+= chars[one]
confidence+=table_pred[i][one]
confidence/= len(results)
return results,confidence

def model_seq_rec(self,model_path):
width, height, n_len, n_class = 164, 48, 7, len(chars)+ 1
rnn_size = 256
input_tensor = Input((164, 48, 3))
x = input_tensor
base_conv = 32
for i in range(3):
x = Conv2D(base_conv * (2 ** (i)), (3, 3))(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
conv_shape = x.get_shape()
x = Reshape(target_shape=(int(conv_shape[1]), int(conv_shape[2] * conv_shape[3])))(x)
x = Dense(32)(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
gru_1 = GRU(rnn_size, return_sequences=True, kernel_initializer='he_normal', name='gru1')(x)
gru_1b = GRU(rnn_size, return_sequences=True, go_backwards=True, kernel_initializer='he_normal', name='gru1_b')(x)
gru1_merged = add([gru_1, gru_1b])
gru_2 = GRU(rnn_size, return_sequences=True, kernel_initializer='he_normal', name='gru2')(gru1_merged)
gru_2b = GRU(rnn_size, return_sequences=True, go_backwards=True, kernel_initializer='he_normal', name='gru2_b')(gru1_merged)
x = concatenate([gru_2, gru_2b])
x = Dropout(0.25)(x)
x = Dense(n_class, kernel_initializer='he_normal', activation='softmax')(x)
base_model = Model(inputs=input_tensor, outputs=x)
base_model.load_weights(model_path)
return base_model

def model_finemapping(self):
input = Input(shape=[16, 66, 3]) # change this shape to [None,None,3] to enable arbitraty shape input
x = Conv2D(10, (3, 3), strides=1, padding='valid', name='conv1')(input)
x = Activation("relu", name='relu1')(x)
x = MaxPool2D(pool_size=2)(x)
x = Conv2D(16, (3, 3), strides=1, padding='valid', name='conv2')(x)
x = Activation("relu", name='relu2')(x)
x = Conv2D(32, (3, 3), strides=1, padding='valid', name='conv3')(x)
x = Activation("relu", name='relu3')(x)
x = Flatten()(x)
output = Dense(2,name = "dense")(x)
output = Activation("relu", name='relu4')(output)
model = Model([input], [output])
return model

def finemappingVertical(self,image,rect):
resized = cv2.resize(image,(66,16))
resized = resized.astype(np.float)/255
res_raw= self.modelFineMapping.predict(np.array([resized]))[0]
res =res_raw*image.shape[1]
res = res.astype(np.int)
H,T = res
H-=3
if H<0:
H=0
T+=2;
if T>= image.shape[1]-1:
T= image.shape[1]-1

rect[2] -= rect[2]*(1-res_raw[1] + res_raw[0])
rect[0]+=res[0]

image = image[:,H:T+2]

image = cv2.resize(image, (int(136), int(36)))
return image,rect

def recognizeOne(self,src):
x_tempx = src
x_temp = cv2.resize(x_tempx,( 164,48))
x_temp = x_temp.transpose(1, 0, 2)
y_pred = self.modelSeqRec.predict(np.array([x_temp]))
y_pred = y_pred[:,2:,:]
return self.fastdecode(y_pred)

def SimpleRecognizePlateByE2E(self,image):
images = self.detectPlateRough(image,image.shape[0],top_bottom_padding_rate=0.1)
res_set = []
for j,plate in enumerate(images):
plate, rect =plate
image_rgb,rect_refine = self.finemappingVertical(plate,rect)
res,confidence = self.recognizeOne(image_rgb)
res_set.append([res,confidence,rect_refine])
return res_set






+ 50
- 12
README.md View File

@@ -1,24 +1,36 @@
# High Accuracy Chinese License Plate Recognition Framework
# High Accuracy Chinese Plate Recognition Framework

### 介绍
This research aims at simply developping plate recognition project based on deep learning methods, with low complexity and high speed. This
project has been used by some commercial corporations. Free and open source, deploying by Zeusee. this pipline also can apply to other countries license plate by training
project has been used by some commercial corporations. Free and open source, deploying by Zeusee.

HyperLPR是一个使用深度学习针对对中文车牌识别的实现,与其他开源的中文车牌识别框架相比,它的检测速度和鲁棒性和多场景的适应性都要好于其他的开源框架。
HyperLPR是一个使用深度学习针对对中文车牌识别的实现,与较为流行的开源的[EasyPR](https://github.com/liuruoze/EasyPR)相比,它的检测速度和鲁棒性和多场景的适应性都要好于目前开源的EasyPR。

##### 更新热点:

- 添加的新的Python 序列模型-识别率大幅提高(尤其汉字)(2018.3.12)
- 新添加了HyperLPR Lite 只需要一个文件 160行代码即可完全整个车牌识别流程.
- 提供精确定位的车牌矩形框(2018.3.12)

#### 相关资源

+ [在线测试地址](http://sftera.vicp.io:8000/uploader)(已失效)。
+ [相关技术博客](http://blog.csdn.net/relocy/article/details/78705662)(技术文章会在接下来的几个月的时间内连续更新)。
+ [带UI界面的工程](https://pan.baidu.com/s/1cNWpK6)(感谢群内小伙伴的工作)。
+ [端到端(多标签分类)训练代码](https://github.com/LCorleone/hyperlpr-train_e2e)(感谢群内小伙伴的工作)。
+ [端到端(CTC)训练代码](https://github.com/armaab/hyperlpr-train)(感谢群内小伙伴工作)。
+ [训练代码和字符分割介绍](https://github.com/zeusees/HyperLPR-Training)。
+ [IOS版本 xiaojun123456贡献](https://github.com/xiaojun123456)。
+ [编译好的OpenCV_3.3.1_VS2013_Win64 版本](https://pan.baidu.com/s/1c3cgGyk);(采用VS2015可以使用opencv_3.3以上官方提供的Release版本)。

### 更新
+ 增加了端到端模型的cpp实现,识别速度比分割快30%(Linux)(2018.1.31)
+ 增加字符分割[训练代码和字符分割介绍](https://github.com/zeusees/HyperLPR-Training)(2018.1)

+ 添加的新的Python 序列模型-识别率大幅提高(尤其汉字)(2018.3.12)
+ 添加了HyperLPR Lite 仅仅需160 行代码即可实现车牌识别(2018.3.12)
+ 提供精确定位的车牌矩形框(2018.3.12)


+ 增加了端到端模型的cpp实现(Linux)(2018.1.31)


+ 增加字符分割[训练代码和字符分割介绍](https://github.com/zeusees/HyperLPR-Training)(2018.1.)
+ 更新了Android实现,大幅提高准确率和速度 (骁龙835 (*720*x*1280*) ~50ms )(2017.12.27)
+ 添加了IOS版本的实现(感谢[xiaojun123456](https://github.com/xiaojun123456)的工作)
+ 添加端到端的序列识别模型识别率大幅度提升,使得无需分割字符即可识别,识别速度提高20% (2017.11.17)
@@ -39,6 +51,19 @@ HyperLPR是一个使用深度学习针对对中文车牌识别的实现,与其
+ 识别率高,仅仅针对车牌ROI在EasyPR数据集上,0-error达到 95.2%, 1-error识别率达到 97.4% (指在定位成功后的车牌识别率)
+ 轻量 总代码量不超1k行

### 模型资源说明

+ cascade.xml 检测模型 - 目前效果最好的cascade检测模型
+ cascade_lbp.xml 召回率效果较好,但其错检太多
+ char_chi_sim.h5 Keras模型-可识别34类数字和大写英文字 使用14W样本训练
+ char_rec.h5 Keras模型-可识别34类数字和大写英文字 使用7W样本训练
+ ocr_plate_all_w_rnn_2.h5 基于CNN的序列模型
+ ocr_plate_all_gru.h5 基于GRU的序列模型从OCR模型修改,效果目前最好但速度较慢,需要20ms。
+ plate_type.h5 用于车牌颜色判断的模型
+ model12.h5 左右边界回归模型



### 注意事项:

+ Win工程中若需要使用静态库,需单独编译
@@ -61,12 +86,25 @@ HyperLPR是一个使用深度学习针对对中文车牌识别的实现,与其

### 简单使用方式

新更新的HyperLPR Lite

```python
from hyperlpr import pipline as pp
import HyperLPRLite as pr
import cv2
image = cv2.imread("filename")
image,res = pp.SimpleRecognizePlate(image)
print(res)
import numpy as np
grr = cv2.imread("images_rec/demo1.jpg")
model = pr.LPR("model/cascade.xml","model/model12.h5","model/ocr_plate_all_gru.h5")

for pstr,confidence,rect in model.SimpleRecognizePlateByE2E(grr):
if confidence>0.7:
image = drawRectBox(grr, rect, pstr+" "+str(round(confidence,3)))
print("plate_str",pstr)
print("plate_confidence",confidence)


cv2.imshow("image",image)
cv2.waitKey(0)

```
### Linux/Mac 编译



BIN
model/ocr_plate_all_gru.h5 View File


Loading…
Cancel
Save