From a7a296025a156fbdd5e9b3217994a009cb1b96ef Mon Sep 17 00:00:00 2001 From: OleehyO Date: Sat, 19 Apr 2025 16:29:49 +0000 Subject: [PATCH] [feat] Add texteller training script --- examples/client_demo.py | 10 ++ examples/train_texteller/dataset/train/0.png | Bin 0 -> 3133 bytes examples/train_texteller/dataset/train/1.png | Bin 0 -> 8905 bytes examples/train_texteller/dataset/train/10.png | Bin 0 -> 6927 bytes examples/train_texteller/dataset/train/11.png | Bin 0 -> 4248 bytes examples/train_texteller/dataset/train/12.png | Bin 0 -> 5363 bytes examples/train_texteller/dataset/train/13.png | Bin 0 -> 12345 bytes examples/train_texteller/dataset/train/14.png | Bin 0 -> 2914 bytes examples/train_texteller/dataset/train/15.png | Bin 0 -> 2245 bytes examples/train_texteller/dataset/train/16.png | Bin 0 -> 2297 bytes examples/train_texteller/dataset/train/17.png | Bin 0 -> 2675 bytes examples/train_texteller/dataset/train/18.png | Bin 0 -> 3144 bytes examples/train_texteller/dataset/train/19.png | Bin 0 -> 2785 bytes examples/train_texteller/dataset/train/2.png | Bin 0 -> 3948 bytes examples/train_texteller/dataset/train/20.png | Bin 0 -> 3959 bytes examples/train_texteller/dataset/train/21.png | Bin 0 -> 2949 bytes examples/train_texteller/dataset/train/22.png | Bin 0 -> 3819 bytes examples/train_texteller/dataset/train/23.png | Bin 0 -> 3574 bytes examples/train_texteller/dataset/train/24.png | Bin 0 -> 3180 bytes examples/train_texteller/dataset/train/25.png | Bin 0 -> 2518 bytes examples/train_texteller/dataset/train/26.png | Bin 0 -> 2263 bytes examples/train_texteller/dataset/train/27.png | Bin 0 -> 3178 bytes examples/train_texteller/dataset/train/28.png | Bin 0 -> 2923 bytes examples/train_texteller/dataset/train/29.png | Bin 0 -> 5404 bytes examples/train_texteller/dataset/train/3.png | Bin 0 -> 4176 bytes examples/train_texteller/dataset/train/30.png | Bin 0 -> 3990 bytes examples/train_texteller/dataset/train/31.png | Bin 0 -> 5004 bytes examples/train_texteller/dataset/train/32.png | Bin 0 -> 2994 bytes examples/train_texteller/dataset/train/33.png | Bin 0 -> 1819 bytes examples/train_texteller/dataset/train/34.png | Bin 0 -> 3321 bytes examples/train_texteller/dataset/train/4.png | Bin 0 -> 5793 bytes examples/train_texteller/dataset/train/5.png | Bin 0 -> 11536 bytes examples/train_texteller/dataset/train/6.png | Bin 0 -> 4897 bytes examples/train_texteller/dataset/train/7.png | Bin 0 -> 4607 bytes examples/train_texteller/dataset/train/8.png | Bin 0 -> 2594 bytes examples/train_texteller/dataset/train/9.png | Bin 0 -> 5353 bytes .../dataset/train/metadata.jsonl | 35 ++++ examples/train_texteller/train.py | 71 ++++++++ examples/train_texteller/train_config.yaml | 32 ++++ examples/train_texteller/utils/__init__.py | 17 ++ .../train_texteller/utils/augraphy_pipe.py | 165 ++++++++++++++++++ examples/train_texteller/utils/functional.py | 47 +++++ examples/train_texteller/utils/transforms.py | 154 ++++++++++++++++ 43 files changed, 531 insertions(+) create mode 100644 examples/client_demo.py create mode 100644 examples/train_texteller/dataset/train/0.png create mode 100644 examples/train_texteller/dataset/train/1.png create mode 100644 examples/train_texteller/dataset/train/10.png create mode 100644 examples/train_texteller/dataset/train/11.png create mode 100644 examples/train_texteller/dataset/train/12.png create mode 100644 examples/train_texteller/dataset/train/13.png create mode 100644 examples/train_texteller/dataset/train/14.png create mode 100644 examples/train_texteller/dataset/train/15.png create mode 100644 examples/train_texteller/dataset/train/16.png create mode 100644 examples/train_texteller/dataset/train/17.png create mode 100644 examples/train_texteller/dataset/train/18.png create mode 100644 examples/train_texteller/dataset/train/19.png create mode 100644 examples/train_texteller/dataset/train/2.png create mode 100644 examples/train_texteller/dataset/train/20.png create mode 100644 examples/train_texteller/dataset/train/21.png create mode 100644 examples/train_texteller/dataset/train/22.png create mode 100644 examples/train_texteller/dataset/train/23.png create mode 100644 examples/train_texteller/dataset/train/24.png create mode 100644 examples/train_texteller/dataset/train/25.png create mode 100644 examples/train_texteller/dataset/train/26.png create mode 100644 examples/train_texteller/dataset/train/27.png create mode 100644 examples/train_texteller/dataset/train/28.png create mode 100644 examples/train_texteller/dataset/train/29.png create mode 100644 examples/train_texteller/dataset/train/3.png create mode 100644 examples/train_texteller/dataset/train/30.png create mode 100644 examples/train_texteller/dataset/train/31.png create mode 100644 examples/train_texteller/dataset/train/32.png create mode 100644 examples/train_texteller/dataset/train/33.png create mode 100644 examples/train_texteller/dataset/train/34.png create mode 100644 examples/train_texteller/dataset/train/4.png create mode 100644 examples/train_texteller/dataset/train/5.png create mode 100644 examples/train_texteller/dataset/train/6.png create mode 100644 examples/train_texteller/dataset/train/7.png create mode 100644 examples/train_texteller/dataset/train/8.png create mode 100644 examples/train_texteller/dataset/train/9.png create mode 100644 examples/train_texteller/dataset/train/metadata.jsonl create mode 100644 examples/train_texteller/train.py create mode 100644 examples/train_texteller/train_config.yaml create mode 100644 examples/train_texteller/utils/__init__.py create mode 100644 examples/train_texteller/utils/augraphy_pipe.py create mode 100644 examples/train_texteller/utils/functional.py create mode 100644 examples/train_texteller/utils/transforms.py diff --git a/examples/client_demo.py b/examples/client_demo.py new file mode 100644 index 0000000..a6445ad --- /dev/null +++ b/examples/client_demo.py @@ -0,0 +1,10 @@ +import requests + +server_url = "http://127.0.0.1:8000/predict" + +img_path = "/path/to/your/image" +with open(img_path, 'rb') as img: + files = {'img': img} + response = requests.post(server_url, files=files) + +print(response.text) diff --git a/examples/train_texteller/dataset/train/0.png b/examples/train_texteller/dataset/train/0.png new file mode 100644 index 0000000000000000000000000000000000000000..9f27321b972d80dab0ebcbafd3779ba6b9878fd1 GIT binary patch literal 3133 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 literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/10.png b/examples/train_texteller/dataset/train/10.png new file mode 100644 index 0000000000000000000000000000000000000000..b2306ab1c74bac9675ca72fd679e1b10e71f8be5 GIT binary patch literal 6927 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 Bu|EI+ literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/11.png b/examples/train_texteller/dataset/train/11.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b20a1e057c18059e8864474c107e130dd13962 GIT binary patch literal 4248 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 literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/12.png b/examples/train_texteller/dataset/train/12.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3b2852d7a817a9064afd4995dc041b1f4d1e35 GIT binary patch literal 5363 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 literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/13.png b/examples/train_texteller/dataset/train/13.png new file mode 100644 index 0000000000000000000000000000000000000000..692fcc274dc8f524dc1ad0398c73b6d6e0bae2fc GIT binary patch literal 12345 zcma)?2|QHq|L6x_6bT7YmPoQM5n(LZQX<#HO5Z>zd7r9*Te_-?D+jPax~ST3W(WL=!PZ9S2?%sf=g$}AUEuKK$Jx!pAdqONmYNDAU~E0h%F!Ik*&bT* z@&RvQv2T@=DP7)kg)_D(Ct9wBFL_GTS=Stye=WVI*AgakyIW|jPVrOllj_GyPOqs| zhQnU|(?(O_J9$^@u4BaGrWa|~C7?SmE`EwhOS`v!mAJNynQA!gZNO%xZ({A`R=OvA zFt_nXCx~g2@-3w^KnuBZX14*nay}8iZCtKPaBOdlkLF;iHKPRn2vQOroFsidPIA=! z!ao-ML}w#&;$==%dLJa`=kl8UU|pp!LerTg;ZsP$dXOuZp3MV*mmxG~fg0|ZXaSt<>pB+0 zqbGEwMq~gq2h0Zna_ju2RMhA}peC-nd9MoXVjRB&0T3~#(}SY`>5R{n#hA^6Dh*xv z?s<^lk@H#YF1(rlP>mV{f?ORQeg6$W1GmV{6Uf+nyP*=hPY&8`MzpLR0R-c7Zd@6i zHA0th-}mLKyKf0ReH}*t z!Fhr7Ezf|NbnQw_9WF)QqXx&4L+B*YEkv7!(m=BxJ4^W-HP^LIgHJZRa%_*=4-@u+ zbor9Vk(KWOnhCgvQ9WUFsa!HA)!Xea)lOv(62ebq3+kXtPtQn$l%*#hkYJ;}EI$!v zPxgFnN(Ap-wG(>(*A)29+N66WMNqAYBQVs-AK@?a9}bJq%7L9);ByIeB3iU zT^$N1?yPrJiCGyNU-Yas%dT5Mr=31JiKV5DZMRx>e+erycMmN(F4?b|P{NEcEJ%Wy zgz9_K8sWnIZjNK|)5ynHRwzIqgPAkj`C;d;QNN=f z@pF=$K}O*uGr9@qz1Wt_YGm0RaDxEW+>*_q-fdzu=Hx;#7MYVVu1>T{5mqZ2yt8`z zj`m{(0=rkK4VB6cpK8}Bnc+s?VuqGo5?Tj;^fSjSP^YjyLV%8(oul4Rr;Up+7rraw zmfUM>?y+fWad8$Kqjsl4aVhB3pQmEJ0Y_to9aLDJaQtkDAH8m6cj~ix{eZU~AyEwa zF2Zu;pHig9)-B%pq0NxchKtX37$5U6MK2?$gDu>voX+cMswPmzeknT+?0)tn?X^wI zu)PXD>yt>Hv!xky}JEgqLn*FobPAN*6;o0q(?ODIb zQ_cahg)i>4&1(;Tz)J3yidS~AZiqqGXih~FiiVB$t%>U2RjZ6p$3;SSdUoF8@9p?m zCu+vJ?Ih0tZ4%h|wjp zMOxl=nbJ3UqaMg1GLtLn(9^UF@8ie0G0d*1DDRLL6x;}Sv{^#ZT7|$MBqUa`Mmh2U zpG`CK7u5i=s5;eSL1Rl|GOOfhwoaR|vFFKJDJ-zDZF}qk!gA zV+p9Y+zK+8P|l0e9Ah)ceVF|hP8aUTN`X-gUNY^BkH<&V3ZBoo@ zO+r6DJx7UB=hmBN+>UBm?v_u?JnhxGv>0&D7?PjyP zb4@Zjqk?b&96ij0ODWY0LZ~3icJ-l0p5f!Dpb+Vo1w{2!&JSZYY_(t&^d&=;q%Ddb z^5oFzl}uiO_0IF8#f%mn@IAN{RAd=>k#^Jy89fdfdMQj@%FZcP^CG$(qvbV+AaYRTJd(9vFF|%!9`2s|Gjb^&xg2WgS85G1k+SQuakRclQfQNT~CB|LIghQX$rHkb@m;z@A-%r z&>Yj~)Z}A&X6-V_Uln<)&kZITy`1*3=2Mu?VV41V>L>Sp#s&6D<3y*jBYJsJpr=q! zAN$9zUccwz(61c2H-jB;X&ryl;9waI+`5M6VejjVA1y~Ac4Z$2RS1~LSm4N6Q?1_= z(pe@^H)p*4$%9paV6|ZpL=(SI`wX5(H2O(fYYbCbr!=h-+ zeMkqk+P)Z|`#8uU7Q>P)(%ZeJ-u4hbSrDFW27R84D%SM%dje1!dh#79R8(60z20L3 zps_Rf@$Ge}Wd>Ch@kky!efuovIYqL^D z@QRa&y8yt|Kk>E4lFt=A>qa1K+bzY+!5<2q~i{T>Nl{GDBGxB_8&p}p@|5x+(XVco_xcUPHEircG9tGofPijIwlD2?TG z>R8vB^2P5dLL1rghsS-J3Gi%Kc6B1aySlxTr{#kg7rX~vEAu`2yLk|Caidejk(-7abvgu52BpB*|erJ5{~d& zkBBherk+Mk!*Xa=(o@!>oI|8JP}n6cyVedT3up!0r|zS|f)SKW28m)y4NeZ2%;1-( zNC^{M@Di$IOy%T7vEq;X9;Hhiea!dUz}94A;n&%nuK@Ta{FpEZ)LjARs)ZYnP{R&o znfbeOF!uB-^sL=-3FpN}Ud$AgweU3cFPgB?)u`p4e7&&^&kheEp%%+DK*W#CPwm+a zzqZh=4Mq4gj=o0EZN;<*oo9k#jR2VTy7vL(PIV-cwfPLxvab*qM)=#K&Kq4Rl{Hrx zm>35jVhKls*iCF8w zW@I>2jaAI5K6twve@0+4xkh7n*);0O(b%yI9yO^}b=~8^)LTesc6ak=_-AT|=pm_M zCu1g?=Rbv9T!w~^~mOXb#1HvmE)h3a~szUz0;+ z$(j?ta5J|P2+SpU=`Y1QK48`cV2}=-I)dS_wL$!f?sogGA76e+S{@zvTWWeU>jiPG;1xhVIfO<=?93eYBoo903OqH z^K^5z_nZvOUMmvczOrQRexcgim0Q31DFl@=@i}k&4n9VK{+rX45udhsK3-}aoHFN) zUsXtEUT~H>x`k5>g@eRr?+#GDoY}(V2$HuRHyvZv_Ybdpr?75$G#*??3tJ~osxf^&8C(mHUO89ixFhiREsuM4$VibwRd=jk zr`Id$@Oxxp1`|i3ape|q6PX)dJR={hBu>v$i!YNm9p?%rrxKx+3B*(suYv8sCQ_ei z;b2^H+D)a`mOmmIn>u_^(;&=TFMK21KdZMtwkY84gaE<)IoMJQ5iW4nS@s~=R{tq} zEWyh{b6@izVRfM(@wjW)>oS){9#Z3_0gd0lTJ}JftC@%2ii8(x+#MIbKn)R@`Po#~ z5SVmD*6gCF#uD&8n@`!b&g}w4@YOi9pS^8$tUT{^E;*S+lU$a6+J1y1yCnFrn!T3;^_#ZteBDyEFXD&Fxc=zO zd?ce=9GqzK)NkyIm;pmTCIN?J`DYN#$~vLsdPX(Oj^7ffKyjW0+@+;W_;GBF z*ivH}uW4KWqn`|k6?cv(+FMPWha2xVIS=EPCu)7xdP{f(e+Q*LOFjl&`6;?0{I%;x zZdea_UEigh^ezX{Apdi%ejFgz-%qQ0>2y5qHHliYWSjI2l1YxDzVzftzr+B58f3~8 z;NI@$YN*j^9q>q2HXr!&n4BaYHlU`7hnqZ9I4ND68iyMRH9pOI@o%o2J*jUe)e)Kf z`fuzkk{7q;KA8PmQG&|OqzitjHlm~PuWXs0k{kkHnGE<{VrgH@<8)_VEE*oTnU9AD zCO8&&0rb`1-PfO_BiYd~|5~{^fM}Lj3x@UVQKiqJ8bG@SJY(zzB8|+4$(l3*Hn$Qk zhfW;KYvi;>08rx2DNvDoF36g(_+i;IiNKKE!{t5gdmJ4)F-s)Mv2vi1yDnw`m;2^E ziL$k46mt790VT>ViBdiEtex>~cFJ+NT)>rN5a@Y$g4;?!$$Ulpa1;xs^X7DuEkhq5;6UY|Ok1F{odp8RmYZ{^ zqf00K*Bf2%jJa#TlUU9Nzo2Ek43r0%{F5De3lPdbTCWl>0`2)hXO#WmzxdlmnPK+$%K?}p0RXU%|vb@zPy&*gwjHk*v6?bZpT9!QKRYc@(pYD4p)ra}*o z^QS|BQ3aZAu2H86@R@&)qc8*bKhl>C2m__Evdlj1%-!{F~(xaJN$x(2+hML)^OdM(fIuk&?=0wnwSZ#Y4)^mKrFwXSq5!DF;j!Y8`^8hX_E0KUke49jTt4r=Ri(Bzs?dsuoOzSeb8+G071EUQ@rT$r38c>j2~piuoMtv^S|i z$^j!+TV2PiNPfT8Z1E{2^}W<&Kwejtl>rvMuRN!FZSL_>L_|>4MBU<)2rX@P3Bk3; z!G(ooHID=fi=m}C%xkeNA_9db9A==&Dl27hq<5ny2){&jeE?JZ9ltQi}TH5)OpatgTNryb-sS7DT4 zFALy00U_QO%!9#}FOCI~dEZ$L7Gs$7`)2TZwyOsc3LXvLO%P}}^R0d&8HfRV6#RMq z8|223ZY!E^)#lp4z%&0phCCU~C_cvTk?Iz%q~I+JwXPlb2R9-&@ zy|oaa=yQ)5pE}XM{3h`1udh;sUw}!sT#|zm+b)8m=oAbLPA%xb7Mx~qYuMG4Hjwt- zH5|yNE_dcE4efP*ltoQr1xh=l&TTt>f}V6XWK>p6e}VUb=@$@A2D?Vz`hLtuJTx7FgPT<3yF1Hf z*J`1k?b@!1c9~XYpfD6072i`{ThDCD@4Z+hF06SHC*j%Sv;LNM+mdIu2ltxpwqbm$ z(b@(NeKm11WRclS7K{uQ-VvWH8Vhtr7p51z_7B;m)V2PI^UGh5(pLPA zp*udEL42^_KlVI5sSw@~_i$XSc9(k;-j4{v6lUm)7r~p1X97w%+n)_}^0FG07GJS$ zq$l{xV6IN1y7!W4(uDhkyJTPRZFu+TE8o|3nV_wKG`VR}CegeQS?@JmI9&LGfIWzS z9A~CoAdCKYdwvZM(vTL_pNfF~c*Y(WYyq7Yz`k^gj9M8H%x1IPeDLyUWJ;`dkDDz? z${rqgYxm=94stB@$O29K;RrE3M{eUac60Vx$3&ul`Vm+l@t_u|uj-o|n?e)2Yu=u< z){S>?5sXl1XKanVDCNGE2r14&@D5_4OV31I6RerrB?1F<-JS9ddmwUHl{58SyRW#U z9AFktG))Rztgjt@V?J+cbeaFNfSh!RhB#i}Ix|DrpNXGRYjjuGpK&_2rv#_|X zXDLilu7lSQQQo@egq}%C>(dC1()zp z^Zc*L|F1fo9^;R|99gogC7N+UFjjzBZzh>_jQ7b?^_-2=>OF3OcI`eiIsfH*DhyKO zyfR{SB2AJxi`SxHDp7)M8ZEWsxcIj?Pm^0&Rf`Wx$} zI@QdLMoMWP?SIZ>b&q^7f^B_sCW;BUNMnl(_EODz_${}fYM&|*oPVs zSNLI9VuE|Cl^|L7(@WI&vhC^qAslsi&F&?%_pIP_aC%iao2-pu0@=?R<#Hw42Z7ZI zmGWs{`7w&ifeOmr{gudwVH7rYoN4%(0QFCnfaW;C!JDq%=`q>W{{%p2!xR!?t!k9) zk_9;F^TFvVN$SCK&)O3~2nmZu@!E@2`L-<2 z9y=FsqN|5*%6z22xIkSk+S*-JDuPog7%~@%q-HX|8L%Hz%0mc>Fi!a_kCpw?9jO0z z=ZU~XQR*zF_YW>w6!O*Tt$W3@!=@}Cch!5Oo_0SMsoRJg_hK&RC`YCVMo6wk<*I4e z`Jy%Ug1^5}MnBWtScx68u`~Ur^`&{T(5rXxVPywkYQwKM5v12m_4g@MpQbNj%i5l4 zhcAYX_+1wSZtu>e-P+!gkdLb0hfL2NWd`=lh}&ISm!NAf_@OKXi6BGx}4#a;~1VT%^E%aKrcmC-0OrmAmlzZw`lAP!70H=gV5W zh5xVGaL2x{{I!aHA*+WM^)$@@GN!F$vUd?Ax`|(VA~I-Y*4&eCDp+=tQaQ2@&*Y;^)r@lPPj152u`wm2bcYMlKn8(!%T2WkIufg6pODVb zL8Rc`aq?Om2ba9!69rtOV<|u{5&r^7;^t-*pwyE@64Zt*(d)4p|4*;J<{q-!;rH(U zD%CNA35H6h$2ath902l(SX6Os`RaFMH*x6%AfwwM1!uX~;N)3{LHnF!;Wn#78%sU| zyj~`GbwIBBR!zwR6a3qXg{8=y6{lntWU1s2FWyZ9|BaH%nfGR7A~f>y2z$nba>m9` z!6-E&>FYIx@~dE_pEu7AFi25bh9ngU-h2gB2Wzv1Ae<8(1O*haq)+`1fN)(878wN56S2VBvO^bk3 zu@!NyG>;RTr|9?L@9Lnv=l-M?ti}M)oKBlTnvOKd)5~9xm|4fds(ie$3%#9j{1EBa zT)Kd2|8zK=d|dt~TZFOUu(e3H{_y$X8N`C~>EKDx?HQBdo)jUoQrDWflbR3HT*oKN z_;mcA@VnNGODR$42{*VOUBBIR8C{iYivU80#r!QA zNW#4#6usHss7qArsh`dm1NiB$ln1EK$Cd|M5%g9E;e2z5JtRo~@r zqo{A2gy}#jCV8YJu@gf*g*sayqva0I!EA8wBNdr`93BD-w)49OO=>8J{Ulx<=QDuC zYS|@Y3X;@Afor)!M#QmK33XYIL&04xQRrlbxF?T+Tm|=+a~z#|shdOA$qXjNEElul zF5NEaLT<#4^WnR3MaVtPJwMv170~P@bN*E&o2TdGb|dC^x0iyfOMTh|-3JR(mgFEf7U`|>>H z`6)R6MAq1^Y}J~%udRzD$A5vpb_Q9L_DR>W~+=k!Rh>knO`J1 zuI9oH$nj`#{gvbjX_6dYcBj<){TjoTuuO8}u1YEpk{h@8SarA9RW2=fI-Fc^lPv9b zu1b0m^*PNic{C)V-YR*V)Dv(AhqK=}%M5&DblUtamNXt?G{){;jz&BHX9V6-2jsZg zgWl;P5flKX9tFJo3L2>SK9B#gxiCR;<3xuj4aesi^C@81HK(7bglZ~+~soPC_R|88WXCM9Ud*KFA`3EM3Dk|L-ypx$nw*@?4* zBEoHjH4oZicXLq%-dW(=^e7oPMGzIkt^?BUnJzMW?IPD z{WE3==GoY94~a*NA93e<57`*lE^Llg!VGu}q+PW*yyZ9V$G=v%1fdB?XUF>6_=aP7 zg?>s>s_jv<;EM#AQ;F)8sl*p3-p$z4QY6>n!KkE_n~ETn4h=m<3?&dVO1==o?#orb z=8Lc_WuZSCRR2mr)8N8@=gbor)Gn8N)6cTak7JZeW%2Xt4|n#(tlHgzFQp^drF8@b z^iZMYj)`t-B|!YS;WzFEPdo}kQkt`0sx%UNMd6U~^|}vcv8eyq;uBD%Am)PA3sz%- z_1(5Ut)`uNoZyWXLst9h(@d5N{B1^lN|KUucH_Ynl!z*YQU#AuijqLFI1$o>!X~+^ z-!}?vUqA5SU7k{i#EQwA6Tn@c-_5W2)63%XttbRb*E&vUgtD`)l$B2t8V_*g-=40< zT}E}p3FQm6A(H|>xCJr#t*9vI*kDVHCYIV?Mp;5=uj`)cPq^x-`s7_n$M%-lmFMXE zz|YmgZ$xXhx?s#wZQ&>`$PcQ$CXEVDZ>4`8kddE6trE(ZJD8=@^z$;9^Qtd`E#j4A zAU!TMmd~Nei^pB_qSZ=-%?T8|{buRf-LKyrzM)Q-AXYK41;Z4G{7SZfI8pFjxg9?* zRrs>YGmd5C$(!}(>qZ1HT7d7u31U4mcm%=*3cKAA7vt(bkv4bmnX=I;Kk7|fYx(S= z%va7~zswF6LNN_o)LS}YjLsr3QJZ;C+G_Er1E#7gYAh+O4qXKu@cuMdAGWa2QQoqWl!aM_b-Tk1-E(hoVM}oO(D(AIz zN{jg0f7Ce@wb-?D^pMIR{rT(5x9#H2y(}8D>*8b>zbFWQH~N}}45YkoeNXTqByH*7 zbHu+%Y{jBySf5IH@n<<^^fAsJwMLmsnk+HrLS+|U;ap0gU9q$*ttzapCK|Vp`=hVe zNe)|(1=Pf`a_O@lCT^IByAO$1>ObooMgUiGm#zi0-6C9JNrzE|>@F=2h5MHDyW@DV zbYKlb^!Gt$nAcU+3HM`RFtbi1r;@Qv`vdoV8R(}+DlejLf<|Ni$m|v1c!@zv^*jcG zlS_K$!`rbUJ0^R_JOa+Ljd$JW;@GPQfFyHNU()}q>?N2lQlz|1!3@1et)vX^ zx~KV|^p^@5=m{mJF}dvkXl=s3Yi$RT)>a{DZT3rnO*f7><(p`ODuV!#ri^Gw zcZ(?j+F-C{Cg0>C-CvCY1an6NEH5`+Y&MhukWZkvTsbsA_VT~h1h8P&&ZALa9}Q9!5;c7S2AgVNDDrHVC&3(k`zK2-lvJjYu5)emi(w!5gsw!cjC zn30J3Bb1f@=)&Ji6I>zpeanB@jdqs*0zU@ME+>y9qhmR*)jpZ7AeK&QzA3#woV(UN z`I`UfZ(VE07<@AN*NPfw15;4OJmgk`06_FIDVex8vmAA|Px7y+m(y6%1h`3M_3XkM z?n}WS&M%mN$bVlH=b#DJpgU(zIPA&vitYel*HX2aUe^au5Coszg=}({1ayg{D z^7(MK3TPsque!0XosF-(oUOM#@Bxw(my{9_mlP3~g-FQA-IS1%kQEXamlGFP4Da~( zUkbQ+*f~9h{pSL@Q=XTA0yq9=4Zcop_CCHgZl3?S%%v{9cA$(1sf?4Yt(>igC(PT) z!O<6_`ma516>nds$Myl-1|E-n{cXJMxh2IVB+k^feE|we{Hvgyy^pQ8lc%qfhdb!M z74Xs5yu+=fs>=P)+vBm5t3A^>vPhsX6REJL-D5dJdv707!G~%ZA`+s~2DeO`fj@(^ M)OFNK?^r+kAC`lRhX4Qo literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/14.png b/examples/train_texteller/dataset/train/14.png new file mode 100644 index 0000000000000000000000000000000000000000..e7fe2fd944aa446e97a22c26056c1f89ba5d2803 GIT binary patch literal 2914 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 literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/15.png b/examples/train_texteller/dataset/train/15.png new file mode 100644 index 0000000000000000000000000000000000000000..fbbeb825e28b095a3de7247d10590f4d44b22564 GIT binary patch literal 2245 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 literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/17.png b/examples/train_texteller/dataset/train/17.png new file mode 100644 index 0000000000000000000000000000000000000000..4f30cf14ce690fc5575dec850fb853d89bc1f3d3 GIT binary patch literal 2675 zcmZ|R2T&8+8V7LjN-+{ZBLss~r6?r{)dwOVp;v)RClCUWUP5S*BIN-=6jV@Anjk7l zCjq2$BLWu?QR!VkN`QzMfl%_6`{urxH*enl=G*Vg+4-NdGdr`pBr6L;FbD=>V`Bpw z8=qTr z&UI3fe7*F!Q?tIrDN|ILU|L~<;PL98vmL1h`-#_eIYO%>VQ>!txn%{}Y^y3skgpC* zj+_Zfh%5X(^E4&(m%Cp1LPR%xV#v6D%ripy=|YU+=jT0Zp5L0ba7!)qe$MNz0P_-q z%DZTh7L&941Qq~7Mev-@sgnz^AFtro3Wy!wC;wxMr7-x=+cZlSe+A$Y?sr!8l6x>z zT_MnE618w;4N#WFgO$#{YhqZEC_8$_AEee32&O*1jc#cox@cA8_eC*B>f9z`1J1)p z=_muqnmDNkcR>4ta~r`C4WzFJn}?BY)=I;iGQs^;fXvOsv_A#1CPmy_HAoNGrzA;Wr}1>^W~#zP~mW8yJwRO(R19q$GMc2d?>`Tq3t^xtQuDD zAv_JOGGKp_3(Bi_&aC7^xn}*wWaAkd$v$l@*3bRVrMAQ@n~M!+$j7u)MupeF;U)Rw z=9H(t>Lu26?N-*#A@&!su`|+4>+IwLn``&n`Cy4NHw6RWy&nddV^@# z65aavxAy`EJb60mLWY|x-$o48xoGyCVQEBkL~=MFi&-dKu5(NHjhbCRnYFY@*5g8P z2ktx!*=mD$gX+iYAdbN#ZT4}#ht4bfkzD_-{c;-Q-gO=LD<~w(4$8Tl##`jX#v< zBwmYE0!9uGhN}U{B65c`QTYdMp}*TrY*udi(>0f8!Y#)>FhF{fcu0(>FEerAxYW@a z2Q$Rov=JdhEHO-K6*6D3mj)e-+%;f-tAhb`D01m|*!?iu*)Gtr z)PL8#_rk=x1cd*L#1X0Vf*w8!iEV|;Zjm`gyHQyn<=ZwATX~SbHtd-a76f*nr{|cV z^P8_kImT&yJwU`Z!~sZaZ|#yuQoj&@OxaCMfb(u!KdyGn9|c`Mg4)|ZlEY~By*c#j zwRx1*su&}KSu0kMBT^gV>f6P>YjMGsSp_S*>DNJgbTYcIn&}WzhDK}lIeC|^n=N~N zr7z||D=F{fI`&z$Xrkqa>@2wqR>N4!jYVW%~2|G;f z>Zy0z)cTSb@~L@uMQrkPWD35U~k)OJ)Q90pK|2DApw1RWY3#J+4tUk*_ zv)`a@!;y|}*DA#1dp>%QcckW~6dxJA=~0p)(8~QI7w>xNYlE*Gs2MJu`_dT>PqR!X z>Xi;_<1pc(=XJ;>k-63x$#C+<&_?iugzb>%vVF=l=AxS?EuV2!^W2cX{MQEIn9etv zc}C6pFdl3LxRCVMibONtV&3JdAL4u_<1)DkkbDZ?_bRF{c+ay4NC!~zku z=Jy_1a(e66uGh~ASSGn_ef%Ln_NU5yqxCe--ydsL989_B7mrcx`_$qz?WP9u68~%4 zh_jX*ZU>uPi9ox{G^M7I%N&c7;)Z@_xwedxb$I#ppj=Gx%x8pQqfBZ z(k`(EF)>1+byRRQiSpk|xw0T(V%bmv$;*M`Rt_Jt00pl`CTQ!7)0C76>N?Y4*xs5Nh|um01Yc*6Rv|+&siy~yq`!gs=ulP6sGN0B;!r^31L%D~>ZhwO z`eq@jywRH9*W1;Lgb9g(LOawyIcm3rPJK~EY5~l%rj_oseXIiERz&Ba&&4@Z$@5--&p^^_!(t=FgIsyiIo0k2x>sNs)M2p9SDSFhb47GE zLgH2L>Q$qbs_CWV`X~MDTcqif3#rx6Mlk%+yW@pwgQROCni7J0q#`J{#7yih#OxbL zF}57mQkv}aF~jkykz-@mc4t>_j!3_}@bKOw@I<(fX=qw>LWtEts5Y=nXXOIPz5`C|T&{Txfm zgbOhD+ydne8&;f!g6zQemykJ~R|93AjM;uxF3pQHDNLZw9`Zar^Y_rl*q&(nS`l&)){#y)%IHV&|#2 zF{!+9RtCnym&`?F(iBt-X1H%*glI@?B=G*c0vj;1t!E~doc$I=tlRddk6C=VJbZcB z0cGFFQ_MkGnzf*q0lEW4iUovofA~5(`q)>k;goo&h~O4*S2C7b-N$;F_y#w2(Nn%N z?rSFVFiF?;7VtA8MbLL3cwz`%8d$s+(Abm^N-7EnB?ZJ~Tco;%GEzfXNe+R~Kp;kk zGavm|ARx%o2N(7K1EsfR<$!?fe|8}F1bBrKFag2;KXaIW;wO+%ILi27u^QN*;3&M$ z4Q~RQ-rpl}T|B`D=M^b#6NDo~VDMhzN(dy9yRnlD1d)FSJ-tG)c%NW`Pf#G+{{%v< z4X=qC>*=tPDn)~UNR!?I7zjdy#DMe~X`(a*L5frb49G>K zL+DjNP>O;CY0|q~2qETe?wk8&-n@DHnX|t$XZQO%GyBh;$0kO)V2*PfAP@+wuZOq; z)E!_5LRf*j|4B+aP+0F8=pyKUUni{hzXK~LaC$c0K<)W^pbi(yfC-zAzM&4=(lK^! z0g=;SJ0!3KK{*@wfbrdbWXH$|hfT;v08_QnK8W zO9mdV3CZ~;FNRn+JoNJOeV<2~M2ubMtE+gjbQyXp&k&j{3xztw;^gy3b896eGC3}u zSgXF*)-l~i_am$Ro+eNBQ%Ulhl>21q&4rhX_`!g|fLFVP14pM$Giz_1sp4TkOz}0y z_&N<l$x6*$O2$4>~TEd)NCA#`XN_K?Ff|qsm}^%GQo^{@W&tAmU%D4(D2lg}q!h z5N2&imM*%7Kol*J1PGrykr=7lW|Vdl!rZDnu)uIj4eB=fQi_85Q`7 zcEqKP#?b)cE^OEYC#nn;K36ON;Oi`9U7-Z_?mb%-L6pBmS~R`I*PHjYPnOh}VT)q< zjWn`?l}mp4S)gycSwp zo`{)P{_w@Uh?lbCzc81YXf@cM70b}yFBw{QurQm}Mdc*1ZK==0NLP;HGqU)e4v#YA z{lZrL#?*TVnY_+pme&Fa+*2F!%^g_&%>7R zep{iUq0X=oHfU@Qzk+yrcCH?r`8_UED zxC`^{uJ8PM&tzUlBsS6u@RR%rHE3O0u&lyt@!%#x1(p$IWZK*jMsom%b!G)y9Go9!KAMzePwiz!Fv}S^vR$0HwkbsYB zU(?#y4V=Lv$2e?`zhe7!17en^zEmor9A95bp&caDYBVzOMfMWToa~Jt`?f`fOCZ_x z%HO%S9GFvS_JbcUDPwRUXQ*mkKc0wwkkqM!&+|@N-FK{Ts1rDj(DNJ`-1fkFX?2|^ z)th^AKik57A2T`#>u26>wBqHujIf^la%+*SG|f=dK@L-=Zy$Ag7a8On^&3Ufm%7pWJek=-YE5BhU%WDdLr7C?%b0wt zmpc|wmQom!fTF2jbo9%M>S_dy!tC$h`5bb3z}uj!!-;Dr^YEXX18s68O6BM&~@$$;I z@yc>H$JxI4k!&5AI3%>mL|x6cWiBQ3GVS)^Syzklaa@pEK=#McG@^_Z&$YnarGWya ziT$F$CfGw>0QdU2X+;voUJYg67{LZ_5}JT`#-1LqP45G59%J~anak=2ckX*7IxZ#- z6Wd{S6I)?`|Gr?HT0GtvyI3mTL;FH4+BaTpo+frvMC{Z8!1oOXunZ#g0ZTvgGGkIa zOFXPL@}rOGE7tPgR;XJ5gn6-bjo5hdewg@6xIh}SQQtx3X^P{02Sbw0z3Xaut41Sl zMsSWS&5EnXY@UCppGWVxdM!jaNKIv-{0#@&qz5BHB z(TYWnf5Ill=)>#-;FfCef%OV<4(W?jd7}9&1hXKjOm#uk9Pn=#r{{)B^?cyLrnlkOd;he(o z*SZRC)MCn0<%sPTe<$?^(x6(>A^)#yOF>%D$2aqni+AWfNd)WnQ-WRo)GzDCHJab( zA%lcU&OvEq184w@fxd4QTzp`%txchZV_TGd{LxMJ7JcrYq@hTA4+vy9mKFZy?UD}uv&x;-(rT@(nOKn6m63w2eVdGStEU= z%<b3br}#ls*a3e|#7y5leP(*EOSX)E(d}W_)v%K^yUn1H9VTnTi_6u%cOC^D z)*gFOllQ9l@Mm*OSoc~6xN3iQXLTJ5e5a!BG+1MEcUSz_qu>e_ETl?8Aog(|H|Akg zuBc1UpY?ID;f*NX|pQQ=${SE4W7YF8;6V0$j@Rf?8-zKr{5m? zUoGCJu2Az;E4wM%XVb^}le^hRnOT{eOvlfWGsUT1ludl*s+`5D9T?bivWu^UItp!C zwcvK->Ts(Lbclo`eNSygNg^KzserMGE}bh6LW9G1BCj5WKz;;QReU>~Cy0*XfEJ^x zcAP+qFLRtfnuhE=qSIG--zQBtbtSL8Q{$2)%JUac+l79_4<2pV=hsXt$J^PbAxp3Y zUq`325Baq;M>4eHuEQ=wm3veLO=el?k7f;AsHv51x-;E2?UbLlpZ-zdD1y0FJL$96 ze)QCNU#v+&RQq-y!HFdcuMp_^t8a-ne}xP{=J&o~s1t+Q=`uWSGn{#Y<1t;=1F#Q| z5$(#onrkv7g05l-l#3iESz>$&Ibcze?1aVe7DNI%EE_oN z6@_YYb&;t}`$3zSX&H9(!KrXl{zyw!xwF6tRm4Zf+Q-G&$5j=DcLfSaPF7AqN>)xv zR@oe`q$&?rl~T2WAr!ru6g~kh7~a_;00iQ<_!8}CDZ(hh{LfrmZ>}^ z4IE)x$+%;@x+Jba=G{#pIca&%m)Xv5W2FbgPn;B%eTw6+sydNjHO?||;ZH=1d7hc( zj_!{cOpUJ{xtTIr*)L#UM;r*89Nw91>LnLuF0yyE+8-}AHw3PRuTuT`nm@pHB&?oX z#uro#cJ+$o@eSN98f=8w=PxUC1%}S7k^+Cv z2(y6awlv;muMW_Sx!e>u9$OxGu!gE%5J0!vIo^hcSGxdarw+7RImEK>WEb}_-G%oL zV$uXuCG0`=x(4oa% zU^^*$z-7yM+9v>bx_S}7JIz>vlp|(88iOI>`lN;V4X^V=&7jL*d7GJ__LE3rp*qMGcsdm@4yarQ>mS|ydF^T=8$#y+fIKTkZj?12>DL|x9EORB zx24n6{hgLx)5$VdQ;NH+zu}RGxN^e6mdw-R10xnhe0pvH@GZCQ>&Y-XKKln_Zv^;Y ztIF-JjqWjGIW zlj$DLXM4N{0T8o*e7w!s@FadE3JIz$wQOF(R0+a#X@A)Hy*$rj1uqe_i3O$IP6u!; z$@r(xOnwAJZ_)=)ifqvkzGhG-247rttPO_}=jZvHbSvZoyL^$b!S$W<0bd~)?ii&ga+V?oo%)vF{ip#I|xCLq0vd*l4>LlUrV%#1a zGlPi0%(n_tO=;w~qOv}(A;KUWIR#c&7DmqIB*B+OR8a+t7zX{N2qP&Kno<(C<~uL( zHVpr1*}Nn{$)OFBccXKAsKD&x5SzM4yP|XCu@lBEGZ3K7V%~HA-1jbfPiyMUxR;NX zwsLk7y?f&GD)&9U!)+QX;sN}8PDwK(RT3Pa`K;{QcUBw6>f|z&yRW5HsMHi}KP+q5 z1ZTlLCa1Ek(MmEu3GJyIPFKUqunH}Q{i#K5W#M_IZwt<8bM;b2o+>qR+ZzK9~)ECdv8K4 z{BFyVDgELWB1dbt^qf@PYW$1NRjj8Wd9TDNQCqeJNo(-%DKbu3|q=`*l7wi)V^$dLwS&6cqgQImc9d!0CnQ{J3%cp4iNY0NNO8Dh-@HsGY8Bp1)ifq ztabJ&{Ta+M-pfA9Nj5d~YjoDk^Wz=msE0l#>8!Xp?Th0{yz>tEw=yJ~NlWX+eJ}KC z*3mm*LTGskU4_X%45+e;yt{CTY!F41%S4biL6AW2ROeg8Q4 zwGr+&h^yn=_Ws)5%uajlEZ^TN-0wD(0zUMxEP-DqIkJ%*+0~g$(82o>fCAD)X`WF< zX{w^mS!-zPoYv4eeO?)b(m|od23~vrPr#e#>fsjr?}5_$p#wlb@xMEeJ-i8iWM^;E zzh`!-SV178%E@@(@j7@SDcIM;{U#Y?_|FV!;7j&!BLpF@65Ysw&b|bsCQ3sCO6#Zv zf*St>T?u}8Uk?)5gXjbLzknac_!838&=6_mOLX(_B8c#F#QP8@Qbds|)r1x)Do6`N1cHR#ArXNDkoX{=1jO>7NH7v5 z5TuBx6d@F)2n3PdML>!arG=8fUEX`&d(J)gy!$z`GiPSMJ7@md-=^5wSO^Qq2yk(6 z30qkr?76tOrGW8qQ9j^)xffLgbbOwdED(GDy7*D75nzTt%5@qBbxkin(qR$;BmP^WTm488G*2^vMC1;Qr53awT?o z#E_MPXI9SeeM^U$i1L`UaBrL$dmGj1nY-yhP={NVV>g(ChQ1Q2kgM=A!pYTb^d5V? z6TR1yR(P5Y_;@yvl64Dwh6n|lp8efWE}d7SPMV$1F2oiyyO^}TJb-vF+jSM&(TONZ z=|cn(XA9A_+tY>UbKD_4viS1XG(tK_?GRc{(M6-m6ZcuUYht5uF=;quh;JXlwpEvM^fsj`thGTw zFmo2ICL^_fE>XFI2U-W#-ppaTQ+&u-Hv;-jEe1isUb^9rS3^NcP(wu*y>>gCd+uflg_qa8Nn2i|&VX3|gcQYL)tWbaHiF>D*gm zU+E0wq(i~G^<^T0KFNW7MOQ!gkbesCy3=C{=3mjDeL_Djd(XQy?2=}S<*kgFfP z|42!Ic2kSA-ZKX-YDW?lHV48vztkyIHRgK=L{*_AWzES$iqrbj=Cu7O0spF^3SJ3($m*(Ybm{3y9IUhKz2Xdt| zq~?V@w1(CRi(Q(-4y~sCq-{R_;d~cuMJr*4Pp6-b_nTweZkx@CymF}|2ZSnHl%7P1 zpXpjTUI7{c%{!09ha_y*v0ku7vv|kf&BwJaPyd#oPPeI)eov$xaAZ{I4vz)l-&&6v ztFU!lMN1WneHyy8PFF;H9fP*G)Ibi%e5+R*3P+Zzpd{PRg0J$*9~t`aT{z#DEl|l_ z>(I+d8jG@@oi>hB4=LQe5Fdy%)>3hv-7Ymox_2W17qsI%*`GG~b6Zmj9D>cx=?vBf z&V0BW^mIV;x>4*zD;u?e8BF({|5jc4vmr|`@b$Qe#9xkEJ_(_gX0MO;iTyQj$H4fgtb=&+bjc2@_V&js&6YGH+vDBQ3pA7-{iT6m_ zcNyv4FcRq+<@})HVRu8a=`F1+5!X=UtzP_L<_Gt^~9eDwK$ml$sw-TIDiPzOS{+5!OA3vwGarI5A}rW^>E9 z?H+&;$zIsa`APJsvfOv>W+GTL+0*>6;Vf@-F z-m6~Vo{o^GIg!Imcnh=BIFSneq|APwWfL&=%KuOq%n80-B>*+j7U z3lGqECM}4}7iDJNNnhFpbF~=ct;P1xl%+0M)l36kd2RO&R-XX4>;Tf-rshOl`KS~E za~pep!9K(Bq{8%Xc~{;rTpRBgfac zNK*TYqjt0ceoQPk(yfw=&|wD|n}p3*a$9$c>pZ1#rB0x)U}hbNYkttuE`E^jVhy-T zuDb0XtYj}UJBGPzelXG<60%baeICOsYsnn^%{$V}Tnf-WDmwC64GxJrWl^g+-I$w& zd;vI~D_a0KrAisl4IVF#?KXcTcPUMwIa$$n3X!p58T~TbueS>M%c%&f;%wT=d9b6v zN@?=X-VF@3dU7I_zSbzXFU2NDKlv(Tne-tksJi0m6q@)Xf^W2@& zyIr{MJgWPud?cuHFv7vmyiS=4hiA^K^`hxYxe_>{jcAPoUTGukUhU}?-*rm>W|=g+ zG1I({L^CW4_8M-{IT7$eDxizt{x|#94k2G)w#ixxIO|lP{)!Y$`%Fy!-QnY?+x@!# z?5ymO0tD7fcQJPsH_E)vL$XfRx*prAR~vT#Gt8}>KC&Y-r-wQ4`|<82?v2CbF4jvL z@k4<9;fMEiHx=Ad&|fl2cqV!poufVSielFJoE&adEdfF-yvz1LHcb}Akjl8JDtu>e z<7`Ni4Yzgwqg6izr2Q*SFAqxiPkp#p<%-GM2QJS5mwJ$+01l6DJGTs_Inuw_ zzXZ^q%~U#QpG*2Idrwye^^VV4=t)+>)$F6Av7Dt}H_`oRB!kfj7)5TC2$1W3o|V)I zC56lY|l--y7K(+NB zFG0ITX<@WBA%jz!)@cC$wRzdF$=%Am(J%%qV6J3ZGXc~WD8rl~jLNX4rTj6R(QMq; zqN4e*EYs!CY?=FH&5q3)xo8nb)sd%Qx*9U!eZ^ba!qF+=7)7~ix^+&@H5-f%tKx?u zH`1nnpzBvXZL*tcUOKI)K^60)9ngeTp^>+A>UJcli^LBONahfIsM%B-hM;0>-8 zU4cP#X#e;&Hk+5khH+nhOlio(w@E>nxk{G9i!5a54;SU>--1;kzMB*~yIH@r>?7gr zX3HySCL2O4Qnf)&NEn4Yl?9zIryQtI1io5#2%da**20ew1)h66k^laO^JAw^kQ^!r zzm2dUv8k@8v_(h5A8j?>f}-!j638N-*qMQAdVWd-)_Ty~P%tCzR1#WaL8;RjKg-!x zfIb{( z@YgobDY+NF{(Q#P7uMw;>|OW{8<6y?Y-%lhdO|uIF?|-ibq}b?)kgYGumq< zTAsb)7C!6OfQC4 z8DK@ARP9ePp28ZzYBWo?muKx+1H7j$W{{F8<|aE&9%lhg%)`fGKMvmpeq(w^XSU#y^GhX&>bc**Uz`H&0t)AK9p`O;iSPzGE=_e!ZB=zmRdqc_ z4P65*bpvhn)9UI5>gsfx$*2D(5FF~|?-Tu>1H%&66o7#8|L%bE5BA35t_O$x=S(VJ z%r=lw-Ou=AFb0^=u;>VXUq2j|*}q3nlL(x@k9QQ*A=C$V^Lm6gR8w6;16=jF90+Rs zJLu(&#YFgr;rv5Gxc*-NYj0r+wK6k<+D3%>_y>7Q2yx#5!V>%8FfShiC+`UCe$WpF literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/20.png b/examples/train_texteller/dataset/train/20.png new file mode 100644 index 0000000000000000000000000000000000000000..45c400d3781f6924ec2bcf1a44c56d5ccda516d2 GIT binary patch literal 3959 zcmZ|Sc{J4D{|E3vD9dOW%SYBqP4+z``;ro)5wc|)r7#+d-GumLi73ky*+R$=HDb&V z4cW33jfQMZ$TFIV!B~E8pYQqp&iS72`Mw|L{l53yd!Oh2@jmB$U+-j?jin%;I3EZE z612K#b`=ET-~#$54)Xv{{!WitpyBblY-zUl&vnR&H4cm%3c7eb7-&EKb9-;i)c_sd z5UVTZyz`s~k4P)5y+vOKh7Nms+Mq!o0h@o_+-1Pn;<8BPDPT9Em6@@9__yT(Ze)?rG_d{m8N59ysZjtWDArZws?UJEE-Bt6w zI?UpOL=n4_dHz3FbyS_o7p?tzEM5?U-pp^izoJWFzD7rW3jV~zu;%(_^#_^;c3cN` z=9+64n`_TM*%pODQsiu-5CAz{kPBg#-i9JjH#Wpff8U3XJ+S zvWp9Ge}Ml@ep$8BmI4uvfIo^FsfU{5!+ zVT(0PZzhf79(JB1PeL$of&3QM58@fR+jhi=58wr9M!9&VwySv_0DVMTPf&mumrUR8 z7)h!&atH=!3{Fx3i|Cp^$v?~)CnAij&;V`Kb6S8hw?g@dsvng{r^d;_q62ORp65k+ z{YpMNMSRYR{JzN1oJ0U*ml;hfx=zE3YhL02XgZ6(Q8Z9x96YWT*)=a&+Qx9qZEfDZ zR^vWg@0(Lu3b(9C=PXG6WOkEtUTgutftI31_|K^^X)P0MG@VLpTg-_iYDmNhQMXZhqEX{*zi-L<(JnB9?O=d+Mq-{6s-RsGkTTjhJt z0*d)v+4^qo)b(%puXwq~jfJG0Kg$(sbZ^Yhm>Z%oZhu0DX4o5hx{3R`ecWC4{hZ~% zJ&gLWZD_K=mOF0GI1FduCE}PkVigRkQ3uZFFEq`Gx~1+jJ>^ zT?(p>o6>@0lKR>A)~5lU9`3Rr9I}Z-+Y*`G`WQJ+J`E+y6b-VjIk*6-quY+kU&6{; zr^yy^S`-p*yuPID@SbCp8bu<`QKRmCTLA<%-YN4SRJ5O_VyccknS_uoJd6@&X>u}i zxQbS0n==*-Mq4MVVnfjMG2%@YCxH+aMkiJ7G#LEw*nPj9u(?H3&3j!`UsONU`rUS` zQ#4VuxKaWB*?F)yx^L^}$Ko&{V$}Qu8C9GDQI7V7V_Zf027)-go;JRyRi(A)**H; zdkA0$qR+;((APgZ3w0$>$^dfxKct1aI(`TJqA9*wt>7=`FX!m<1P7EOZfPKM9o;~HChRoqn}u>EZ2 z?~mbTRGcXsT5CZSlqPIbXkE&8Fs+O+g+d|&yMB(vW^-5n@H)5laG#MM5}*QWDE2k& z=V>exm7svr_hPqMv#ne=5=ne9!ovnCd#|^<7}9WCkmjH|fHRH$*Q5rC*9q@6mV!{Y zXUQuq86C2Enp;)|CJQyRkA1m)IEY1=@D9r;E1Wa!6q%Rx28(eSljDI`py*LBWH!yC zdHr)p#RldUqoN!BR5>EM9Ci}^>^_b8D>OeV)oswe$If~nr0Sv|37LL!+@VW>YFSQQ z-iTSay-HAs8<2BTzlKNeXwGH`)tB~y`wsOgh#aV(%|IM#^feOc*Da=_B=Igp^wWh80q1NKc!m*1n;+Be zGj5NP+kT(?Jmf_FLq|Y;-%Y#(4piIqOxGf~-p6P=YRe!bI}rNm%}Q z-n(Ry)_QZ4ad^hi2X>Ht>5Qch9XKem~+FX&SrTGihQ`TE_T;r zD`7$C4?V-)O#Xy$+xCIkf*m$;B|Nz6+4(o~th4_y^QZkoHNm#e zB+zxtzHw56{w?vwX8~MP9=ssvZw0WU1g>t6 zwG^-B+~l_J+h1a7l2LVA?|<=D$2sYUq$d(*)$J*l!Hu#%Et#d8eiFX#gNLtw+O=KB z)bAaelPU_u14N*=6>lrn58lKoFO~rO^&vjScll-S!#c@I0#lOkecz(CdH1FY_co+> z(?^E@c2l)+tvtKpb@Zk+k2)XJDcvjyj$e=0y0<{cYDTlG2)?G%k?cs0+whOpHsFT< zHIn-~$?#iWO$k!p5X70j^)Q#^fVYj;#nP&Ig@1PFq;(8}rDx0*&pppDl*Sl$QEqK!2?xACL?HDgt0^BvBj8H1+@35~*MO^#)a1)zstEN2TKFLRS>tz#Z( zCNeHOoxpi(mx?w`HOs+d7LU><19g#xKX8l(1bR}YTINh*BKOApcT?zVQTJRzKEEqodK)!626?4hR& zf~$`4uk7C6?Z2FOv6keTz65o-`pFoEI;~lsoXvlwMZzX=nk`8Z1wX)|Rhv#svFDp)=(aYF%kpqF|8gNDY9|yjTm5 zQI6Tvlp_1XKPsbQpB+TJA-SLTilQ-lKA)$xl&oqu|0Xb=sI+R$m&K3d90$LOtRRjh zUOVkE`uUd3z@?eQiDS0BF!Z$G|H@eX3gufOAWGJz$CY649fXYF#5CogzfmxVTdT zgQnS~#F-SU3c{tC8`J;#;A4 zm^+2|c!nVKyio|C0jaC1YbvR#E2-+(tDV!+P}9>?S5Q^eQ&k;4hE4yEKmgLm&o|> z`69w);7H$)Fi#XhMqO1+?O-$c4G>iOchCnB?2YmZ3h_e*g8nNIeAUuK#>&)G28KfV w`uQV{32-C<;bZ&ZARk{n2Lvj3KL|6kP*PLYf@?d!2c|(*<~C+H6OZ`+17fMQfdBvi literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/21.png b/examples/train_texteller/dataset/train/21.png new file mode 100644 index 0000000000000000000000000000000000000000..311c1fd6b3fb5ef086b1f3c8a2ca10dbc2435ba2 GIT binary patch literal 2949 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 a_-!Q>D zAViHw8ck&xGPW#58B2KY^e*ST=RNQJod5jq_Wj>`XMS_e|0Y|aP55}kcmM$4Gc!eA z2KzR!83}TMpY4XuabU;gdeH>A|7+p4WsQM*xC2e?LcqTNS99B*s{~gLhMJk94$dDq zBqXhwQ!f?^?h`#&6jo5G&CJk#;Mq@WurH zvzc5%7*U^srG3}^vTrQ9`q0YYikjNa?ig>quG$cFKxZgoV(?|sPw4{y;OspS9lkTQ ze6ZwA9Z0o=R%8?7xNEn+9Yj*&1potnLSk$8xZ%^%81w!7=n`EBfoDZ{-bnxw05s+q zi*N(L6InNl7lpU=4!?Ivnw@OQzh+)_qNF$n1S|Qp)wmuoCr(HMN7ATa$Y=PgZ~&dB zJL3-mKmkK<1%&=ywd25QU8&u7T5Ne2_9V4D9RF=;`a=yP4rSYPb80PtnymV33GBIl zM^Af32Xu_oUj@>P4melVXJTi2ek_+Q$x%OYcm9Xma?{fr-mJIR{SW691?WQ0kHQ8P z7h+Em_s}tAMdf&#<*JVk+waXIRG7Vgiz34)2q&V2L-bBH%W1U({e55uq`R?id81tK z9r}C4jt#5&x<9{3PRRi1QprSMK$8}^>OTG$Z4E(qKE@rQAQ&~Uo42E4vlI2m2b9vk zI|jO64u1#pfeJZ9gfVH^Hb~JOr45HAxyXziSr)1)DB8AmhZIGl_>?SDK>M339}Kjc zzBAtbc`^B<>ycNls35rvuNQrLPP&#L!DM$W50J5Jz(hyH{%m{L2uF-3YBYr`V&@k) zFTJHl=Nlwo;!I?Rn~Al|&y&RMs35&S9bGix{))EbPRM0=_0Om^EBDW}X?>bfsYumz zwx_I@3)Gw}YBy6Yp4z+cZ8yi}>otQ9DMC=MhR|3EwJU?RI&P0C@r0BEGe6f^3a4-C zp4jK2BXYDpaO3j^0td>`($~ds}3Xp4=qJVIxG1NFP;jIw!ljlh)%64VVSO5jBO8{ zsmbQTG%<`-t=i9Pb`f>?ZTVPzSy#>z&|G`6C-qc#y}dGR0SK95;nX#&UrjgY`fUa4 zE!t7)E=ZR=Kg=}6d%Zrr=7ZloO3PIody_QT&J=F@0MADo}WZ6i$BY{9un7I$k-{pb1Lt!)ZZXPTMSeNG*ZU5jfESu zvsRxDDMpxI*;Ri3!bv>F|J?9X_{g(MpJeyP%xMKAEvzr44)G_kYmiY6oemfokhg>9 zkwOi81Z@hw?g-tX=WP&>saHqeioh`scj)oVFF2+}Lt7~+x+ziill9ci-~EN_Z^zH^ zB!%hZH5vAp##(3do5Ed1uUZWEeWDRgPp4n}aO_A>Uv0(#wM^-DR>@UIYpnjY=%6yS z$vzV)w_FD$pWh)xWY{Gv!hjD=2y=#&;9luT*!AEljCpSNJx4WvW0kp$Wt! zMl$Dq_O&iuw&@DFb-RU9XY%0#9{gFb3qV7E3nIxTa4FqZzZPwj64~W-C_zMLQsGsB z6lq2S`y*?@poM{&mwV^Y!6T1o(q@OXzFOTM&Q?%W;YdZm$T7z&RUP|cO|?sZ)3k)ard zxFFnl-MwRMCwP^rw@lc$ax!&ZGHaZES&ug2bm9o-g}CC*H@1Y9$l%gH9IYMn&utZ` zN69^_se{Yd8zg5g!4zo=d1-VkChB%W1xYL@*kUzLiR#$Pe5}}a?l0F+;l4-v6{vv= z*=?mQ(V4sBR%H8PJLiGmwZBPxr|6rR6OSq?I3GqPVU-TIJHfDPKDpZ&I0*t@(?#FE zI;fM(RoT;H4o$6rglWB`wkfurBDd_&SdFQEEeU1ho$f+5y4(sK!jF93b6T`3#Tiv& zqH9huM?w_a(omx~Q<|!u6QfS4V%k$1 za{@lzXVswg%jC*j}<{}`57uqou$ zx%TEY3pFVk<@5+accVP}ULCEK~SydKh* zL}vTC>0HL39MUs&2v!8wOz$O`lrALb;2z7%Ll4t^rrti@@oyRqohq!Kl$kUyK!k%BrQVIh~s;jnp`_sBoUQkHK=9 zh>6(8Ew}aC&%om$0)8*1t5Z9a_DKE)Q&rV8&8PAOFYbdRmah#_XFo>x&Q%gk{%(ec z*w1QiVe$CBpdW7U4t#x~KoO(Z#u5cPoXV=wlSQfyt_*+m5qgGfE-S23LR`k`dnBm7 z>$dC)5rw5l(vxl5w;rESoFsR?_3wX`HG3cq#tnkJ-NmPThM5shi@9{5GAJgqCTas(tHQR29{-VP-GM*~?Gv zCsD9b6~^!zusOshBmd%OmeUL1RN~n!Ek@;d8-D%cYouLP-3gqz?BbJUP}m^CU&(VS z>$yUL#eHif!Cu;oPq2pf+@G)6lJ!Ml=W67~9*@_Ab&vAdH%xwlegxew1GL8Jp>895 zv}VAgThGFA9DC0il(iYMfA`}lC@^67{rBm2D4;E$vzUu$)>h1mivz!4hz0uFm9_E% zw`0yUVuj{}ePA?2Qcw*vAvB@g2DS~|O^B|Xds*e8%`j_o=9Qu!7#7X6tKcQyvK^d9 zo0SB{H0h63BM6;-n^E;=^4=PFKTvX~+*+AFWyXMFMM+8+A&BEa(2*#y zE%h~TWNO4ft;>(3>tr+iT%Jye2aLGK&b_vgCEt+?+~yo>EqIm9RxCs2yD^V_PH2!5 zZzfduT+MG}`nco@KcSCa{(XVVLaOW{L+GxAGM9j&A;SYy>QQV@yKEt15^`r&Dj_EF zu1pOBobVMpOP&J&ZQ+yQ01$Z6@+$x^EFb(jV9>=0#9oMF&j%9^KmEsg~l}zBmTR9MnW`uyYUr0N{u4NX1%xJ-YLp3C%rw ztqS4}bf$yj8sxjO2wSZ`9j+P(r9b6F2`n9Y!QhaAkNSesw=wb2G0|MG;H*{qnvWfb zt7i`-RJmwRYb06dPJ;g&=5B7o`ZG)Wa`+=eF3`iJ7!K^kSG)vE=c8wZqqM~n9g<@GK`<_JQ*#D{eu;Qfu-R|I0S!7Fv1G+Hj+ zu++6G?s(%g|6W+Py5y8E9E2ra1ZI8>X`8XW*8i^>xPw*iM1xQCRdhvo>{OHW17h`F z+xGh65Ge#=;P+EtTH6$Mtbsche4mgHMcIbByM*EpZoxRP15}k&)#1vjaAj?biWWjm z1)-sOMp+r5tSr@hPw>A2{sHdZ9ufaP5HNF$3CX@b5Jl!{AVF4_vs6b$~}G!6g_cqpGZ;a;T;EDHv4wchDUd z;uh>380sBx9r&L>$Ym2F8M6x)WGsUNJiPsIM|e4If#DMKiS)z}=_P1@m~j{_0BlZ!-&zh@d4`2zY211p&V#1;0$i)Ff7uXU=x7n zL97Ts*J-4)u`dY3V*Gc3)B$}fJBnWIAP`fPfwqQ)|F^Yg_WB%CydBMH#a!CHiCG!0 z627%OOy8L5*(^*GysT1iFC8SdB1Rtu4NY3JiKkxJ#j@25evjaQn4MKnYIK!)5#eOu z&0HiNvqkg9x$2lXC`WleZ>o1SPOjQVRcY?6j|1xG)rBhy0sT3bME1^Nl=&uRiTA%W zcz~U?x!H8_@qPT+DvGrG#XC31+3}=MS^0BWEU^n|XN+Qtv{xFZFDa+$YbDB4xQc&pHp|S2k@^WR^rN~-q4g+Q>ky;0dhubO$1!k zH3l-1&oAnNlctGR>VA%A`Lw7H0G^K4&SGlb=OPDQFM!%S;=XWIK)CKwwIa3d0c50A z6#$Ucysv82Vf1f@LrV6Im8Q>aumnV<3>>^YI8+)9^=Phj4DPpMD`v>Fy@hw_8B2Q& zL*fscs77mNFf|%6C)k995BHtE19{GH+yhZ7Os&{9MT;%N3WKH8q;PCvIAEiU7ju3+=jJcH5 z;7BiiMS4wBf;M)3kPY7R&SK7}S8SwvmO5C3!IOe-l1h<<3st|@+Ut0y+ABZ-Y6ywN z!@-~uUoCRD*V(N`i+#MEh9_-G1XS=+sf9)ak6=;q@c33x6HQNXVW7vwUB3QfE$W2& z_l)|ke$71hIT?k(G8r*VKILW(bi8oN5XLDlnE&U4@Jov?U2Geqb2f8_ikc7~5 zo*Bc5%TH=b!5#a8vo{80M0L&Zf$7b-@EwtMb+5*>2>x|bwaSfibTGmZI~9G}4dGAO zYgNI7J*(|p!>8|(hHzsfF2LnW(SfCvH-erYcbk|=HqnhVYz+M5^T&>$HQze{A3gZ0a z5WULKWT@99a>RBV<9O9iWx}|Q{qiytK$G>XuOC%{3k>Q!Ulk2{FKkW6ENH=K84CUR#SnpSlI_fr;Hsn+#h3O_R^$6*Av?=`XX1Lijdigk=;! z6GEYiopNmG$upaeMxI2>f}vj0cY@-3wNb)yh@7(2M1!p9uHQfWv3UM)0C;<;K&cQA zp7a5r2{KmBSI2jy58)b@e22Z}=gm9DcdE!PQ%2=^4zt1Ap#YlqxlSh1;g+wBCNGkc z&Sp$Xlbi!-EBjvq*z|NyDo=x^qXop)`<8W%^uZ86sx~sOeAWT*Tc~)=qZNGc;ZF1TG4?oav=)q&`r*(?0zGhya*RrL4JgR`c3D>@t98#j zEbXPD(EfYx5Hvu_sooio*vhl~pgtcU=f`K|LVl<2!LbS zV@qL=XTIW6n_f@7k9|GSE`3*{I!E}$4yAPyK>HSIpGq`rS@YYU2sM+j-7h~J4QxO6pA_o)tR{k3_q z=y8VvC#eK?*OUa$4b<0dyI(4>(Oa4Wu@jyd@vDAzTVb{D;{88<%TQo>?7;babVHA# zzZRUdxcP~2P#GRhi8tDdnpm}8`niS;nj}8HBBtf8Zz1?ZUQDF=vMSe^>sEsE9I@jJ zgjo8m3n@{xG9KLAB&a%~b{<_T@_a=n)VfV?Fa)bpiXQXrfoi%ll+A0r%8Qd}Fx9f+ zwVjk0jC`?BXt8d-ZTI=#VR3cg&l@GROSe5J1|#=dh8VDE%tdnA{N7ouW|7}26;Z6T zNDfE_wAXzP75n9Wi-C#N2cdh9WB(qS`)h}BWOL{uE1BjXL9&MC5+*#ei~K^!dz0IE zGLcM_3g-{B;`L?7ySq8?Gp~PQWBUtO|yIjpPY+lT- zdR(lkBJvF9wxUOitxrZL2X>|#y_+L_aB!{w^)~*r-z1K~)`^e`KzM@q52kwjXcxf1 z$&dVNa)N|t`AW8&BD||W2##qB2~aTK0lcP?Da`W`yDGew)2VmYIg`QdSKc^kFYfJf z@vL_Y*A+&Shb13w&UIwIDCMDZq(e#`F z(z5a}X<3-GvW1KiTuuhApeQaa4VRW){zIbuuYec&jvFfA{|B-OkY*ro`9CY*+`L?T zaL!(s|DWl7cfkqBz^EBFBodB9V*;>lcU^HHt$$jA8d#hg%Ee#sCK`qFbH=&|%1X<~ zoM>pP0fI9B1n;=`AhB*3oEzF3^gjU~b3IK#11&8Z-G!yp44V{M|QQ^dajmn!Is literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/25.png b/examples/train_texteller/dataset/train/25.png new file mode 100644 index 0000000000000000000000000000000000000000..b90ab4590a198a125dad228f434f380fec476dbd GIT binary patch literal 2518 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 P*ajgi?JcUzyyE{2m^-|x literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/26.png b/examples/train_texteller/dataset/train/26.png new file mode 100644 index 0000000000000000000000000000000000000000..087e6de1895a1a58059b1eaab16afe24e3d9d7e0 GIT binary patch literal 2263 zcmZ{ldpMJQAHXL$rchHcr&JF$G&F}Hr;#O0Mlx;IY+2HY-ca-Q@!)YGIGYE1GvC-3cfujjq4_j<4A{#@VR_j`T6zt8W!?)#r#GTQC*Zh19% z5D2sz<%~QBRPo5A7Bppc=X zTpeX*cE~Dg@04yJSOG01BEjuC2&CZlpOBgXdLq|wIBB(Q)01pTJ1)SUPAi(~gt&G8NyCznT3?G7ZZQw&r+^ zFn-!5eA7;t*e!E+iqE|lVX{DObyiuhPh(icjVRP4U)8xku!MAcsN+E>B&LF<8e%9c{xAzH<>x8h^cE4BvqI>@!G7~^?-*7uPW zf)jpC^xk_t?AMI;u1|$VVwPkvVWgF*q(<01(kcpvJ%TI6`VS)8Gdq;z1I;HFTUWs3}>>-xR9{7BV zogf0&n}jrsJ6ojw3K^o-<1itdJ5FK6;g;Gpnq(NB-Ik0}HuQUKZiwTwvJ$tRfiDoR zV^WXXb-_#X$WC(5Np`Dff8QCN#o=0Yi$nFnw^||JW;=hMOX-qpo%2YyJj0pK%+8yP z^xz4qo`0L23!h>;Da*;6HO+!1`Mz#*RC5vBzIBp)!4*8%KrJ3;(YTy1ENtTvYv<9C z90xDqTgyO(%Hp)@4axG#nb)@BnWmhh7F8I~l)J@0CQcmCuS$v<6QvmH?w!&V9a@S@ z2`VnN>#7r>hi-W(R%m)lFm2{GpRQyqtbEYerQW9nz+4){X1Xs&y3 z0~FJRXArrJQ}a=pxV62~53e@WEOd83<6>O7#rQU^rQ`g>OI!ArwxL@Uir5}ik;zGO zfEk?OJ@?@JXJ{;_yrBXho{Wjp98$!)w zM2&z@;<2RDS%CGEyb}Q0&8YOohEk%Ym_;3R2^-PN-ujA#_P-d6?l#qsBYZ!uDovtdqs~#tw_mrV7B+hqt-RgnmlHT%~~J5iGb~VFCi)kD?}w zB%S2oD?=;Cp-Z!mRw0dccrh3_(h z@C`=u?HSKL15o_OH(NI1R|q50KH-r=pS?;X=8~6@%)L=R4`!bgb6;#N|M;Vb|K>_` zlPF?j!O$Ofe`E??phabW(C1#zynez^$P@$guL^1g0Q@&KtD^^*=!{a-@8-kCv>11F zka&EL*vDr6`AiwyGpKkNG>~T}X}X)LHg<9rFZr;)?5$^Q2|2zyiqvduYnFF$#!z0Z zY}AIk`F(j2@^yVulu_-z17f_*)I7ES8o-W%ccrG~66wR%zAJ$maTdLV{_F5FPM@3s zWMQ#{AFbb|#s}scIEsR2G1Vp8@K-M~o`^3A9OswTLVvtk)0*B|ZS(SL_kx^wC(tRa zUFk+%YZr`}o@@-?Kh&f3O(EFK-c>EPtyvg|XWkN6=S*JIRWp%aP&Q{uN zxwW%9E|irr+`FZbEv#{MLDI>GE*y1?u;H&J=d>k+^5xb)}g3rbW=)7|qyv{Ha34 zFaK+t!sHXCZUF{gx$s)58m%9@$M00gS_{d4c5L*;6J|@rlk>#tj?^ui+Gz4d@AZiW zJ;{K{I-Il~Vdvq4p}6!99p>8BS(;}Rvt<;HNuAeIANc1LH+V^$;x4WIr}RMv_t};7{D)`>ux`q}cDcp4L(*y*SFJ}Qzs5fM zmRcCp4HssI#jSI?z$r=}&)CF7e_vk>_g@(h=L;NKGH;*Iz$4Cbx k<&Xd}!kZLE+ZNGCCj%oxxTmQv4;X_`j&8^*d;f%g18v_god5s; literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/27.png b/examples/train_texteller/dataset/train/27.png new file mode 100644 index 0000000000000000000000000000000000000000..67f552c3855caec13f1d1a908c5908bbcbf3e520 GIT binary patch literal 3178 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 literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/29.png b/examples/train_texteller/dataset/train/29.png new file mode 100644 index 0000000000000000000000000000000000000000..917e0ede113abb91f48fac700eb69e75efe31402 GIT binary patch literal 5404 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 LsUr&&%>w=fsNbAN literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/32.png b/examples/train_texteller/dataset/train/32.png new file mode 100644 index 0000000000000000000000000000000000000000..7c019a52500fdb64c2f761f39ba509d37d9b007c GIT binary patch literal 2994 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 literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/33.png b/examples/train_texteller/dataset/train/33.png new file mode 100644 index 0000000000000000000000000000000000000000..172ff553d0722d7f6b7046f26441b4a3c2f23b8a GIT binary patch literal 1819 zcmZ|PdoY{%8VB$Z^SsY*p6C6}`_DUXzCYOu zp{A<_004sIO$-1#A1pmhD0mlEi(Z2b8hy-*xcl`|4c&SLPE=Xmr#N6A`dU=kax-{< zaY=rjFo_Zzh1JJQevSi2np6ro1pw5^f0oJ&I9sLuBTWVXDijj&NKl$+t>Un^t<===~R>~bo8HDW41FQd0yY=gVL(QbmTnz#8q+* zdX9(>vmn=xoty-j8j_$TFp$ac%DsopiBo6B&U>s@Z;ocnEjWpcvvh{Toudx>$hpNEAH6Qrbe{kKCC#j?o%JP=tCb{wL%Uo!ca7i-?VDq%3p+I6 z*{7$aiT@HrXtd0s+JUB$!C_>LNNAN3U?ZEE_>FWpl58wGxLfR2yBx1kU=^<%fQGi5#eS#eNVwMFX zX1t$m3Bh7Kk;n83R=@`ghc?YW8UKcve4BG}8SHLnJF-wi1? znXT7|Pw8#g$#udunFoCmMEU!!z5BZU6k~#LeSv~~U60#2*NWMGTM0=_ka^^?cympb z0&(dyoIxf@YaOqLmq`OHDmyD@mXbFh--W~yioR?=?NNC5Zt!{qzR~r~75vI&hTTo! zlCDbKodxfo^*74QVH&s(&iie=bJwf>o%ZY1<%vhmMJ`cJx3?)w}P&J$XFg;2d>n^|JNB5Y~(24%0An^H`U2+_?y=aI0{g5Elfqbl^u224MJw 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 S>JBZyVGzd198ETGjsIV?%`Y$j literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/4.png b/examples/train_texteller/dataset/train/4.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b0e391eccd6cb710ca0235ed24dbe50aa481de GIT binary patch literal 5793 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 I!!hc=05nQD)Bpeg literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/5.png b/examples/train_texteller/dataset/train/5.png new file mode 100644 index 0000000000000000000000000000000000000000..db3af1f8e02deb01b75404f7adf56fd9f95b3584 GIT binary patch literal 11536 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 a;to_=;)a2o*~vFA8clUwM6sH6=zjpMZi~bK literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/7.png b/examples/train_texteller/dataset/train/7.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2f9a67245a2ab7394759b18d691046205f1fc0 GIT binary patch literal 4607 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 WU69k68*M;0kDc`;NQLFCgnt3?_cb#B literal 0 HcmV?d00001 diff --git a/examples/train_texteller/dataset/train/8.png b/examples/train_texteller/dataset/train/8.png new file mode 100644 index 0000000000000000000000000000000000000000..54e300afb67c5323ec0503e880ba112cae0178e9 GIT binary patch literal 2594 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 MIN_HEIGHT and x["image"].width > MIN_WIDTH + ) + dataset = dataset.shuffle(seed=42) + dataset = dataset.flatten_indices() + + tokenizer = load_tokenizer() + # If you want use your own tokenizer, please modify the path to your tokenizer + # tokenizer = load_tokenizer("/path/to/your/tokenizer") + filter_fn_with_tokenizer = partial(filter_fn, tokenizer=tokenizer) + dataset = dataset.filter(filter_fn_with_tokenizer, num_proc=8) + + map_fn = partial(tokenize_fn, tokenizer=tokenizer) + tokenized_dataset = dataset.map( + map_fn, batched=True, remove_columns=dataset.column_names, num_proc=8 + ) + + # Split dataset into train and eval, ratio 9:1 + split_dataset = tokenized_dataset.train_test_split(test_size=0.1, seed=42) + train_dataset, eval_dataset = split_dataset["train"], split_dataset["test"] + train_dataset = train_dataset.with_transform(img_train_transform) + eval_dataset = eval_dataset.with_transform(img_inf_transform) + collate_fn_with_tokenizer = partial(collate_fn, tokenizer=tokenizer) + + # Train from scratch + model = load_model() + + # If you want to train from pre-trained model, please modify the path to your pre-trained checkpoint + # model = load_model("/path/to/your/model_checkpoint") + + enable_train = True + training_config = yaml.safe_load(open("train_config.yaml")) + if enable_train: + train(model, tokenizer, train_dataset, eval_dataset, collate_fn_with_tokenizer) diff --git a/examples/train_texteller/train_config.yaml b/examples/train_texteller/train_config.yaml new file mode 100644 index 0000000..5bd7953 --- /dev/null +++ b/examples/train_texteller/train_config.yaml @@ -0,0 +1,32 @@ +# For more information, please refer to the official documentation: https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.TrainingArguments + +seed: 42 # Random seed for reproducibility +use_cpu: false # Whether to use CPU (it's easier to debug with CPU when starting to test the code) +learning_rate: 5.0e-5 # Learning rate +num_train_epochs: 10 # Total number of training epochs +per_device_train_batch_size: 4 # Batch size per GPU for training +per_device_eval_batch_size: 8 # Batch size per GPU for evaluation +output_dir: "train_result" # Output directory +overwrite_output_dir: false # If the output directory exists, do not delete its content +report_to: + - tensorboard # Report logs to TensorBoard +save_strategy: "steps" # Strategy to save checkpoints +save_steps: 500 # Interval of steps to save checkpoints, can be int or a float (0~1), when float it represents the ratio of total training steps (e.g., can set to 1.0 / 2000) +save_total_limit: 5 # Maximum number of models to save. The oldest models will be deleted if this number is exceeded +logging_strategy: "steps" # Log every certain number of steps +logging_steps: 500 # Number of steps between each log +logging_nan_inf_filter: false # Record logs for loss=nan or inf +optim: "adamw_torch" # Optimizer +lr_scheduler_type: "cosine" # Learning rate scheduler +warmup_ratio: 0.1 # Ratio of warmup steps in total training steps (e.g., for 1000 steps, the first 100 steps gradually increase lr from 0 to the set lr) +max_grad_norm: 1.0 # For gradient clipping, ensure the norm of the gradients does not exceed 1.0 (default 1.0) +fp16: false # Whether to use 16-bit floating point for training (generally not recommended, as loss can easily explode) +bf16: false # Whether to use Brain Floating Point (bfloat16) for training (recommended if architecture supports it) +gradient_accumulation_steps: 1 # Gradient accumulation steps, consider this parameter to achieve large batch size effects when batch size cannot be large +jit_mode_eval: false # Whether to use PyTorch jit trace during eval (can speed up the model, but the model must be static, otherwise will throw errors) +torch_compile: false # Whether to use torch.compile to compile the model (for better training and inference performance) +dataloader_pin_memory: true # Can speed up data transfer between CPU and GPU +dataloader_num_workers: 1 # Default is not to use multiprocessing for data loading, usually set to 4*number of GPUs used +evaluation_strategy: "steps" # Evaluation strategy, can be "steps" or "epoch" +eval_steps: 500 # If evaluation_strategy="step" +remove_unused_columns: false # Don't change this unless you really know what you are doing. diff --git a/examples/train_texteller/utils/__init__.py b/examples/train_texteller/utils/__init__.py new file mode 100644 index 0000000..6ae22c1 --- /dev/null +++ b/examples/train_texteller/utils/__init__.py @@ -0,0 +1,17 @@ +from .functional import ( + collate_fn, + filter_fn, + tokenize_fn, +) +from .transforms import ( + img_train_transform, + img_inf_transform, +) + +__all__ = [ + "collate_fn", + "filter_fn", + "tokenize_fn", + "img_train_transform", + "img_inf_transform", +] diff --git a/examples/train_texteller/utils/augraphy_pipe.py b/examples/train_texteller/utils/augraphy_pipe.py new file mode 100644 index 0000000..fa038ae --- /dev/null +++ b/examples/train_texteller/utils/augraphy_pipe.py @@ -0,0 +1,165 @@ +""" +Custom augraphy pipeline for training + +This file implements a custom augraphy data augmentation pipeline. We found that using augraphy's +default pipeline can cause significant degradation to formula images, potentially losing semantic +information. Therefore, we carefully selected several common augmentation effects, +adjusting their parameters and combination methods to preserve the original semantic information +of the images as much as possible. +""" + +from augraphy import ( + InkColorSwap, + LinesDegradation, + OneOf, + Dithering, + InkBleed, + InkShifter, + NoiseTexturize, + BrightnessTexturize, + ColorShift, + DirtyDrum, + LightingGradient, + Brightness, + Gamma, + SubtleNoise, + Jpeg, + AugraphyPipeline, +) +import random + + +def get_custom_augraphy(): + pre_phase = [] + + ink_phase = [ + InkColorSwap( + ink_swap_color="random", + ink_swap_sequence_number_range=(5, 10), + ink_swap_min_width_range=(2, 3), + ink_swap_max_width_range=(100, 120), + ink_swap_min_height_range=(2, 3), + ink_swap_max_height_range=(100, 120), + ink_swap_min_area_range=(10, 20), + ink_swap_max_area_range=(400, 500), + p=0.2, + ), + LinesDegradation( + line_roi=(0.0, 0.0, 1.0, 1.0), + line_gradient_range=(32, 255), + line_gradient_direction=(0, 2), + line_split_probability=(0.2, 0.4), + line_replacement_value=(250, 255), + line_min_length=(30, 40), + line_long_to_short_ratio=(5, 7), + line_replacement_probability=(0.4, 0.5), + line_replacement_thickness=(1, 3), + p=0.2, + ), + # ============================ + OneOf( + [ + Dithering( + dither="floyd-steinberg", + order=(3, 5), + ), + InkBleed( + intensity_range=(0.1, 0.2), + kernel_size=random.choice([(7, 7), (5, 5), (3, 3)]), + severity=(0.4, 0.6), + ), + ], + p=0.2, + ), + # ============================ + # ============================ + InkShifter( + text_shift_scale_range=(18, 27), + text_shift_factor_range=(1, 4), + text_fade_range=(0, 2), + blur_kernel_size=(5, 5), + blur_sigma=0, + noise_type="perlin", + p=0.2, + ), + # ============================ + ] + + paper_phase = [ + NoiseTexturize( + sigma_range=(3, 10), + turbulence_range=(2, 5), + texture_width_range=(300, 500), + texture_height_range=(300, 500), + p=0.2, + ), + BrightnessTexturize(texturize_range=(0.9, 0.99), deviation=0.03, p=0.2), + ] + + post_phase = [ + ColorShift( + color_shift_offset_x_range=(3, 5), + color_shift_offset_y_range=(3, 5), + color_shift_iterations=(2, 3), + color_shift_brightness_range=(0.9, 1.1), + color_shift_gaussian_kernel_range=(3, 3), + p=0.2, + ), + DirtyDrum( + line_width_range=(1, 6), + line_concentration=random.uniform(0.05, 0.15), + direction=random.randint(0, 2), + noise_intensity=random.uniform(0.6, 0.95), + noise_value=(64, 224), + ksize=random.choice([(3, 3), (5, 5), (7, 7)]), + sigmaX=0, + p=0.2, + ), + # ===================================== + OneOf( + [ + LightingGradient( + light_position=None, + direction=None, + max_brightness=255, + min_brightness=0, + mode="gaussian", + linear_decay_rate=None, + transparency=None, + ), + Brightness( + brightness_range=(0.9, 1.1), + min_brightness=0, + min_brightness_value=(120, 150), + ), + Gamma( + gamma_range=(0.9, 1.1), + ), + ], + p=0.2, + ), + # ===================================== + # ===================================== + OneOf( + [ + SubtleNoise( + subtle_range=random.randint(5, 10), + ), + Jpeg( + quality_range=(70, 95), + ), + ], + p=0.2, + ), + # ===================================== + ] + + pipeline = AugraphyPipeline( + ink_phase=ink_phase, + paper_phase=paper_phase, + post_phase=post_phase, + pre_phase=pre_phase, + log=False, + ) + + return pipeline diff --git a/examples/train_texteller/utils/functional.py b/examples/train_texteller/utils/functional.py new file mode 100644 index 0000000..6f5c09e --- /dev/null +++ b/examples/train_texteller/utils/functional.py @@ -0,0 +1,47 @@ +from typing import Any + +import torch +from transformers import DataCollatorForLanguageModeling + +from texteller.constants import MAX_TOKEN_SIZE, MIN_HEIGHT, MIN_WIDTH + + +def _left_move(x: torch.Tensor, pad_val): + assert len(x.shape) == 2, "x should be 2-dimensional" + lefted_x = torch.ones_like(x) + lefted_x[:, :-1] = x[:, 1:] + lefted_x[:, -1] = pad_val + return lefted_x + + +def tokenize_fn(samples: dict[str, list[Any]], tokenizer=None) -> dict[str, list[Any]]: + assert tokenizer is not None, "tokenizer should not be None" + tokenized_formula = tokenizer(samples["latex_formula"], return_special_tokens_mask=True) + tokenized_formula["pixel_values"] = samples["image"] + return tokenized_formula + + +def collate_fn(samples: list[dict[str, Any]], tokenizer=None) -> dict[str, list[Any]]: + assert tokenizer is not None, "tokenizer should not be None" + pixel_values = [dic.pop("pixel_values") for dic in samples] + + clm_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False) + + batch = clm_collator(samples) + batch["pixel_values"] = pixel_values + batch["decoder_input_ids"] = batch.pop("input_ids") + batch["decoder_attention_mask"] = batch.pop("attention_mask") + + batch["labels"] = _left_move(batch["labels"], -100) + + # convert list of Image to a tensor with (B, C, H, W) + batch["pixel_values"] = torch.stack(batch["pixel_values"], dim=0) + return batch + + +def filter_fn(sample, tokenizer=None) -> bool: + return ( + sample["image"].height > MIN_HEIGHT + and sample["image"].width > MIN_WIDTH + and len(tokenizer(sample["latex_formula"])["input_ids"]) < MAX_TOKEN_SIZE - 10 + ) diff --git a/examples/train_texteller/utils/transforms.py b/examples/train_texteller/utils/transforms.py new file mode 100644 index 0000000..b72998c --- /dev/null +++ b/examples/train_texteller/utils/transforms.py @@ -0,0 +1,154 @@ +import torch +import random +import numpy as np +import cv2 + +from torchvision.transforms import v2 +from typing import Any +from PIL import Image +from collections import Counter + +from texteller.constants import ( + IMG_CHANNELS, + MAX_RESIZE_RATIO, + MIN_RESIZE_RATIO, +) +from texteller.utils import transform as inference_transform +from .augraphy_pipe import get_custom_augraphy + +augraphy_pipeline = get_custom_augraphy() + + +def trim_white_border(image: np.ndarray): + if len(image.shape) != 3 or image.shape[2] != 3: + raise ValueError("Image is not in RGB format or channel is not in third dimension") + + if image.dtype != np.uint8: + raise ValueError(f"Image should stored in uint8") + + corners = [tuple(image[0, 0]), tuple(image[0, -1]), tuple(image[-1, 0]), tuple(image[-1, -1])] + bg_color = Counter(corners).most_common(1)[0][0] + bg_color_np = np.array(bg_color, dtype=np.uint8) + + h, w = image.shape[:2] + bg = np.full((h, w, 3), bg_color_np, dtype=np.uint8) + + diff = cv2.absdiff(image, bg) + mask = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) + + threshold = 15 + _, diff = cv2.threshold(mask, threshold, 255, cv2.THRESH_BINARY) + + x, y, w, h = cv2.boundingRect(diff) + + trimmed_image = image[y : y + h, x : x + w] + + return trimmed_image + + +def add_white_border(image: np.ndarray, max_size: int) -> np.ndarray: + randi = [random.randint(0, max_size) for _ in range(4)] + pad_height_size = randi[1] + randi[3] + pad_width_size = randi[0] + randi[2] + if pad_height_size + image.shape[0] < 30: + compensate_height = int((30 - (pad_height_size + image.shape[0])) * 0.5) + 1 + randi[1] += compensate_height + randi[3] += compensate_height + if pad_width_size + image.shape[1] < 30: + compensate_width = int((30 - (pad_width_size + image.shape[1])) * 0.5) + 1 + randi[0] += compensate_width + randi[2] += compensate_width + return v2.functional.pad( + torch.from_numpy(image).permute(2, 0, 1), + padding=randi, + padding_mode="constant", + fill=(255, 255, 255), + ) + + +def padding(images: list[torch.Tensor], required_size: int) -> list[torch.Tensor]: + images = [ + v2.functional.pad( + img, padding=[0, 0, required_size - img.shape[2], required_size - img.shape[1]] + ) + for img in images + ] + return images + + +def random_resize(images: list[np.ndarray], minr: float, maxr: float) -> list[np.ndarray]: + if len(images[0].shape) != 3 or images[0].shape[2] != 3: + raise ValueError("Image is not in RGB format or channel is not in third dimension") + + ratios = [random.uniform(minr, maxr) for _ in range(len(images))] + return [ + # Anti-aliasing + cv2.resize( + img, (int(img.shape[1] * r), int(img.shape[0] * r)), interpolation=cv2.INTER_LANCZOS4 + ) + for img, r in zip(images, ratios) + ] + + +def rotate(image: np.ndarray, min_angle: int, max_angle: int) -> np.ndarray: + # Get the center of the image to define the point of rotation + image_center = tuple(np.array(image.shape[1::-1]) / 2) + + # Generate a random angle within the specified range + angle = random.randint(min_angle, max_angle) + + # Get the rotation matrix for rotating the image around its center + rotation_mat = cv2.getRotationMatrix2D(image_center, angle, 1.0) + + # Determine the size of the rotated image + cos = np.abs(rotation_mat[0, 0]) + sin = np.abs(rotation_mat[0, 1]) + new_width = int((image.shape[0] * sin) + (image.shape[1] * cos)) + new_height = int((image.shape[0] * cos) + (image.shape[1] * sin)) + + # Adjust the rotation matrix to take into account translation + rotation_mat[0, 2] += (new_width / 2) - image_center[0] + rotation_mat[1, 2] += (new_height / 2) - image_center[1] + + # Rotate the image with the specified border color (white in this case) + rotated_image = cv2.warpAffine( + image, rotation_mat, (new_width, new_height), borderValue=(255, 255, 255) + ) + + return rotated_image + + +def ocr_aug(image: np.ndarray) -> np.ndarray: + if random.random() < 0.2: + image = rotate(image, -5, 5) + image = add_white_border(image, max_size=25).permute(1, 2, 0).numpy() + image = augraphy_pipeline(image) + return image + + +def train_transform(images: list[Image.Image]) -> list[torch.Tensor]: + assert IMG_CHANNELS == 1, "Only support grayscale images for now" + + images = [np.array(img.convert("RGB")) for img in images] + # random resize first + images = random_resize(images, MIN_RESIZE_RATIO, MAX_RESIZE_RATIO) + images = [trim_white_border(image) for image in images] + + # OCR augmentation + images = [ocr_aug(image) for image in images] + + # general transform pipeline + images = inference_transform(images) + return images + + +def img_train_transform(samples: dict[str, list[Any]]) -> dict[str, list[Any]]: + processed_img = train_transform(samples["pixel_values"]) + samples["pixel_values"] = processed_img + return samples + + +def img_inf_transform(samples: dict[str, list[Any]]) -> dict[str, list[Any]]: + processed_img = inference_transform(samples["pixel_values"]) + samples["pixel_values"] = processed_img + return samples