Skip to content

Commit 7cb30a3

Browse files
first public
0 parents  commit 7cb30a3

File tree

81 files changed

+2040
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+2040
-0
lines changed

.idea/.gitignore

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/ALPR_Ver7.iml

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/inspectionProfiles/Project_Default.xml

+52
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/inspectionProfiles/profiles_settings.xml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules.xml

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

__pycache__/main.cpython-38.pyc

1.81 KB
Binary file not shown.

dockerfile

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
FROM python:3.9.7
2+
3+
WORKDIR /app
4+
5+
COPY ./main.py ./
6+
COPY ./requirements.txt ./
7+
COPY ./src ./src
8+
# COPY ./src/*.py ./src
9+
# COPY ./src/character_recognition/*.py ./src/character_recognition
10+
# COPY ./src/lp_detection/*.py ./src/lp_detection
11+
# COPY ./src/weight_folder/*.h5 ./src/weight_folder
12+
# COPY ./src/weight_folder/*.json ./src/weight_folder
13+
# COPY ./src/weight_folder/config/*.py ./src/weight_folder/config
14+
# COPY ./src/weight_folder/config/*.yml ./src/weight_folder/config
15+
# COPY ./src/weight_folder/model/all_plates/*.pth ./src/weight_folder/model/all_plates
16+
# COPY ./src/weight_folder/model/all_plates_cut_and_padding/*.pth ./src/weight_folder/model/all_plates_cut_and_padding
17+
# COPY ./src/weight_folder/model/all_plates_padding/*.pth ./src/weight_folder/model/all_plates_padding
18+
# COPY ./src/weight_folder/model/pretrain/*.pth ./src/weight_folder/model/pretrain
19+
# COPY ./vietocr/*.py ./vietocr
20+
# COPY ./vietocr/model/*.py ./vietocr/model
21+
# COPY ./vietocr/model/backbone/*.py ./vietocr/model/backbone
22+
# COPY ./vietocr/model/seqmodel/*.py ./vietocr/model/seqmodel
23+
# COPY ./vietocr/tool/*.py ./vietocr/tool
24+
COPY ./vietocr ./vietocr
25+
RUN apt-get update && apt-get install -y python3-opencv
26+
RUN pip install --upgrade pip
27+
RUN pip install --no-cache-dir -r requirements.txt
28+
29+
ENTRYPOINT ["python"]
30+
CMD ["main.py"]

main.py

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import flask
2+
import os
3+
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
4+
from src.lp_detection.detect import get_plate
5+
from src.detect_and_recognize import load_wpod_net_model, cvtBase64, paddingImg, get_plate_numbers_for_rec_plate, \
6+
get_plate_numbers_for_square_plate
7+
from vietocr.tool.predictor import Predictor
8+
from vietocr.tool.config import Cfg
9+
from flask import Flask, request
10+
from flask_cors import CORS, cross_origin
11+
import cv2
12+
import numpy as np
13+
wpod_net = load_wpod_net_model()
14+
15+
config = Cfg.load_config_from_file('./src/weight_folder/config/vgg_transformer.yml')
16+
config['cnn']['pretrained'] = False
17+
config['device'] = 'cpu'
18+
config['predictor']['beamsearch'] = False
19+
20+
detector = Predictor(config)
21+
# Build Flask app
22+
app = Flask(__name__)
23+
CORS(app)
24+
app.config['CORS_HEADERS'] = 'Content-Type'
25+
26+
27+
def detect_and_recognize_image(inputImg):
28+
inputImg = cvtBase64(inputImg)
29+
inputImg = paddingImg(inputImg)
30+
plate_image, LpType, cor = get_plate(wpod_net, inputImg, Dmax=700, Dmin=500)
31+
if LpType == 1:
32+
output_plate_image = get_plate_numbers_for_rec_plate(plate_image)
33+
plateString = detector.predict(output_plate_image)
34+
elif LpType == 2:
35+
output_plate_image = get_plate_numbers_for_square_plate(plate_image)
36+
plateString = detector.predict(output_plate_image)
37+
return plateString
38+
39+
40+
@app.route('/detect_plate_base64', methods=['GET', 'POST'])
41+
@cross_origin(origin='*')
42+
def plateDetect():
43+
inputImg = request.form.get('image')
44+
try:
45+
plate_number = detect_and_recognize_image(inputImg)
46+
return flask.jsonify(number=plate_number, plate_color="")
47+
except:
48+
return flask.jsonify(number="", plate_color="")
49+
50+
51+
if __name__ == '__main__':
52+
app.run(threaded=True, port=8765, host='0.0.0.0')

