JapanKanji
2267 строк · 138.3 Кб
1{
2"cells": [
3{
4"cell_type": "code",
5"execution_count": 1,
6"metadata": {},
7"outputs": [],
8"source": [
9"import datetime\n",
10"import sys, os\n",
11"\n",
12"import cv2 as cv2\n",
13"import numpy as np\n",
14"import pandas as pd\n",
15"import matplotlib.pyplot as plt\n",
16"import skimage.transform"
17]
18},
19{
20"cell_type": "code",
21"execution_count": 2,
22"metadata": {},
23"outputs": [],
24"source": [
25"dirData = '../Data'\n",
26"dataTrain = os.path.join(dirData,'train_images')\n",
27"dataTest = os.path.join(dirData,'test_images')\n",
28"dirTrain = dataTrain\n",
29"dirTest = dataTest\n",
30"\n",
31"dataSave = '../Work'\n",
32"dirSave = dataSave\n",
33"dirLoad = dirSave\n",
34"\n",
35"dirPython = '../Python'\n",
36"dirModels = '../Model'\n",
37"dirResul = '../Result'\n",
38"dirLogs = '../Logs'"
39]
40},
41{
42"cell_type": "code",
43"execution_count": 3,
44"metadata": {},
45"outputs": [],
46"source": [
47"#sys.path.append(dirPython)"
48]
49},
50{
51"cell_type": "code",
52"execution_count": 4,
53"metadata": {},
54"outputs": [
55{
56"data": {
57"text/plain": [
58"(3881,\n",
59" 4150,\n",
60" ['100241706_00004_2.jpg',\n",
61" '100241706_00005_1.jpg',\n",
62" '100241706_00005_2.jpg',\n",
63" '100241706_00006_1.jpg',\n",
64" '100241706_00007_2.jpg',\n",
65" '100241706_00008_1.jpg',\n",
66" '100241706_00008_2.jpg',\n",
67" '100241706_00009_1.jpg'],\n",
68" ['test_00145af3.jpg',\n",
69" 'test_001c37e2.jpg',\n",
70" 'test_003aa33a.jpg',\n",
71" 'test_00665e33.jpg',\n",
72" 'test_006964dc.jpg',\n",
73" 'test_0082d2cd.jpg',\n",
74" 'test_0086f578.jpg',\n",
75" 'test_008bc9f0.jpg'])"
76]
77},
78"execution_count": 4,
79"metadata": {},
80"output_type": "execute_result"
81}
82],
83"source": [
84"ftrain = os.listdir(dataTrain)\n",
85"ftest = os.listdir(dataTest)\n",
86"ftrain, ftest = sorted(ftrain), sorted(ftest)\n",
87"len(ftrain), len(ftest), ftrain[:8], ftest[:8]"
88]
89},
90{
91"cell_type": "code",
92"execution_count": null,
93"metadata": {},
94"outputs": [],
95"source": []
96},
97{
98"cell_type": "code",
99"execution_count": 5,
100"metadata": {},
101"outputs": [
102{
103"data": {
104"text/html": [
105"<div>\n",
106"<style scoped>\n",
107" .dataframe tbody tr th:only-of-type {\n",
108" vertical-align: middle;\n",
109" }\n",
110"\n",
111" .dataframe tbody tr th {\n",
112" vertical-align: top;\n",
113" }\n",
114"\n",
115" .dataframe thead th {\n",
116" text-align: right;\n",
117" }\n",
118"</style>\n",
119"<table border=\"1\" class=\"dataframe\">\n",
120" <thead>\n",
121" <tr style=\"text-align: right;\">\n",
122" <th></th>\n",
123" <th>image_id</th>\n",
124" <th>labels</th>\n",
125" </tr>\n",
126" </thead>\n",
127" <tbody>\n",
128" <tr>\n",
129" <th>0</th>\n",
130" <td>100241706_00004_2</td>\n",
131" <td>U+306F 1231 3465 133 53 U+304C 275 1652 84 69 ...</td>\n",
132" </tr>\n",
133" <tr>\n",
134" <th>1</th>\n",
135" <td>100241706_00005_1</td>\n",
136" <td>U+306F 1087 2018 103 65 U+304B 1456 1832 40 73...</td>\n",
137" </tr>\n",
138" <tr>\n",
139" <th>2</th>\n",
140" <td>100241706_00005_2</td>\n",
141" <td>U+306F 572 1376 125 57 U+306E 1551 2080 69 68 ...</td>\n",
142" </tr>\n",
143" <tr>\n",
144" <th>3</th>\n",
145" <td>100241706_00006_1</td>\n",
146" <td>U+3082 1455 3009 65 44 U+516B 1654 1528 141 75...</td>\n",
147" </tr>\n",
148" <tr>\n",
149" <th>4</th>\n",
150" <td>100241706_00007_2</td>\n",
151" <td>U+309D 1201 2949 27 33 U+309D 1196 1539 27 36 ...</td>\n",
152" </tr>\n",
153" <tr>\n",
154" <th>5</th>\n",
155" <td>100241706_00008_1</td>\n",
156" <td>U+25B2 1056 929 96 39 U+309D 379 1098 21 43 U+...</td>\n",
157" </tr>\n",
158" <tr>\n",
159" <th>6</th>\n",
160" <td>100241706_00008_2</td>\n",
161" <td>U+25B2 1648 955 95 44 U+25B2 1887 947 96 45 U+...</td>\n",
162" </tr>\n",
163" <tr>\n",
164" <th>7</th>\n",
165" <td>100241706_00009_1</td>\n",
166" <td>U+3078 1551 2071 104 41 U+3078 323 1473 135 43...</td>\n",
167" </tr>\n",
168" <tr>\n",
169" <th>8</th>\n",
170" <td>100241706_00009_2</td>\n",
171" <td>U+309D 1452 1423 20 37 U+3078 690 2535 121 41 ...</td>\n",
172" </tr>\n",
173" <tr>\n",
174" <th>9</th>\n",
175" <td>100241706_00010_1</td>\n",
176" <td>U+3078 587 1127 100 40 U+3064 1103 1480 60 45 ...</td>\n",
177" </tr>\n",
178" </tbody>\n",
179"</table>\n",
180"</div>"
181],
182"text/plain": [
183" image_id labels\n",
184"0 100241706_00004_2 U+306F 1231 3465 133 53 U+304C 275 1652 84 69 ...\n",
185"1 100241706_00005_1 U+306F 1087 2018 103 65 U+304B 1456 1832 40 73...\n",
186"2 100241706_00005_2 U+306F 572 1376 125 57 U+306E 1551 2080 69 68 ...\n",
187"3 100241706_00006_1 U+3082 1455 3009 65 44 U+516B 1654 1528 141 75...\n",
188"4 100241706_00007_2 U+309D 1201 2949 27 33 U+309D 1196 1539 27 36 ...\n",
189"5 100241706_00008_1 U+25B2 1056 929 96 39 U+309D 379 1098 21 43 U+...\n",
190"6 100241706_00008_2 U+25B2 1648 955 95 44 U+25B2 1887 947 96 45 U+...\n",
191"7 100241706_00009_1 U+3078 1551 2071 104 41 U+3078 323 1473 135 43...\n",
192"8 100241706_00009_2 U+309D 1452 1423 20 37 U+3078 690 2535 121 41 ...\n",
193"9 100241706_00010_1 U+3078 587 1127 100 40 U+3064 1103 1480 60 45 ..."
194]
195},
196"execution_count": 5,
197"metadata": {},
198"output_type": "execute_result"
199}
200],
201"source": [
202"trainY = pd.read_csv('../Data/train.csv')\n",
203"trainY.head(10)"
204]
205},
206{
207"cell_type": "code",
208"execution_count": null,
209"metadata": {},
210"outputs": [],
211"source": []
212},
213{
214"cell_type": "code",
215"execution_count": null,
216"metadata": {},
217"outputs": [],
218"source": []
219},
220{
221"cell_type": "code",
222"execution_count": 6,
223"metadata": {},
224"outputs": [
225{
226"data": {
227"text/html": [
228"<div>\n",
229"<style scoped>\n",
230" .dataframe tbody tr th:only-of-type {\n",
231" vertical-align: middle;\n",
232" }\n",
233"\n",
234" .dataframe tbody tr th {\n",
235" vertical-align: top;\n",
236" }\n",
237"\n",
238" .dataframe thead th {\n",
239" text-align: right;\n",
240" }\n",
241"</style>\n",
242"<table border=\"1\" class=\"dataframe\">\n",
243" <thead>\n",
244" <tr style=\"text-align: right;\">\n",
245" <th></th>\n",
246" <th>symb</th>\n",
247" <th>x</th>\n",
248" <th>y</th>\n",
249" <th>w</th>\n",
250" <th>h</th>\n",
251" </tr>\n",
252" </thead>\n",
253" <tbody>\n",
254" <tr>\n",
255" <th>0</th>\n",
256" <td>U+306F</td>\n",
257" <td>1231</td>\n",
258" <td>3465</td>\n",
259" <td>133</td>\n",
260" <td>53</td>\n",
261" </tr>\n",
262" <tr>\n",
263" <th>1</th>\n",
264" <td>U+304C</td>\n",
265" <td>275</td>\n",
266" <td>1652</td>\n",
267" <td>84</td>\n",
268" <td>69</td>\n",
269" </tr>\n",
270" <tr>\n",
271" <th>2</th>\n",
272" <td>U+3044</td>\n",
273" <td>1495</td>\n",
274" <td>1218</td>\n",
275" <td>143</td>\n",
276" <td>69</td>\n",
277" </tr>\n",
278" <tr>\n",
279" <th>3</th>\n",
280" <td>U+3051</td>\n",
281" <td>220</td>\n",
282" <td>3331</td>\n",
283" <td>53</td>\n",
284" <td>91</td>\n",
285" </tr>\n",
286" <tr>\n",
287" <th>4</th>\n",
288" <td>U+306B</td>\n",
289" <td>911</td>\n",
290" <td>1452</td>\n",
291" <td>61</td>\n",
292" <td>92</td>\n",
293" </tr>\n",
294" </tbody>\n",
295"</table>\n",
296"</div>"
297],
298"text/plain": [
299" symb x y w h\n",
300"0 U+306F 1231 3465 133 53\n",
301"1 U+304C 275 1652 84 69\n",
302"2 U+3044 1495 1218 143 69\n",
303"3 U+3051 220 3331 53 91\n",
304"4 U+306B 911 1452 61 92"
305]
306},
307"execution_count": 6,
308"metadata": {},
309"output_type": "execute_result"
310}
311],
312"source": [
313"#\n",
314"# heights & weights\n",
315"#\n",
316"aa=[np.array(l.split()).reshape((-1,5)) for l in trainY.dropna().labels]\n",
317"bb=np.vstack(aa)\n",
318"\n",
319"dfClasses = pd.DataFrame()\n",
320"dfClasses['symb'] = bb[:,0]\n",
321"dfClasses['x'] = bb[:,1].astype(np.int16)\n",
322"dfClasses['y'] = bb[:,2].astype(np.int16)\n",
323"dfClasses['w'] = bb[:,3].astype(np.int16)\n",
324"dfClasses['h'] = bb[:,4].astype(np.int16)\n",
325"\n",
326"dfClasses.head()"
327]
328},
329{
330"cell_type": "code",
331"execution_count": 7,
332"metadata": {},
333"outputs": [
334{
335"data": {
336"text/html": [
337"<div>\n",
338"<style scoped>\n",
339" .dataframe tbody tr th:only-of-type {\n",
340" vertical-align: middle;\n",
341" }\n",
342"\n",
343" .dataframe tbody tr th {\n",
344" vertical-align: top;\n",
345" }\n",
346"\n",
347" .dataframe thead th {\n",
348" text-align: right;\n",
349" }\n",
350"</style>\n",
351"<table border=\"1\" class=\"dataframe\">\n",
352" <thead>\n",
353" <tr style=\"text-align: right;\">\n",
354" <th></th>\n",
355" <th>symb</th>\n",
356" <th>hcount</th>\n",
357" <th>hmean</th>\n",
358" <th>hstd</th>\n",
359" <th>wcount</th>\n",
360" <th>wmean</th>\n",
361" <th>wstd</th>\n",
362" </tr>\n",
363" </thead>\n",
364" <tbody>\n",
365" <tr>\n",
366" <th>80</th>\n",
367" <td>U+306B</td>\n",
368" <td>24685</td>\n",
369" <td>81.266964</td>\n",
370" <td>23.367150</td>\n",
371" <td>24685</td>\n",
372" <td>66.787766</td>\n",
373" <td>24.607299</td>\n",
374" </tr>\n",
375" <tr>\n",
376" <th>83</th>\n",
377" <td>U+306E</td>\n",
378" <td>24136</td>\n",
379" <td>79.463913</td>\n",
380" <td>23.876515</td>\n",
381" <td>24136</td>\n",
382" <td>82.174428</td>\n",
383" <td>23.512733</td>\n",
384" </tr>\n",
385" <tr>\n",
386" <th>60</th>\n",
387" <td>U+3057</td>\n",
388" <td>22209</td>\n",
389" <td>124.199514</td>\n",
390" <td>50.427857</td>\n",
391" <td>22209</td>\n",
392" <td>33.656761</td>\n",
393" <td>27.332906</td>\n",
394" </tr>\n",
395" <tr>\n",
396" <th>75</th>\n",
397" <td>U+3066</td>\n",
398" <td>20569</td>\n",
399" <td>95.881278</td>\n",
400" <td>24.440175</td>\n",
401" <td>20569</td>\n",
402" <td>67.325247</td>\n",
403" <td>21.920820</td>\n",
404" </tr>\n",
405" <tr>\n",
406" <th>77</th>\n",
407" <td>U+3068</td>\n",
408" <td>16588</td>\n",
409" <td>83.424463</td>\n",
410" <td>21.888026</td>\n",
411" <td>16588</td>\n",
412" <td>43.707499</td>\n",
413" <td>13.900656</td>\n",
414" </tr>\n",
415" </tbody>\n",
416"</table>\n",
417"</div>"
418],
419"text/plain": [
420" symb hcount hmean hstd wcount wmean wstd\n",
421"80 U+306B 24685 81.266964 23.367150 24685 66.787766 24.607299\n",
422"83 U+306E 24136 79.463913 23.876515 24136 82.174428 23.512733\n",
423"60 U+3057 22209 124.199514 50.427857 22209 33.656761 27.332906\n",
424"75 U+3066 20569 95.881278 24.440175 20569 67.325247 21.920820\n",
425"77 U+3068 16588 83.424463 21.888026 16588 43.707499 13.900656"
426]
427},
428"execution_count": 7,
429"metadata": {},
430"output_type": "execute_result"
431}
432],
433"source": [
434"dfCount = dfClasses[['symb','h','w']].groupby(['symb']).agg(['count','mean','std'])\n",
435"dfCount = dfCount.reset_index()\n",
436"dfCount.columns = ['symb','hcount','hmean','hstd','wcount','wmean','wstd']\n",
437"dfCount = dfCount.fillna(0)\n",
438"dfCount.sort_values(['hcount'], ascending=False).head()"
439]
440},
441{
442"cell_type": "code",
443"execution_count": null,
444"metadata": {},
445"outputs": [],
446"source": []
447},
448{
449"cell_type": "code",
450"execution_count": 8,
451"metadata": {},
452"outputs": [
453{
454"name": "stdout",
455"output_type": "stream",
456"text": [
457"(4212,)\n"
458]
459},
460{
461"data": {
462"text/plain": [
463"array(['U+306B', 'U+306E', 'U+3057', 'U+3066', 'U+3068', 'U+3092',\n",
464" 'U+306F', 'U+304B', 'U+308A', 'U+306A', 'U+3082', 'U+3044',\n",
465" 'U+308B', 'U+3089', 'U+305F', 'U+304F', 'U+3078', 'U+307E',\n",
466" 'U+304D', 'U+308C'], dtype=object)"
467]
468},
469"execution_count": 8,
470"metadata": {},
471"output_type": "execute_result"
472}
473],
474"source": [
475"classes_all = dfCount.sort_values('hcount',ascending=False)[['symb']].values.squeeze()\n",
476"print(classes_all.shape)\n",
477"classes_all[:20]"
478]
479},
480{
481"cell_type": "code",
482"execution_count": 9,
483"metadata": {},
484"outputs": [
485{
486"data": {
487"text/plain": [
488"4212"
489]
490},
491"execution_count": 9,
492"metadata": {},
493"output_type": "execute_result"
494}
495],
496"source": [
497"classes = classes_all[0:500]\n",
498"classes = classes_all\n",
499"len(classes)"
500]
501},
502{
503"cell_type": "code",
504"execution_count": null,
505"metadata": {},
506"outputs": [],
507"source": []
508},
509{
510"cell_type": "code",
511"execution_count": 10,
512"metadata": {},
513"outputs": [],
514"source": [
515"shape_net = np.array((1024, 512+256, 1))\n",
516"shape_net = np.array((1024+512, 512+512, 1))\n",
517"\n",
518"n_anchors = 4\n",
519"\n",
520"dirSaveX = os.path.join(dirSave,'{shape[0]}x{shape[1]}x{shape[2]}'.format(shape=shape_net)); \n",
521"dirLoadX = dirSaveX\n",
522"\n",
523"batch_size= 8"
524]
525},
526{
527"cell_type": "code",
528"execution_count": null,
529"metadata": {},
530"outputs": [],
531"source": []
532},
533{
534"cell_type": "code",
535"execution_count": 11,
536"metadata": {},
537"outputs": [],
538"source": [
539"anchors_net = np.load(os.path.join(dirSaveX,'anchors_net.npy'))"
540]
541},
542{
543"cell_type": "code",
544"execution_count": null,
545"metadata": {},
546"outputs": [],
547"source": []
548},
549{
550"cell_type": "code",
551"execution_count": 12,
552"metadata": {},
553"outputs": [
554{
555"data": {
556"text/plain": [
557"array([[ 12.87340051, 14.71878874],\n",
558" [ 29.01291339, 62.38006796],\n",
559" [ 64.06123873, 59.79107683],\n",
560" [ 89.22370175, 115.99161836]])"
561]
562},
563"execution_count": 12,
564"metadata": {},
565"output_type": "execute_result"
566}
567],
568"source": [
569"anchors_net"
570]
571},
572{
573"cell_type": "code",
574"execution_count": null,
575"metadata": {},
576"outputs": [],
577"source": []
578},
579{
580"cell_type": "code",
581"execution_count": 13,
582"metadata": {},
583"outputs": [],
584"source": [
585"def xTrainCreate (nameFiles, shape_net, dirFiles=dirTrain, \n",
586" bwOK=True, norm=True, stats=False) :\n",
587" \n",
588" dd = [1,] if bwOK else [3,]\n",
589" bw = 0 if bwOK else -1\n",
590" \n",
591" zxtrain = np.zeros([len(nameFiles),]+list(shape_net), dtype=np.float32)\n",
592" \n",
593" scale_all = []\n",
594" shape_in_all = []\n",
595"\n",
596" for ii,image_id in enumerate(nameFiles) :\n",
597" img = cv2.imread(os.path.join(dirFiles,image_id+'.jpg'),bw)\n",
598" shape_in = img.shape[:2]\n",
599" scale = min(np.array(shape_net[:2])/np.array(shape_in[:2]));\n",
600"\n",
601" newX,newY = shape_in[1]*scale, shape_in[0]*scale\n",
602" newimg = cv2.resize(img,(int(newX),int(newY)))\n",
603"\n",
604" \n",
605" if stats :\n",
606" if ii==0 : means, stds = [], []\n",
607" means.append(newimg.mean())\n",
608" stds.append(newimg.std())\n",
609"\n",
610" newimg = newimg.astype(np.float64)\n",
611" newimg = newimg-newimg.mean()\n",
612" #newimg = newimg/127.0\n",
613" newimg = newimg/max(abs(newimg.min()),abs(newimg.max()))\n",
614"\n",
615" ##newimg = newimg/newimg.std()\n",
616"\n",
617" ###newimg = np.clip(newimg,-1.0,1.0) ####### shift mean on +0.15\n",
618" \n",
619" if bwOK : newimg = newimg.reshape(newimg.shape+(1,))\n",
620" zxtrain[ii,:int(newY),:int(newX)] = newimg\n",
621" scale_all.append(scale)\n",
622" shape_in_all.append(shape_in)\n",
623" \n",
624" scale_all = np.array(scale_all)\n",
625" shape_in_all = np.array(shape_in_all)\n",
626" \n",
627" if stats : return(zxtrain,scale_all,shape_in_all,np.array(means),np.array(stds))\n",
628"\n",
629" return(zxtrain,scale_all,shape_in_all)"
630]
631},
632{
633"cell_type": "code",
634"execution_count": null,
635"metadata": {},
636"outputs": [],
637"source": []
638},
639{
640"cell_type": "code",
641"execution_count": null,
642"metadata": {},
643"outputs": [],
644"source": []
645},
646{
647"cell_type": "code",
648"execution_count": 14,
649"metadata": {},
650"outputs": [
651{
652"name": "stderr",
653"output_type": "stream",
654"text": [
655"Using TensorFlow backend.\n"
656]
657}
658],
659"source": [
660"from keras.models import Input, Model\n",
661"from keras.layers import Convolution2D, MaxPooling2D, UpSampling2D, Conv2D, Concatenate, Activation, Dropout,Add\n",
662"from keras.layers import Conv2DTranspose, SpatialDropout2D, Dense, Reshape, Flatten, AveragePooling2D\n",
663"from keras.layers.normalization import BatchNormalization\n",
664"from keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping, TensorBoard\n",
665"import keras\n",
666"import keras.backend as K "
667]
668},
669{
670"cell_type": "code",
671"execution_count": 15,
672"metadata": {},
673"outputs": [],
674"source": [
675"import tensorflow as tf"
676]
677},
678{
679"cell_type": "code",
680"execution_count": 16,
681"metadata": {},
682"outputs": [
683{
684"data": {
685"text/plain": [
686"'2.2.4'"
687]
688},
689"execution_count": 16,
690"metadata": {},
691"output_type": "execute_result"
692}
693],
694"source": [
695"keras.__version__"
696]
697},
698{
699"cell_type": "code",
700"execution_count": null,
701"metadata": {},
702"outputs": [],
703"source": []
704},
705{
706"cell_type": "code",
707"execution_count": null,
708"metadata": {},
709"outputs": [],
710"source": []
711},
712{
713"cell_type": "code",
714"execution_count": null,
715"metadata": {},
716"outputs": [],
717"source": []
718},
719{
720"cell_type": "code",
721"execution_count": null,
722"metadata": {},
723"outputs": [],
724"source": []
725},
726{
727"cell_type": "code",
728"execution_count": 17,
729"metadata": {},
730"outputs": [],
731"source": [
732"from keras.models import load_model\n",
733"\n",
734"def modelLoad (filemodel, customs={}, **kwarg) :\n",
735" model10 = load_model(filemodel,compile=False,custom_objects=customs)\n",
736" return(model10)\n",
737"\n",
738"\n",
739"model10 = modelLoad(os.path.join(dirModels,'best_mySoloV3Tinyx4212x1536x1024x1xIT1.hdf5'));"
740]
741},
742{
743"cell_type": "code",
744"execution_count": null,
745"metadata": {},
746"outputs": [],
747"source": []
748},
749{
750"cell_type": "code",
751"execution_count": 18,
752"metadata": {},
753"outputs": [
754{
755"data": {
756"text/plain": [
757"((1536, 1024, 1), (47, 31, 4, 4217))"
758]
759},
760"execution_count": 18,
761"metadata": {},
762"output_type": "execute_result"
763}
764],
765"source": [
766"shape_out = model10.get_layer(index=-1).output_shape[1:];\n",
767"model10.get_layer(index=0).output_shape[1:], shape_out"
768]
769},
770{
771"cell_type": "code",
772"execution_count": 19,
773"metadata": {},
774"outputs": [],
775"source": [
776"shape_net = np.array(model10.get_layer(index=0).output_shape[1:])\n",
777"shape_out = np.array(model10.get_layer(index=-1).output_shape[1:])\n",
778"grid_net = shape_net[0:2]/shape_out[0:2]"
779]
780},
781{
782"cell_type": "code",
783"execution_count": null,
784"metadata": {},
785"outputs": [],
786"source": []
787},
788{
789"cell_type": "code",
790"execution_count": 20,
791"metadata": {},
792"outputs": [],
793"source": [
794"try : del xtrain, ptrain\n",
795"except : abc = 1\n",
796"try : del xtest, ptest\n",
797"except : abc = 1"
798]
799},
800{
801"cell_type": "code",
802"execution_count": null,
803"metadata": {},
804"outputs": [],
805"source": []
806},
807{
808"cell_type": "code",
809"execution_count": 21,
810"metadata": {},
811"outputs": [
812{
813"name": "stdout",
814"output_type": "stream",
815"text": [
816"2019-08-25 00:38:45.112419\n",
817"2019-08-25 00:45:28.595624\n"
818]
819},
820{
821"data": {
822"text/plain": [
823"((4150, 1536, 1024, 1), (4150,), (4150, 2))"
824]
825},
826"execution_count": 21,
827"metadata": {},
828"output_type": "execute_result"
829}
830],
831"source": [
832"try : del xtest\n",
833"except : abc = 1\n",
834" \n",
835"print(datetime.datetime.now())\n",
836" \n",
837"testFiles = pd.read_csv('../Data/sample_submission.csv')\n",
838"testFiles = testFiles.image_id.values.tolist()\n",
839"xtest, scale_test, shape_in_test, test_means, test_stds = xTrainCreate(testFiles, shape_net, dirFiles=dirTest,\n",
840" norm =True,\n",
841" stats=True,\n",
842" bwOK=True) \n",
843"\n",
844"print(datetime.datetime.now())\n",
845"\n",
846"xtest.shape, scale_test.shape, shape_in_test.shape "
847]
848},
849{
850"cell_type": "code",
851"execution_count": 22,
852"metadata": {},
853"outputs": [
854{
855"name": "stdout",
856"output_type": "stream",
857"text": [
858"2019-08-25 00:45:28.601486\n",
859"2019-08-25 00:49:45.862401\n"
860]
861}
862],
863"source": [
864"if 0 :\n",
865" print(datetime.datetime.now())\n",
866" testFiles\n",
867" np.save('../Work/xtest_files.npy',testFiles)\n",
868" np.save('../Work/xtest_scale.npy',scale_test)\n",
869" np.save('../Work/xtest_shape_in.npy',shape_in_test)\n",
870" np.save('../Work/xtest.npy',xtest)\n",
871" print(datetime.datetime.now())"
872]
873},
874{
875"cell_type": "code",
876"execution_count": 21,
877"metadata": {},
878"outputs": [
879{
880"name": "stdout",
881"output_type": "stream",
882"text": [
883"2019-08-25 02:27:20.312774\n",
884"2019-08-25 02:31:41.453936\n"
885]
886}
887],
888"source": [
889"if 1 :\n",
890" try : del xtest\n",
891" except : abc = 1\n",
892"\n",
893" print(datetime.datetime.now())\n",
894" testFiles = np.load('../Work/xtest_files.npy')\n",
895" scale_test = np.load('../Work/xtest_scale.npy')\n",
896" shape_in_test = np.load('../Work/xtest_shape_in.npy')\n",
897" xtest = np.load('../Work/xtest.npy')\n",
898" print(datetime.datetime.now())"
899]
900},
901{
902"cell_type": "code",
903"execution_count": 22,
904"metadata": {},
905"outputs": [
906{
907"data": {
908"text/plain": [
909"array([[ 12.87340051, 14.71878874],\n",
910" [ 29.01291339, 62.38006796],\n",
911" [ 64.06123873, 59.79107683],\n",
912" [ 89.22370175, 115.99161836]])"
913]
914},
915"execution_count": 22,
916"metadata": {},
917"output_type": "execute_result"
918}
919],
920"source": [
921"anchors_net = np.load(os.path.join(dirSaveX,'anchors_net.npy')); anchors_net"
922]
923},
924{
925"cell_type": "code",
926"execution_count": 23,
927"metadata": {},
928"outputs": [
929{
930"data": {
931"text/plain": [
932"array(['U+306B', 'U+306E', 'U+3057', 'U+3066', 'U+3068', 'U+3092',\n",
933" 'U+306F', 'U+304B', 'U+308A', 'U+306A', 'U+3082', 'U+3044',\n",
934" 'U+308B', 'U+3089', 'U+305F', 'U+304F', 'U+3078', 'U+307E',\n",
935" 'U+304D', 'U+308C', 'U+3055', 'U+3075', 'U+3064', 'U+3093',\n",
936" 'U+304C', 'U+3046', 'U+3059', 'U+3042', 'U+3084', 'U+304A',\n",
937" 'U+3053', 'U+3088', 'U+3072', 'U+3051', 'U+3070', 'U+305B',\n",
938" 'U+305D', 'U+309D', 'U+3081', 'U+3060', 'U+4E00', 'U+3067',\n",
939" 'U+3069', 'U+307F', 'U+30A2', 'U+306D', 'U+4EBA', 'U+3031',\n",
940" 'U+308F', 'U+3061', 'U+30FB', 'U+4E8B', 'U+5165', 'U+308D',\n",
941" 'U+305A', 'U+51FA', 'U+3079', 'U+4E91', 'U+3058', 'U+5B50',\n",
942" 'U+53C8', 'U+307B', 'U+306C', 'U+898B', 'U+3086', 'U+7269',\n",
943" 'U+5927', 'U+6B64', 'U+3080', 'U+4E0A', 'U+65E5', 'U+3054',\n",
944" 'U+5176', 'U+4E09', 'U+3056', 'U+65B9', 'U+4E2D', 'U+5C0F',\n",
945" 'U+4E5F', 'U+4F55', 'U+25CB', 'U+4E8C', 'U+5973', 'U+5019',\n",
946" 'U+5FA1', 'U+56FD', 'U+5341', 'U+3073', 'U+4ECA', 'U+30CF',\n",
947" 'U+6642', 'U+662F', 'U+3065', 'U+300C', 'U+6C34', 'U+5408',\n",
948" 'U+624B', 'U+30C8', 'U+6240', 'U+4E94'], dtype=object)"
949]
950},
951"execution_count": 23,
952"metadata": {},
953"output_type": "execute_result"
954}
955],
956"source": [
957"classes[:100]"
958]
959},
960{
961"cell_type": "code",
962"execution_count": 26,
963"metadata": {},
964"outputs": [
965{
966"data": {
967"image/png": "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\n",
968"text/plain": [
969"<Figure size 1080x864 with 4 Axes>"
970]
971},
972"metadata": {
973"needs_background": "light"
974},
975"output_type": "display_data"
976}
977],
978"source": [
979"plt.figure(figsize=(15,12))\n",
980"plt.subplot (2,2,1); plt.hist(test_means,bins=100); plt.title('means')\n",
981"plt.subplot (2,2,2); plt.hist(test_stds, bins=100); plt.title('stds')\n",
982"plt.subplot (2,2,3); plt.hist(scale_test,bins=100); plt.title('scale')\n",
983"plt.subplot (224); plt.scatter(shape_in_test[:,0],shape_in_test[:,1],); plt.title('shapes')\n",
984"plt.show()"
985]
986},
987{
988"cell_type": "code",
989"execution_count": 24,
990"metadata": {},
991"outputs": [
992{
993"data": {
994"image/png": "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\n",
995"text/plain": [
996"<Figure size 432x288 with 1 Axes>"
997]
998},
999"metadata": {
1000"needs_background": "light"
1001},
1002"output_type": "display_data"
1003},
1004{
1005"data": {
1006"image/png": "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\n",
1007"text/plain": [
1008"<Figure size 432x288 with 1 Axes>"
1009]
1010},
1011"metadata": {
1012"needs_background": "light"
1013},
1014"output_type": "display_data"
1015}
1016],
1017"source": [
1018"plt.hist(xtest.mean(axis=(1,2,3)),bins=100)\n",
1019"plt.show()\n",
1020"plt.hist(xtest.std(axis=(1,2,3)),bins=100)\n",
1021"plt.show()"
1022]
1023},
1024{
1025"cell_type": "code",
1026"execution_count": null,
1027"metadata": {},
1028"outputs": [],
1029"source": []
1030},
1031{
1032"cell_type": "code",
1033"execution_count": 25,
1034"metadata": {},
1035"outputs": [],
1036"source": [
1037"def s(x) : return(1.0/(1.0+np.exp(np.clip(-x,-10000,50))))\n",
1038"def softmax(x, axis=-1):\n",
1039" y = np.exp(x - np.max(x, axis, keepdims=True))\n",
1040" return y / np.sum(y, axis, keepdims=True)"
1041]
1042},
1043{
1044"cell_type": "code",
1045"execution_count": 26,
1046"metadata": {
1047"scrolled": false
1048},
1049"outputs": [],
1050"source": [
1051"def drawPred1 (img1, pred1, anchors, grid_net, shape_net, threshold=0.5, \n",
1052" iiNumber=-1, f1=-1,\n",
1053" sigmoidOK=False, show=True, printOK=False) :\n",
1054" \n",
1055" if show : plt.figure(figsize=(10,15))\n",
1056" plt.imshow(img1.squeeze())\n",
1057" \n",
1058" iCount, rCount = 0, 0\n",
1059" \n",
1060" ecolor = ['r','g','b','w']\n",
1061"\n",
1062" for rr, a1 in enumerate(pred1) :\n",
1063" for cc, a2 in enumerate(a1) :\n",
1064" for aa, pr in enumerate(a2) :\n",
1065" if s(pr[0])>=threshold :\n",
1066" iCount += 1\n",
1067" if printOK : print(iCount, '.. ', rr, cc, aa, '\\t', np.round(pr[0:5],4))\n",
1068" lx4 = pr[1:5].copy()\n",
1069" if sigmoidOK : lx4[0:2] = s(lx4[0:2])\n",
1070" \n",
1071" #print('lx4 ',np.round(lx4,2))\n",
1072" \n",
1073" lx4[0:2] = np.round((lx4[0:2]+(cc,rr))*(grid_net[1],grid_net[0])) # x, y\n",
1074" pclass = -1\n",
1075" if len(pr)>5 :\n",
1076" aacc = s(pr[5:])\n",
1077" iclass = aacc.argmax()\n",
1078" pclass = aacc[iclass]\n",
1079" marker = 'o' if pclass>0.5 else 's'\n",
1080" color = 'r' if pclass>0.5 else 'b'\n",
1081" if color=='r' : rCount = rCount+1\n",
1082" if len(pr)<=5 :\n",
1083" marker = 'o'\n",
1084" color = 'r'\n",
1085" \n",
1086" plt.scatter(lx4[0],lx4[1], color=color, marker=marker)\n",
1087" \n",
1088" lx4[2:4] = np.exp(lx4[2:4])*anchors[aa] # w,h\n",
1089" \n",
1090" tl, dr = np.floor(lx4[0:2]-lx4[2:4]/2), np.ceil(lx4[0:2]+lx4[2:4]/2)\n",
1091" \n",
1092" tl[0] = np.clip(tl[0],0,shape_net[1])\n",
1093" tl[1] = np.clip(tl[1],0,shape_net[0])\n",
1094" dr[0] = np.clip(dr[0],0,shape_net[1])\n",
1095" dr[1] = np.clip(dr[1],0,shape_net[0])\n",
1096" \n",
1097" border = [tl,[tl[0],dr[1]],dr,[dr[0],tl[1]]]\n",
1098" line = plt.Polygon(border, closed=True, fill=None, edgecolor=ecolor[aa]) #'r')\n",
1099" plt.gca().add_line(line)\n",
1100"\n",
1101" \n",
1102" plt.title(str(iCount)+' '+str(rCount)+\n",
1103" (' ('+str(iiNumber)+')' if iiNumber>=0 else '')+(' ('+str(f1)+')' if f1>=0 else ''))\n",
1104" \n",
1105" if show :\n",
1106" plt.show()\n",
1107" plt.close()\n",
1108" print(iCount)\n",
1109" \n",
1110" return\n",
1111"\n",
1112"if 0 :\n",
1113" ii = 2000\n",
1114" ii = 500\n",
1115" ii = 1574\n",
1116" ii = 3278\n",
1117" ii = 0\n",
1118"\n",
1119" pdraw = model10.predict(xtest[:100],batch_size=batch_size)\n",
1120"\n",
1121" for ii in range(90,len(pdraw)) :\n",
1122" drawPred1 (xtest[ii], pdraw[ii], anchors_net, grid_net, shape_net, \n",
1123" printOK=False, threshold=0.5, sigmoidOK=True)"
1124]
1125},
1126{
1127"cell_type": "code",
1128"execution_count": 27,
1129"metadata": {},
1130"outputs": [],
1131"source": [
1132"def drawSub1 (imgFile, sub, showOK=True) :\n",
1133" img = cv2.imread(imgFile,-1)\n",
1134"\n",
1135" aa = np.array(sub.split()).reshape((-1,3))\n",
1136" aaxy = aa[:,1:3].astype(np.int32)\n",
1137" if False :\n",
1138" plt.hist(aaxy[:,0],bins=150); plt.show()\n",
1139" plt.hist(aaxy[:,1],bins=350); plt.show()\n",
1140" \n",
1141" plt.figure(figsize=(15,20))\n",
1142"\n",
1143" plt.imshow(img.squeeze())\n",
1144" plt.scatter(aaxy[:,0],aaxy[:,1], c='r')\n",
1145" plt.title('l={:d}'.format(len(aaxy)))\n",
1146" if showOK : plt.show()\n",
1147" return\n",
1148"\n",
1149"#subs = pd.read_csv(os.path.join(dirResult,'boba-030.csv'))\n",
1150"\n",
1151"#plt.figure(figsize=(15,20))\n",
1152"ii = 3000\n",
1153"#imgFile = os.path.join(dirTest,subs.image_id[ii]+'.jpg')\n",
1154"#drawSub1(imgFile,subs.fillna('').labels[ii])\n",
1155"#drawSub1(imgFile,results[0][ii])"
1156]
1157},
1158{
1159"cell_type": "code",
1160"execution_count": 57,
1161"metadata": {},
1162"outputs": [],
1163"source": [
1164"def s(x) : return(1.0/(1.0+np.exp(np.clip(-x,-10000,50))))\n",
1165"def softmax(x, axis=-1):\n",
1166" y = np.exp(x - np.max(x, axis, keepdims=True))\n",
1167" return y / np.sum(y, axis, keepdims=True)\n",
1168"\n",
1169"def BBxyTLDR (lx4_, rr,cc, anchor_net, scale, grid_net, shape_in=None) :\n",
1170" \n",
1171" lx4 = lx4_.copy()\n",
1172" \n",
1173" lx4[0:2] = s(lx4[0:2])\n",
1174" \n",
1175" lx4[0] = (lx4[0]+cc)*grid_net[1] # center x \n",
1176" lx4[1] = (lx4[1]+rr)*grid_net[0] # center y\n",
1177" \n",
1178" lx4[2:4] = anchor_net*np.exp(lx4[2:4]) # size x, y\n",
1179" \n",
1180" tl = np.round((lx4[0:2]-lx4[2:4]/2)/scale,0) # top-left x,y point\n",
1181" dr = np.round((lx4[0:2]+lx4[2:4]/2)/scale,0) # down-right x,y point\n",
1182"\n",
1183" if shape_in is not None:\n",
1184" tl = np.clip(tl,0,(shape_in[1],shape_in[0]))\n",
1185" dr = np.clip(dr,0,(shape_in[1],shape_in[0]))\n",
1186" \n",
1187" return(tl.astype(np.int32),dr.astype(np.int32))\n",
1188"\n",
1189"\n",
1190"def BBxySizeHalf (lx4_, rr,cc, anchor_net, scale, grid_net) :\n",
1191" \n",
1192" lx4 = lx4_.copy()\n",
1193" \n",
1194" lx4[0:2] = s(lx4[0:2])\n",
1195" \n",
1196" lx4[0] = (lx4[0]+cc)*grid_net[1] # center x \n",
1197" lx4[1] = (lx4[1]+rr)*grid_net[0] # center y\n",
1198" \n",
1199" lx4[2:4] = anchor_net*np.exp(lx4[2:4]) # size x, y\n",
1200" \n",
1201" lx4 = np.round(lx4/scale,0)\n",
1202" \n",
1203" return(lx4[0:4].astype(np.int32))\n",
1204"\n",
1205"def BBxyHalf (lx2_, rr,cc, scale, grid_net) :\n",
1206" \n",
1207" lx4 = lx2_.copy()\n",
1208" \n",
1209" lx4[0:2] = s(lx4[0:2])\n",
1210" \n",
1211" lx4[0] = (lx4[0]+cc)*grid_net[1] # center x \n",
1212" lx4[1] = (lx4[1]+rr)*grid_net[0] # center y\n",
1213" \n",
1214" lx4 = np.round(lx4/scale)\n",
1215" \n",
1216" return(lx4[0:2].astype(np.int32))\n",
1217"\n",
1218"\n",
1219"def formSub (pSub, scale_all, shape_in_all, classes, anchors_net, grid_net, classesOK=True, **kwargs) :\n",
1220" labels = []\n",
1221" for ii, pSub1 in enumerate(pSub) :\n",
1222" \n",
1223" if classesOK :\n",
1224" pSub1 = nms(pSub1, scale_all[ii], shape_in_all[ii], anchors_net, grid_net, \n",
1225" threshold2=0.5, debug=False)\n",
1226"\n",
1227" label1 = formSub1(pSub1, scale_all[ii], shape_in_all[ii], classes, grid_net, \n",
1228" classesOK=classesOK, **kwargs)\n",
1229" labels.append(label1)\n",
1230" \n",
1231" return(labels)\n",
1232" \n",
1233"def formSubx4(pSub, scale_all, shape_in_all, classes, anchors_net, grid_net, delta, classesOK=True, **kwargs) :\n",
1234" \n",
1235" labels = []\n",
1236" for ii, pSub1 in enumerate(pSub) :\n",
1237" \n",
1238" label1 = formSub1x4(pSub1, scale_all[ii], shape_in_all[ii], \n",
1239" classes, grid_net, anchors_net, delta[ii],\n",
1240" classesOK=classesOK, **kwargs)\n",
1241" \n",
1242" #label1 = NMSx4(label1, noClass=False)\n",
1243" \n",
1244" labels.append(label1)\n",
1245" \n",
1246" return(labels)\n",
1247" \n",
1248"def formSub1(pSub1, scale, shape_in, classes, grid_net,\n",
1249" threshold=0.5, threshold2=0.5, classesOK=True, sigmoidOK=True, softmaxOK=False,\n",
1250" **kwargs) :\n",
1251" \n",
1252" label1 = ''\n",
1253" for ir,rr in enumerate(pSub1) :\n",
1254" for ic,cc in enumerate(rr) :\n",
1255" for aa in cc :\n",
1256" #print(aa.shape, s(aa[0]),len(threshold))\n",
1257" \n",
1258" paa = s(aa[0]) if sigmoidOK else aa[0].copy()\n",
1259" if (paa>=threshold) :\n",
1260" \n",
1261" lx4 = BBxyHalf(aa[1:3],ir,ic,scale,grid_net) \n",
1262" \n",
1263" lx4 = np.clip(lx4,0,(shape_in[1],shape_in[0]))\n",
1264" \n",
1265" class1 = -1\n",
1266" try : class1 = softmax(aa[5:]).argmax() if sigmoidOK else aa[5:].argmax()\n",
1267" except : class1 = -1\n",
1268" if class1>=0 :\n",
1269" pclass = s(aa[5+class1]) if sigmoidOK else aa[5+class1].copy()\n",
1270" if pclass<threshold2 : class1=-1\n",
1271" #print(class1, pclass)\n",
1272" if classesOK :\n",
1273" if class1>=0 :\n",
1274" label1 = label1+(classes[class1] if class1>=0 else '+X0000')\n",
1275" label1 = label1+' '+str(int(lx4[0]))+' '+str(int(lx4[1]))+' '\n",
1276" else :\n",
1277" label1 = label1+(classes[class1] if class1>=0 else '+X0000')\n",
1278" label1 = label1+' '+str(int(lx4[0]))+' '+str(int(lx4[1]))+' '\n",
1279" label1 = label1.strip()\n",
1280" return(label1)\n",
1281"\n",
1282"def formSubY(pSub1, scale, shape_in, classes, \n",
1283" threshold=0.5, threshold2=0.5, classesOK=True, sigmoidOK=False,\n",
1284" **kwargs) :\n",
1285" label1 = ''\n",
1286" for ir,rr in enumerate(pSub1) :\n",
1287" for ic,cc in enumerate(rr) :\n",
1288" for aa in cc :\n",
1289" #print(aa.shape, s(aa[0]),len(threshold))\n",
1290" \n",
1291" paa = s(aa[0]) if sigmoidOK else aa[0].copy()\n",
1292" if (paa>=threshold) :\n",
1293" try : class1 = s(aa[5:]).argmax() if sigmoidOK else aa[5:].argmax()\n",
1294" except : class1 = -1\n",
1295" lx4 = s(aa[1:3].copy()) if sigmoidOK else aa[1:3].copy()\n",
1296" lx4[0] = lx4[0]*shape_net[1]/scale\n",
1297" lx4[1] = lx4[1]*shape_net[0]/scale\n",
1298" \n",
1299" lx4 = np.clip(lx4,0,(shape_in[1],shape_in[0]))\n",
1300" \n",
1301" #lx4 = np.round(lx4)[ir]\n",
1302" if class1>=0 :\n",
1303" pclass = s(aa[5+class1]) if sigmoidOK else aa[5+class1]\n",
1304" if pclass<threshold2 : class1=-1\n",
1305" #print(class1, pclass)\n",
1306" if classesOK :\n",
1307" if class1>=0 :\n",
1308" label1 = label1+(classes[class1] if class1>=0 else '+X0000')\n",
1309" label1 = label1+' '+str(int(lx4[0]))+' '+str(int(lx4[1]))+' '\n",
1310" else :\n",
1311" label1 = label1+(classes[class1] if class1>=0 else '+X0000')\n",
1312" label1 = label1+' '+str(int(lx4[0]))+' '+str(int(lx4[1]))+' '\n",
1313" label1 = label1.strip()\n",
1314" return(label1)\n",
1315"#labels = formSub(ptest, scale_test, threshold=0.5)\n",
1316"\n",
1317"def formSub1x4 ( pSub1, scale, shape_in, classes, grid_net, anchors_net, delta1,\n",
1318" threshold=0.5, threshold2=0.5, classesOK=True, sigmoidOK=True, debug=False,\n",
1319" **kwargs) :\n",
1320" label1 = ''\n",
1321" iCount = 0\n",
1322" for ir,rr in enumerate(pSub1) :\n",
1323" for ic,cc in enumerate(rr) :\n",
1324" for ia,aa in enumerate(cc) :\n",
1325" #print(aa.shape, s(aa[0]), threshold)\n",
1326" \n",
1327" paa = s(aa[0]) if sigmoidOK else aa[0].copy()\n",
1328" if (paa>=threshold) :\n",
1329" \n",
1330" iCount = iCount + 1\n",
1331" lx4 = BBxySizeHalf(aa[1:5],ir,ic, anchors_net[ia], scale, grid_net)\n",
1332" \n",
1333" lx4[0:2] = np.clip(lx4[0:2]+delta1[::-1]/scale,0,shape_in[::-1])\n",
1334" \n",
1335" class1 = -1\n",
1336" try : class1 = softmax(aa[5:]).argmax() if sigmoidOK else aa[5:].argmax()\n",
1337" except : class1 = -1\n",
1338" if class1>=0 :\n",
1339" pclass = s(aa[5+class1]) if sigmoidOK else aa[5+class1].copy()\n",
1340" if pclass<threshold2 : class1=-1\n",
1341" #print(class1, pclass)\n",
1342" if classesOK :\n",
1343" if class1>=0 :\n",
1344" label1 = label1+(classes[class1] if class1>=0 else '+X0000')\n",
1345" #label1 = label1+' '+str(int(lx4[0]))+' '+str(int(lx4[1]))+' '\n",
1346" label1 = label1+' {l[0]:d} {l[1]:d} {l[2]:d} {l[3]:d} '.format(l=lx4)\n",
1347" else :\n",
1348" label1 = label1+(classes[class1] if class1>=0 else '+X0000')\n",
1349" #label1 = label1+' '+str(int(lx4[0]))+' '+str(int(lx4[1]))+' '\n",
1350" label1 = label1+' {l[0]:d} {l[1]:d} {l[2]:d} {l[3]:d} '.format(l=lx4)\n",
1351" #print(aa.shape, s(aa[0]),len(threshold))\n",
1352" \n",
1353" label1 = label1.strip()\n",
1354" \n",
1355" if debug : return(label1, iCount)\n",
1356" return(label1)\n",
1357"#labels = formSub(ptest, scale_test, threshold=0.5)\n",
1358"\n",
1359"def nms(pSub1, scale, shape_in, anchors_net, grid_net, threshold=0.5, threshold2=0.5, debug=False, printOK=False) :\n",
1360" \n",
1361" bb1, code = [], 0\n",
1362" for ir,rr in enumerate(pSub1) :\n",
1363" for ic,cc in enumerate(rr) :\n",
1364" for ia,aa in enumerate(cc) :\n",
1365" paa = s(aa[0].copy())\n",
1366" if (paa>=threshold) :\n",
1367" \n",
1368" tl,dr = BBxyTLDR(aa[1:5],ir,ic,anchors_net[ia],scale,grid_net,shape_in=shape_in)\n",
1369" \n",
1370" class1 = -1\n",
1371" try : class1 = softmax(aa[5:]).argmax()\n",
1372" except : class1 = -1\n",
1373" \n",
1374" #print(class1, pclass)\n",
1375" if class1>=0 :\n",
1376" bb1.append([class1,tl[0],tl[1],dr[0],dr[1],ir,ic,ia,1])\n",
1377" else :\n",
1378" print(class1)\n",
1379" \n",
1380" #print(len(bb1))\n",
1381" bb1 = np.array(bb1);\n",
1382" #print(bb1.shape)\n",
1383" if len(bb1)>0 :\n",
1384" bb1=bb1[bb1[:,0].argsort(),:]\n",
1385" for ii in range(len(bb1)) :\n",
1386" if bb1[ii,8]>0 :\n",
1387" for jj in range(ii+1,len(bb1)) :\n",
1388" if bb1[ii,0]!=bb1[jj,0] : break\n",
1389" ttll = np.maximum(bb1[ii,1:3],bb1[jj,1:3])\n",
1390" ddrr = np.minimum(bb1[ii,3:5],bb1[jj,3:5])\n",
1391" if np.min(ddrr-ttll)<0 : break\n",
1392" iou1 = (ddrr-ttll)[0]*(ddrr-ttll)[1]\n",
1393" iou = iou1/((bb1[ii,3]-bb1[ii,1])*(bb1[ii,4]-bb1[ii,2])+\n",
1394" (bb1[jj,3]-bb1[jj,1])*(bb1[jj,4]-bb1[jj,2])-iou1)\n",
1395" if printOK :\n",
1396" print('---',np.round(bb1[ii,1:5],0),np.round(bb1[jj,1:5],0))\n",
1397" print(' ',iou, iou1)\n",
1398" if iou>=threshold2 : bb1[jj,8] = 0\n",
1399" for jj in range(len(bb1)) :\n",
1400" if bb1[jj,8]<=0 :\n",
1401" pSub1[int(bb1[jj,5]),int(bb1[jj,6]),int(bb1[jj,7]),0]=-1000 # sigmoid=0\n",
1402" code = code+1\n",
1403" \n",
1404" if debug : return(pSub1,code,bb1)\n",
1405" return pSub1\n",
1406"\n",
1407"def notIOUx12 (tldr1, tldr2, threshold=0.5, printOK=False) :\n",
1408" \n",
1409" ttll = np.maximum(tldr1[0:2],tldr2[0:2])\n",
1410" ddrr = np.minimum(tldr1[2:4],tldr2[2:4])\n",
1411"\n",
1412" if printOK and False:\n",
1413" print('notIOUx12 1',tldr1,tldr2, np.min(ddrr-ttll))\n",
1414"\n",
1415" if np.min(ddrr-ttll)<=0 : return(True)\n",
1416"\n",
1417" iou12= (ddrr-ttll)[0]*(ddrr-ttll)[1]\n",
1418" size1= (tldr1[2]-tldr1[0])*(tldr1[3]-tldr1[1])\n",
1419" size2= (tldr2[2]-tldr2[0])*(tldr2[3]-tldr2[1])\n",
1420"\n",
1421" if printOK :\n",
1422" print('notIOUx12 2',\n",
1423" tldr1,tldr2,'\\t' ,\n",
1424" iou12, size1, size2, \n",
1425" round(iou12/(size2-iou12),4),\n",
1426" round(iou12/(size1+size2-iou12),4))\n",
1427" \n",
1428" if iou12==size2 : return(False)\n",
1429" elif (iou12/(size2-iou12))>=threshold : return(False)\n",
1430" else :\n",
1431" iou = iou12/(size1+size2-iou12)\n",
1432" if iou>=threshold : return(False)\n",
1433" \n",
1434" return(True)\n",
1435" \n",
1436"\n",
1437"def NMSx4(pSub1x4, threshold=0.5, noClass=False, debug=False, printOK=False) :\n",
1438" \n",
1439" count = 0\n",
1440" label1 = ''\n",
1441" bb1 = np.array(pSub1x4.split()).reshape((-1,5))\n",
1442" uni = bb1[:,0]\n",
1443" tldr = bb1[:,1:5].astype(np.int32)\n",
1444" mark = np.ones(len(uni)).astype(bool)\n",
1445" \n",
1446" if noClass : \n",
1447" uni = np.ones(len(uni))\n",
1448" \n",
1449" size = -(tldr[:,2]*tldr[:,3])\n",
1450" sort1= size.argsort()\n",
1451" uni = uni [sort1]\n",
1452" tldr = tldr[sort1,:]\n",
1453" \n",
1454" if printOK :\n",
1455" print(len(tldr))\n",
1456" \n",
1457" if False :\n",
1458" mark = (np.abs(tldr[:,2:]-tldr[:,2:].mean(axis=0))<=2.0*tldr[:,2:].std(axis=0))\n",
1459" mark = np.logical_and(mark[:,0],mark[:,1])\n",
1460" \n",
1461" temp = tldr.astype(np.int32)\n",
1462" tldr[:,0:2] = np.floor(temp[:,0:2]-(temp[:,2:4]/2)).astype(np.int32)\n",
1463" tldr[:,2:4] = np.ceil (temp[:,0:2]+(temp[:,2:4]/2)).astype(np.int32)\n",
1464" \n",
1465" if not noClass :\n",
1466" sort2 = uni[:].argsort()\n",
1467" tldr=tldr[sort2,:]\n",
1468" mark=mark[sort2]\n",
1469" uni =uni [sort2]\n",
1470" \n",
1471" if len(uni)==0 :\n",
1472" if debug : return(label1,count)\n",
1473" return label1\n",
1474" \n",
1475" for ii in range(len(mark)) :\n",
1476" if mark[ii] :\n",
1477" for jj in range(ii+1,len(mark)) :\n",
1478" if mark[jj] :\n",
1479" mark[jj] = notIOUx12(tldr[ii], tldr[jj], threshold=threshold) #, printOK=True)\n",
1480" \n",
1481" tldr[:,2:4] = tldr[:,2:4]-tldr[:,0:2]\n",
1482" tldr[:,0:2] = np.floor(tldr[:,0:2]+tldr[:,2:4]//2).astype(np.int32)\n",
1483" \n",
1484" for ii in range(len(mark)) :\n",
1485" if mark[ii] :\n",
1486" label1 = label1 + '{uni} {b[0]:d} {b[1]:d} {b[2]:d} {b[3]:d} '.format(uni=uni[ii], b=tldr[ii])\n",
1487" count = count+1\n",
1488" \n",
1489" label1 = label1.strip()\n",
1490" if debug : return(label1,count)\n",
1491" return label1"
1492]
1493},
1494{
1495"cell_type": "code",
1496"execution_count": null,
1497"metadata": {},
1498"outputs": [],
1499"source": []
1500},
1501{
1502"cell_type": "code",
1503"execution_count": 29,
1504"metadata": {},
1505"outputs": [],
1506"source": [
1507"try : del ptrain\n",
1508"except : abc = 1"
1509]
1510},
1511{
1512"cell_type": "code",
1513"execution_count": 30,
1514"metadata": {},
1515"outputs": [],
1516"source": [
1517"from keras.models import load_model\n",
1518"\n",
1519"def modelLoad (filemodel, customs={}, **kwarg) :\n",
1520" model10 = load_model(filemodel,compile=False,custom_objects=customs)\n",
1521" return(model10)\n",
1522"#model10 = modelLoad('../Temp/best4501.hdf5',customs={'yloss':yloss})\n",
1523"#model10 = modelLoad('../Temp/best4500.hdf5',customs={'yloss':yloss}) "
1524]
1525},
1526{
1527"cell_type": "code",
1528"execution_count": 31,
1529"metadata": {},
1530"outputs": [
1531{
1532"data": {
1533"text/plain": [
1534"(24.31640625, 6527385600, (4150, 1536, 1024, 1))"
1535]
1536},
1537"execution_count": 31,
1538"metadata": {},
1539"output_type": "execute_result"
1540}
1541],
1542"source": [
1543"xtest.nbytes/(1024*1024*1024), xtest.size, xtest.shape"
1544]
1545},
1546{
1547"cell_type": "code",
1548"execution_count": null,
1549"metadata": {},
1550"outputs": [],
1551"source": []
1552},
1553{
1554"cell_type": "code",
1555"execution_count": 32,
1556"metadata": {},
1557"outputs": [],
1558"source": [
1559"def yloss (y_true_, y_pred_, sigmoidOK=True, debug=False) :\n",
1560" \n",
1561" loss = 0.0\n",
1562" return loss\n"
1563]
1564},
1565{
1566"cell_type": "code",
1567"execution_count": 60,
1568"metadata": {},
1569"outputs": [],
1570"source": [
1571"def doResult(doList, classes_all, xtest, scale_test, shape_test, anchors_net, grid_net,\n",
1572" batch_size, stepClasses=4212,\n",
1573" stepLabels=300,\n",
1574" debug=False) :\n",
1575" pResult = []\n",
1576" for i1, fileModel in doList :\n",
1577" print(datetime.datetime.now(), i1, fileModel)\n",
1578" classes = classes_all[i1:i1+stepClasses]\n",
1579" model10 = modelLoad(fileModel,customs={'yloss':yloss});\n",
1580" pResult1 = []\n",
1581" for i2 in range(0,len(xtest),stepLabels) :\n",
1582" \n",
1583" print(datetime.datetime.now(), i2)\n",
1584" ptest = model10.predict(xtest[i2:i2+stepLabels],batch_size=batch_size)\n",
1585" try :\n",
1586" pResult1 = pResult1 + formSubx4 ( ptest, \n",
1587" scale_test[i2:i2+stepLabels], \n",
1588" shape_test[i2:i2+stepLabels], \n",
1589" classes, anchors_net, grid_net,\n",
1590" [[0,0]]*len(ptest),\n",
1591" threshold=0.5, threshold2=0.5, classeOK=True)\n",
1592" #except : print('except')\n",
1593" finally : del ptest\n",
1594" pResult.append(pResult1)\n",
1595" if debug : return(pResult, ptest)\n",
1596" return(pResult)"
1597]
1598},
1599{
1600"cell_type": "code",
1601"execution_count": null,
1602"metadata": {},
1603"outputs": [],
1604"source": []
1605},
1606{
1607"cell_type": "code",
1608"execution_count": null,
1609"metadata": {},
1610"outputs": [],
1611"source": []
1612},
1613{
1614"cell_type": "code",
1615"execution_count": 61,
1616"metadata": {},
1617"outputs": [],
1618"source": [
1619"doList = [[0, '../Temp/best_0000x0500xB.hdf5'],\n",
1620" [500, '../Temp/best_0500x1000xB.hdf5'],\n",
1621" [1000,'../Temp/best_1000x1500xB.hdf5'],\n",
1622" [1500,'../Temp/best_1500x2000xB.hdf5'],]\n",
1623"\n",
1624"#doList = [[0, os.path.join(dirModels,'best_mySoloV3Tinyx4212x1024x768x1xCT1.hdf5')],] # 0.240 45\n",
1625"#doList = [[0, os.path.join(dirModels,'best_mySoloV3Tinyx4212x1024x768x1xDT1.hdf5')],] # 0.298 46\n",
1626"#doList = [[0, os.path.join(dirModels,'best_mySoloV3Tinyx4212x1024x768x1xET1.hdf5')],] # 0.285 47\n",
1627"#doList = [[0, os.path.join(dirModels,'best_mySoloV3Tinyx4212x1536x1024x1xFT1.hdf5')],] # 0.534 48\n",
1628"doList = [[0, os.path.join(dirModels,'best_mySoloV3Tinyx4212x1536x1024x1xIT1.hdf5')],] # "
1629]
1630},
1631{
1632"cell_type": "code",
1633"execution_count": 62,
1634"metadata": {},
1635"outputs": [
1636{
1637"name": "stdout",
1638"output_type": "stream",
1639"text": [
1640"2019-08-25 03:46:27.179053 0 ../Model/best_mySoloV3Tinyx4212x1536x1024x1xIT1.hdf5\n",
1641"2019-08-25 03:46:28.896054 0\n",
1642"2019-08-25 03:47:15.008905 200\n",
1643"2019-08-25 03:48:00.691797 400\n",
1644"2019-08-25 03:48:46.473637 600\n",
1645"2019-08-25 03:49:32.575474 800\n",
1646"2019-08-25 03:50:18.342592 1000\n",
1647"2019-08-25 03:51:04.232963 1200\n",
1648"2019-08-25 03:51:49.948427 1400\n",
1649"2019-08-25 03:52:35.791002 1600\n",
1650"2019-08-25 03:53:21.665751 1800\n",
1651"2019-08-25 03:54:07.469856 2000\n",
1652"2019-08-25 03:54:53.282785 2200\n",
1653"2019-08-25 03:55:39.201672 2400\n",
1654"2019-08-25 03:56:25.270055 2600\n",
1655"2019-08-25 03:57:11.184845 2800\n",
1656"2019-08-25 03:57:56.836516 3000\n",
1657"2019-08-25 03:58:42.661675 3200\n",
1658"2019-08-25 03:59:28.558759 3400\n",
1659"2019-08-25 04:00:14.452388 3600\n",
1660"2019-08-25 04:01:00.382525 3800\n",
1661"2019-08-25 04:01:46.075949 4000\n",
1662"2019-08-25 04:02:20.616588\n"
1663]
1664}
1665],
1666"source": [
1667"batch_size = 6\n",
1668"results5 = doResult(doList,classes_all,xtest,scale_test,shape_in_test, \n",
1669" anchors_net, grid_net, \n",
1670" batch_size,\n",
1671" stepLabels=200)\n",
1672"\n",
1673"#results, ptest = doResult(doList,classes_all,xtest,scale_test,shape_in_test, batch_size, debug=True)\n",
1674"print(datetime.datetime.now())"
1675]
1676},
1677{
1678"cell_type": "code",
1679"execution_count": 63,
1680"metadata": {},
1681"outputs": [],
1682"source": [
1683"results = []\n",
1684"for r1 in results5 :\n",
1685" result = []\n",
1686" for r2 in r1 :\n",
1687" result.append(' '.join([' '.join(l.tolist()) for l in np.array(r2.split()).reshape((-1,5))[:,:3]]))\n",
1688" results.append(result)"
1689]
1690},
1691{
1692"cell_type": "code",
1693"execution_count": 64,
1694"metadata": {},
1695"outputs": [
1696{
1697"data": {
1698"text/plain": [
1699"(1, 4150)"
1700]
1701},
1702"execution_count": 64,
1703"metadata": {},
1704"output_type": "execute_result"
1705}
1706],
1707"source": [
1708"len(results),len(results[0])"
1709]
1710},
1711{
1712"cell_type": "code",
1713"execution_count": null,
1714"metadata": {},
1715"outputs": [],
1716"source": []
1717},
1718{
1719"cell_type": "code",
1720"execution_count": 65,
1721"metadata": {
1722"scrolled": false
1723},
1724"outputs": [
1725{
1726"data": {
1727"text/plain": [
1728"'U+6B64 278 537 U+306E 434 561 U+3042 624 526 U+3064 814 525 U+304B 1181 551 U+5927 1364 539 U+82B1 1533 546 U+3068 1712 538 U+4F1D 1900 532 U+3068 2063 525 U+3057 633 617 U+706B 998 634 U+3057 1898 651 U+3082 2060 631 U+3053 287 695 U+5C71 1533 682 U+309E 1738 683 U+307C 2068 716 U+3092 451 766 U+3066 625 737 U+306F 794 731 U+305F 985 759 U+306E 1351 774 U+3069 1735 755 U+3092 1887 769 U+3053 637 857 U+3089 794 849 U+305F 983 831 U+3057 1166 849 U+3044 1721 842 U+308A 2055 828 U+5C11 289 898 U+305F 460 933 U+3081 988 913 U+53E4 1351 886 U+306E 1506 913 U+305D 1897 886 U+308A 2055 895 U+3057 639 977 U+3066 792 973 U+304F 986 966 U+3092 1164 968 U+3075 1723 953 U+304C 1910 979 U+3066 281 1025 U+3082 1164 1081 U+4EBA 1718 1079 U+308A 2055 1064 U+3051 453 1118 U+3089 622 1104 U+305F 799 1153 U+6C60 1524 1128 U+3061 2050 1119 U+305F 282 1188 U+3078 622 1213 U+3055 982 1196 U+3066 1156 1198 U+3046 1334 1173 U+3082 1713 1204 U+61F8 1895 1222 U+304B 448 1249 U+304D 619 1293 U+3064 793 1254 U+51FA 1162 1301 U+4F55 1333 1286 U+306B 1526 1263 U+3072 287 1324 U+3072 982 1311 U+8D8A 1165 1329 U+3070 1535 1362 U+307C 1718 1338 U+306E 1887 1354 U+59CB 2048 1340 U+3070 289 1427 U+305D 604 1392 U+3051 983 1422 U+3066 1335 1414 U+3064 1702 1434 U+306A 1882 1440 U+3092 2049 1442 U+3089 601 1498 U+306B 813 1475 U+65E5 1163 1464 U+4E95 1518 1494 U+308A 1702 1483 U+3068 1885 1512 U+308A 290 1551 U+306E 428 1541 U+305F 814 1572 U+308C 981 1539 U+306B 1157 1556 U+5927 1341 1579 U+3057 2047 1558 U+3075 429 1646 U+3064 610 1622 U+3044 1161 1636 U+3057 1711 1640 U+3084 435 1725 U+3051 612 1728 U+3066 800 1711 U+3066 810 1706 U+3068 1159 1725 U+4E8B 1332 1720 U+3068 1891 1684 U+3082 2044 1698 U+3069 996 1768 U+306E 1507 1772 U+3079 2049 1809 U+3046 435 1858 U+308A 798 1833 U+306A 1150 1845 U+3064 284 1919 U+306F 791 1945 U+307F 1149 1934 U+3092 1328 1898 U+3082 1888 1927 U+3066 2046 1927 U+3070 619 1971 U+304F 971 1984 U+307F 1143 1989 U+3092 1512 1991 U+306B 275 2086 U+304C 449 2080 U+3079 619 2093 U+3044 1141 2052 U+304D 793 2141 U+306A 967 2118 U+305F 1138 2113 U+304F 1328 2127 U+304B 1521 2138 U+3057 1877 2142 U+4E09 2047 2151 U+3059 615 2207 U+3057 1147 2235 U+3089 1335 2230 U+308A 1521 2226 U+308B 1882 2231 U+4E09 2045 2207 U+307F 262 2273 U+3066 782 2281 U+65E5 2046 2280 U+308D 264 2390 U+3057 978 2334 U+3066 1134 2377 U+305B 1330 2332 U+3051 1516 2331 U+3057 1880 2352 U+4EBA 2041 2371 U+3066 427 2407 U+308A 609 2435 U+4E0B 1150 2428 U+3089 1333 2450 U+3089 1521 2429 U+3092 270 2519 U+306B 966 2476 U+304D 1511 2533 U+3092 1870 2477 U+306E 2045 2480 U+306B 611 2553 U+308C 978 2561 U+7F6E 1150 2544 U+308C 1334 2565 U+3069 1868 2581 U+307E 2043 2567 U+3092 435 2657 U+306E 798 2641 U+305F 1146 2664 U+3070 1337 2631 U+3093 1527 2661 U+3081 1868 2678 U+308A 794 2741 U+305D 973 2694 U+308A 1342 2704 U+3061 1524 2748 U+5869 246 2810 U+3072 615 2780 U+305A 979 2803 U+524D 1340 2806 U+3059 1877 2808 U+307F 432 2862 U+4EBA 790 2871 U+306C 2034 2845 U+308B 263 2937 U+3044 428 2938 U+3066 611 2914 U+3092 786 2949 U+8A08 985 2921 U+306E 1146 2935 U+307B 1334 2922 U+3066 1514 2925 U+4E5F 1872 2947 U+4E8B 2047 3003'"
1729]
1730},
1731"execution_count": 65,
1732"metadata": {},
1733"output_type": "execute_result"
1734}
1735],
1736"source": [
1737"results[0][35]"
1738]
1739},
1740{
1741"cell_type": "code",
1742"execution_count": 66,
1743"metadata": {},
1744"outputs": [],
1745"source": [
1746"if 0 :\n",
1747" print(ptest.shape)\n",
1748" aa = s(ptest[...,0])\n",
1749" plt.figure(figsize=(15,10))\n",
1750" plt.hist(aa[aa>=0.1].ravel(),bins=100)\n",
1751" plt.show()"
1752]
1753},
1754{
1755"cell_type": "code",
1756"execution_count": null,
1757"metadata": {},
1758"outputs": [],
1759"source": []
1760},
1761{
1762"cell_type": "code",
1763"execution_count": 67,
1764"metadata": {},
1765"outputs": [],
1766"source": [
1767"sizing = np.array([len(ll) for ll in results[0]])"
1768]
1769},
1770{
1771"cell_type": "code",
1772"execution_count": 68,
1773"metadata": {},
1774"outputs": [
1775{
1776"data": {
1777"image/png": "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\n",
1778"text/plain": [
1779"<Figure size 432x288 with 1 Axes>"
1780]
1781},
1782"metadata": {
1783"needs_background": "light"
1784},
1785"output_type": "display_data"
1786}
1787],
1788"source": [
1789"plt.plot(sizing[sizing.argsort()]); plt.show()"
1790]
1791},
1792{
1793"cell_type": "code",
1794"execution_count": null,
1795"metadata": {},
1796"outputs": [],
1797"source": []
1798},
1799{
1800"cell_type": "code",
1801"execution_count": 69,
1802"metadata": {},
1803"outputs": [],
1804"source": [
1805"#labels = [results[0][ii]+' '+results[1][ii]+' '+results[2][ii]+' '+results[3][ii] for ii in range(len(results[0]))]\n",
1806"labels = results[0]"
1807]
1808},
1809{
1810"cell_type": "code",
1811"execution_count": 70,
1812"metadata": {},
1813"outputs": [
1814{
1815"data": {
1816"text/plain": [
1817"(4150,\n",
1818" 'U+3072 108 607 U+77ED 242 612 U+306F 414 612 U+3064 561 595 U+304D 744 619 U+3042 927 631 U+3070 1106 620 U+3069 1267 601 U+3044 1426 595 U+304D 1590 642 U+3053 1742 618 U+306B 1894 635 U+306B 1905 635 U+3068 105 706 U+308C 573 694 U+3066 740 705 U+3082 1257 714 U+3089 1436 667 U+306B 255 729 U+7528 410 738 U+307E 911 733 U+3053 1087 763 U+306B 1253 736 U+305B 1425 757 U+308A 1593 756 U+3068 1891 736 U+53C8 103 854 U+307F 251 846 U+308A 574 829 U+306F 748 826 U+3053 908 843 U+3066 1422 855 U+3089 1888 817 U+6240 413 900 U+3067 762 930 U+305F 909 913 U+3066 1235 892 U+306B 1584 892 U+306F 1890 910 U+516D 102 944 U+5FF5 242 942 U+3078 412 991 U+4E8C 1429 971 U+306F 1586 966 U+308C 1882 987 U+9053 101 1048 U+7D44 248 1068 U+3068 411 1040 U+3061 572 1063 U+3078 908 1031 U+3079 1078 1047 U+306A 1254 1035 U+304B 1424 1035 U+306F 1587 1030 U+53F3 740 1088 U+7533 908 1127 U+3093 1414 1089 U+308B 1585 1120 U+306B 1743 1099 U+3066 1889 1101 U+3057 249 1182 U+7533 414 1209 U+304F 567 1172 U+304D 746 1207 U+3065 1080 1174 U+306E 1408 1203 U+308B 1583 1209 U+3064 1736 1211 U+306E 1890 1213 U+305F 101 1286 U+8A9E 562 1289 U+3055 903 1244 U+304F 1086 1291 U+304B 1578 1232 U+3064 1736 1262 U+3066 250 1312 U+3068 399 1328 U+898B 1383 1327 U+898B 1405 1335 U+306B 1573 1309 U+304B 104 1394 U+305D 255 1383 U+306B 562 1406 U+304B 724 1433 U+3089 908 1427 U+3075 895 1385 U+3068 1077 1403 U+3084 1409 1422 U+307E 1573 1404 U+3066 1723 1378 U+308A 1899 1393 U+3058 111 1496 U+306E 246 1459 U+5165 561 1510 U+308A 1233 1513 U+3055 1570 1507 U+3061 1722 1504 U+3068 1890 1495 U+5FA1 253 1552 U+307C 400 1564 U+306A 743 1554 U+3072 905 1556 U+3068 98 1612 U+3065 255 1651 U+305D 558 1615 U+3075 1056 1601 U+304A 1236 1623 U+3093 1399 1624 U+308A 1578 1624 U+3068 1714 1619 U+3068 88 1702 U+3065 250 1672 U+306B 389 1687 U+3044 907 1723 U+305E 1073 1689 U+3060 250 1769 U+3066 385 1802 U+56FD 717 1792 U+304F 1401 1783 U+305F 1568 1768 U+307E 1707 1754 U+3072 1865 1766 U+305D 86 1828 U+3044 240 1852 U+3051 548 1841 U+308A 892 1831 U+3068 1057 1816 U+304A 1232 1865 U+308B 1568 1870 U+306E 1863 1844 U+5185 379 1927 U+3075 545 1938 U+306B 717 1902 U+309D 1063 1927 U+3092 245 1963 U+304B 894 1972 U+3066 1232 1980 U+6240 1558 1990 U+308D 1706 1975 U+5F62 1859 1985 U+3052 82 2039 U+3081 375 2056 U+3089 558 2033 U+3050 898 2047 U+3072 1059 2030 U+3068 79 2126 U+3075 209 2151 U+3055 379 2140 U+306C 545 2123 U+306F 713 2131 U+3046 892 2152 U+5F8C 1232 2124 U+3031 1406 2125 U+306B 1561 2104 U+307F 1711 2111 U+3048 77 2191 U+3081 381 2227 U+3046 890 2193 U+305B 1550 2199 U+306F 1862 2179 U+3055 76 2286 U+3057 232 2253 U+6D6E 537 2252 U+306A 713 2270 U+3058 905 2258 U+3075 1041 2271 U+307E 1218 2287 U+3093 1554 2287 U+308F 1710 2266 U+308A 1863 2290 U+306C 351 2331 U+4E16 525 2365 U+3084 888 2343 U+3089 1046 2345 U+3057 1724 2375 U+304D 709 2436 U+3060 1223 2417 U+3066 1545 2412 U+3082 1859 2421 U+309D 225 2480 U+304B 1211 2514 U+3057 1394 2476 U+3044 1545 2518 U+3078 57 2554 U+3066 210 2580 U+304F 546 2568 U+3084 713 2544 U+3057 1067 2559 U+309D 1222 2579 U+716E 1698 2546 U+306E 1856 2541 U+5F8C 351 2621 U+304B 1051 2660 U+3092 1557 2624 U+306B 1859 2635 U+3031 559 2685 U+3093 712 2714 U+7533 882 2717 U+304C 1051 2719 U+308B 1218 2682 U+306A 1374 2688 U+306F 1560 2713 U+306B 1698 2689 U+7533 62 2770 U+3064 205 2787 U+4E00 1037 2789 U+3042 1203 2789 U+308B 1365 2771 U+3058 1564 2807 U+3080 1692 2795 U+3042 1850 2761 U+3088 351 2850 U+3068 547 2828 U+3068 713 2834 U+6CE3 1035 2879 U+308C 1368 2870 U+3080 1692 2858 U+308B 1865 2855 U+3055 54 2910 U+304B 215 2936 U+3075 537 2934 U+309D 701 2917 U+306A 862 2956 U+3092 1214 2910 U+306E 1542 2923 U+309D 1860 2919 U+3031 375 2988 U+3072 707 3029 U+308F 1210 2982 U+306E 1373 2989 U+3055 1543 3023 U+3057 1705 2966 U+3075 60 3051 U+3093 1217 3040 U+304E 1378 3047 U+306E 1687 3043 U+306E 1851 3052')"
1819]
1820},
1821"execution_count": 70,
1822"metadata": {},
1823"output_type": "execute_result"
1824}
1825],
1826"source": [
1827"len(labels), labels[0]"
1828]
1829},
1830{
1831"cell_type": "code",
1832"execution_count": null,
1833"metadata": {},
1834"outputs": [],
1835"source": []
1836},
1837{
1838"cell_type": "code",
1839"execution_count": null,
1840"metadata": {},
1841"outputs": [],
1842"source": []
1843},
1844{
1845"cell_type": "code",
1846"execution_count": null,
1847"metadata": {},
1848"outputs": [],
1849"source": []
1850},
1851{
1852"cell_type": "code",
1853"execution_count": null,
1854"metadata": {},
1855"outputs": [],
1856"source": []
1857},
1858{
1859"cell_type": "code",
1860"execution_count": null,
1861"metadata": {},
1862"outputs": [],
1863"source": []
1864},
1865{
1866"cell_type": "code",
1867"execution_count": null,
1868"metadata": {},
1869"outputs": [],
1870"source": []
1871},
1872{
1873"cell_type": "code",
1874"execution_count": 71,
1875"metadata": {},
1876"outputs": [],
1877"source": [
1878"dfTest = pd.DataFrame()\n",
1879"dfTest['image_id'] = testFiles\n",
1880"dfTest['labels'] = labels"
1881]
1882},
1883{
1884"cell_type": "code",
1885"execution_count": 72,
1886"metadata": {},
1887"outputs": [
1888{
1889"data": {
1890"text/html": [
1891"<div>\n",
1892"<style scoped>\n",
1893" .dataframe tbody tr th:only-of-type {\n",
1894" vertical-align: middle;\n",
1895" }\n",
1896"\n",
1897" .dataframe tbody tr th {\n",
1898" vertical-align: top;\n",
1899" }\n",
1900"\n",
1901" .dataframe thead th {\n",
1902" text-align: right;\n",
1903" }\n",
1904"</style>\n",
1905"<table border=\"1\" class=\"dataframe\">\n",
1906" <thead>\n",
1907" <tr style=\"text-align: right;\">\n",
1908" <th></th>\n",
1909" <th>image_id</th>\n",
1910" <th>labels</th>\n",
1911" </tr>\n",
1912" </thead>\n",
1913" <tbody>\n",
1914" <tr>\n",
1915" <th>0</th>\n",
1916" <td>test_00145af3</td>\n",
1917" <td>U+3072 108 607 U+77ED 242 612 U+306F 414 612 U...</td>\n",
1918" </tr>\n",
1919" <tr>\n",
1920" <th>1</th>\n",
1921" <td>test_001c37e2</td>\n",
1922" <td>U+3082 370 773 U+306E 517 767 U+3070 700 793 U...</td>\n",
1923" </tr>\n",
1924" <tr>\n",
1925" <th>2</th>\n",
1926" <td>test_003aa33a</td>\n",
1927" <td>U+308C 190 792 U+3092 502 771 U+3057 840 791 U...</td>\n",
1928" </tr>\n",
1929" <tr>\n",
1930" <th>3</th>\n",
1931" <td>test_00665e33</td>\n",
1932" <td>U+3066 220 544 U+3057 455 544 U+306E 650 543 U...</td>\n",
1933" </tr>\n",
1934" <tr>\n",
1935" <th>4</th>\n",
1936" <td>test_006964dc</td>\n",
1937" <td>U+3060 157 612 U+68A7 300 609 U+3059 455 594 U...</td>\n",
1938" </tr>\n",
1939" </tbody>\n",
1940"</table>\n",
1941"</div>"
1942],
1943"text/plain": [
1944" image_id labels\n",
1945"0 test_00145af3 U+3072 108 607 U+77ED 242 612 U+306F 414 612 U...\n",
1946"1 test_001c37e2 U+3082 370 773 U+306E 517 767 U+3070 700 793 U...\n",
1947"2 test_003aa33a U+308C 190 792 U+3092 502 771 U+3057 840 791 U...\n",
1948"3 test_00665e33 U+3066 220 544 U+3057 455 544 U+306E 650 543 U...\n",
1949"4 test_006964dc U+3060 157 612 U+68A7 300 609 U+3059 455 594 U..."
1950]
1951},
1952"execution_count": 72,
1953"metadata": {},
1954"output_type": "execute_result"
1955}
1956],
1957"source": [
1958"dfTest.head()"
1959]
1960},
1961{
1962"cell_type": "code",
1963"execution_count": 73,
1964"metadata": {},
1965"outputs": [],
1966"source": [
1967"dirResult = '../Result'\n",
1968"dfTest.to_csv(os.path.join(dirResult,'boba-053.csv'), header=True, index=False)"
1969]
1970},
1971{
1972"cell_type": "code",
1973"execution_count": 74,
1974"metadata": {},
1975"outputs": [
1976{
1977"data": {
1978"text/plain": [
1979"4150"
1980]
1981},
1982"execution_count": 74,
1983"metadata": {},
1984"output_type": "execute_result"
1985}
1986],
1987"source": [
1988"len(dfTest)"
1989]
1990},
1991{
1992"cell_type": "code",
1993"execution_count": null,
1994"metadata": {},
1995"outputs": [],
1996"source": []
1997},
1998{
1999"cell_type": "code",
2000"execution_count": null,
2001"metadata": {},
2002"outputs": [],
2003"source": []
2004},
2005{
2006"cell_type": "code",
2007"execution_count": 54,
2008"metadata": {},
2009"outputs": [],
2010"source": [
2011"form44 = pd.read_csv(os.path.join(dirResult,'boba-044.csv'))"
2012]
2013},
2014{
2015"cell_type": "code",
2016"execution_count": 55,
2017"metadata": {},
2018"outputs": [
2019{
2020"data": {
2021"text/html": [
2022"<div>\n",
2023"<style scoped>\n",
2024" .dataframe tbody tr th:only-of-type {\n",
2025" vertical-align: middle;\n",
2026" }\n",
2027"\n",
2028" .dataframe tbody tr th {\n",
2029" vertical-align: top;\n",
2030" }\n",
2031"\n",
2032" .dataframe thead th {\n",
2033" text-align: right;\n",
2034" }\n",
2035"</style>\n",
2036"<table border=\"1\" class=\"dataframe\">\n",
2037" <thead>\n",
2038" <tr style=\"text-align: right;\">\n",
2039" <th></th>\n",
2040" <th>image_id</th>\n",
2041" <th>labels</th>\n",
2042" </tr>\n",
2043" </thead>\n",
2044" <tbody>\n",
2045" <tr>\n",
2046" <th>0</th>\n",
2047" <td>test_00145af3</td>\n",
2048" <td>U+3072 95 598 U+306F 406 635 U+3064 568 577 U+...</td>\n",
2049" </tr>\n",
2050" <tr>\n",
2051" <th>1</th>\n",
2052" <td>test_001c37e2</td>\n",
2053" <td>U+4E0A 218 796 U+3068 384 792 U+306E 518 785 U...</td>\n",
2054" </tr>\n",
2055" <tr>\n",
2056" <th>2</th>\n",
2057" <td>test_003aa33a</td>\n",
2058" <td>U+3068 184 786 U+308A 345 777 U+306A 516 759 U...</td>\n",
2059" </tr>\n",
2060" <tr>\n",
2061" <th>3</th>\n",
2062" <td>test_00665e33</td>\n",
2063" <td>U+3082 220 565 U+304B 220 573 U+306F 469 556 U...</td>\n",
2064" </tr>\n",
2065" <tr>\n",
2066" <th>4</th>\n",
2067" <td>test_006964dc</td>\n",
2068" <td>U+7389 167 592 U+6B64 309 619 U+3084 635 577 U...</td>\n",
2069" </tr>\n",
2070" </tbody>\n",
2071"</table>\n",
2072"</div>"
2073],
2074"text/plain": [
2075" image_id labels\n",
2076"0 test_00145af3 U+3072 95 598 U+306F 406 635 U+3064 568 577 U+...\n",
2077"1 test_001c37e2 U+4E0A 218 796 U+3068 384 792 U+306E 518 785 U...\n",
2078"2 test_003aa33a U+3068 184 786 U+308A 345 777 U+306A 516 759 U...\n",
2079"3 test_00665e33 U+3082 220 565 U+304B 220 573 U+306F 469 556 U...\n",
2080"4 test_006964dc U+7389 167 592 U+6B64 309 619 U+3084 635 577 U..."
2081]
2082},
2083"execution_count": 55,
2084"metadata": {},
2085"output_type": "execute_result"
2086}
2087],
2088"source": [
2089"form44.head()"
2090]
2091},
2092{
2093"cell_type": "code",
2094"execution_count": 56,
2095"metadata": {},
2096"outputs": [],
2097"source": [
2098"form42 = pd.read_csv(os.path.join(dirResult,'boba-042.csv'))"
2099]
2100},
2101{
2102"cell_type": "code",
2103"execution_count": 57,
2104"metadata": {},
2105"outputs": [
2106{
2107"data": {
2108"text/html": [
2109"<div>\n",
2110"<style scoped>\n",
2111" .dataframe tbody tr th:only-of-type {\n",
2112" vertical-align: middle;\n",
2113" }\n",
2114"\n",
2115" .dataframe tbody tr th {\n",
2116" vertical-align: top;\n",
2117" }\n",
2118"\n",
2119" .dataframe thead th {\n",
2120" text-align: right;\n",
2121" }\n",
2122"</style>\n",
2123"<table border=\"1\" class=\"dataframe\">\n",
2124" <thead>\n",
2125" <tr style=\"text-align: right;\">\n",
2126" <th></th>\n",
2127" <th>image_id</th>\n",
2128" <th>labels</th>\n",
2129" </tr>\n",
2130" </thead>\n",
2131" <tbody>\n",
2132" <tr>\n",
2133" <th>0</th>\n",
2134" <td>test_00145af3</td>\n",
2135" <td>U+3072 100 627 U+306F 412 619 U+3055 752 594 U...</td>\n",
2136" </tr>\n",
2137" <tr>\n",
2138" <th>1</th>\n",
2139" <td>test_001c37e2</td>\n",
2140" <td>U+751F 215 789 U+3068 382 789 U+306E 525 784 U...</td>\n",
2141" </tr>\n",
2142" <tr>\n",
2143" <th>2</th>\n",
2144" <td>test_003aa33a</td>\n",
2145" <td>U+76EE 199 788 U+3082 352 787 U+5225 653 779 U...</td>\n",
2146" </tr>\n",
2147" <tr>\n",
2148" <th>3</th>\n",
2149" <td>test_00665e33</td>\n",
2150" <td>U+3057 351 563 U+3068 502 584 U+5927 637 553 U...</td>\n",
2151" </tr>\n",
2152" <tr>\n",
2153" <th>4</th>\n",
2154" <td>test_006964dc</td>\n",
2155" <td>U+51FA 162 619 U+3068 456 597 U+3084 628 567 U...</td>\n",
2156" </tr>\n",
2157" </tbody>\n",
2158"</table>\n",
2159"</div>"
2160],
2161"text/plain": [
2162" image_id labels\n",
2163"0 test_00145af3 U+3072 100 627 U+306F 412 619 U+3055 752 594 U...\n",
2164"1 test_001c37e2 U+751F 215 789 U+3068 382 789 U+306E 525 784 U...\n",
2165"2 test_003aa33a U+76EE 199 788 U+3082 352 787 U+5225 653 779 U...\n",
2166"3 test_00665e33 U+3057 351 563 U+3068 502 584 U+5927 637 553 U...\n",
2167"4 test_006964dc U+51FA 162 619 U+3068 456 597 U+3084 628 567 U..."
2168]
2169},
2170"execution_count": 57,
2171"metadata": {},
2172"output_type": "execute_result"
2173}
2174],
2175"source": [
2176"form42.head()"
2177]
2178},
2179{
2180"cell_type": "code",
2181"execution_count": 86,
2182"metadata": {},
2183"outputs": [
2184{
2185"data": {
2186"image/png": "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\n",
2187"text/plain": [
2188"<Figure size 432x288 with 1 Axes>"
2189]
2190},
2191"metadata": {
2192"needs_background": "light"
2193},
2194"output_type": "display_data"
2195}
2196],
2197"source": [
2198"labels = [form42.labels[ii] for ii in range(len(form42))]\n",
2199"plt.hist([len(str(l1))-len(str(l2)) for l1,l2 in zip(form42.labels,form44.labels)],bins=50); \n",
2200"plt.show()"
2201]
2202},
2203{
2204"cell_type": "code",
2205"execution_count": 73,
2206"metadata": {},
2207"outputs": [
2208{
2209"data": {
2210"text/plain": [
2211"(image_id object\n",
2212" labels object\n",
2213" dtype: object, 4150)"
2214]
2215},
2216"execution_count": 73,
2217"metadata": {},
2218"output_type": "execute_result"
2219}
2220],
2221"source": [
2222"form42.dtypes, len(form42)"
2223]
2224},
2225{
2226"cell_type": "code",
2227"execution_count": 80,
2228"metadata": {},
2229"outputs": [
2230{
2231"data": {
2232"text/plain": [
2233"4038"
2234]
2235},
2236"execution_count": 80,
2237"metadata": {},
2238"output_type": "execute_result"
2239}
2240],
2241"source": [
2242"len(labels[0])"
2243]
2244}
2245],
2246"metadata": {
2247"kernelspec": {
2248"display_name": "Python 3",
2249"language": "python",
2250"name": "python3"
2251},
2252"language_info": {
2253"codemirror_mode": {
2254"name": "ipython",
2255"version": 3
2256},
2257"file_extension": ".py",
2258"mimetype": "text/x-python",
2259"name": "python",
2260"nbconvert_exporter": "python",
2261"pygments_lexer": "ipython3",
2262"version": "3.6.6"
2263}
2264},
2265"nbformat": 4,
2266"nbformat_minor": 2
2267}
2268