From e14915f1dfccfe89c2be231fe935bc0ceff18cdd Mon Sep 17 00:00:00 2001 From: Marcin Czerniak Date: Mon, 21 Jun 2021 12:03:27 +0200 Subject: [PATCH] feat: neural network interface --- src/{Lhidden_test.npy => Lhidden.npy} | Bin src/{Lweights_test.npy => Lweights.npy} | Bin src/index.html | 8 ++--- src/logic/agent.js | 1 + src/main.py | 23 ++++++++++++++ src/neural_network.py | 21 +++++++------ src/user_input/file-0.png | Bin 0 -> 399 bytes src/user_input/file-1.png | Bin 0 -> 612 bytes src/user_input/file-2.png | Bin 0 -> 574 bytes src/user_input/file-3.png | Bin 0 -> 684 bytes src/user_input/file-4.png | Bin 0 -> 542 bytes src/user_input/file-5.png | Bin 0 -> 545 bytes src/user_input/file-6.png | Bin 0 -> 686 bytes src/user_input/file-7.png | Bin 0 -> 477 bytes src/view/ordersView.js | 38 ++++++++++++++++++++++-- 15 files changed, 76 insertions(+), 15 deletions(-) rename src/{Lhidden_test.npy => Lhidden.npy} (100%) rename src/{Lweights_test.npy => Lweights.npy} (100%) create mode 100644 src/user_input/file-0.png create mode 100644 src/user_input/file-1.png create mode 100644 src/user_input/file-2.png create mode 100644 src/user_input/file-3.png create mode 100644 src/user_input/file-4.png create mode 100644 src/user_input/file-5.png create mode 100644 src/user_input/file-6.png create mode 100644 src/user_input/file-7.png diff --git a/src/Lhidden_test.npy b/src/Lhidden.npy similarity index 100% rename from src/Lhidden_test.npy rename to src/Lhidden.npy diff --git a/src/Lweights_test.npy b/src/Lweights.npy similarity index 100% rename from src/Lweights_test.npy rename to src/Lweights.npy diff --git a/src/index.html b/src/index.html index 9571bf5..6a3eae7 100644 --- a/src/index.html +++ b/src/index.html @@ -14,6 +14,8 @@ + + @@ -27,7 +29,6 @@ - @@ -316,11 +317,10 @@
-
- -
+
+
diff --git a/src/logic/agent.js b/src/logic/agent.js index 5ca2fa5..8ea4c0b 100644 --- a/src/logic/agent.js +++ b/src/logic/agent.js @@ -10,6 +10,7 @@ class Agent extends AgentController { const cycle = async () => { try { const jobRequest = Products.instance.getJobRequest(); + console.log(jobRequest); if (jobRequest) { await this.takeFromStore(jobRequest.product, jobRequest.amount); await this.deliver(jobRequest.x, jobRequest.y); diff --git a/src/main.py b/src/main.py index ebb4a4f..a478a01 100644 --- a/src/main.py +++ b/src/main.py @@ -1,5 +1,6 @@ from flask import Flask, redirect, jsonify, request import decision_tree +from neural_network import * app = Flask( __name__, @@ -31,6 +32,28 @@ def api_predict_shelf(): return jsonify([ n2t['polka'][clf.predict([X]).tolist()[0]] ]) +@app.route('/api/neural', methods=['POST']) +def naural(): + length = int(request.form['length']) + print(length) + + data = list() + + for fileIndex in range(length): + file = request.files[f'file-{fileIndex}'] + file.save(f'user_input/file-{fileIndex}.png') + data.append(f'user_input/file-{fileIndex}.png') + + return jsonify(testCase(data)) + + # try: + # return("Image uploaded") + # print("Image uploaded") + # except Exception as err: + # print("Error occurred") + # print(err) + # return("Error, image not received.") + @app.route('/') def index(): return redirect('/index.html') diff --git a/src/neural_network.py b/src/neural_network.py index e6e3957..48243f6 100644 --- a/src/neural_network.py +++ b/src/neural_network.py @@ -30,8 +30,8 @@ class NeuralNetwork: self.weights = (np.random.rand(self.hnodes, self.inodes) - 0.5) self.hidden = (np.random.rand(self.onodes, self.hnodes) - 0.5) """ używane przy pobieraniu danych o nauczonej sieci, z pliku """ - # self.weights = np.load(fileWeight) - # self.hidden = np.load(fileHidden) + self.weights = np.load(fileWeight) + self.hidden = np.load(fileHidden) self.lr = learningGrade @@ -136,23 +136,26 @@ li = [] ourOwnDataset = [] record_cache = None def testCase(inputWord): - len = len(inputWord) + length = len(inputWord) word = "" - for i in range(0,len-2): - imgArray = imageio.imread(imageFileName, as_gray=True) + for i in range(0, length): + imgArray = imageio.imread(inputWord[i], as_gray=True) imgData = 255 - imgArray.reshape(784) imgData = (imgData/255 * 0.99) + 0.01 #inputWord[i] - word = word + recognizeLet(letterNetwork ,imgData) - word = word + recognizeNum(digitNetwork, inputWord[-2]) - word = word + recognizeNum(digitNetwork ,inputWord[-1]) + + if i < length - 2: + word = word + recognizeLet(letterNetwork, imgData) + else: + word = word + recognizeNum(digitNetwork, imgData) #assert record_cache.shape == ourOwnDataset[0].shape #labelInput = np.asfarray(li) #print(labelInput) print('slowo: ', word) + return word pass @@ -234,5 +237,5 @@ print('slowo: ', word) ##################################### URUCHOMIENIE TRENINGU -trainNetwork(letterNetwork, "Lweights_test.npy", "Lhidden_test.npy", let_train_images, let_train_labels) +# trainNetwork(letterNetwork, "Lweights_test.npy", "Lhidden_test.npy", let_train_images, let_train_labels) # trainNetwork(digitNetwork, "Dweights_test.npy", "Dhidden_test.npy", let_train_images, let_train_labels) \ No newline at end of file diff --git a/src/user_input/file-0.png b/src/user_input/file-0.png new file mode 100644 index 0000000000000000000000000000000000000000..5687b2536278ba93efa268e590b8f210a8b1cdea GIT binary patch literal 399 zcmV;A0dW3_P)@5XQg!X;gw5LOLHtqIr%Kf{hSJVHXlXY(jb~AHfGm3_d{WJV3e>BHCIc$1I$1 zp4_o=Zs9o)vV_e1_WO2rq^4;a2n^{B{A;)WxuwVB5u42h?RFcQropyt$g+&OuG#yu z!6ivTp64jbl6^m)&u||SqQ%r5}+W*sYrH$EyGU002ovPDHLkV1lLdw9o(m literal 0 HcmV?d00001 diff --git a/src/user_input/file-1.png b/src/user_input/file-1.png new file mode 100644 index 0000000000000000000000000000000000000000..207b1e1ad8e8fa905499288dc6b6abe9da5b35e4 GIT binary patch literal 612 zcmV-q0-ODbP)N3gb(f10t0{Kzr&wv1 z#ncWvxJmf+Jhipj%-2Z2!#>AvpXdGR{r-HO=Xi)b_&D3wZJ zv)SMF?u>La8bPnuBb`puS#GP5!!{Pi6NKW0{++a4Fq1Wqe1=eac zI2;Z{qfw+%sjYoG9g>qI)Oc1T=EBoZW(NyK6?Do*aGMx&wIX|Y(23nXeHk%-1g z+>#>qEgp|!GMPXsl^!3M&1Mk{2GQ+ysoU%8Ymmpi*=#bJ-(HcD=H+rposeIaSS&`N zP{4FLg+L%+#V!Sl(qV;+mHk*y!#o=)Hv9U~{djpBE y&*y_ep+F=OVaoaF`xS6+%BKT=z(dme_Uu0)e;T~_F~&In0000S->P)yU}JfNEQ}kp)3ZJg_sz8mX8cl%Am;C z(|yYJQ=l?s`bzlGc@E(uH1OKpi-$1V2{y!~kG#V%r3UD|a zkV>V{>-A8p)t|&44hK}LRkT_yBoYZI6pBx47%2>g!^q`wIGs+k!R>Z~N~MBKCZqS4 z%LPKA5cByQ=kpmn9uJ*P2Ue@~Js<)7xJZX$v50&=kK^(96DSY}u;1^o-EOJ+<#I{E zzZWBgOoBs{xm+&v`+f9!J!rMsr>}7Wyk4*H`~4`F%Sflw2m}Iu{6EEWs5Kr(MirIN<~Sq%mQm`o;a_psaT(itN`X*Qe4X0vqOh}w8O4nCjHEs%7Z z&1TT)bZ|PIsMTsOZTxk?TcNSr?HCS+SS%LwY-LldfMf(BkqA<$6diCfdu)ppaI@LK zU@*XJHltpzLo61v<$*DfoRvnS5v$dT+DZ2Coni#M-|z5xy(pDRbjaOq_d6{54kO@t zy@p1kfk-66Znt9{l($kkolYTt<8 literal 0 HcmV?d00001 diff --git a/src/user_input/file-3.png b/src/user_input/file-3.png new file mode 100644 index 0000000000000000000000000000000000000000..5b6b1ae14131679a7d54bdb94015decf32a38d4e GIT binary patch literal 684 zcmV;d0#p5oP)G{WC+_79ujjMh)!u9Bz~u)&&OM)V&OLv4lgVU)Zxr4S@Ly+}Go|Hn z8P#ePLZJ|Y!2qMt2z)*t0?!E@B*Xyv^Y-qJw*xlX5<>e*BV(|x~B+~u;eN-wHJU%|cU@$O2ry_iK zc%WVrDHe;^-rk;R=;h@F>+9}1F~Nw^+!2xqb8>P*drzfOq0wm2wqTXHfCT1rI&pDvfvv4Alu9K! z^5zj{;QjqQO(E$ypU+1NMJkof!=k#Jz_+(IM59q8lS#;AGF)9#1R)M~WtuO5ybM6o-e0ivhh}FV4@; z>E+)C0NH`$Twh<){tE_!$mMdhfMT&2Cv0X)!{IP33^Kr%mzTlg@hFJwKawbiH2Ve!t^%Izgw? z!Rd5DlBE9@E~}85H=oa=)oL;9GptrCZnqmsr4n+v9JE@k5L^~`I2_<`IAAmyQ7jg* z*=*2kHaYoryJgjj#e&y}ge>rQJaV!`B7u6n{zpza%x<@X&1Mr}@mg6Rm63p{R0_3P zO*paKhL^x}I*n?z`gOoeCWCUh{C?o)9TKoosk|Tfcs$_sdf9u8MuWSOETGY7aJ^pP zcDvb=qM`WGM59sk`~AP>q{B?7Q&FCLmr|y1IE?Xl%>L8s^{kdup3i3lgF*OwK6QbS zNCdOl46D^jII*xTXhSlYM5oi?(z#qNRiKJ@*z5HWi^aICfk5E>z;?UMDu=@%-=`X( zsIc4ZA|8)pG#Vik3aPbD&gXM} z0B9J~x5;Dzv)TOeOp3tea*0Brfc<_CgTVlL?#PD(v{)?g`~7?XyWP%X>|g!_zTZF1 g%NhwT`1uMy05gdlymMM|w*UYD07*qoM6N<$f5OR0@ei0@v&HkHGu=4v9phY$mMcgL8sG+Znule~=e3GTAS}Znv8Pi3_Y^#$rC7BN~ljFc{Ddlu9K?M^dR29LGVS zP|!H6Rx9N5dCId`EYRt6ylf`$$FAe?h(@DZ{;R;IDA2}%%bQ-u^MOeI*@ zh@yp!SSVOn_yF+%CNazb1G`!Ex``>49k^V#s34rga)I5{~%BobkHe~Puh>2%6~KA#V%R0_AZw|IPf z#Ar0a%gYP8-7W*mWHP8!D$s7JFe<9qY(gv+?*^PqCeUiN@Or(-WHO%~p3mnDNDB)D z0#HY&5ZbX^E??W;wL4q^JsuD4?(R6fA1+B-fi9N|*=&}}TAXs$0;xR)gMqcG-|ur; zj7!qSu`rv>Xt&!;`V^$bl@ro$KA+Ep@k`D|;PLS>8jS{1;R^Wn_Qt>@dyB<_tE($E z3S46&@agFZp->1%M@MW#Xy{3uq)IBJUavEy68Pcafz9H!_>y^dIvw2H+%Odrv{)=c zBob|8ehIi*`TF`A@pv4uSPY3oV*fxAl2j^%)oMkdP}o0^2o8q>gTVl`TJ2|mCXeT8@=&VMX0vU4kesMoF2ioOv(cdZd_KRsO6e%NxVS(t z7-UD%?=q)3q#ac%6?P<%U}#>QPA4;jZSiR==)AkUyhJ*kW&=*w%FgIcPD6LKT8;Db zbGY4Z==FL|Fy>b4zS>Hq5}u!*Km2k9qXPVXKPOk&>BQgGn!o-3TbyPW_`eT)2kQT8 Uyr_inDgXcg07*qoM6N<$f};97a{vGU literal 0 HcmV?d00001 diff --git a/src/user_input/file-7.png b/src/user_input/file-7.png new file mode 100644 index 0000000000000000000000000000000000000000..5d1bf1ed1ba66a0a37ae0057d52706f8ac70906d GIT binary patch literal 477 zcmV<30V4j1P)6;^oJnYEOCi4aB^u1-CCN8s32M*XsRKCC~AzL2*l9_ z2cgow zjYPV!4ezkjXy&<*Uc+_l#MT6v!GW@Y2k|($dW8{;qZ2Q18#fw()^oTW)5+0QJg*WC zhaYjNEZ`ALpf}a4TK6gX(1yiaXg!B-aSppM{};iN7)^DYEd%%gD>z?6ES!DAGh8VH zxZaKR;`)L=I93KQM#8B$w zx&IA3gwObnc+Oh?5@{<=AVytGqr@F=7%H6OA*>gl4 T*>Cgc00000NkvXXu0mjfK!4Q0 literal 0 HcmV?d00001 diff --git a/src/view/ordersView.js b/src/view/ordersView.js index da4ff70..661b57a 100644 --- a/src/view/ordersView.js +++ b/src/view/ordersView.js @@ -3,6 +3,9 @@ class OrdersView { constructor() { OrdersView.instance = this; + this.orders = []; + this.lastRecognizedText = ''; + this.addMultipleCanvases(10); } @@ -23,6 +26,8 @@ class OrdersView { canvas.height = 28; const ctx = canvas.getContext('2d'); + ctx.fillStyle = 'white'; + ctx.fillRect(0, 0, 28, 28); ctx.drawImage(img, 0, 0, 28, 28); canvas.toBlob((blob) => { @@ -34,13 +39,17 @@ class OrdersView { }); }); }) - ).then(async () => { + ).then(async (res) => { + formData.append('length', res.length); + const response = await fetch('/api/neural', { method: 'POST', body: formData }); //const json = await response.json(); - console.log(await response.text()); + const res_ = (await response.text()).replace(/[\"]{1,}/g, ''); + document.querySelector('.response').innerHTML = res_; + this.lastRecognizedText = res_; }); } @@ -115,4 +124,29 @@ class OrdersView { ctx.stroke(); } } + + addOrderByLastRecognizedString() { + this.addOrderByString(this.lastRecognizedText); + } + + addOrderByString(str) { + const numberStr = str.substring(str.length - 2, str.length); + const text = str.substring(0, str.length - 2); + const number = parseInt(numberStr); + + this.orders.push({ + product: Product.REGISTRY[text], + amount: number, + x: 11, + y: 7, + }); + + this.closeWindow(); + } + + getOrder() { + if (!this.orders.length) return null; + + return this.orders.shift(); + } } \ No newline at end of file