requirements.txt

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
torch
2+
Pillow
3+
torchvision
4+
pyyaml
5+
imgaug==0.4.0
6+
einops==0.2.0
7+
gdown==4.4.0
8+
prefetch_generator==1.0.1
9+
lmdb==1.0.0
10+
matplotlib
11+
flask
12+
flask_cors
13+
keras
14+
opencv-python
15+
tensorflow
16+
scikit-learn
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import cv2
2+
import numpy as np
3+
4+
5+
def predict_from_model(image, model, labels):
6+
image = cv2.resize(image, (80, 80))
7+
image = np.stack((image,)*3, axis=-1)
8+
prediction = labels.inverse_transform([np.argmax(model.predict(image[np.newaxis, :]))])
9+
return prediction

src/detect_and_recognize.py

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import base64
2+
import cv2
3+
import numpy as np
4+
from keras.models import model_from_json
5+
from PIL import Image
6+
LP_DETECTION_CFG = {
7+
"wpod-net_update1.json": "./src/weight_folder/wpod-net_update1.json",
8+
"wpod-net_update1.h5": "./src/weight_folder/wpod-net_update1.h5"
9+
}
10+
11+
def load_wpod_net_model():
12+
try:
13+
#path = splitext(path)[0]
14+
with open(LP_DETECTION_CFG["wpod-net_update1.json"], 'r') as json_file:
15+
model_json = json_file.read()
16+
model = model_from_json(model_json, custom_objects={})
17+
model.load_weights(LP_DETECTION_CFG["wpod-net_update1.h5"])
18+
print("[INFO] Wpod-Net_update1.h5 loaded successfully...")
19+
return model
20+
except Exception as e:
21+
print(e)
22+
23+
#convert base64-type to raw image
24+
def cvtBase64(base64Img):
25+
try:
26+
base64Img = np.fromstring(base64.b64decode(base64Img), dtype=np.uint8)
27+
base64Img = cv2.imdecode(base64Img, cv2.IMREAD_COLOR)
28+
except:
29+
return None
30+
return base64Img
31+
32+
def paddingImg(inputImg, resize=False):
33+
padding = np.zeros([inputImg.shape[1], inputImg.shape[1], 3])
34+
a = int((inputImg.shape[1] - inputImg.shape[0]) / 2)
35+
padding[a:(inputImg.shape[0] + a), 0:inputImg.shape[1], :] = inputImg
36+
inputImg = cv2.resize(inputImg, (480, 480))
37+
inputImg = inputImg / 255
38+
if resize:
39+
inputImg = cv2.resize(inputImg, (720, 720))
40+
return inputImg
41+
42+
def sort_contours(cnts, reverse=False):
43+
i = 0
44+
boundingBoxes = [cv2.boundingRect(c) for c in cnts]
45+
(cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes), key=lambda b: b[1][i], reverse=reverse))
46+
return cnts
47+
48+
# image_count = 47176
49+
50+
def get_plate_numbers_for_rec_plate(plate_image):
51+
# global image_count
52+
# image_count = image_count + 1
53+
padding = np.zeros([470, 470, 3])
54+
padding[180:290, 0:470, :] = plate_image
55+
# padding = cv2.cvtColor(np.float32(padding), cv2.COLOR_BGR2GRAY)
56+
# padding = cv2.merge((padding, padding, padding))
57+
cv2.imwrite("temp.jpg", padding)
58+
padding_resize = Image.fromarray(np.uint8(padding)).convert('RGB')
59+
# path = "/home/vdtc/ALPR/test_components/data_2022_03_29/plate_image_train/%d.jpg" % image_count
60+
# padding_resize.save(path)
61+
return padding_resize
62+
63+
64+
def get_plate_numbers_for_square_plate(plate_image):
65+
# global image_count
66+
# image_count = image_count + 1
67+
padding = np.zeros([470, 470, 3])
68+
padding[135:335, 95:375, :] = plate_image
69+
padding_resize = Image.fromarray(np.uint8(padding)).convert('RGB')
70+
# path = "/home/vdtc/ALPR/test_components/data_2022_03_29/plate_image_train/%d.jpg" % image_count
71+
# padding_resize.save(path)
72+
return padding_resize
73+
74+
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)