From f22ea02e59082347ace5049e05afc2e19d26f2d5 Mon Sep 17 00:00:00 2001 From: Stef Date: Fri, 25 Apr 2025 16:33:01 +0200 Subject: [PATCH] refactoring + execution time --- application/__init__.py | 5 ++ .../__pycache__/__init__.cpython-313.pyc | Bin 667 -> 734 bytes .../__pycache__/models.cpython-313.pyc | Bin 0 -> 1941 bytes .../image_processing.cpython-313.pyc | Bin 0 -> 869 bytes .../api/__pycache__/views.cpython-313.pyc | Bin 0 -> 1495 bytes application/api/image_processing.py | 16 ++++++ application/api/views.py | 31 ++++++++++- image.jpg | Bin 34129 -> 18236 bytes instance/data.sqlite | Bin 32768 -> 57344 bytes seed.py | 2 +- server.py | 52 ++---------------- 11 files changed, 55 insertions(+), 51 deletions(-) create mode 100644 application/__pycache__/models.cpython-313.pyc create mode 100644 application/api/__pycache__/image_processing.cpython-313.pyc create mode 100644 application/api/__pycache__/views.cpython-313.pyc create mode 100644 application/api/image_processing.py diff --git a/application/__init__.py b/application/__init__.py index 37f224d..eb55496 100644 --- a/application/__init__.py +++ b/application/__init__.py @@ -1,6 +1,7 @@ from flask import Flask from flask_migrate import Migrate from flask_sqlalchemy import SQLAlchemy +from pyplatex import ANPR # type: ignore # Web Server app = Flask(__name__) @@ -8,7 +9,11 @@ app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///data.sqlite" app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False app.config["SECRET_KEY"] = "bvjchsygvduycgsyugc" + # ORM db = SQLAlchemy(app) migrate = Migrate(app, db) + +# ANPR instance +anpr = ANPR() diff --git a/application/__pycache__/__init__.cpython-313.pyc b/application/__pycache__/__init__.cpython-313.pyc index f5f2e628e42de7b75a3cb758bfb59bb0454eb1ed..a67508c6877d8a2fa0601de913cbbd2b3ac2f98f 100644 GIT binary patch delta 304 zcmbQudXJU&GcPX}0}%Y^<<2-bkyn!O+(dQF`e24&7H>8$_9Au#h8RXAh8PZ0Mvy87 zh9b^j))>wp5eN^N3}#aYa)a4%$Z~*XIdRBxfn;M?fi`ghZPEstTf`m13=)XpHf4fX zRKyd*uEbyp;V=~OrgLlZOnjiup~-lQ#nCSyXfiuv2_xU+8b(X5g35xN#FEsCBDTpJ z7}eQsu_Wdd6ivR)7$zqH)DH4YaR!k1z|6?Vc$Y!^E`#D-2KBoPl9N4{EEqW^H!=we UG_ZeUW8mOvE^A~d5(BCQ09au%IsgCw delta 253 zcmcb|I-8aEGcPX}0}yb3W6vm>$ScXXWum%feGH=#LkycKBS?mUp@==0C5Amn0K!8i zgIU#q++a2wvg}}44ji(aAlVpJpiS&>n>b^bfqX&s7*10rh($$Q>0FxJ6Mv~s)?_SU z$u||b_{&vomkz&Aj=| z>*R780s7@(_Ol_0kl*kpA>~BqFc5YKB~-Xg76~I`D2um+MUjbP#M>`eRnKI>5trBU|pjFRkQ`L;29if{caJ6EGPUzMgki|-=jOv6=liUW) z4lxN6C}AQMm_$V;o60>s+1g#l3F!0P|3so9m9C3S{THwPWN&wc^5tnE{-+8}K?IGa zS+=Sg8Lr&*Ao(M_mt{ylyUyI2%{HvhosFY6K{9A2=*9gRsl+M9j~EKUyTHCCt%2d@ zomM8hRoE={8Wl&M#!4HCa@l= zvEFLd$Z_pXy;^lD3!zgx!XEH!R}suHoK-_)S+wM#DPKCwsyM55!wcCEC>f3#PureX zf8bQgh=PPf5YXB|(Cv_wUN5nbm8;$fdI?z>^KfTGRdOH{4JnTN8mPF2gBWLI$XpH_ zZ?$_a!z}@xIR?ZE=m1c5eHReP2fBq^NtAu)FaWGc+Bz8;eWbO9FFn#*Bjb;IqK3oa z7?h18!vc$jFlY3!9RB0{vL0l;zk)DhYSb8Me0 ztF{Ms7!@YL=q1|P1Xz4Lo_r4bNuN4zfaR~)M_f*cR7Q-k6jfNdnljQ{|0o7W{4Bi! zt~_^E6-4)3PJ)A-pd3L5@A*7*s)Stz<$(}+0W>GzFOmcFI)OoSoqX`@F{c=aK!ao4 zB(1@b$68$MJD?~U>fbe*VY%!rWdGQux6z6W>x&SEU7BbvwPisW-7CK&u*4_fuA-5S zo1Z=Ng2ivBvV`wg{Dwunk3ydZ1y|pXU+E7Rjy%p%^vty-K@eV$S6`5kV^tESznR^d fe>i_kKs?rS!o>FAF@fcHOcqABr~e?ZL^=Hlm`;j) literal 0 HcmV?d00001 diff --git a/application/api/__pycache__/image_processing.cpython-313.pyc b/application/api/__pycache__/image_processing.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6701ef09fed05b28b41eecf8623f67b90189ea7b GIT binary patch literal 869 zcmYjQ&r2IY6n?Y6OpMW_qLg4|O?&8uYA-E?QVJ<8Z4{!o&B>LJtYfm8{lV<4lAJ<& z=~)n^rykos!~Z~0Xql!^s26XR&_i#XN!{p!o%g->X1?#u+ueRTJqq0XkE!M!0{A6@ z*pw^KFL1CACYWdm77;yUi)p2VL z%rt^&L_C|z3{6P9=TE=Km%E^InYCfvM31kq4r@|;W;JdrPH>-x3dDOobb~>Pvz$ST z53D9)bnQ9AP_4wT*OUQv(7s$&$H0>+l061DJCm<@8_HTL=BY@gs`4PN-h%{`=bp%$ z$k582DYLfYcny8iX8r3hD3UCf5i<(c`EmhW=qbtL(YZ4v-^)%OE}r1WaM@)kv<+@I7>YIHjzC~jelq#&Yn!% zKTR3Oit#%Q*@eI1Ew1pcs1+ZeqXa4zl%r&xV?M6bjlKtSBH}M#YF&(uq&Xh6`33qM y0?CMC;+gAjL@oTBO!H8DnBgp6E@gz!519E5$xAJT3Ww1paQAugk8os)Z}|u6M#?Av literal 0 HcmV?d00001 diff --git a/application/api/__pycache__/views.cpython-313.pyc b/application/api/__pycache__/views.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f61e311e97a4f37016905b8f34af92380560eea5 GIT binary patch literal 1495 zcmah}O>Y}T7@qy~_arOXZZ7!l@9;$Ub-QbJEO5kIkmTE4t3m~{XVV1a_1H!N!MVt&w>_t2;oD-7 z<%ql2^y?6gbuIs<*CNf?BM^#%0sTdjk2%)M+B8<>r*H~fR1+hk8nF;LU|mDCL}cy( zD<$p{RAs~EY9XHtSJP~Mc2wt{wVAcY>3oT+F8n(Zbz4VQIhU_xql{`ULbJ8HJi`&H zosZCsY;7gN)#oELTi2${>Ox6~UZbM_IrBgC65Sd0z8KZl#XVk^3Vc-eC6t#dz?2lx zErs0X1meurku3b0GUeB?crVj@Kwv7*LYo8Q){jhX6F%6L~U>cymQrY{PpKK1c4ioeD zS3h0-^4*8I(PH6IqBywxR7P{FV?`Y)>R4GHDeK>6hsyd;d3CI8jFgQ>%I42oL*>d~ z`%skcX?L}ImAjS0c=kc|hYx?e^WB~AKN`i~ek$;i427f^%NUD`BXRK;aTz@6bH6Va ze_gupL=qCoi6EurVZgAO+wGii$TWeO)@i(6cg?O str: + print("Saving file to memory") + image_file = io.BytesIO(image) + + print("Processing image") + anpr_info = await anpr.detect(image_file) # type: ignore + + if anpr_info is None: + print("Something went wrong with ANPR") + return "" + + return str(anpr_info["plate_number"]) diff --git a/application/api/views.py b/application/api/views.py index 0c1eed7..69496b1 100644 --- a/application/api/views.py +++ b/application/api/views.py @@ -1,3 +1,30 @@ -from flask import Blueprint +from flask import Blueprint, request, jsonify +from application import db +from application.models import AllowedPlate, LoggedItem +from application.api.image_processing import process_image +from datetime import datetime +import asyncio -api_blueprint = Blueprint('api', ) \ No newline at end of file +api_blueprint = Blueprint("api", __name__, template_folder="templates") + + +# API to process vehicle +@api_blueprint.route("/api", methods=["POST"]) +def data(): + data = request.data + np = asyncio.run(process_image(image=data)) + + # Check if the found plate is allowed to exit + allowed = AllowedPlate.query.filter_by(plate=np).first() is not None + db.session.add( # Log the found numberplate and status + LoggedItem(plate=np, allowed=allowed, datetime=datetime.now()) + ) + db.session.commit() + + # Return decision to Pico + return jsonify( + { + "message": "Image sent succesfully", + "status": allowed, + } + ) diff --git a/image.jpg b/image.jpg index 80f57d6abd55680df56a3cff13bfebbc6d7b93c2..e80034ce725683cbeb3158eaeb44d6cd0869022a 100644 GIT binary patch delta 17912 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 z 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 sERC`GtpkN^!ExHT>t`t|TwEzGB delta 33930 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 diff --git a/instance/data.sqlite b/instance/data.sqlite index 049201d8704ffaef1d3dca190f9d990cc47b0564..db3d94296ee1e3d44910f7de6bca4be6806da1a8 100644 GIT binary patch literal 57344 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 delta 73 zcmZoTz}(QlG(n1u;T;151II)KJ0^yA8xxk;^Dyy$1&T0m@c-ujx>+FLDgWlL{`?Be d%3S4>*$dn^HfnM)t2Sm#PD~Wp+*eh^3IH@G7aafq diff --git a/seed.py b/seed.py index dab44f6..effaa52 100644 --- a/seed.py +++ b/seed.py @@ -1,5 +1,5 @@ from application import db, app -from models import AllowedPlate +from application.models import AllowedPlate with app.app_context(): db.session.add(AllowedPlate("MUN389")) diff --git a/server.py b/server.py index d650206..775912f 100644 --- a/server.py +++ b/server.py @@ -1,22 +1,14 @@ -from flask import request, jsonify -from pyplatex import ANPR # type: ignore from ultralytics.nn.tasks import DetectionModel # type: ignore -import os import torch -import asyncio -from application import app, db -from application.models import LoggedItem, AllowedPlate -from datetime import datetime +from application import app +from application.api.views import api_blueprint + torch.serialization.add_safe_globals( # type: ignore {"DetectionModel": DetectionModel} # type: ignore ) -anpr = ANPR() - -# Saving images locally -UPLOAD_FOLDER = "uploads" -os.makedirs(UPLOAD_FOLDER, exist_ok=True) +app.register_blueprint(api_blueprint) # Default app route @@ -25,41 +17,5 @@ def home(): return "Hello, World!" -# API to process vehicle -@app.route("/api", methods=["POST"]) -def data(): - data = request.data - - with open("image.jpg", "wb") as f: - f.write(data) - - status = asyncio.run(process_image(file="image.jpg", anpr=anpr)) - return jsonify( - { - "message": "Image sent succesfully", - "status": status, - } - ) - - -async def process_image(file: str, anpr: ANPR) -> bool: - print("Processing image") - anpr_info = await anpr.detect(file) # type: ignore - number_plate = anpr_info["plate_number"] - if number_plate: - allowed = ( - AllowedPlate.query.filter_by(plate=number_plate).first() - is not None - ) - db.session.add( - LoggedItem( - plate=number_plate, allowed=allowed, datetime=datetime.now() - ) - ) - db.session.commit() - return allowed - return False - - if __name__ == "__main__": app.run(host="192.168.137.1", port=2222, debug=True)