From 4dad2524ebcf0c30064a038da0a40f1f0a25a75e Mon Sep 17 00:00:00 2001 From: gianni Date: Wed, 27 Jul 2022 11:05:32 -0400 Subject: [PATCH 01/61] remove named tuple from VGG backbone; it interferes with torchscript serialization --- easyocr/model/modules.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/easyocr/model/modules.py b/easyocr/model/modules.py index d8b6d92eb1..cfe0853fb0 100644 --- a/easyocr/model/modules.py +++ b/easyocr/model/modules.py @@ -68,9 +68,9 @@ def forward(self, X): h_relu5_3 = h h = self.slice5(h) h_fc7 = h - vgg_outputs = namedtuple("VggOutputs", ['fc7', 'relu5_3', 'relu4_3', 'relu3_2', 'relu2_2']) - out = vgg_outputs(h_fc7, h_relu5_3, h_relu4_3, h_relu3_2, h_relu2_2) - return out + + return h_fc7, h_relu5_3, h_relu4_3, h_relu3_2, h_relu2_2 + class BidirectionalLSTM(nn.Module): @@ -92,6 +92,7 @@ def forward(self, input): output = self.linear(recurrent) # batch_size x T x output_size return output + class VGG_FeatureExtractor(nn.Module): def __init__(self, input_channel, output_channel=256): From 57d34c23ef834da6de11208772f48ac8cce54f0a Mon Sep 17 00:00:00 2001 From: gianni Date: Wed, 27 Jul 2022 11:09:36 -0400 Subject: [PATCH 02/61] apparently it's not all in one plae --- trainer/craft/model/vgg16_bn.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/trainer/craft/model/vgg16_bn.py b/trainer/craft/model/vgg16_bn.py index f3f21a79e4..0061f6dffb 100644 --- a/trainer/craft/model/vgg16_bn.py +++ b/trainer/craft/model/vgg16_bn.py @@ -68,6 +68,4 @@ def forward(self, X): h_relu5_3 = h h = self.slice5(h) h_fc7 = h - vgg_outputs = namedtuple("VggOutputs", ['fc7', 'relu5_3', 'relu4_3', 'relu3_2', 'relu2_2']) - out = vgg_outputs(h_fc7, h_relu5_3, h_relu4_3, h_relu3_2, h_relu2_2) - return out + return h_fc7, h_relu5_3, h_relu4_3, h_relu3_2, h_relu2_2 From 6b81cc5b49660626e0784c8e78a82113aff1023c Mon Sep 17 00:00:00 2001 From: gianni Date: Wed, 27 Jul 2022 11:14:05 -0400 Subject: [PATCH 03/61] hm not seeing changes pull in; cleaning up imports --- easyocr/model/modules.py | 5 +++-- trainer/craft/model/vgg16_bn.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/easyocr/model/modules.py b/easyocr/model/modules.py index cfe0853fb0..18118f9127 100644 --- a/easyocr/model/modules.py +++ b/easyocr/model/modules.py @@ -1,10 +1,10 @@ import torch import torch.nn as nn -import torch.nn.functional as F import torch.nn.init as init + from torchvision import models from torchvision.models.vgg import model_urls -from collections import namedtuple + def init_weights(modules): for m in modules: @@ -19,6 +19,7 @@ def init_weights(modules): m.weight.data.normal_(0, 0.01) m.bias.data.zero_() + class vgg16_bn(torch.nn.Module): def __init__(self, pretrained=True, freeze=True): super(vgg16_bn, self).__init__() diff --git a/trainer/craft/model/vgg16_bn.py b/trainer/craft/model/vgg16_bn.py index 0061f6dffb..a2e9782ba0 100644 --- a/trainer/craft/model/vgg16_bn.py +++ b/trainer/craft/model/vgg16_bn.py @@ -1,11 +1,11 @@ -from collections import namedtuple - import torch import torch.nn as nn import torch.nn.init as init + from torchvision import models from torchvision.models.vgg import model_urls + def init_weights(modules): for m in modules: if isinstance(m, nn.Conv2d): @@ -19,6 +19,7 @@ def init_weights(modules): m.weight.data.normal_(0, 0.01) m.bias.data.zero_() + class vgg16_bn(torch.nn.Module): def __init__(self, pretrained=True, freeze=True): super(vgg16_bn, self).__init__() From f284b998f56f4fc31b10f153b8a3dcc16ced738d Mon Sep 17 00:00:00 2001 From: gianni Date: Wed, 27 Jul 2022 11:34:32 -0400 Subject: [PATCH 04/61] torchscript can't serialize AdaptiveAvgPool2d with `None` as a target size, but this is equivalent to a `torch.mean` call. --- easyocr/model/vgg_model.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/easyocr/model/vgg_model.py b/easyocr/model/vgg_model.py index b0f2ae1c65..a720b189b5 100644 --- a/easyocr/model/vgg_model.py +++ b/easyocr/model/vgg_model.py @@ -1,35 +1,27 @@ +import torch import torch.nn as nn from .modules import VGG_FeatureExtractor, BidirectionalLSTM -class Model(nn.Module): +class Model(nn.Module): def __init__(self, input_channel, output_channel, hidden_size, num_class): super(Model, self).__init__() - """ FeatureExtraction """ self.FeatureExtraction = VGG_FeatureExtractor(input_channel, output_channel) self.FeatureExtraction_output = output_channel - self.AdaptiveAvgPool = nn.AdaptiveAvgPool2d((None, 1)) - """ Sequence modeling""" self.SequenceModeling = nn.Sequential( BidirectionalLSTM(self.FeatureExtraction_output, hidden_size, hidden_size), BidirectionalLSTM(hidden_size, hidden_size, hidden_size)) self.SequenceModeling_output = hidden_size - """ Prediction """ self.Prediction = nn.Linear(self.SequenceModeling_output, num_class) - def forward(self, input, text): - """ Feature extraction stage """ visual_feature = self.FeatureExtraction(input) - visual_feature = self.AdaptiveAvgPool(visual_feature.permute(0, 3, 1, 2)) - visual_feature = visual_feature.squeeze(3) + visual_feature = torch.mean(visual_feature.permute(0, 3, 1, 2), dim=3) - """ Sequence modeling stage """ contextual_feature = self.SequenceModeling(visual_feature) - """ Prediction stage """ prediction = self.Prediction(contextual_feature.contiguous()) return prediction From 40ffaf951e652dac92872792710be7cda00d8f68 Mon Sep 17 00:00:00 2001 From: gianni Date: Wed, 27 Jul 2022 11:40:22 -0400 Subject: [PATCH 05/61] i don't care that much about the multigpu support inside forward. `rnn.flatten_parameters()` should probably be called elsewhere conditional on multigpu environment - does it actually need to be called more than once? --- easyocr/model/modules.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/easyocr/model/modules.py b/easyocr/model/modules.py index 18118f9127..89d914b5ac 100644 --- a/easyocr/model/modules.py +++ b/easyocr/model/modules.py @@ -81,14 +81,6 @@ def __init__(self, input_size, hidden_size, output_size): self.linear = nn.Linear(hidden_size * 2, output_size) def forward(self, input): - """ - input : visual feature [batch_size x T x input_size] - output : contextual feature [batch_size x T x output_size] - """ - try: # multi gpu needs this - self.rnn.flatten_parameters() - except: # quantization doesn't work with this - pass recurrent, _ = self.rnn(input) # batch_size x T x input_size -> batch_size x T x (2*hidden_size) output = self.linear(recurrent) # batch_size x T x output_size return output @@ -118,6 +110,7 @@ def __init__(self, input_channel, output_channel=256): def forward(self, input): return self.ConvNet(input) + class ResNet_FeatureExtractor(nn.Module): """ FeatureExtractor of FAN (http://openaccess.thecvf.com/content_ICCV_2017/papers/Cheng_Focusing_Attention_Towards_ICCV_2017_paper.pdf) """ @@ -128,6 +121,7 @@ def __init__(self, input_channel, output_channel=512): def forward(self, input): return self.ConvNet(input) + class BasicBlock(nn.Module): expansion = 1 @@ -158,11 +152,13 @@ def forward(self, x): if self.downsample is not None: residual = self.downsample(x) + out += residual out = self.relu(out) return out + class ResNet(nn.Module): def __init__(self, input_channel, output_channel, block, layers): From 59a413e255c2602b96560d85e943a5bc37a4ab93 Mon Sep 17 00:00:00 2001 From: gianni Date: Wed, 27 Jul 2022 12:20:57 -0400 Subject: [PATCH 06/61] Make sure GPU behavior still calls flatten_parameters --- easyocr/recognition.py | 49 ++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/easyocr/recognition.py b/easyocr/recognition.py index 147370f7d0..625e802681 100644 --- a/easyocr/recognition.py +++ b/easyocr/recognition.py @@ -1,23 +1,31 @@ -from PIL import Image +import importlib +import math +import types + +from collections import OrderedDict + import torch -import torch.backends.cudnn as cudnn -import torch.utils.data import torch.nn.functional as F +import torch.utils.data import torchvision.transforms as transforms import numpy as np -from collections import OrderedDict -import importlib + +from PIL import Image + +from .model.modules import BidirectionalLSTM from .utils import CTCLabelConverter -import math + def custom_mean(x): return x.prod()**(2.0/np.sqrt(len(x))) + def contrast_grey(img): high = np.percentile(img, 90) low = np.percentile(img, 10) return (high-low)/np.maximum(10, high+low), high, low + def adjust_contrast_grey(img, target = 0.4): contrast, high, low = contrast_grey(img) if contrast < target: @@ -27,8 +35,8 @@ def adjust_contrast_grey(img, target = 0.4): img = np.maximum(np.full(img.shape, 0) ,np.minimum(np.full(img.shape, 255), img)).astype(np.uint8) return img -class NormalizePAD(object): +class NormalizePAD(object): def __init__(self, max_size, PAD_type='right'): self.toTensor = transforms.ToTensor() self.max_size = max_size @@ -46,8 +54,8 @@ def __call__(self, img): return Pad_img -class ListDataset(torch.utils.data.Dataset): +class ListDataset(torch.utils.data.Dataset): def __init__(self, image_list): self.image_list = image_list self.nSamples = len(image_list) @@ -59,8 +67,8 @@ def __getitem__(self, index): img = self.image_list[index] return Image.fromarray(img, 'L') -class AlignCollate(object): +class AlignCollate(object): def __init__(self, imgH=32, imgW=100, keep_ratio_with_pad=False, adjust_contrast = 0.): self.imgH = imgH self.imgW = imgW @@ -96,8 +104,9 @@ def __call__(self, batch): image_tensors = torch.cat([t.unsqueeze(0) for t in resized_images], 0) return image_tensors -def recognizer_predict(model, converter, test_loader, batch_max_length,\ - ignore_idx, char_group_idx, decoder = 'greedy', beamWidth= 5, device = 'cpu'): + +def recognizer_predict(model, converter, test_loader, batch_max_length, + ignore_idx, char_group_idx, decoder='greedy', beamWidth=5, device='cpu'): model.eval() result = [] with torch.no_grad(): @@ -150,9 +159,10 @@ def recognizer_predict(model, converter, test_loader, batch_max_length,\ return result -def get_recognizer(recog_network, network_params, character,\ - separator_list, dict_list, model_path,\ - device = 'cpu', quantize = True): + +def get_recognizer(recog_network, network_params, character, + separator_list, dict_list, model_path, + device='cpu', quantize=True): converter = CTCLabelConverter(character, separator_list, dict_list) num_class = len(converter.character) @@ -178,11 +188,22 @@ def get_recognizer(recog_network, network_params, character,\ except: pass else: + # Override the forward method to flatten parameters when in a multi-GPU environment + def dp_forward(self, input): + self.rnn.flatten_parameters() + return self.forward_(input) + + for m in model.modules(): + if type(m) is BidirectionalLSTM: + m.forward_ = m.forward + m.forward = types.MethodType(dp_forward, m) + model = torch.nn.DataParallel(model).to(device) model.load_state_dict(torch.load(model_path, map_location=device)) return model, converter + def get_text(character, imgH, imgW, recognizer, converter, image_list,\ ignore_char = '',decoder = 'greedy', beamWidth =5, batch_size=1, contrast_ths=0.1,\ adjust_contrast=0.5, filter_ths = 0.003, workers = 1, device = 'cpu'): From 9bd8be01cb83dded4cf41af9deb3f582539c0a5d Mon Sep 17 00:00:00 2001 From: rkcosmos Date: Tue, 9 Aug 2022 19:02:08 +0700 Subject: [PATCH 07/61] add unit test --- unit_test/README.md | 27 + unit_test/data/EasyOcrUnitTestPackage.pickle | Bin 0 -> 43252 bytes unit_test/demo.ipynb | 226 +++++++ unit_test/demo.py | 16 + unit_test/make_test_solution.py | 647 +++++++++++++++++++ unit_test/run_unit_test.py | 19 + unit_test/unit_test.py | 262 ++++++++ 7 files changed, 1197 insertions(+) create mode 100644 unit_test/README.md create mode 100644 unit_test/data/EasyOcrUnitTestPackage.pickle create mode 100644 unit_test/demo.ipynb create mode 100644 unit_test/demo.py create mode 100644 unit_test/make_test_solution.py create mode 100644 unit_test/run_unit_test.py create mode 100644 unit_test/unit_test.py diff --git a/unit_test/README.md b/unit_test/README.md new file mode 100644 index 0000000000..f88bd75ff0 --- /dev/null +++ b/unit_test/README.md @@ -0,0 +1,27 @@ +# Unit Test + +##Description +This module contains unit test for EasyOCR. + +## Usage +This module can be used as a typical python module. One python wrapper script and on ipython notebook are provided. + +### Python script (*recommneded*) +The script can be called with (assuming calling from `EasyOCR/`); +``` +python ./unit_test/run_unit_test.py --easyocr ./easyocr --verbose 2 --test ./unit_test/EasyOcrUnitTestPackage.pickle --data_dir ./examples +``` + +#### Script arguments + * easyocr: [Required] EasyOCR package to test. This should point to a directory where `__init__.py` of EasyOCR is located. + * verbose (-v): [Optional] Verbosity level to report test results (The default is 0) + * 0: Report only the final result + * 1: Same as 0 and also results of each tested module. + * 2: Same as 1 and also results of each test of each module. + * 3: Same as 2 and also the calculated and the expected outputs of each test. + * 4 or higher: Same as 3 and also the inputs of each test. (This will produce a lot of text on console). + * test_data (-t): [Optional] Path to test package to use (The default is `./unit_test/data/EasyOcrUnitTestPackage.pickle`). + * data_dir (-d): [Optional] Path to EasyOCR example images directory. (The default is `./examples/` + +### Ipython notebook +Please see `demo.ipynb` for documentation. \ No newline at end of file diff --git a/unit_test/data/EasyOcrUnitTestPackage.pickle b/unit_test/data/EasyOcrUnitTestPackage.pickle new file mode 100644 index 0000000000000000000000000000000000000000..ca39120ed9c9f8f149adcdfcbf27dd4dac11961a GIT binary patch literal 43252 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

E=TBnLt*_S7!!-f$jV9!2AiY5U$($E={RB zXsDn#I4+qGkf6ek=?wlgC2>%@`Em*S4RS+T%_bdhPLg zo+6oW{nm?KmQ2qNsOEP|Ys?)xC={_iOGN~W4RS$;10`&+kIj)S1Z6^Y_C7M2W?m*d z-n&o9=R77p<|$gc=X{lSCJIkJ^an$BkIn^+>`IfW_P zqqcC7;;J?IVNDUmv{rF8=06N@h+?goQe4bQz z8D>B|D53vceyJ1OCDBCT3w5xI|C(BiKP%3NvU-6t!VOseoq2?@D)v|4Kh5WY`WnuR zPftez%$q4MzI+~tfdZsoI5JZJzEfa&*%{?zU6zTk_&5sd<^2*h{VN!nWS+j@aXtZL5{49%MPnfmixp0b zMYAVHcFUkJ zi|i+~OE)h}4KOn*i5cdmIQ z3$&xhP-zWk#BsEg(!&;VP7>+uB8QaKp4i&71%hwi2m@hmnDOd#Qf*04FeW=CmoN(B|<%8Dj&dP30T&ep0vMlkA zCK-0JfZ~p=cMwBZ4=ap(x+(Z7ZoNS;*J()MQ{?Mu3e<8-!CavarM+%k1!6N>lO-sP zb5iO(t|{~aDv08DZf< z=u{`9W>UuTRf!5=^yiBJBCcjO7rr{iX!vttaoDmxZDC0O6q0$c74v_)hY+tGpujDY{j-TXKv;NWnINRDk6NS-x zKruM}8NWPB#`GeXb7etJ#nG2?9Gkl=vJX)p4$?xR>*lcbHN}!kQtusbZO-n?QRIwC_T4Hhc}E^uQFBLQ ztQG7d_tw$~hp+!FJd_7uQnAx|uVjbed3KG&&Qvx!RS$Xm>UpY4{59)Gck`-#q4&0yejwu+i5l;hqF#s~ZCj>V(w)KXi+qG8 zaiLoS&Iue-D+Xg9w%eewXx*Zw8=6aWc_m&fwTP_`$I&IYMn-Umj*qg)mGG>|vU>RS zUApKaBXk;F8;~C57LHd*^fP~~3mvir!P&>`rUlNL2g?L4Zlx?Nor`NUmnMcEMH0cW zabh#SV87WiV>Nwige?XFUub9;AWjbEH5;0+axkeu>yeTKhIOEG6uqiZJC8Ju!>AeM zL8~NPn{!nIHKGNQ5Zilce0Be8VogubOAkLDG~4QnZZ22J8KXJAZQ`N}l9B4aIqkuh zaW5cqAdS#(`2>Ts0^_eOg534*;4xDw1py6i0f6nJ244Q)a+Wb{7`>5&dc-K+v;5t@v%iFG?&^NXw>4ZiYvB`(htzoU27 zoc~Qy00!%DPsGL;Ug$LJ1UF;(lGtg`$LL&q#P@QihRbFNU1z4MRn6{T9Q%>hm^v)>fE4vtWZyCB)3u}Cn*?J&n3FVjuoDaK09ieF zH<-QK&>W>qi;pT5ES4!yfj+a(awO=l;_6a!XsDkMI!HV>?}se%e*p+^zp3br`zT8L zIWJHKt027UK5{snoNR=tZzV;0n`JM!oQbUC4S%;M1m?Ym z1hu%f{haZ-0KioGNExPd#G-I#uG<2sWuF_z_GU;##m=$Ht&QS)Hh@)Vf3%3Ffg6f~ zOY9)|!mR>j(TR3i)f~k})dAefJNqR+lmUKl>|)iy5bje52s9PYYKk~FMNCt&%Zq{2 zdFP;h83#R=b#Xp2VJ)*9F`Egre39K8m~t*^pWW#JOgoc{>U=xRw-X*8zgCeIb7yi) z)zhh*dJG5f0UHrRWpyD}p3;gq4o|K`}pvdg~0(}YxjcmF*!_{AS z`BD)72W+J8Etu{zimXO4<8G>G+B8(y7i#6^@%W48WD{57&jWDH>0!CppqqPHE`p37 zNaZ7zF#Q(9jC#dSJM^hkzsM%;*yv`TX5R8iu5D6GPCmobov0D61n@jkW>loy+aqWz zUmamX$Nk{)$)B}CZd=(SazezD6g!aW@)^Z2uYs_Ixd^PK63UM}(0Z0q!%fn~Ko(;@ zGdGj_0Bo_t{2+yz;`SBk`6`vPSsI&lKD)==qrOy25de%#sTRZ8Y-&hx-^2{F=z59D z9h$VMJEl0Hf9Nq*|xqZG5YtFfm8T&W<)>sZ#q4Spl31~Kd8preJ)#vlbTcNRhq2<_#|G9F(L4!WfI3>Zn>;;@ ziVF1?9d@x<4S>dax33yTgA%jY1T~$*9()B9Eh)Du36rksL;}~xlbgjIgJN|zP>HGN z30HrBNwo5>6kYX&6H$%2T-~;XcX1TQnDi_4<2d`MeYLGpH1`EVqN;#J0c8>>Gg*L7 zc0E|SEDRyc-R8|;TX4g>W8e#tul-Z;G$UH9NHcPL9QQjEfEQH_c0f$*tmv-8qNfSp zR3|21gQ2TQ9rElXtOE0F9xrBnYyoiR9Yq|5^V#9#Wl6*pZlmNSY3JS&Ai~}oeWBS; z6NcVHDd=&WTlZ5f+pKfgP%TR>8=+mCW=8Lc>bm})t6sBpVR!(GUmJn%N5ZF%YTR|{ zc*iQm-AKA{UP>;)c;@8h9Wu1|xQI9`I{uLDa2W`}LIMiVz*gT76$%*-Rv zw6ODD59Xlbj)~KOJP&0WOj$kPYN^)uE@a?cQ%M30+|xlWSw@HG<88|+umrOmrpA)M zypgbR4p;r^hyS$J2B(}LhOBYc83$wpVK7ijZwb;GWP;tj2G&DDP8c#^4S^>IN^2FS zIJPoG`8%Q67uvI3D7+|~PU%cC6T2)}I=4wa-MI)}S5(RX;8{)xn^Ky*tMsaBygzH{ zlnBncgHg(|*rr(7er&QU19J&Mz|)_Kj;rf^0m5qM%xCsaK?(t$3R0U==fvgwHK^5G zSH}~}kddH*&XUQ-^&Bw{=4O>STl(T{3HrOK7+cWx2bAiACo3KvO&_T=b16Y0++-c{ zsy3e`9E0Sor}V5ry3r7$TJS7&GXz=!7P_y$B*Z7UXuL!_sO&@pdXY*bVL+>b_3&En zaW%-o=FUm}c?N4et)*-br07$gFDLnP8-vf?qwb=T1&b*jG#4w0ZLTa+s$hqxA}*Y) zrb1Qj)FiNkT=FS^IQRi#h)f{`meBMBEjBmhb58dG z9VeomCvzm9$RV|eu+YmL^|(tv&@X<1eBIXA{K>0 z#8nCXD(&{VUQH`QAoESh?9#AB0f|z_T%(%!vV5gR9|Mo9vNf=PqAQ2LB1IKf4*ec8gW17F~+^xyf2-hUpC=Y3~S}ffz#^T+hIE8jd^vN5t zJW!n0{hp6CJG&Z2p6r#g&2N~smviicTt{pPLZdi#&48136uiFDp!9@By?fJ|D}><$ z_ylaCLrLm6n4eEns!fJEQ%A>p*AdZKD`h7zr%@|hR&Tr|l$Y+h3P{Caajt@J^-e#D zgi!qoe?FX;L&xNInPOcq$n&}0PjnWQi5Jy~@>4qy{uXP~#jH2@n0sd@=pCa+KrtFn z%tVS=+@7TxTV3O}B|>~BVRDDDbvMcK39I*COgD~m=X>_E)2=@>& zVua*%)`j)?!Z7SO--9jDaIT>Q?m0YQLtKXy9c(OznCY=b>M3rSItw*#Swbr_8j#%~ zdoH^q&c11Ji>wP;T#ZLOJlti=6NP3-8<^E$Sl-i9TB<=a@tX<#0+iNj`t`&!S;qtE z4yf+Eh1#m=-<$wqW>;tX)f+$vV?VP_-o7+F?jV(QcKeQ-X$Fhx7J~E zYPi6g4$$i1!pDllPt%~U?yIW-dS<&1uo1QdE8~3Ch*b9=oCCchYJFM`Zbk_(bAfx1 zdpq;I8aa{5eG-Pr6eNc_GZj4VfB}a1yADF^pcd?+N>00dX(ZR0( z{b?#+lqRtw6EJQX+-~4a#036qQ&NfM9=dzgv)~!=aCf%JaW8k1PA(m%ug!>qVZnF3 z6&Lj4nc*1#`OYpV#g(0EwBJ}jqtFrX92udRNx5}1U=(VEce~6|_%)3#o>{lFd91>1(>Z3Trp`J{uwf1V?AuYA!d;B2#hX zdS!@t*NPllDUYyFr*%)1)nQ4l=U~c?>Vs8qLQTy!Lz2lF-G<^CdwR0kyt=o4$?b3E z^j}7BX%me)n@0MC?C-k3&EHM&cXPh9gWJGge+eMrLdji|gxXmsFT=_p@59Ev@}%5m z@bedUkDX2j2ehJlmvkyaR&Fj#I0&4FUe(}s#=TlX3`OZ{hO)ugg2f(NKREQdu^4}z zoM*ExCFT3F5{ z4DKgqW9wc~7@2V)=#!h|l%Hp_#KabenPX+HO7$fjY6E`^iQX?_4Mqyqvm!#{z*Xi? zyhXrwQ?;|<)UeI1*T;yH4%Tl|3xAVxdJ>Kbp$O8_* z*ZWYJ{*Z6=?L9-NTKj+j@;{NoJ9~{L?x%iFzDa6hCG7l(NN<}qV+G@gsYoPoS}iiT z`BF@!^`MX|(s^Bnn>7U1^t{M}a|St?GTKoh(^SHV}VFTK8BfR1%rMa9%6!vRKZUWlVhXpdX&c*B$| zof9~@do30f&+uygrASz*Tp`zGAy@I-4fzYm4zcTg67|Ag;vjD=AutU)$1ZVrA~$$q zLKQF~7AhBdQiOg(Q_&ggD_juzHqzkE75RI_BWafU9ry>92$t=BVT9S+@-gGg#^-)p zBKEL4jBG2!?_ubK<@@KNDdRQwlnDbgZNkTcOD9?4!Weq$zp%nKJS(Iunm?%nu3-?R zM4(J2V)1##A_x>(r*|(B+*t0SL?R5$%t)Zi3|SKq_ma(SKMPWnvaLlXq<0DCdoJ_}@ha|RI ze@khownFG!v#ZMsCD{e7X6h*}dlGE{RMrG4q9z$=B&`2>dnVS~xtUx*B-~}2_ABKc zcGs>j%w3>m)(1$D1#SEb;Pp>e{<1Oo>l+{u^tsi&R!^N(Kh>FFE{4%F{W2a*O6CY|nhJoJq07bKaVT;`Pn= zheqP^@J*Va9Qa7!7-+JkZPH!udg8&*3>x|6!j{*s_phW4)W?c*AcO`)^)Q5QR2tH2 z(&*>UmM)cx8LJihc8xCyixkPhN%ySyzD+hccX*Z{(!*o&s#$6z%RkCyjuC6`AR+?iGom#^ zRmB0UGw9JHP#{Kv+IaYTBa@&FA}?t@{L>XHBlovAq$U~V|K!uHzU-CnIGP08>ReOP z$WTGiN#HRHu6q;g&t>tm4fI`eLVj)HZJ}Lmo4B?xHYCFd?dt{x>a%qKyy2ad4@r5V zAxiX|DcKXe&tJgF)R)BZus93=xVu`S$t#zhI$^(jPr@BkP=0gI%%n6`r+pNx_dzv2 zC0~0QT_DqfeJ$XRL$g!+|B^U{{}o%i6fn`pI{uGJ$-`CK2r@2gv%rCQ<0;Wt=kzV_ z)~5<>iol01!_NdCdu}qsZ6HzUmOC~1$?5ITais1Gt8|{gLJsc8gfn7^aR}mi*RN26 z_QKB0aRlXVQM-A$5b_Zy;4ZFUHFiBDa%55Zby~lts>~vO*_0KMWsJI=#VG1~L$$p;p3Mx`vK=6sz&&WXc@ z%ulha{;_k5#K`E3jE59sbq9sV6H_?k;SBQAiPa`Uc%K5=8tyN_oV()d|0*9m?oQNz z(-SKR?auq&N44hXud>VB&ttRsh8$H)z(Fi9zG7V~bq|9`T*2O2wteNVDm{4NRfV9s z9n_*^)J0CrXujn2!=}jj>wy^YFQimo798`g55D_gxDI9>(&-;mfh%r>zJ6!Gj1INKA z&LCNKGJ5x~U|l`}$-0axWR0fJL~M&*dw3j0;|dqIH(cWV^tM}XF&PtU_($>DV>gV9 z5jPvsR+%0;s<-BV86iY(nlE)%x=1>Aap!1_Qa+lcm&SpmMfX>Wb1QVIvN%`GnAmo^ zk99guywoDYJyPoRrYFYuLR$&XiXimUnZ81|_76$HJT$e}x$|JbXC#_TogR;57*~f~ z!M8k?VpRMc1`i^6X|lz@F6(-hAQ|oVj%#ZMj)F{zfK18P81|M6@E=Lbkf4k{4l?*w zHSq*21Q`sOleQq%d_K5Rc*5Ay49ig9;z^*%D;No|G5G4dp~T);#l3U|^Ci(&TbRa% z0$eH)0~PjSkd{1e(lJfII9bT2li2~Hh5b&Y`IhizrQ8`JY$#{|Rc_?aV7=l#Z>~=> z7~&~N0R;H3TR&IK>*n4G& zJQ*o#ZNmTUXs|k(%BwXXM{^t_^tQG<t+mD1HawzkvoOmfLTv6VUm{~6% z(fMrZ-A!GroCA}1f-tPzRUO>WX8yN^jNo$KeDIyK!`vN@B&ZLmfQ6j(lLR1BB2TGX z1bquABdA0K<&DaUhxlv!z|{U<2*qFlwn9CNg!X)2n|br&GjGsRN^q18QRPNT+K{J> zx;0tGX*~Uz&oO!8j<34ypD6wSkLGRkS!aYX>Ctt@4$E~0#I|^hA?nub8zbx&NYSb2 zQ)ENH_|Nk)x;EA4$;rYy+7;6i_I>2|Wpa;|OouN}bsg!F@ zDWdin!4l)7ylHAOW?h<=S(lONehRRUlTrUpNE-u5tZX>Tl}8b(J14ep$QbnzWeZF>h7{s@Y)RbrKFC%~{n zc5{?Y$l0z-6139IIw^PuOrCbI8nznWomd(ly3;O1c18b zG!BirYoqFbwCTmxbLC=hjgMvO^zO1Va&uylkOB@q0BU=9F?yiF*KGEnSs!>H-wg86;(?w=F$C`Uqq9xxw7YpM zOOeb7{x9XW10Q%tX#BzQK*!TJ_Iv)Rjf^P)iyh23RN1w*U82BVTC|`#Nx^-XF|Tc% zj@q{qx`U$jZ?~;YG`G=-wY|;w@8(ySp>ofD$E2e3MpKNKKT3JNm9uT_eTJjT>w`dD zCSM9A*+!YV4tIJ)#uMrcI;Sk{2d$L0@9X=|g-ihjPryt#Po_1%J;wYQ+^S?r1LQjj z=tIMW0!&%sLs_2YdQpc#=bbd8Iqib-x_Aq2l>KtGtIn()-V&sW)sKWbA4#H3&0h4n zam{%U7*d~$#$YV+b$B3*9?h_P=C&k=^dM&Lb08-m>*>B65H&H*;zC^@#6rVfsTV-B z!xm8e(+d{lXFvSq>0{%G@DaWA@M#bL-vOZmMP2BH8kNS+>GUw*y75umNc7V1wqv^3 zEJ?g35Ibcwdn3FSd_X!K`}LD;TC;(5SV88{isgf*ZwwVce9lowX;&iRo>o=1ErpB3 zh@;iDPohf$hW1Wh<e9=z3H?b%@v9MuB~W(Z>Cso4$loK(l1&k^EUH zCfhSW6C#`+O$sk)QtLWkFm8_Y0ja}Dz9{)6Ep zsc^t9Z?zzKvTg75!NWZ}BAvjqcLMSZ9o6ZJik8!nsRCD81;dO(cdbNASX z%+d_ZuoCQC5;@9JUy-H%%*t{)S07JI{X;{r4WzS=+<19ePbWoYK37KXW2N=WqH$l9 zqg|G38d3tgIN$!B0IAot2zn}!)zBvtl_TGi>YHX}(=)!3z#C`1jnmKFesIa4PT{CK zqDy^K$pdYHey0KS!nj>vND>@{p1cq~wX%Txuh)%|c`ia)>AH5~L8N1t({aAw>n^;P z6C3>fgJct5MHW~a`2}1?@#^zSNmhB0?w8UOVCLB%tugJ(-gc{m&g2*(*3)Rdc6I{m zFr&meK{p?cPED;L{U*HIb!`tP(`VE*-t|Do&a&2d!hY??S7y!8Q_mjyjTaKroorO3 zFwl{bZ~w7|Vp=%l<`=F6iB!}0j@y`@;4Ipw;JG-X2>_+Cs%1kAUG~TQ%X?bvq-mF} zTmYR;fAjo2(!Jky=k$xRnOP;H;DTV#GeUK_SO9~>I}5ANQ)Z`B-DPS9|1U#@R2q43 zb6O{>&PvqwtPN_K9%Jyji}`j9vKt?4`v>uv_=sgFP$+Q$uO1M&4AokH-ng2tkwBD1 z?MN%Sq>%YVQX|UuqyRmXgZoGl&&~%)27_!7UQeZub(uC(QVl?qiN^UXD#vnzec49` z#$4s)Yk?bo2~r%hn=z1pcaIP!4hJ!LYt*3eYC0(8ng6+BC!YR>&67Q{P_CN?B_SUA zCAOHc1K9(OpSijQw-u9JfwKSZulIjDr0x=2?H9NmFvp5g7L*Xj50AeU|K;K!V9c5o zCQSe!kyl7#&_!G2CRE$1r4HCt)FnYE36rg@gWXplv1j>Md7HA+w=sfW#bc+ZQ#m0mt zr@9ofJ6J!(+Aj3bMdbeMH*3)rx1-?XDOHm4AOOcjxJf`>G6%khK(N1lne|6F`3MW8 zH)j}|*mCWjgL7I$jp~-dqrvW*PvDWquY4VDfAJA(W{=uZ+7@95l6afDeVZ<1=;>;n zT50Q=?UL!eP{Kj+hKP8>pV+E*0WfcM@wBF%v^<#UZ%_;rAT9K_=8 z!jTPoBw|fPO5b2{)O<=C0J~`H|D3IC+RuD$gr&m*y??QUQpWEhrdX14+Wsuu=gW)_ zJS&cQj7HXFSu4F+^eF*o1e6_g6l3g228!B9zGV+UyV<6DJ$P_7Ezm{=SAuhWNyD@p z<6Stdj%r-ids4>_1}eCt>>t&m>D0YZ`$v2Y&y}GA8=>DjG6md zRV#wi0b69+`-HL?41%h-1aT2{XrvBW&N?R_kTLRD!-Htqu9p+o%k1{-5w}yFKI$K3 zbe|}(u|W2FL-4saI;IqereGE;4qng`^T=7ELYEgx{R-%+j?sy=CTelYDu*4~GkyEn z@&Djwd&gqu=A$fjncI{g^&D2GYHfUaskE07C}9Q@`w$p!n}}#lp#T$~MfHK->x9kaPqUEG|Qu`p(((AUSb>Tzvo@21~wb=Fv__cX;qJ z>x1eXu(1&zgrYo+y!nN|xLu(1oJ+B@G6B0NMAtR`cBNR~_RY^s5y5zRc;lO}>a*qB zM^eiyZzE~R2!DblswfPbg+kjoZ}NG*3bmByM&09fN>g~09Y zR;_*{7STP8O2Ld)KVNlp-9D2Nb5$}x2^I5kr@{n-71{##J> znn(oPGhb#^A0esLdIp3~#tg|NOjCba-poFj6G(CXoIi(rKXrQ+m3}KI&Ikty)?I@t zTkaVcK+PSgc7{m4&>aE`q3@I-vpS@l`z63@UiwlPmLS=c2XRLVI5YZ2xoQ*$N+jdA zAsfAGra_xqC$8i#bK^AahXgm5aN!!5I1j4rW(gM6qjqF`7Iak~_bCW1VqqcDI1s?> zvQf7!{v;=I_Ts}+P@-W)Sf!lJ5dP*Vun@)CO}PaZ8QA>B+0SOeijlHbNh{bNc)2zk z(5ozzgUN>#x)#3f&X`qE4>^=BL^^wENe9ExFpZFc3qfV#&u|9+VQnS z>?4Y{m32A!p|jKRccgy%4CiU<9uK?gl9e2`hI3z7Na*-{yj#foBn~{qr_Ele<9Ll{_NN#y^<_E0*9JuqP>B(Y%cT%oT}xuFz2-v2z+(CHtOXqiy?)p`9xmsbOzF-%5(kWORpPjOH zVhW>BfH9J#kh3Q-WN6cIT0pP%Q9%-iRG=2j+RL;bc12!V7IgyGbpm9b~NR4F-W8jI!9(o|fK^ z${GfN(9|`k)bvbS27o5Ba2d|yi-gWOkLV1*sMxv_<#9F;U}^6kV;HSW_gm+@V!LL; z;j#l=l?hRvGKNUjn|jG(N}|aA%n%l0DF0H072+wGS-vO;tM5v|89;}=eGa=)UC;x&7zhnwogL#UnkcFdCr+$|&` z;)Pn?L0L*5YjiQMHJqAmlFWaXP;F$>pWoCUm_1`1JG3!2>ImdrpcOz^{3mp8x1o-~ zYY>2++Te-c;r+I)30r|iO!cK7hhn8({}r6H6Sml9EXi|LeljLcw5GbxWx^7kl@MFf zZGF5K4HK&#yG}B#M_gLrlJfZ2>v&`@m#m<1BkXJ(Vi!(opmCt8-D7@r!97| zDGJ~j*m&m?m{OGZ@<3ZBytbL+spi>EhWK8CR)z<7quB1( z&_Qg8aN)tk7=4ruqdAdI0XWR31+fKLWGwQg(|A8!1)u19&%Tp%*J~J@%~|2zMJnPN z;&AH59HKEto8`9l%aLs@07~Z(DEdAUy0R?nRmX{PEm*T;ikPgq9Ag1)5SiOU!$a9l z82T58Y01f;hEhQ!y=v?gQ`&&5$q{0_4DqVDO-g7KwCF~> zzS`}AaV0kD35nS)K+U{U??-e-fG$Q1!DMKG9d+7<%z3y>v z40QKqRF}vFNI~t;tbSW#$w3=-wh2z(e^Tv4H+6F>!Sz>uS@j zGw7C{c3}o}!gFZrFu3)_pYccg16x$MqWr!ihYbxHC2r@S0LeE(^4?+sFqJz9MW@Fj zEU<{MygHhmB5Vz9Awlaw)yphb`ybdd)t5jhGTk2iZTRS?6w&!8)BklQud#<}%w7=O zIu+Ap@fsBpBlYR^+6m)(B9lJJcXMFEsLn_+zssNZfQ6E;83>&;o9$ zrY;@2>7c*-Bqgl)>i>S})okrcq>(4Wgt$qzzM;k+Q2}b3PYW*U1 z#&J^fc@9krE_=tRy9)nTI%wgvq(WYJQ~tPj%A}NBn*!Qb4GUO{6sc_U89+Wbqxex4 zxOhu@AIn)5P6Q<}0A7y|qPw_r2inod$f^SZVli4RnP(yH`o*v;*eYoy7G?o~BcVZP zXDQ2)e`&H9KEAE$V4(t*K7u5nc%0+aU6PJy!b#juop{YB>#-8rd51l=;Og&`R!9Mc zfmZWpVdmw-fSGRB0Swvhk{AAFS?hB_%0n3XdY79Y7>TZX;fN?XWEx$f`cuH*uR)D# z>{dA|15(ar;b+Z`lL_!>3W<7wkLiunYVNqe#rwDSMg>+Ps3KN;hwdl9olx}uIvhw4)^FuJIh zLw1`MxXh0E^9~Xsho06RhxtL&Z&9cg*x}hk7v#yJ_m)l)cV`Q;FU(vxW1JutvQ128 zBuGBKLtHyvcv&JjYniYzlv)JB)nmTI?1Ae>#E>%KwKPKz@p)JIdWuvcx+QmzXlw=9 zBYuW00E!C~Ru&IusRh%XD#;}#jm`#o5AW4o5t2wX%XtKYs`Ralwhrim1?{whd!!?4 zE%gs7~sP27a1g6S;CIonY9hIp9~u&SYQ0?8sROeJToLSZsU9Sxl28WtlkI~n=Au}681xk z;LZ%)0`V3&L#KBTnxzhsO*7V9bAuR=0Qw9NHv0M#{@sbMlXt>sAuzMas=l0uk2i&! zMp&w&?@@CyO`@tr2OQ8_&YWBqn9!dj0=Ru0mThIhHPwkPcOl^L6vS5@Y&L+=V(UqG z%)hCBE%8HVqpO`DYe4K|_n67>1YCd*a(^Bz-|E;6Df4@tgI+ojL)w@8U^}q|{m3}& z?9pFL;_o}L$;SrB zqX(us&Cz&#^tYdD<_&>%}V69u3ge6X`M&X%d>b7 ztxnpt4}I@*Q72>pv9h~Q{nH_cd0VmnZMR+G4h^+p{YsE3PeEL`WnUB*cWK@WbNvY- z-*YxcNHrzSAr0@6>5=~K=^BP!GFUdIGXOzXdG?_wmGu+<#Kd&5YQZB{9r}kX1PY_7 zpqniY+tST@J@Erz{;!f0hv5+*69R%($J5DI758sjGa{&yL5+>Lb*Ld1?E`LWHBF^} zBG%3_-!q@taN=ufzc)dX&X>J*mO*xJq#bh;k1TV`t54dKxnk7q)G&?ZQ0-bett;$T zt_qVt&E*f@rq0zd2IiG0dmyNz30|*<0lhme9Mra%Oa*GO;jsdeBuPJO235LKp}64h z6VEv?$O@Ygd9O$h7*}HPC!xW~gX`g25vfRtX2}1eu~|jM@a+CDRMHf=FX9Uc$(JZ*X(&3Jan%BKhi9!)0UMZEkLh^=eZ<^$KN|C|4#m zt%3n7S44@S!&nHAcaW`0bV^(eFuaioGyt>v{>`Jwkq`&%DaeUvXFxfg`HiSc5ftPlW{!)j@x}5B! z(HhLfKt#CWDQ}{3Z%YhFj<>KV?*ZCP%kCEmpkQKsr;A|>h2xNBvDRx@*C!Mj*83#D zBkkUN+(rj+QnT#{jsohrkaHm^157cGzW_0SY|IIOIM!UbVIz^o_ccu$M-x5e$Ld7G znM#jiwuj(ommhCV8Wh2%avFfnB1ObBGdO6|FVf2q9elTqAlt}Q10w<|cPk|E9Jy@- zCWVRK){lt&h;@VbV!ZsYCn%V$;lvTqDi%Jj0CmIJ*dN&6r!OiP*IB|GtZBcXiynT) zQ@0h&@3|~5w``WcSO$?q0(CD*Z=;ha*Zy-37|PaRtfSj^<1mZ?SqvN|(@kIP!kKF3 zrWfJVA5hxMeX32OC4UL~#M>9%j90`Ll_p@qYm`zlDa?3DYI0M|dlDjKtASpdE5&YD z4q4Vdvv-Y%fK$}9`~H102OmD!6ICh;?9WbzG$_eG-STKQL}4)vtt>+b1y`(YI-vNU zaDeJdKVXZ1mK+nPf%ID^nW~{+q#-u`Z{r6e=TtryV^E;ccmLd{#=hSZD;CW=08fTv z>!f(XW#bc02U+inSy z>4;nY$@t~eO`y7nf{U!f7|PBx85s5(bB!e1nsJn!^h2n&(X?>Z%*h*}8>uaoE?Q=J zVjY{<(o`sJaySAiG`tcIT zbLz%!qI$h=9J)e*+3yN4S=OUZ=6&8QZ;A$rS;@s6aDm@%~Uk^+Gg_*@jn3jt0Iv$M7gSW#&%mK_W-Jry~Rc90pSJFQ0fF zGjO#)0rzOR>PjCfF>g-QR?E=HnZXSQVMC7Yv=koxhJtL>V{NmM3;~SHGI$PmD20LB z*0Ihq$6U=-cMm#hpszLEHV2<+;i(7@9-4hR4&1tv5GVv2gJ=BuUgG9$j5z}jc#$;P|>4`ypZbn}XDN;2D+4beSpzH2V)>>sTdhYp?xd!Ei zhENU6(`=BnqG>YE`LKz|AQME=zUKIO2d(o-DOa~{bGUQHisi`mJ%jLs(`8&xs3D7zX8L>GXs#$t`xm$H~`wTUVe`*l%;=J_G4jE+0YPHq;rni!h4-jK} zs4SXooj|8kOUhW>5$5Ouo4M#Q4BdQ#nyPVx%mV*ue=xeB0>;y15p~lOC0GD|GP1mk zgu!_k0vJyP%+1K<=RUsQG8E}wtTRCQo1}Uis>{smz8$G35n6dkQ!mVA2ARL*=A1 zUcE~nO!?^s`r|bwo(}>SpWO+gj-^kly7>-jk`LF5X3iS^E6(78pDoB#49r%>h^fcB31YT??{Z5!3z-4 zxa}vNIkXb*NAL=(6|F__Ir|(lR51=wAE)(O90Pv}9V}g0+?y?5o&6A<8@E??$pjJH zC-ijZ9;|@7K&%ry#@l)$cmJ*ikGJP;iPZvKcOn=0{*FNII^5%n%gtnvbZmM+M16My zu|?)00I&vc7wVm$JV508e&+O6LP*+2o%GJ%PoRxfqoG<(bp*Wzf4oy8tvswBG@}$C2>-YJyPh#)HC1ar{r8+lsqw^9Hq4V_V`H#o7+`+x8|@2DU`1UeQqNwrqic-~<&p}++D!LHVMRrk> zy0kj-3OP4kGnUCfhR3TWA8K^Hk)-dETNp#pTiZFI$qk3}T*P;(^xzcwFw~wrgf87^g?S}=bwJifp1}BIaoXV^YPzu4KGX?*VP2_T-F7{9tbL%tSM7k;?svlr(hvT;Rz%^)LMt$c4Yq(v@Yo(cTMXN<)sAEVe7OdJJA5 z7-eD7=^(#78Y4XUW-kvMa`q^qJ+{J!z9HiXs4i<{;ee}nyj4+y2D(S7B(Fzw>WTw= z>02C9uDp>AsUHyc`NCHXP(;f?NH&J@FY7lG#d4p9lT6KMsfhR%|H9g(n;=F6&fZ=5 z6F~e$c8I>`Yk|r-@HLKqVbUge-<=hVw4)$Vjy#6L(G;ZD<)HKVs0x$P%2;JW#Y{KE z6RbtNXa;@Jv1o+&z_d7M@N@SILR6_-t6$jO;#5#C?zSZfvgs|qD{0cg%QPYVI=m?0 z4MbZ3`ZoV*VsbP6gQv6snIE~Y88JPpA^_A|(3UX%eIOti!Q4*#6-_5L7qe6*@?81wY8;KZU z(HqS$DZlj1%qh7-wC!k`giE9Uju3^yLbd=_u%iawwe^R!+x zFR%4Tef)+3{V?kVa+ni=HAX3FWg9NcdroR!rRPfZSyu7H$Z#?6>MsbBZ_bEw)5El3 zNgeyCczMy<$v9FJG8gCkRK9;QFnZ-fo`qnBN_xvG{G+U zm{W4P_$ff-Mgsvkf$-R)Q;Xu%L5!;P}1lojq(gsi(CsC^vE@Ly@ zS+hOzOMmoId;lGHHz4qDDJFoTCSHIRnwy`92)KLb*P>_sl4LqF;rm1=wT9B98u!VH zZvq^0=Q%Q-Mhb5GPdeV($25y6KR6B4|2(Z(LiypC6yeh(_$n|tCYA}3GjUmD*hz=o zpv-W1Rm)$wvFo;8!9{%FB+ZIgdU_cR!e*EY8+5J} zeBA^pcm?QTFQx?O8X6^--dk0Sjhz*mE$0D)W87MB-pI|f=-Dl}%QUMd2>j0Gi2gPp zD^B$Zrozz`&+2!0Aki$sz@_AGihl}LC1?q5 zQ1>6lDVS5aMATxt#5177Ipn5&m{82~LJHu-=AWjpb8T!0>rvjmPCXl_9-^C>XxwmU zkvdencwL>QoR~~`7gz3jd>5IgrELuMhA#+lgni9MQ1NJxDzFJ6Gi=z!$2d6k*#DFe zbj;&-?ajr}`L|{mJnuL5pxX2ZCgB_^=GXBU%y%S$9|wuV!DlA0y;xJT-$euZap}sB zyrqGkw}9-oUfR6(taV|Ps$E1ls;OxYVta&E=p#JmhvAp=2?0fi*->}L&!~-DbVl6k zZ%0Y2ZMJbZqI&vUWQMR?rn6$82Ym`dW~oaQsl7XB9?ct66G4&DG@eqZ{>k{VgWpr> z!Bjm@g?w-b7O15T@6lbJJCC_4VJt?h_v4|C;&P{+gMbJ& zEaM*#9>DJR0~aWS{B!SRUW8~66`dN5@!5iQSZF$$J=oEUipSbB@74D=^{ZQJv+&|7 zYa&NnGJ(9p$A%bmWZWX@n358ZVmJzYw0{S%WsDmcddU$eT(>{x3DK2X+om-cCg3Lx ze-nSTrS>k5hUY!9X=cS>@5Enm)pc(I){@P+wgraA`gktYfNUajpiu9WY%;|xR8||G z*ad=ift9VbJX`G06w0Bx?I7?JVV7E>4dC21-M9oHd|pqMj6**x zr5z_#ntR1N_nh4^>25xqw|jNtkQm=yQcp)PUt6~sZCgK5X*^-R5BuwSxF-=*q|;jQ zwyY1!#*6x*k6w7b_z6NGvhBj6t;SK#^0-76#14+lNOZGgRj|61MB~I#N9a^o)TxuV zufCq3^oe$Y5nuXdaNZG1xI!WA_h4q_V4?JBvN(T&JDl|s++U*mq-qU)Xs8843wb^;GNZ@2aPC}(Iqhj>_q$6Fm-HZ;-k0+|gOazAW#H61>dy!E#O4Q%Qez2*1 z0$I57twhE5lnc2SbI|c*3+>Q6Kz_9gW>9*LvydkEee*t0;C5U`)m73h$;6W+hj!V{ zPsoJ)OXsHLNpz3K@*F=$z;NkYbaV?1Up#F_*VwE`s?`a1n9g2n46)f?5HG_F5mFWB z{0UrVtYr%WQ}6teQb~*jwL``opByT!*dpA0p6AuF|{bYBs>L{>WYF(=k zg$Uy{J_Mex+H~+f^PJ}CyGb-Tcp)Vm_=L~>Hne`+!w!`(nOg<8r<>Ap(+-q&AY4*6 zgCJev3DI%55U2bJhC&DsuP?8IS+u-i4eu-A4mT`Yvzx1ApxZy6!J*8x-B4g%6CKF} zYqxamS)->_225^C;#onEm`hDD&QjYy@T+5~<;EZis5lfWB+`kx5q}G9fEyl&jaPj`?qmQ5Y9!;fG_;T4TVr%jY&-NsI*uoh zchFM@BayjRRNBTP3V9(+fyLS^fU~l#}lZ^!$X)q}{wO((| zwOu!xFp6V73cVET(C|o7w=`R0P+FT8E%bV*!dFBW!GeMX_Rp=mTaTRHn;Asp_#4<9 zRPkQVGgbUBzsj}PE)>^Ag`wBim74LEJlaH3@3Z9n*@_~w%B*YP55rfA6JJ#a0%CaihSu!LqTaq?$J)yPfsWClI6#hk6%|)Ms_t}~+kPMx&=uNm+9>sAG zqS@>kHgGjIR8h|cA4rVN8~%>|^>QEW>D@IKq|iJ`or3Cd*@G>DeqHDZI|Q#>GMIMV zmoBuT+RCan7RrVdq7!5$T=ZbVa;iWm`u+a~jBom$6CUCzrCJjut53?3BeEz$9vmEI&_-y9Wq1?3Df zATMud15d!+%6szgvCk9p!e!#N!UXnB{GM)R0yZ;EZCa)UX??@z#k+5cPF}hD``gI7 zPY^Si@U>S)YU{PY8~tbU>H&i7Ol75|77nhWm0q8r$K<^zJ7J$xX0Fz%c9J>@S{mri z#v~9kMks~`xhf^LE`>c3RcqnZd_;3IE!%H?^&ElZKqjlHgRZz~pz3ncvGIHu#SdJF z8R}$Tw6_;sHv&=LOOl3{9gBENO67{`b;8BDQ7Z3*YINE57zlCd9!0^CNUm<@qT-GA z<;zf`*YxmMvd!W!lcNsi6W*Y*9|36lc24_UO6|?(UFB5uw31tp1+1nWY7*psirXpj z$6`T~_Fc3wA^xv(3Z$)gzCgBno(=a{#!Sz)+if0!L)crI7#S%xn}bvJZ&?~RAMF-h zc+YqGrHmaW6Gt*cwj3fZvA#=w6egf#l#KdhWS|PKg(bqpGH|2Ymst#s>PlkeIhiu! zXM&E3|DvwGjT-M8`qL*pk;p%ENqhpN6vl!;0Yq?Vyn$zX^M*FKmUqKY5>qfEt(ZwZ zGe$aN2}jkU{SmBdcxI2v$X$Mom-aH@Sr=_omw}xyz?M#Cbz;dUm1(T4nR&mFmnvyw z0)mC5KUP523l~KGJ{6u^n=$-!E@Hf%Pw_CO0t1Ypn7TS+bZp3k1H7s1^RD5HO$)kK zTc^?y5R0MPm|ax1$I)6I(XSK=^3UdTpH`?t!@Ykut=N7%<@)uHq&|VZ_e})P4CNFr z_xMh?($+a=Lf1o^ldX6lK_|zt1KqU?N;jIJgFN&8$Z4H(WBU^TDXN#q>_^FIVu6{2T{i)&OcR%#oEhE$OC+8X>vHy~QV)M<11*#(t-tO{I12 zksd2>%Z>HI$Lj+PsJ4CSy$yeYf+i2i@fft%zoa*1LB&}fEf=Ff`-V039pMv)lQLy5 zRJ}U^fb3zZvxJ_=*tUb+dPX-lYq^C%;E=zFO#i4}-{p5>`;${HOTwC)pa8mpQUoOE zABj5sV>v5GNX|)fXcy~D*;iq?g~Z-1#PC>S<~jRlL0D;~ZUGd^TxC1IRk~?X`7?!} zv1d22G3^4@@~|l=l{|NaF(PCTnol3iC26Kw@WGo2?xH_!fP`bQe}RVtB;jn3u1~OF zs+jEX_I`QpbYQ$)>orL2No5aN;@~J85!Veg%p4EzEYk(>bpP(3_jh?J*5BobbcXPZ z*k!j({0NgFbI!HUiloe@c>i8bl5zk50DC6*jlNS&3;+So(E`rr5ltA$-Lb@H`vL#} I000D8TF<)T 0: + print("##Testing module {}: {:d} tests will be performed.".format(name, num_test)) + for test_id, test in tests.items(): + if self.verbose > 1: + print("#### {}: {}".format(test_id, test['description'])) + + if test['method'].startswith('unit_test.'): + test['method'] = '.'.join(test['method'].split('.')[1:]) + test_method = self.get_nested_attr(self, test['method']) + + test['input'] = [(self.get_nested_attr(self, '.'.join(input_.split('.')[1:])) + if input_.startswith('unit_test.') else input_) if isinstance(input_, str) else input_ for input_ in test['input']] + if verbose > 3: + print("###### Input: {}".format(test['input'])) + results = test_method(*test['input']) + if verbose > 2: + print("###### Expected output: {}".format(test['output'])) + print("###### Received output: {}".format(results)) + test_result = self.validate(results, test['output'], type(test['output'])) + if test_result: + num_passed += 1 + if self.verbose > 1: + print("#### Passed. [{:d}/{:d}]".format(num_passed, num_test)) + else: + if test['severity'] == "Warning": + num_passed += 1 + if self.verbose > 1: + print("#### Passed. [{:d}/{:d}]".format(num_passed, num_test)) + if self.verbose > 2: + print("##### Warning: While the result is considered as passed, the test yields results ({}) \ + that are different from the expected values ({}). It is strongly recommended to make sure \ + that this is expected.".format(results, test['output'])) + else: + if self.verbose > 1: + print("#### Failed") + if self.verbose > 2: + print("##### The test yields results ({}) which are different from the expected values ({}).") + + if num_passed >= min_pass: + num_module_pass += 1 + if self.verbose > 0: + print("##Module {}: Passed.\n".format(name)) + else: + print("##Module {}: Failed.\n".format(name)) + + print("#"*50) + if num_module_pass >= num_module_to_test: + print("Testing completed:\n Final result: Passed.") + else: + print("Testing completed:\n Final result: Failed.") + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 803b90729d25fda253011c505d0189e8e63cc039 Mon Sep 17 00:00:00 2001 From: rkcosmos Date: Mon, 22 Aug 2022 18:34:39 +0700 Subject: [PATCH 08/61] add dbnet --- MANIFEST.in | 2 + easyocr/DBNet/DBNet.py | 758 +++++++++++++++ easyocr/DBNet/README.md | 70 ++ easyocr/DBNet/assets/ops/dcn/__init__.py | 13 + .../assets/ops/dcn/functions/__init__.py | 0 .../assets/ops/dcn/functions/deform_conv.py | 181 ++++ .../assets/ops/dcn/functions/deform_pool.py | 69 ++ .../DBNet/assets/ops/dcn/modules/__init__.py | 0 .../assets/ops/dcn/modules/deform_conv.py | 157 ++++ .../assets/ops/dcn/modules/deform_pool.py | 172 ++++ easyocr/DBNet/assets/ops/dcn/setup.py | 15 + .../assets/ops/dcn/src/deform_conv_cuda.cpp | 695 ++++++++++++++ .../ops/dcn/src/deform_conv_cuda_kernel.cu | 866 ++++++++++++++++++ .../assets/ops/dcn/src/deform_pool_cuda.cpp | 87 ++ .../ops/dcn/src/deform_pool_cuda_kernel.cu | 364 ++++++++ easyocr/DBNet/backbones/__init__.py | 2 + easyocr/DBNet/backbones/mobilenetv3.py | 252 +++++ easyocr/DBNet/backbones/resnet.py | 340 +++++++ easyocr/DBNet/configs/DBNet_inference.yaml | 50 + easyocr/DBNet/decoders/__init__.py | 6 + .../decoders/balance_cross_entropy_loss.py | 56 ++ easyocr/DBNet/decoders/dice_loss.py | 186 ++++ easyocr/DBNet/decoders/feature_attention.py | 145 +++ easyocr/DBNet/decoders/l1_loss.py | 41 + easyocr/DBNet/decoders/pss_loss.py | 115 +++ easyocr/DBNet/decoders/seg_detector.py | 152 +++ easyocr/DBNet/decoders/seg_detector_asf.py | 163 ++++ easyocr/DBNet/decoders/seg_detector_loss.py | 264 ++++++ easyocr/DBNet/decoders/simple_detection.py | 191 ++++ easyocr/DBNet/model/constructor.py | 103 +++ easyocr/DBNet/model/detector.py | 53 ++ easyocr/DBNet/model/model.py | 71 ++ easyocr/character/ady_char.txt | 1 + easyocr/character/tjk_char.txt | 158 ++-- easyocr/config.py | 19 + easyocr/detection.py | 2 +- easyocr/detection_db.py | 209 +++++ easyocr/easyocr.py | 173 ++-- easyocr/model/modules.py | 24 +- easyocr/model/vgg_model.py | 14 +- easyocr/recognition.py | 49 +- easyocr/scripts/compile_dbnet_dcn.py | 37 + requirements.txt | 3 + setup.py | 31 +- 44 files changed, 6185 insertions(+), 174 deletions(-) create mode 100644 easyocr/DBNet/DBNet.py create mode 100644 easyocr/DBNet/README.md create mode 100644 easyocr/DBNet/assets/ops/dcn/__init__.py create mode 100644 easyocr/DBNet/assets/ops/dcn/functions/__init__.py create mode 100644 easyocr/DBNet/assets/ops/dcn/functions/deform_conv.py create mode 100644 easyocr/DBNet/assets/ops/dcn/functions/deform_pool.py create mode 100644 easyocr/DBNet/assets/ops/dcn/modules/__init__.py create mode 100644 easyocr/DBNet/assets/ops/dcn/modules/deform_conv.py create mode 100644 easyocr/DBNet/assets/ops/dcn/modules/deform_pool.py create mode 100644 easyocr/DBNet/assets/ops/dcn/setup.py create mode 100644 easyocr/DBNet/assets/ops/dcn/src/deform_conv_cuda.cpp create mode 100644 easyocr/DBNet/assets/ops/dcn/src/deform_conv_cuda_kernel.cu create mode 100644 easyocr/DBNet/assets/ops/dcn/src/deform_pool_cuda.cpp create mode 100644 easyocr/DBNet/assets/ops/dcn/src/deform_pool_cuda_kernel.cu create mode 100644 easyocr/DBNet/backbones/__init__.py create mode 100644 easyocr/DBNet/backbones/mobilenetv3.py create mode 100644 easyocr/DBNet/backbones/resnet.py create mode 100644 easyocr/DBNet/configs/DBNet_inference.yaml create mode 100644 easyocr/DBNet/decoders/__init__.py create mode 100644 easyocr/DBNet/decoders/balance_cross_entropy_loss.py create mode 100644 easyocr/DBNet/decoders/dice_loss.py create mode 100644 easyocr/DBNet/decoders/feature_attention.py create mode 100644 easyocr/DBNet/decoders/l1_loss.py create mode 100644 easyocr/DBNet/decoders/pss_loss.py create mode 100644 easyocr/DBNet/decoders/seg_detector.py create mode 100644 easyocr/DBNet/decoders/seg_detector_asf.py create mode 100644 easyocr/DBNet/decoders/seg_detector_loss.py create mode 100644 easyocr/DBNet/decoders/simple_detection.py create mode 100644 easyocr/DBNet/model/constructor.py create mode 100644 easyocr/DBNet/model/detector.py create mode 100644 easyocr/DBNet/model/model.py create mode 100644 easyocr/detection_db.py create mode 100644 easyocr/scripts/compile_dbnet_dcn.py diff --git a/MANIFEST.in b/MANIFEST.in index d899e8522d..6d6f4de9ba 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,3 +4,5 @@ include README.md include easyocr/model/* include easyocr/character/* include easyocr/dict/* +include easyocr/scripts/compile_dbnet_dcn.py +recursive-include easyocr/DBNet * diff --git a/easyocr/DBNet/DBNet.py b/easyocr/DBNet/DBNet.py new file mode 100644 index 0000000000..eeac4f1d84 --- /dev/null +++ b/easyocr/DBNet/DBNet.py @@ -0,0 +1,758 @@ +''' +Created by Jaided AI +Released Date: 18/08/2022 +Description: +DBNet text detection module. +Many parts of the codes are adapted from https://github.com/MhLiao/DB +''' +import os +import math +import yaml +from shapely.geometry import Polygon +import PIL.Image +import numpy as np +import cv2 +import pyclipper +import torch + +from .model.constructor import Configurable +# %% +class DBNet: + def __init__(self, + backbone = "resnet18", + weight_dir = "./DBNet/weights/", + weight_name = 'pretrained', + initialize_model = True, + dynamic_import_relative_path = None, + device = 'cuda', + verbose = 0): + ''' + DBNet text detector class + + Parameters + ---------- + backbone : str, optional + Backbone to use. Options are "resnet18" and "resnet50". The default is "resnet18". + weight_dir : str, optional + Path to directory that contains weight files. The default is "./DBNet/weights/". + weight_name : str, optional + Name of the weight to use as specified in DBNet_inference.yaml or a filename + in weight_dir. The default is 'pretrained'. + initialize_model : Boolean, optional + If True, construct the model and load weight at class initialization. + Otherwise, only initial the class without constructing the model. + The default is True. + dynamic_import_relative_path : str, optional + Relative path to 'model/detector.py'. This option is for supporting + integrating this module into other modules. For example, easyocr/DBNet + This should be left as None when calling this module as a standalone. + The default is None. + device : str, optional + Device to use. Options are "cuda" and "cpu". The default is 'cuda'. + verbose : int, optional + Verbosity level. The default is 0. + + Raises + ------ + ValueError + Raised when backbone is invalid. + FileNotFoundError + Raised when weight file is not found. + + Returns + ------- + None. + ''' + self.device = device + + config_path = os.path.join(os.path.dirname(__file__), "configs", "DBNet_inference.yaml") + with open(config_path, 'r') as fid: + self.configs = yaml.safe_load(fid) + + if dynamic_import_relative_path is not None: + self.configs = self.set_relative_import_path(self.configs, dynamic_import_relative_path) + + if backbone in self.configs.keys(): + self.backbone = backbone + else: + raise ValueError("Invalid backbone. Current support backbone are {}.".format(",".join(self.configs.keys()))) + + if initialize_model: + if weight_name in self.configs[backbone]['weight'].keys(): + weight_path = os.path.join(os.path.dirname(__file__), 'weights', self.configs[backbone]['weight'][weight_name]) + error_message = "A weight with a name {} is found in DBNet_inference.yaml but cannot be find file: {}." + else: + weight_path = os.path.join(os.path.dirname(__file__), 'weights', weight_name) + error_message = "A weight with a name {} is not found in DBNet_inference.yaml and cannot be find file: {}." + + if not os.path.isfile(weight_path): + raise FileNotFoundError(error_message.format(weight_name, weight_path)) + + self.initialize_model(self.configs[backbone]['model'], weight_path) + + else: + self.model = None + + self.BGR_MEAN = np.array(self.configs['BGR_MEAN']) + self.min_detection_size = self.configs['min_detection_size'] + self.max_detection_size = self.configs['max_detection_size'] + + def set_relative_import_path(self, configs, dynamic_import_relative_path): + ''' + Create relative import paths for modules specified in class. This method + is recursive. + + Parameters + ---------- + configs : dict + Configuration dictionary from .yaml file. + dynamic_import_relative_path : str, optional + Relative path to 'model/detector/'. This option is for supporting + integrating this module into other modules. For example, easyocr/DBNet + This should be left as None when calling this module as a standalone. + The default is None. + + Returns + ------- + configs : dict + Configuration dictionary with correct relative path. + ''' + assert dynamic_import_relative_path is not None + prefices = dynamic_import_relative_path.split(os.sep) + for key,value in configs.items(): + if key == 'class': + configs.update({key: ".".join(prefices + value.split("."))}) + else: + if isinstance(value, dict): + value = self.set_relative_import_path(value, dynamic_import_relative_path) + else: + pass + return configs + + def load_weight(self, weight_path): + ''' + Load weight to model. + + Parameters + ---------- + weight_path : str + Path to trained weight. + + Raises + ------ + RuntimeError + Raised when the model has not yet been contructed. + + Returns + ------- + None. + ''' + if self.model is None: + raise RuntimeError("model has not yet been constructed.") + self.model.load_state_dict(torch.load(weight_path, map_location=self.device), strict=False) + self.model.eval() + + def construct_model(self, config): + ''' + Contruct text detection model based on the configuration in .yaml file. + + Parameters + ---------- + config : dict + Configuration dictionary. + + Returns + ------- + None. + ''' + self.model = Configurable.construct_class_from_config(config).structure.builder.build(self.device) + + def initialize_model(self, model_config, weight_path): + ''' + Wrapper to initialize text detection model. This model includes contructing + and weight loading. + + Parameters + ---------- + model_config : dict + Configuration dictionary. + weight_path : str + Path to trained weight. + + Returns + ------- + None. + ''' + self.construct_model(model_config) + self.load_weight(weight_path) + + def get_cv2_image(self, image): + ''' + Load or convert input to OpenCV BGR image numpy array. + + Parameters + ---------- + image : str, PIL.Image, or np.ndarray + Image to load or convert. + + Raises + ------ + FileNotFoundError + Raised when the input is a path to file (str), but the file is not found. + TypeError + Raised when the data type of the input is not supported. + + Returns + ------- + image : np.ndarray + OpenCV BGR image. + ''' + if isinstance(image, str): + if os.path.isfile(image): + image = cv2.imread(image, cv2.IMREAD_COLOR).astype('float32') + else: + raise FileNotFoundError("Cannot find {}".format(image)) + elif isinstance(image, np.ndarray): + image = image.astype('float32') + elif isinstance(image, PIL.Image.Image): + image = np.asarray(image)[:, :, ::-1] + else: + raise TypeError("Unsupport image format. Only path-to-file, opencv BGR image, and PIL image are supported.") + + return image + + def resize_image(self, img, detection_size = None): + ''' + Resize image such that the shorter side of the image is equal to the + closest multiple of 32 to the provided detection_size. If detection_size + is not provided, it will be resized to the closest multiple of 32 each + side. If the original size exceeds the min-/max-detection sizes + (specified in configs.yaml), it will be resized to be within the + min-/max-sizes. + + Parameters + ---------- + img : np.ndarray + OpenCV BGR image. + detection_size : int, optional + Target detection size. The default is None. + + Returns + ------- + np.ndarray + Resized OpenCV BGR image. The width and height of this image should + be multiple of 32. + ''' + height, width, _ = img.shape + if detection_size is None: + detection_size = max(self.min_detection_size, min(height, width, self.max_detection_size)) + + if height < width: + new_height = int(math.ceil(detection_size / 32) * 32) + new_width = int(math.ceil(new_height / height * width / 32) * 32) + else: + new_width = int(math.ceil(detection_size / 32) * 32) + new_height = int(math.ceil(new_width / width * height / 32) * 32) + resized_img = cv2.resize(img, (new_width, new_height)) + + return resized_img, (height, width) + + def image_array2tensor(self, image): + ''' + Convert image array (assuming OpenCV BGR format) to image tensor. + + Parameters + ---------- + image : np.ndarray + OpenCV BGR image. + + Returns + ------- + torch.tensor + Tensor image with 4 dimension [batch, channel, width, height]. + ''' + return torch.from_numpy(image).permute(2, 0, 1).float().unsqueeze(0) + + def normalize_image(self, image): + ''' + Normalize image by substracting BGR mean and divided by 255 + + Parameters + ---------- + image : np.ndarray + OpenCV BGR image. + + Returns + ------- + np.ndarray + OpenCV BGR image. + ''' + return (image - self.BGR_MEAN)/255.0 + + def load_image(self, image_path, detection_size = 0): + ''' + Wrapper to load and convert an image to an image tensor + + Parameters + ---------- + image : path-to-file, PIL.Image, or np.ndarray + Image to load or convert. + detection_size : int, optional + Target detection size. The default is None. + + Returns + ------- + img : torch.tensor + Tensor image with 4 dimension [batch, channel, width, height].. + original_shape : tuple + A tuple (height, width) of the original input image before resizing. + ''' + img =self.get_cv2_image(image_path) + img, original_shape = self.resize_image(img, detection_size = detection_size) + img = self.normalize_image(img) + img = self.image_array2tensor(img) + + return img, original_shape + + def load_images(self, images, detection_size = None): + ''' + Wrapper to load or convert list of multiple images to a single image + tensor. Multiple images are concatenated together on the first dimension. + + Parameters + ---------- + images : a list of path-to-file, PIL.Image, or np.ndarray + Image to load or convert. + detection_size : int, optional + Target detection size. The default is None. + + Returns + ------- + img : torch.tensor + A single tensor image with 4 dimension [batch, channel, width, height]. + original_shape : tuple + A list of tuples (height, width) of the original input image before resizing. + ''' + images, original_shapes = zip(*[self.load_image(image, detection_size = detection_size) + for image in images]) + return torch.cat(images, dim = 0), original_shapes + + def hmap2bbox(self, + image_tensor, + original_shapes, + hmap, + text_threshold = 0.2, + bbox_min_score = 0.2, + bbox_min_size = 3, + max_candidates = 0, + as_polygon=False): + ''' + Translate probability heatmap tensor to text region boudning boxes. + + Parameters + ---------- + image_tensor : torch.tensor + Image tensor. + original_shapes : tuple + Original size of the image (height, width) of the input image (before + rounded to the closest multiple of 32). + hmap : torch.tensor + Probability heatmap tensor. + text_threshold : float, optional + Minimum probability for each pixel of heatmap tensor to be considered + as a valid text pixel. The default is 0.2. + bbox_min_score : float, optional + Minimum score for each detected bounding box to be considered as a + valid text bounding box. The default is 0.2. + bbox_min_size : int, optional + Minimum size for each detected bounding box to be considered as a + valid text bounding box. The default is 3. + max_candidates : int, optional + Maximum number of detected bounding boxes to be considered as + candidates for valid text bounding box. Setting it to 0 implies + no maximum. The default is 0. + as_polygon : boolean, optional + If True, return the bounding box as polygon (fine vertrices), + otherwise return as rectangular. The default is False. + + Returns + ------- + boxes_batch : list of lists + Bounding boxes of each text box. + scores_batch : list of floats + Confidence scores of each text box. + + ''' + segmentation = self.binarize(hmap, threshold = text_threshold) + boxes_batch = [] + scores_batch = [] + for batch_index in range(image_tensor.size(0)): + height, width = original_shapes[batch_index] + if as_polygon: + boxes, scores = self.polygons_from_bitmap( + hmap[batch_index], + segmentation[batch_index], + width, + height, + bbox_min_score = bbox_min_score, + bbox_min_size = bbox_min_size, + max_candidates = max_candidates) + else: + boxes, scores = self.boxes_from_bitmap( + hmap[batch_index], + segmentation[batch_index], + width, + height, + bbox_min_score = bbox_min_score, + bbox_min_size = bbox_min_size, + max_candidates = max_candidates) + + boxes_batch.append(boxes) + scores_batch.append(scores) + + boxes_batch, scores_batch = zip(*[zip(*[(box, score) + for (box,score) in zip(boxes, scores) if score > 0]) + for (boxes, scores) in zip(boxes_batch, scores_batch)] + ) + + return boxes_batch, scores_batch + + def binarize(self, tensor, threshold): + ''' + Apply threshold to return boolean tensor. + + Parameters + ---------- + tensor : torch.tensor + input tensor. + threshold : float + Threshold. + + Returns + ------- + torch.tensor + Boolean tensor. + + ''' + return tensor > threshold + + def polygons_from_bitmap(self, + hmap, + segmentation, + dest_width, + dest_height, + bbox_min_score = 0.2, + bbox_min_size = 3, + max_candidates = 0): + ''' + Translate boolean tensor to fine polygon indicating text bounding boxes + + Parameters + ---------- + hmap : torch.tensor + Probability heatmap tensor. + segmentation : torch.tensor + Segmentataion tensor. + dest_width : TYPE + target width of the output. + dest_height : TYPE + target width of the output. + bbox_min_score : float, optional + Minimum score for each detected bounding box to be considered as a + valid text bounding box. The default is 0.2. + bbox_min_size : int, optional + Minimum size for each detected bounding box to be considered as a + valid text bounding box. The default is 3. + max_candidates : int, optional + Maximum number of detected bounding boxes to be considered as + candidates for valid text bounding box. Setting it to 0 implies + no maximum. The default is 0. + + Returns + ------- + boxes_batch : list of lists + Polygon bounding boxes of each text box. + scores_batch : list of floats + Confidence scores of each text box. + + ''' + assert segmentation.size(0) == 1 + bitmap = segmentation.cpu().numpy()[0] # The first channel + hmap = hmap.cpu().detach().numpy()[0] + height, width = bitmap.shape + boxes = [] + scores = [] + + contours, _ = cv2.findContours( + (bitmap*255).astype(np.uint8), + cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) + + if max_candidates > 0: + contours = contours[:max_candidates] + + for contour in contours: + epsilon = 0.002 * cv2.arcLength(contour, True) + approx = cv2.approxPolyDP(contour, epsilon, True) + points = approx.reshape((-1, 2)) + if points.shape[0] < 4: + continue + + score = self.box_score_fast(hmap, points.reshape(-1, 2)) + if score < bbox_min_score: + continue + + if points.shape[0] > 2: + box = self.unclip(points, unclip_ratio=2.0) + if len(box) > 1: + continue + + else: + continue + + box = box.reshape(-1, 2) + _, sside = self.get_mini_boxes(box.reshape((-1, 1, 2))) + if sside < bbox_min_size + 2: + continue + + if not isinstance(dest_width, int): + dest_width = dest_width.item() + dest_height = dest_height.item() + + box[:, 0] = np.clip( + np.round(box[:, 0] / width * dest_width), 0, dest_width) + box[:, 1] = np.clip( + np.round(box[:, 1] / height * dest_height), 0, dest_height) + boxes.append(box.tolist()) + scores.append(score) + + return boxes, scores + + def boxes_from_bitmap(self, + hmap, + segmentation, + dest_width, + dest_height, + bbox_min_score = 0.2, + bbox_min_size = 3, + max_candidates = 0): + ''' + Translate boolean tensor to fine polygon indicating text bounding boxes + + Parameters + ---------- + hmap : torch.tensor + Probability heatmap tensor. + segmentation : torch.tensor + Segmentataion tensor. + dest_width : TYPE + target width of the output. + dest_height : TYPE + target width of the output. + bbox_min_score : float, optional + Minimum score for each detected bounding box to be considered as a + valid text bounding box. The default is 0.2. + bbox_min_size : int, optional + Minimum size for each detected bounding box to be considered as a + valid text bounding box. The default is 3. + max_candidates : int, optional + Maximum number of detected bounding boxes to be considered as + candidates for valid text bounding box. Setting it to 0 implies + no maximum. The default is 0. + + Returns + ------- + boxes_batch : list of lists + Polygon bounding boxes of each text box. + scores_batch : list of floats + Confidence scores of each text box. + ''' + assert segmentation.size(0) == 1 + bitmap = segmentation.cpu().numpy()[0] # The first channel + hmap = hmap.cpu().detach().numpy()[0] + height, width = bitmap.shape + contours, _ = cv2.findContours( + (bitmap*255).astype(np.uint8), + cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) + if max_candidates > 0: + num_contours = min(len(contours), max_candidates) + else: + num_contours = len(contours) + + boxes = np.zeros((num_contours, 4, 2), dtype=np.int16) + scores = np.zeros((num_contours,), dtype=np.float32) + + for index in range(num_contours): + contour = contours[index] + points, sside = self.get_mini_boxes(contour) + if sside < bbox_min_size: + continue + + points = np.array(points) + score = self.box_score_fast(hmap, points.reshape(-1, 2)) + if score < bbox_min_score: + continue + + box = self.unclip(points).reshape(-1, 1, 2) + box, sside = self.get_mini_boxes(box) + if sside < bbox_min_size + 2: + continue + + box = np.array(box) + if not isinstance(dest_width, int): + dest_width = dest_width.item() + dest_height = dest_height.item() + + box[:, 0] = np.clip( + np.round(box[:, 0] / width * dest_width), 0, dest_width) + box[:, 1] = np.clip( + np.round(box[:, 1] / height * dest_height), 0, dest_height) + boxes[index, :, :] = box.astype(np.int16) + scores[index] = score + + return boxes.tolist(), scores + + def unclip(self, box, unclip_ratio=1.5): + poly = Polygon(box) + distance = poly.area * unclip_ratio / poly.length + offset = pyclipper.PyclipperOffset() + offset.AddPath(box, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON) + expanded = np.array(offset.Execute(distance)) + + return expanded + + def get_mini_boxes(self, contour): + bounding_box = cv2.minAreaRect(contour) + points = sorted(list(cv2.boxPoints(bounding_box)), key=lambda x: x[0]) + + index_1, index_2, index_3, index_4 = 0, 1, 2, 3 + if points[1][1] > points[0][1]: + index_1 = 0 + index_4 = 1 + else: + index_1 = 1 + index_4 = 0 + if points[3][1] > points[2][1]: + index_2 = 2 + index_3 = 3 + else: + index_2 = 3 + index_3 = 2 + + box = [points[index_1], points[index_2], + points[index_3], points[index_4]] + + return box, min(bounding_box[1]) + + def box_score_fast(self, hmap, box_): + ''' + Calculate total score of each bounding box + + Parameters + ---------- + hmap : torch.tensor + Probability heatmap tensor. + box_ : list + Rectanguar bounding box. + + Returns + ------- + float + Confidence score. + ''' + h, w = hmap.shape[:2] + box = box_.copy() + xmin = np.clip(np.floor(box[:, 0].min()).astype(np.int), 0, w - 1) + xmax = np.clip(np.ceil(box[:, 0].max()).astype(np.int), 0, w - 1) + ymin = np.clip(np.floor(box[:, 1].min()).astype(np.int), 0, h - 1) + ymax = np.clip(np.ceil(box[:, 1].max()).astype(np.int), 0, h - 1) + + mask = np.zeros((ymax - ymin + 1, xmax - xmin + 1), dtype=np.uint8) + box[:, 0] = box[:, 0] - xmin + box[:, 1] = box[:, 1] - ymin + cv2.fillPoly(mask, box.reshape(1, -1, 2).astype(np.int32), 1) + + return cv2.mean(hmap[ymin:ymax+1, xmin:xmax+1], mask)[0] + + def image2hmap(self, image_tensor): + ''' + Run the model to obtain a heatmap tensor from a image tensor. The heatmap + tensor indicates the probability of each pixel being a part of text area. + + Parameters + ---------- + image_tensor : torch.tensor + Image tensor. + + Returns + ------- + torch.tensor + Probability heatmap tensor. + ''' + return self.model.forward(image_tensor, training=False) + + def inference(self, + image, + text_threshold = 0.2, + bbox_min_score = 0.2, + bbox_min_size = 3, + max_candidates = 0, + detection_size = None, + as_polygon = False, + return_scores = False): + ''' + Wrapper to run the model on an input image to get text bounding boxes. + + Parameters + ---------- + image : path-to-file, PIL.Image, or np.ndarray + Image to load or convert. + text_threshold : float, optional + Minimum probability for each pixel of heatmap tensor to be considered + as a valid text pixel. The default is 0.2. + bbox_min_score : float, optional + Minimum score for each detected bounding box to be considered as a + valid text bounding box. The default is 0.2. + bbox_min_size : int, optional + Minimum size for each detected bounding box to be considered as a + valid text bounding box. The default is 3. + max_candidates : int, optional + Maximum number of detected bounding boxes to be considered as + candidates for valid text bounding box. Setting it to 0 implies + no maximum. The default is 0. + detection_size : int, optional + Target detection size. Please see docstring under method resize_image() + for explanation. The default is None. + as_polygon : boolean, optional + If true, return the bounding boxes as find polygons, otherwise, return + as rectagular. The default is False. + return_scores : boolean, optional + If true, return confidence score along with the text bounding boxes. + The default is False. + + Returns + ------- + list of lists + Text bounding boxes. If return_scores is set to true, another list + of lists will also be returned. + + ''' + if not isinstance(image, list): + image = [image] + + image_tensor, original_shapes = self.load_images(image, detection_size = detection_size) + with torch.no_grad(): + hmap = self.image2hmap(image_tensor) + batch_boxes, batch_scores = self.hmap2bbox(image_tensor, + original_shapes, + hmap, + text_threshold = text_threshold, + bbox_min_score = bbox_min_score, + bbox_min_size = bbox_min_size, + max_candidates = max_candidates, + as_polygon=as_polygon) + + if return_scores: + return batch_boxes, batch_scores + else: + return batch_boxes + diff --git a/easyocr/DBNet/README.md b/easyocr/DBNet/README.md new file mode 100644 index 0000000000..a95f73e246 --- /dev/null +++ b/easyocr/DBNet/README.md @@ -0,0 +1,70 @@ +# DBNet - Inference Only +This text detection module is adapted from [DBNet++](https://github.com/MhLiao/DB). + +## Overview +DBNet works as an image segmentation which performs classification at pixel-level. The model classifies if each pixel from the input image is a part of a text region. This module uses dynamic import and class construction from a config file. Config files are expected to be found in `./configs/`. At the input, the input image are expected to have width and height as multiple of 32. Input images that does not have these dimension will be resized accordingly. In addition, minimum and maximum sizes can be specified in the config file. + +### Terminology + * Probability Heatmap: A tensor represent classification confidence of each pixel for being a part of text region. + * Segmentation: A boolean-like tensor represent region that is determined as being a part of a text region. + * text_threshold: A threshold for each element of the probability heatmap to be consider as text region. + * detection_size: This term is used to refer to the size of the image on which the detection routine will be performed. Input images that are not of this size will be resized accordingly. + +### Compiling DCN operator +DBNet requires DCN operator to be compiled. The instruction from the original repo can be found [here](https://github.com/MhLiao/DB#requirements). If EasyOCR is install via `pypi`, this process should be done automatically. If the operator is compiled successfully, a flag `dcn_compiling_success` will be added to `./DBNet/`. If the compilation failed during installation, the flag will be missing. Although, EasyOCR **can work** without DBNet and DCN operator by using CRAFT text detection (default). + +### Changes from the original repo + 1. Scripts inside `./concerns/` and multiple `.yaml` files are consolidated and pruned for inference-only implementation and dependencies reduction. + 2. A flag file `dcn_compiling_success` is added to indicate when DCN operator is compiled successfully. In addition, a log file `log.txt` is created to collect warning and error messages from compilation process. + 3. Pretrained weights are renamed for easy referring and adding file extension. + | Original name | New name | + |-----------------------------------------------------|---------------------------| + |synthtext_finetune_ic15_res18_dcn_fpn_dbv2 |pretrained_ic15_resnet18.pt| + |synthtext_finetune_ic15_res50_dcn_fpn_dbv2_thresh0.25|pretrained_ic15_resnet50.pt| + +### Troubleshoot +If DCN operators are failed to compile. You can try compile it manually. The following procedure may serve as a guideline. + +#### Locate EasyOCR and DBNet module inside it +In python console environment (Linux/Mac terminal, Jupyter notebook, Spyder IDE, etc.); +``` +> import os +> import easyocr +> print(os.dirname(easyocr.__file__)) +``` +This should show the location of easyocr on the machine. + +The exact output of the above command depends on many factors and will be likely unique for each user, especially the `username`. For the sake of troubleshooting, let's assuming the command above returns something like; +``` +/home/username/anaconda3/lib/python3.8/site-packages/easyocr +``` + +#### Check for error messages from previous compilation + +We want to go into the directory where `DBNet` and the compile script are located within EasyOCR which can be done by appending `DBNet` to the path obtained above. For example; +``` +> cd /home/username/anaconda3/lib/python3.8/site-packages/easyocr/DBNet +``` +If the compilation had been attempted, there would be a log file `log.txt` in this directory. You can open the log file to check for any error and resolve it. If the compilation hadn't been attempted before, the file would be missing (this is expected). + +#### Compiling DCN operator manually + +Once the error, if any, from the previous compilation attempt has been resolved, you can try compile the operator again manual. To do so, first go to EasyOCR directory (e.g. `/home/username/anaconda3/lib/python3.8/site-packages/easyocr`) by; +``` +> cd /home/username/anaconda3/lib/python3.8/site-packages/easyocr +``` +Then, change the directory to subdirectory `scritps/`, by; +``` +> cd scripts +``` +To verify if you have the compiling script, you can look for a file `compile_dbnet_dcn.py` under subdirectory `scripts` by; +``` +> ls +``` +This will list all files and subdirectories in the current directory. + +Then, to start the compilation, run; +``` +> python compile_dbnet_dcn.py +``` +This will start the compilation process. If the compilation is completed successfully, a flag (blank file) `dcn_compiling_success` will be added to `/home/username/anaconda3/lib/python3.8/site-packages/easyocr/DBNet`. If the compilation failed, a new `log.txt` will be written and you can check for any other error messages, resolve them, and try again. diff --git a/easyocr/DBNet/assets/ops/dcn/__init__.py b/easyocr/DBNet/assets/ops/dcn/__init__.py new file mode 100644 index 0000000000..165e637253 --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/__init__.py @@ -0,0 +1,13 @@ +from .functions.deform_conv import deform_conv, modulated_deform_conv +from .functions.deform_pool import deform_roi_pooling +from .modules.deform_conv import (DeformConv, ModulatedDeformConv, + DeformConvPack, ModulatedDeformConvPack) +from .modules.deform_pool import (DeformRoIPooling, DeformRoIPoolingPack, + ModulatedDeformRoIPoolingPack) + +__all__ = [ + 'DeformConv', 'DeformConvPack', 'ModulatedDeformConv', + 'ModulatedDeformConvPack', 'DeformRoIPooling', 'DeformRoIPoolingPack', + 'ModulatedDeformRoIPoolingPack', 'deform_conv', 'modulated_deform_conv', + 'deform_roi_pooling' +] diff --git a/easyocr/DBNet/assets/ops/dcn/functions/__init__.py b/easyocr/DBNet/assets/ops/dcn/functions/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/easyocr/DBNet/assets/ops/dcn/functions/deform_conv.py b/easyocr/DBNet/assets/ops/dcn/functions/deform_conv.py new file mode 100644 index 0000000000..6af75a758b --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/functions/deform_conv.py @@ -0,0 +1,181 @@ +import torch +from torch.autograd import Function +from torch.nn.modules.utils import _pair + +from .. import deform_conv_cuda + + +class DeformConvFunction(Function): + + @staticmethod + def forward(ctx, + input, + offset, + weight, + stride=1, + padding=0, + dilation=1, + groups=1, + deformable_groups=1, + im2col_step=64): + if input is not None and input.dim() != 4: + raise ValueError( + "Expected 4D tensor as input, got {}D tensor instead.".format( + input.dim())) + ctx.stride = _pair(stride) + ctx.padding = _pair(padding) + ctx.dilation = _pair(dilation) + ctx.groups = groups + ctx.deformable_groups = deformable_groups + ctx.im2col_step = im2col_step + + ctx.save_for_backward(input, offset, weight) + + output = input.new_empty( + DeformConvFunction._output_size(input, weight, ctx.padding, + ctx.dilation, ctx.stride)) + + ctx.bufs_ = [input.new_empty(0), input.new_empty(0)] # columns, ones + + if not input.is_cuda: + raise NotImplementedError + else: + cur_im2col_step = min(ctx.im2col_step, input.shape[0]) + assert (input.shape[0] % + cur_im2col_step) == 0, 'im2col step must divide batchsize' + deform_conv_cuda.deform_conv_forward_cuda( + input, weight, offset, output, ctx.bufs_[0], ctx.bufs_[1], + weight.size(3), weight.size(2), ctx.stride[1], ctx.stride[0], + ctx.padding[1], ctx.padding[0], ctx.dilation[1], + ctx.dilation[0], ctx.groups, ctx.deformable_groups, + cur_im2col_step) + return output + + @staticmethod + def backward(ctx, grad_output): + input, offset, weight = ctx.saved_tensors + + grad_input = grad_offset = grad_weight = None + + if not grad_output.is_cuda: + raise NotImplementedError + else: + cur_im2col_step = min(ctx.im2col_step, input.shape[0]) + assert (input.shape[0] % + cur_im2col_step) == 0, 'im2col step must divide batchsize' + + if ctx.needs_input_grad[0] or ctx.needs_input_grad[1]: + grad_input = torch.zeros_like(input) + grad_offset = torch.zeros_like(offset) + deform_conv_cuda.deform_conv_backward_input_cuda( + input, offset, grad_output, grad_input, + grad_offset, weight, ctx.bufs_[0], weight.size(3), + weight.size(2), ctx.stride[1], ctx.stride[0], + ctx.padding[1], ctx.padding[0], ctx.dilation[1], + ctx.dilation[0], ctx.groups, ctx.deformable_groups, + cur_im2col_step) + + if ctx.needs_input_grad[2]: + grad_weight = torch.zeros_like(weight) + deform_conv_cuda.deform_conv_backward_parameters_cuda( + input, offset, grad_output, + grad_weight, ctx.bufs_[0], ctx.bufs_[1], weight.size(3), + weight.size(2), ctx.stride[1], ctx.stride[0], + ctx.padding[1], ctx.padding[0], ctx.dilation[1], + ctx.dilation[0], ctx.groups, ctx.deformable_groups, 1, + cur_im2col_step) + + return (grad_input, grad_offset, grad_weight, None, None, None, None, + None) + + @staticmethod + def _output_size(input, weight, padding, dilation, stride): + channels = weight.size(0) + output_size = (input.size(0), channels) + for d in range(input.dim() - 2): + in_size = input.size(d + 2) + pad = padding[d] + kernel = dilation[d] * (weight.size(d + 2) - 1) + 1 + stride_ = stride[d] + output_size += ((in_size + (2 * pad) - kernel) // stride_ + 1, ) + if not all(map(lambda s: s > 0, output_size)): + raise ValueError( + "convolution input is too small (output would be {})".format( + 'x'.join(map(str, output_size)))) + return output_size + + +class ModulatedDeformConvFunction(Function): + + @staticmethod + def forward(ctx, + input, + offset, + mask, + weight, + bias=None, + stride=1, + padding=0, + dilation=1, + groups=1, + deformable_groups=1): + ctx.stride = stride + ctx.padding = padding + ctx.dilation = dilation + ctx.groups = groups + ctx.deformable_groups = deformable_groups + ctx.with_bias = bias is not None + if not ctx.with_bias: + bias = input.new_empty(1) # fake tensor + if not input.is_cuda: + raise NotImplementedError + if weight.requires_grad or mask.requires_grad or offset.requires_grad \ + or input.requires_grad: + ctx.save_for_backward(input, offset, mask, weight, bias) + output = input.new_empty( + ModulatedDeformConvFunction._infer_shape(ctx, input, weight)) + ctx._bufs = [input.new_empty(0), input.new_empty(0)] + deform_conv_cuda.modulated_deform_conv_cuda_forward( + input, weight, bias, ctx._bufs[0], offset, mask, output, + ctx._bufs[1], weight.shape[2], weight.shape[3], ctx.stride, + ctx.stride, ctx.padding, ctx.padding, ctx.dilation, ctx.dilation, + ctx.groups, ctx.deformable_groups, ctx.with_bias) + return output + + @staticmethod + def backward(ctx, grad_output): + if not grad_output.is_cuda: + raise NotImplementedError + input, offset, mask, weight, bias = ctx.saved_tensors + grad_input = torch.zeros_like(input) + grad_offset = torch.zeros_like(offset) + grad_mask = torch.zeros_like(mask) + grad_weight = torch.zeros_like(weight) + grad_bias = torch.zeros_like(bias) + deform_conv_cuda.modulated_deform_conv_cuda_backward( + input, weight, bias, ctx._bufs[0], offset, mask, ctx._bufs[1], + grad_input, grad_weight, grad_bias, grad_offset, grad_mask, + grad_output, weight.shape[2], weight.shape[3], ctx.stride, + ctx.stride, ctx.padding, ctx.padding, ctx.dilation, ctx.dilation, + ctx.groups, ctx.deformable_groups, ctx.with_bias) + if not ctx.with_bias: + grad_bias = None + + return (grad_input, grad_offset, grad_mask, grad_weight, grad_bias, + None, None, None, None, None) + + @staticmethod + def _infer_shape(ctx, input, weight): + n = input.size(0) + channels_out = weight.size(0) + height, width = input.shape[2:4] + kernel_h, kernel_w = weight.shape[2:4] + height_out = (height + 2 * ctx.padding - + (ctx.dilation * (kernel_h - 1) + 1)) // ctx.stride + 1 + width_out = (width + 2 * ctx.padding - + (ctx.dilation * (kernel_w - 1) + 1)) // ctx.stride + 1 + return n, channels_out, height_out, width_out + + +deform_conv = DeformConvFunction.apply +modulated_deform_conv = ModulatedDeformConvFunction.apply diff --git a/easyocr/DBNet/assets/ops/dcn/functions/deform_pool.py b/easyocr/DBNet/assets/ops/dcn/functions/deform_pool.py new file mode 100644 index 0000000000..65ff0efb57 --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/functions/deform_pool.py @@ -0,0 +1,69 @@ +import torch +from torch.autograd import Function + +from .. import deform_pool_cuda + + +class DeformRoIPoolingFunction(Function): + + @staticmethod + def forward(ctx, + data, + rois, + offset, + spatial_scale, + out_size, + out_channels, + no_trans, + group_size=1, + part_size=None, + sample_per_part=4, + trans_std=.0): + ctx.spatial_scale = spatial_scale + ctx.out_size = out_size + ctx.out_channels = out_channels + ctx.no_trans = no_trans + ctx.group_size = group_size + ctx.part_size = out_size if part_size is None else part_size + ctx.sample_per_part = sample_per_part + ctx.trans_std = trans_std + + assert 0.0 <= ctx.trans_std <= 1.0 + if not data.is_cuda: + raise NotImplementedError + + n = rois.shape[0] + output = data.new_empty(n, out_channels, out_size, out_size) + output_count = data.new_empty(n, out_channels, out_size, out_size) + deform_pool_cuda.deform_psroi_pooling_cuda_forward( + data, rois, offset, output, output_count, ctx.no_trans, + ctx.spatial_scale, ctx.out_channels, ctx.group_size, ctx.out_size, + ctx.part_size, ctx.sample_per_part, ctx.trans_std) + + if data.requires_grad or rois.requires_grad or offset.requires_grad: + ctx.save_for_backward(data, rois, offset) + ctx.output_count = output_count + + return output + + @staticmethod + def backward(ctx, grad_output): + if not grad_output.is_cuda: + raise NotImplementedError + + data, rois, offset = ctx.saved_tensors + output_count = ctx.output_count + grad_input = torch.zeros_like(data) + grad_rois = None + grad_offset = torch.zeros_like(offset) + + deform_pool_cuda.deform_psroi_pooling_cuda_backward( + grad_output, data, rois, offset, output_count, grad_input, + grad_offset, ctx.no_trans, ctx.spatial_scale, ctx.out_channels, + ctx.group_size, ctx.out_size, ctx.part_size, ctx.sample_per_part, + ctx.trans_std) + return (grad_input, grad_rois, grad_offset, None, None, None, None, + None, None, None, None) + + +deform_roi_pooling = DeformRoIPoolingFunction.apply diff --git a/easyocr/DBNet/assets/ops/dcn/modules/__init__.py b/easyocr/DBNet/assets/ops/dcn/modules/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/easyocr/DBNet/assets/ops/dcn/modules/deform_conv.py b/easyocr/DBNet/assets/ops/dcn/modules/deform_conv.py new file mode 100644 index 0000000000..50d15d1513 --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/modules/deform_conv.py @@ -0,0 +1,157 @@ +import math + +import torch +import torch.nn as nn +from torch.nn.modules.utils import _pair + +from ..functions.deform_conv import deform_conv, modulated_deform_conv + + +class DeformConv(nn.Module): + + def __init__(self, + in_channels, + out_channels, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + deformable_groups=1, + bias=False): + super(DeformConv, self).__init__() + + assert not bias + assert in_channels % groups == 0, \ + 'in_channels {} cannot be divisible by groups {}'.format( + in_channels, groups) + assert out_channels % groups == 0, \ + 'out_channels {} cannot be divisible by groups {}'.format( + out_channels, groups) + + self.in_channels = in_channels + self.out_channels = out_channels + self.kernel_size = _pair(kernel_size) + self.stride = _pair(stride) + self.padding = _pair(padding) + self.dilation = _pair(dilation) + self.groups = groups + self.deformable_groups = deformable_groups + + self.weight = nn.Parameter( + torch.Tensor(out_channels, in_channels // self.groups, + *self.kernel_size)) + + self.reset_parameters() + + def reset_parameters(self): + n = self.in_channels + for k in self.kernel_size: + n *= k + stdv = 1. / math.sqrt(n) + self.weight.data.uniform_(-stdv, stdv) + + def forward(self, x, offset): + return deform_conv(x, offset, self.weight, self.stride, self.padding, + self.dilation, self.groups, self.deformable_groups) + + +class DeformConvPack(DeformConv): + + def __init__(self, *args, **kwargs): + super(DeformConvPack, self).__init__(*args, **kwargs) + + self.conv_offset = nn.Conv2d( + self.in_channels, + self.deformable_groups * 2 * self.kernel_size[0] * + self.kernel_size[1], + kernel_size=self.kernel_size, + stride=_pair(self.stride), + padding=_pair(self.padding), + bias=True) + self.init_offset() + + def init_offset(self): + self.conv_offset.weight.data.zero_() + self.conv_offset.bias.data.zero_() + + def forward(self, x): + offset = self.conv_offset(x) + return deform_conv(x, offset, self.weight, self.stride, self.padding, + self.dilation, self.groups, self.deformable_groups) + + +class ModulatedDeformConv(nn.Module): + + def __init__(self, + in_channels, + out_channels, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + deformable_groups=1, + bias=True): + super(ModulatedDeformConv, self).__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.kernel_size = _pair(kernel_size) + self.stride = stride + self.padding = padding + self.dilation = dilation + self.groups = groups + self.deformable_groups = deformable_groups + self.with_bias = bias + + self.weight = nn.Parameter( + torch.Tensor(out_channels, in_channels // groups, + *self.kernel_size)) + if bias: + self.bias = nn.Parameter(torch.Tensor(out_channels)) + else: + self.register_parameter('bias', None) + self.reset_parameters() + + def reset_parameters(self): + n = self.in_channels + for k in self.kernel_size: + n *= k + stdv = 1. / math.sqrt(n) + self.weight.data.uniform_(-stdv, stdv) + if self.bias is not None: + self.bias.data.zero_() + + def forward(self, x, offset, mask): + return modulated_deform_conv(x, offset, mask, self.weight, self.bias, + self.stride, self.padding, self.dilation, + self.groups, self.deformable_groups) + + +class ModulatedDeformConvPack(ModulatedDeformConv): + + def __init__(self, *args, **kwargs): + super(ModulatedDeformConvPack, self).__init__(*args, **kwargs) + + self.conv_offset_mask = nn.Conv2d( + self.in_channels, + self.deformable_groups * 3 * self.kernel_size[0] * + self.kernel_size[1], + kernel_size=self.kernel_size, + stride=_pair(self.stride), + padding=_pair(self.padding), + bias=True) + self.init_offset() + + def init_offset(self): + self.conv_offset_mask.weight.data.zero_() + self.conv_offset_mask.bias.data.zero_() + + def forward(self, x): + out = self.conv_offset_mask(x) + o1, o2, mask = torch.chunk(out, 3, dim=1) + offset = torch.cat((o1, o2), dim=1) + mask = torch.sigmoid(mask) + return modulated_deform_conv(x, offset, mask, self.weight, self.bias, + self.stride, self.padding, self.dilation, + self.groups, self.deformable_groups) diff --git a/easyocr/DBNet/assets/ops/dcn/modules/deform_pool.py b/easyocr/DBNet/assets/ops/dcn/modules/deform_pool.py new file mode 100644 index 0000000000..5e0196753e --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/modules/deform_pool.py @@ -0,0 +1,172 @@ +from torch import nn + +from ..functions.deform_pool import deform_roi_pooling + + +class DeformRoIPooling(nn.Module): + + def __init__(self, + spatial_scale, + out_size, + out_channels, + no_trans, + group_size=1, + part_size=None, + sample_per_part=4, + trans_std=.0): + super(DeformRoIPooling, self).__init__() + self.spatial_scale = spatial_scale + self.out_size = out_size + self.out_channels = out_channels + self.no_trans = no_trans + self.group_size = group_size + self.part_size = out_size if part_size is None else part_size + self.sample_per_part = sample_per_part + self.trans_std = trans_std + + def forward(self, data, rois, offset): + if self.no_trans: + offset = data.new_empty(0) + return deform_roi_pooling( + data, rois, offset, self.spatial_scale, self.out_size, + self.out_channels, self.no_trans, self.group_size, self.part_size, + self.sample_per_part, self.trans_std) + + +class DeformRoIPoolingPack(DeformRoIPooling): + + def __init__(self, + spatial_scale, + out_size, + out_channels, + no_trans, + group_size=1, + part_size=None, + sample_per_part=4, + trans_std=.0, + num_offset_fcs=3, + deform_fc_channels=1024): + super(DeformRoIPoolingPack, + self).__init__(spatial_scale, out_size, out_channels, no_trans, + group_size, part_size, sample_per_part, trans_std) + + self.num_offset_fcs = num_offset_fcs + self.deform_fc_channels = deform_fc_channels + + if not no_trans: + seq = [] + ic = self.out_size * self.out_size * self.out_channels + for i in range(self.num_offset_fcs): + if i < self.num_offset_fcs - 1: + oc = self.deform_fc_channels + else: + oc = self.out_size * self.out_size * 2 + seq.append(nn.Linear(ic, oc)) + ic = oc + if i < self.num_offset_fcs - 1: + seq.append(nn.ReLU(inplace=True)) + self.offset_fc = nn.Sequential(*seq) + self.offset_fc[-1].weight.data.zero_() + self.offset_fc[-1].bias.data.zero_() + + def forward(self, data, rois): + assert data.size(1) == self.out_channels + if self.no_trans: + offset = data.new_empty(0) + return deform_roi_pooling( + data, rois, offset, self.spatial_scale, self.out_size, + self.out_channels, self.no_trans, self.group_size, + self.part_size, self.sample_per_part, self.trans_std) + else: + n = rois.shape[0] + offset = data.new_empty(0) + x = deform_roi_pooling(data, rois, offset, self.spatial_scale, + self.out_size, self.out_channels, True, + self.group_size, self.part_size, + self.sample_per_part, self.trans_std) + offset = self.offset_fc(x.view(n, -1)) + offset = offset.view(n, 2, self.out_size, self.out_size) + return deform_roi_pooling( + data, rois, offset, self.spatial_scale, self.out_size, + self.out_channels, self.no_trans, self.group_size, + self.part_size, self.sample_per_part, self.trans_std) + + +class ModulatedDeformRoIPoolingPack(DeformRoIPooling): + + def __init__(self, + spatial_scale, + out_size, + out_channels, + no_trans, + group_size=1, + part_size=None, + sample_per_part=4, + trans_std=.0, + num_offset_fcs=3, + num_mask_fcs=2, + deform_fc_channels=1024): + super(ModulatedDeformRoIPoolingPack, self).__init__( + spatial_scale, out_size, out_channels, no_trans, group_size, + part_size, sample_per_part, trans_std) + + self.num_offset_fcs = num_offset_fcs + self.num_mask_fcs = num_mask_fcs + self.deform_fc_channels = deform_fc_channels + + if not no_trans: + offset_fc_seq = [] + ic = self.out_size * self.out_size * self.out_channels + for i in range(self.num_offset_fcs): + if i < self.num_offset_fcs - 1: + oc = self.deform_fc_channels + else: + oc = self.out_size * self.out_size * 2 + offset_fc_seq.append(nn.Linear(ic, oc)) + ic = oc + if i < self.num_offset_fcs - 1: + offset_fc_seq.append(nn.ReLU(inplace=True)) + self.offset_fc = nn.Sequential(*offset_fc_seq) + self.offset_fc[-1].weight.data.zero_() + self.offset_fc[-1].bias.data.zero_() + + mask_fc_seq = [] + ic = self.out_size * self.out_size * self.out_channels + for i in range(self.num_mask_fcs): + if i < self.num_mask_fcs - 1: + oc = self.deform_fc_channels + else: + oc = self.out_size * self.out_size + mask_fc_seq.append(nn.Linear(ic, oc)) + ic = oc + if i < self.num_mask_fcs - 1: + mask_fc_seq.append(nn.ReLU(inplace=True)) + else: + mask_fc_seq.append(nn.Sigmoid()) + self.mask_fc = nn.Sequential(*mask_fc_seq) + self.mask_fc[-2].weight.data.zero_() + self.mask_fc[-2].bias.data.zero_() + + def forward(self, data, rois): + assert data.size(1) == self.out_channels + if self.no_trans: + offset = data.new_empty(0) + return deform_roi_pooling( + data, rois, offset, self.spatial_scale, self.out_size, + self.out_channels, self.no_trans, self.group_size, + self.part_size, self.sample_per_part, self.trans_std) + else: + n = rois.shape[0] + offset = data.new_empty(0) + x = deform_roi_pooling(data, rois, offset, self.spatial_scale, + self.out_size, self.out_channels, True, + self.group_size, self.part_size, + self.sample_per_part, self.trans_std) + offset = self.offset_fc(x.view(n, -1)) + offset = offset.view(n, 2, self.out_size, self.out_size) + mask = self.mask_fc(x.view(n, -1)) + mask = mask.view(n, 1, self.out_size, self.out_size) + return deform_roi_pooling( + data, rois, offset, self.spatial_scale, self.out_size, + self.out_channels, self.no_trans, self.group_size, + self.part_size, self.sample_per_part, self.trans_std) * mask diff --git a/easyocr/DBNet/assets/ops/dcn/setup.py b/easyocr/DBNet/assets/ops/dcn/setup.py new file mode 100644 index 0000000000..020d5edc4b --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/setup.py @@ -0,0 +1,15 @@ +from setuptools import setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + +setup( + name='deform_conv', + ext_modules=[ + CUDAExtension('deform_conv_cuda', [ + 'src/deform_conv_cuda.cpp', + 'src/deform_conv_cuda_kernel.cu', + ]), + CUDAExtension('deform_pool_cuda', [ + 'src/deform_pool_cuda.cpp', 'src/deform_pool_cuda_kernel.cu' + ]), + ], + cmdclass={'build_ext': BuildExtension}) diff --git a/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cuda.cpp b/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cuda.cpp new file mode 100644 index 0000000000..598c44a6d8 --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cuda.cpp @@ -0,0 +1,695 @@ +// modify from +// https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/blob/mmdetection/mmdet/ops/dcn/src/deform_conv_cuda.c + +#include + +#include +#include + +void deformable_im2col(const at::Tensor data_im, const at::Tensor data_offset, + const int channels, const int height, const int width, + const int ksize_h, const int ksize_w, const int pad_h, + const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int parallel_imgs, const int deformable_group, + at::Tensor data_col); + +void deformable_col2im(const at::Tensor data_col, const at::Tensor data_offset, + const int channels, const int height, const int width, + const int ksize_h, const int ksize_w, const int pad_h, + const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int parallel_imgs, const int deformable_group, + at::Tensor grad_im); + +void deformable_col2im_coord( + const at::Tensor data_col, const at::Tensor data_im, + const at::Tensor data_offset, const int channels, const int height, + const int width, const int ksize_h, const int ksize_w, const int pad_h, + const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int parallel_imgs, + const int deformable_group, at::Tensor grad_offset); + +void modulated_deformable_im2col_cuda( + const at::Tensor data_im, const at::Tensor data_offset, + const at::Tensor data_mask, const int batch_size, const int channels, + const int height_im, const int width_im, const int height_col, + const int width_col, const int kernel_h, const int kenerl_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int deformable_group, + at::Tensor data_col); + +void modulated_deformable_col2im_cuda( + const at::Tensor data_col, const at::Tensor data_offset, + const at::Tensor data_mask, const int batch_size, const int channels, + const int height_im, const int width_im, const int height_col, + const int width_col, const int kernel_h, const int kenerl_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int deformable_group, + at::Tensor grad_im); + +void modulated_deformable_col2im_coord_cuda( + const at::Tensor data_col, const at::Tensor data_im, + const at::Tensor data_offset, const at::Tensor data_mask, + const int batch_size, const int channels, const int height_im, + const int width_im, const int height_col, const int width_col, + const int kernel_h, const int kenerl_w, const int pad_h, const int pad_w, + const int stride_h, const int stride_w, const int dilation_h, + const int dilation_w, const int deformable_group, at::Tensor grad_offset, + at::Tensor grad_mask); + +void shape_check(at::Tensor input, at::Tensor offset, at::Tensor *gradOutput, + at::Tensor weight, int kH, int kW, int dH, int dW, int padH, + int padW, int dilationH, int dilationW, int group, + int deformable_group) { + TORCH_CHECK(weight.ndimension() == 4, + "4D weight tensor (nOutputPlane,nInputPlane,kH,kW) expected, " + "but got: %s", + weight.ndimension()); + + TORCH_CHECK(weight.is_contiguous(), "weight tensor has to be contiguous"); + + TORCH_CHECK(kW > 0 && kH > 0, + "kernel size should be greater than zero, but got kH: %d kW: %d", kH, + kW); + + TORCH_CHECK((weight.size(2) == kH && weight.size(3) == kW), + "kernel size should be consistent with weight, ", + "but got kH: %d kW: %d weight.size(2): %d, weight.size(3): %d", kH, + kW, weight.size(2), weight.size(3)); + + TORCH_CHECK(dW > 0 && dH > 0, + "stride should be greater than zero, but got dH: %d dW: %d", dH, dW); + + TORCH_CHECK( + dilationW > 0 && dilationH > 0, + "dilation should be greater than 0, but got dilationH: %d dilationW: %d", + dilationH, dilationW); + + int ndim = input.ndimension(); + int dimf = 0; + int dimh = 1; + int dimw = 2; + + if (ndim == 4) { + dimf++; + dimh++; + dimw++; + } + + TORCH_CHECK(ndim == 3 || ndim == 4, "3D or 4D input tensor expected but got: %s", + ndim); + + long nInputPlane = weight.size(1) * group; + long inputHeight = input.size(dimh); + long inputWidth = input.size(dimw); + long nOutputPlane = weight.size(0); + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + + TORCH_CHECK(nInputPlane % deformable_group == 0, + "input channels must divide deformable group size"); + + if (outputWidth < 1 || outputHeight < 1) + AT_ERROR( + "Given input size: (%ld x %ld x %ld). " + "Calculated output size: (%ld x %ld x %ld). Output size is too small", + nInputPlane, inputHeight, inputWidth, nOutputPlane, outputHeight, + outputWidth); + + TORCH_CHECK(input.size(1) == nInputPlane, + "invalid number of input planes, expected: %d, but got: %d", + nInputPlane, input.size(1)); + + TORCH_CHECK((inputHeight >= kH && inputWidth >= kW), + "input image is smaller than kernel"); + + TORCH_CHECK((offset.size(2) == outputHeight && offset.size(3) == outputWidth), + "invalid spatial size of offset, expected height: %d width: %d, but " + "got height: %d width: %d", + outputHeight, outputWidth, offset.size(2), offset.size(3)); + + TORCH_CHECK((offset.size(1) == deformable_group * 2 * kH * kW), + "invalid number of channels of offset"); + + if (gradOutput != NULL) { + TORCH_CHECK(gradOutput->size(dimf) == nOutputPlane, + "invalid number of gradOutput planes, expected: %d, but got: %d", + nOutputPlane, gradOutput->size(dimf)); + + TORCH_CHECK((gradOutput->size(dimh) == outputHeight && + gradOutput->size(dimw) == outputWidth), + "invalid size of gradOutput, expected height: %d width: %d , but " + "got height: %d width: %d", + outputHeight, outputWidth, gradOutput->size(dimh), + gradOutput->size(dimw)); + } +} + +int deform_conv_forward_cuda(at::Tensor input, at::Tensor weight, + at::Tensor offset, at::Tensor output, + at::Tensor columns, at::Tensor ones, int kW, + int kH, int dW, int dH, int padW, int padH, + int dilationW, int dilationH, int group, + int deformable_group, int im2col_step) { + // todo: resize columns to include im2col: done + // todo: add im2col_step as input + // todo: add new output buffer and transpose it to output (or directly + // transpose output) todo: possibly change data indexing because of + // parallel_imgs + + shape_check(input, offset, NULL, weight, kH, kW, dH, dW, padH, padW, + dilationH, dilationW, group, deformable_group); + + input = input.contiguous(); + offset = offset.contiguous(); + weight = weight.contiguous(); + + int batch = 1; + if (input.ndimension() == 3) { + // Force batch + batch = 0; + input.unsqueeze_(0); + offset.unsqueeze_(0); + } + + // todo: assert batchsize dividable by im2col_step + + long batchSize = input.size(0); + long nInputPlane = input.size(1); + long inputHeight = input.size(2); + long inputWidth = input.size(3); + + long nOutputPlane = weight.size(0); + + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + + TORCH_CHECK((offset.size(0) == batchSize), "invalid batch size of offset"); + + output = output.view({batchSize / im2col_step, im2col_step, nOutputPlane, + outputHeight, outputWidth}); + columns = at::zeros( + {nInputPlane * kW * kH, im2col_step * outputHeight * outputWidth}, + input.options()); + + if (ones.ndimension() != 2 || + ones.size(0) * ones.size(1) < outputHeight * outputWidth) { + ones = at::ones({outputHeight, outputWidth}, input.options()); + } + + input = input.view({batchSize / im2col_step, im2col_step, nInputPlane, + inputHeight, inputWidth}); + offset = + offset.view({batchSize / im2col_step, im2col_step, + deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + at::Tensor output_buffer = + at::zeros({batchSize / im2col_step, nOutputPlane, + im2col_step * outputHeight, outputWidth}, + output.options()); + + output_buffer = output_buffer.view( + {output_buffer.size(0), group, output_buffer.size(1) / group, + output_buffer.size(2), output_buffer.size(3)}); + + for (int elt = 0; elt < batchSize / im2col_step; elt++) { + deformable_im2col(input[elt], offset[elt], nInputPlane, inputHeight, + inputWidth, kH, kW, padH, padW, dH, dW, dilationH, + dilationW, im2col_step, deformable_group, columns); + + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + weight = weight.view({group, weight.size(0) / group, weight.size(1), + weight.size(2), weight.size(3)}); + + for (int g = 0; g < group; g++) { + output_buffer[elt][g] = output_buffer[elt][g] + .flatten(1) + .addmm_(weight[g].flatten(1), columns[g]) + .view_as(output_buffer[elt][g]); + } + } + + output_buffer = output_buffer.view( + {output_buffer.size(0), output_buffer.size(1) * output_buffer.size(2), + output_buffer.size(3), output_buffer.size(4)}); + + output_buffer = output_buffer.view({batchSize / im2col_step, nOutputPlane, + im2col_step, outputHeight, outputWidth}); + output_buffer.transpose_(1, 2); + output.copy_(output_buffer); + output = output.view({batchSize, nOutputPlane, outputHeight, outputWidth}); + + input = input.view({batchSize, nInputPlane, inputHeight, inputWidth}); + offset = offset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + if (batch == 0) { + output = output.view({nOutputPlane, outputHeight, outputWidth}); + input = input.view({nInputPlane, inputHeight, inputWidth}); + offset = offset.view({offset.size(1), offset.size(2), offset.size(3)}); + } + + return 1; +} + +int deform_conv_backward_input_cuda(at::Tensor input, at::Tensor offset, + at::Tensor gradOutput, at::Tensor gradInput, + at::Tensor gradOffset, at::Tensor weight, + at::Tensor columns, int kW, int kH, int dW, + int dH, int padW, int padH, int dilationW, + int dilationH, int group, + int deformable_group, int im2col_step) { + shape_check(input, offset, &gradOutput, weight, kH, kW, dH, dW, padH, padW, + dilationH, dilationW, group, deformable_group); + + input = input.contiguous(); + offset = offset.contiguous(); + gradOutput = gradOutput.contiguous(); + weight = weight.contiguous(); + + int batch = 1; + + if (input.ndimension() == 3) { + // Force batch + batch = 0; + input = input.view({1, input.size(0), input.size(1), input.size(2)}); + offset = offset.view({1, offset.size(0), offset.size(1), offset.size(2)}); + gradOutput = gradOutput.view( + {1, gradOutput.size(0), gradOutput.size(1), gradOutput.size(2)}); + } + + long batchSize = input.size(0); + long nInputPlane = input.size(1); + long inputHeight = input.size(2); + long inputWidth = input.size(3); + + long nOutputPlane = weight.size(0); + + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + + TORCH_CHECK((offset.size(0) == batchSize), 3, "invalid batch size of offset"); + gradInput = gradInput.view({batchSize, nInputPlane, inputHeight, inputWidth}); + columns = at::zeros( + {nInputPlane * kW * kH, im2col_step * outputHeight * outputWidth}, + input.options()); + + // change order of grad output + gradOutput = gradOutput.view({batchSize / im2col_step, im2col_step, + nOutputPlane, outputHeight, outputWidth}); + gradOutput.transpose_(1, 2); + + gradInput = gradInput.view({batchSize / im2col_step, im2col_step, nInputPlane, + inputHeight, inputWidth}); + input = input.view({batchSize / im2col_step, im2col_step, nInputPlane, + inputHeight, inputWidth}); + gradOffset = gradOffset.view({batchSize / im2col_step, im2col_step, + deformable_group * 2 * kH * kW, outputHeight, + outputWidth}); + offset = + offset.view({batchSize / im2col_step, im2col_step, + deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + for (int elt = 0; elt < batchSize / im2col_step; elt++) { + // divide into groups + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + weight = weight.view({group, weight.size(0) / group, weight.size(1), + weight.size(2), weight.size(3)}); + gradOutput = gradOutput.view( + {gradOutput.size(0), group, gradOutput.size(1) / group, + gradOutput.size(2), gradOutput.size(3), gradOutput.size(4)}); + + for (int g = 0; g < group; g++) { + columns[g] = columns[g].addmm_(weight[g].flatten(1).transpose(0, 1), + gradOutput[elt][g].flatten(1), 0.0f, 1.0f); + } + + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + gradOutput = gradOutput.view( + {gradOutput.size(0), gradOutput.size(1) * gradOutput.size(2), + gradOutput.size(3), gradOutput.size(4), gradOutput.size(5)}); + + deformable_col2im_coord(columns, input[elt], offset[elt], nInputPlane, + inputHeight, inputWidth, kH, kW, padH, padW, dH, dW, + dilationH, dilationW, im2col_step, deformable_group, + gradOffset[elt]); + + deformable_col2im(columns, offset[elt], nInputPlane, inputHeight, + inputWidth, kH, kW, padH, padW, dH, dW, dilationH, + dilationW, im2col_step, deformable_group, gradInput[elt]); + } + + gradOutput.transpose_(1, 2); + gradOutput = + gradOutput.view({batchSize, nOutputPlane, outputHeight, outputWidth}); + + gradInput = gradInput.view({batchSize, nInputPlane, inputHeight, inputWidth}); + input = input.view({batchSize, nInputPlane, inputHeight, inputWidth}); + gradOffset = gradOffset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + offset = offset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + if (batch == 0) { + gradOutput = gradOutput.view({nOutputPlane, outputHeight, outputWidth}); + input = input.view({nInputPlane, inputHeight, inputWidth}); + gradInput = gradInput.view({nInputPlane, inputHeight, inputWidth}); + offset = offset.view({offset.size(1), offset.size(2), offset.size(3)}); + gradOffset = + gradOffset.view({offset.size(1), offset.size(2), offset.size(3)}); + } + + return 1; +} + +int deform_conv_backward_parameters_cuda( + at::Tensor input, at::Tensor offset, at::Tensor gradOutput, + at::Tensor gradWeight, // at::Tensor gradBias, + at::Tensor columns, at::Tensor ones, int kW, int kH, int dW, int dH, + int padW, int padH, int dilationW, int dilationH, int group, + int deformable_group, float scale, int im2col_step) { + // todo: transpose and reshape outGrad + // todo: reshape columns + // todo: add im2col_step as input + + shape_check(input, offset, &gradOutput, gradWeight, kH, kW, dH, dW, padH, + padW, dilationH, dilationW, group, deformable_group); + + input = input.contiguous(); + offset = offset.contiguous(); + gradOutput = gradOutput.contiguous(); + + int batch = 1; + + if (input.ndimension() == 3) { + // Force batch + batch = 0; + input = input.view( + at::IntList({1, input.size(0), input.size(1), input.size(2)})); + gradOutput = gradOutput.view( + {1, gradOutput.size(0), gradOutput.size(1), gradOutput.size(2)}); + } + + long batchSize = input.size(0); + long nInputPlane = input.size(1); + long inputHeight = input.size(2); + long inputWidth = input.size(3); + + long nOutputPlane = gradWeight.size(0); + + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + + TORCH_CHECK((offset.size(0) == batchSize), "invalid batch size of offset"); + + columns = at::zeros( + {nInputPlane * kW * kH, im2col_step * outputHeight * outputWidth}, + input.options()); + + gradOutput = gradOutput.view({batchSize / im2col_step, im2col_step, + nOutputPlane, outputHeight, outputWidth}); + gradOutput.transpose_(1, 2); + + at::Tensor gradOutputBuffer = at::zeros_like(gradOutput); + gradOutputBuffer = + gradOutputBuffer.view({batchSize / im2col_step, nOutputPlane, im2col_step, + outputHeight, outputWidth}); + gradOutputBuffer.copy_(gradOutput); + gradOutputBuffer = + gradOutputBuffer.view({batchSize / im2col_step, nOutputPlane, + im2col_step * outputHeight, outputWidth}); + + gradOutput.transpose_(1, 2); + gradOutput = + gradOutput.view({batchSize, nOutputPlane, outputHeight, outputWidth}); + + input = input.view({batchSize / im2col_step, im2col_step, nInputPlane, + inputHeight, inputWidth}); + offset = + offset.view({batchSize / im2col_step, im2col_step, + deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + for (int elt = 0; elt < batchSize / im2col_step; elt++) { + deformable_im2col(input[elt], offset[elt], nInputPlane, inputHeight, + inputWidth, kH, kW, padH, padW, dH, dW, dilationH, + dilationW, im2col_step, deformable_group, columns); + + // divide into group + gradOutputBuffer = gradOutputBuffer.view( + {gradOutputBuffer.size(0), group, gradOutputBuffer.size(1) / group, + gradOutputBuffer.size(2), gradOutputBuffer.size(3)}); + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + gradWeight = + gradWeight.view({group, gradWeight.size(0) / group, gradWeight.size(1), + gradWeight.size(2), gradWeight.size(3)}); + + for (int g = 0; g < group; g++) { + gradWeight[g] = gradWeight[g] + .flatten(1) + .addmm_(gradOutputBuffer[elt][g].flatten(1), + columns[g].transpose(1, 0), 1.0, scale) + .view_as(gradWeight[g]); + } + gradOutputBuffer = gradOutputBuffer.view( + {gradOutputBuffer.size(0), + gradOutputBuffer.size(1) * gradOutputBuffer.size(2), + gradOutputBuffer.size(3), gradOutputBuffer.size(4)}); + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + gradWeight = gradWeight.view({gradWeight.size(0) * gradWeight.size(1), + gradWeight.size(2), gradWeight.size(3), + gradWeight.size(4)}); + } + + input = input.view({batchSize, nInputPlane, inputHeight, inputWidth}); + offset = offset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + if (batch == 0) { + gradOutput = gradOutput.view({nOutputPlane, outputHeight, outputWidth}); + input = input.view({nInputPlane, inputHeight, inputWidth}); + } + + return 1; +} + +void modulated_deform_conv_cuda_forward( + at::Tensor input, at::Tensor weight, at::Tensor bias, at::Tensor ones, + at::Tensor offset, at::Tensor mask, at::Tensor output, at::Tensor columns, + int kernel_h, int kernel_w, const int stride_h, const int stride_w, + const int pad_h, const int pad_w, const int dilation_h, + const int dilation_w, const int group, const int deformable_group, + const bool with_bias) { + TORCH_CHECK(input.is_contiguous(), "input tensor has to be contiguous"); + TORCH_CHECK(weight.is_contiguous(), "weight tensor has to be contiguous"); + + const int batch = input.size(0); + const int channels = input.size(1); + const int height = input.size(2); + const int width = input.size(3); + + const int channels_out = weight.size(0); + const int channels_kernel = weight.size(1); + const int kernel_h_ = weight.size(2); + const int kernel_w_ = weight.size(3); + + if (kernel_h_ != kernel_h || kernel_w_ != kernel_w) + AT_ERROR("Input shape and kernel shape wont match: (%d x %d vs %d x %d).", + kernel_h_, kernel_w, kernel_h_, kernel_w_); + if (channels != channels_kernel * group) + AT_ERROR("Input shape and kernel channels wont match: (%d vs %d).", + channels, channels_kernel * group); + + const int height_out = + (height + 2 * pad_h - (dilation_h * (kernel_h - 1) + 1)) / stride_h + 1; + const int width_out = + (width + 2 * pad_w - (dilation_w * (kernel_w - 1) + 1)) / stride_w + 1; + + if (ones.ndimension() != 2 || + ones.size(0) * ones.size(1) < height_out * width_out) { + // Resize plane and fill with ones... + ones = at::ones({height_out, width_out}, input.options()); + } + + // resize output + output = output.view({batch, channels_out, height_out, width_out}).zero_(); + // resize temporary columns + columns = + at::zeros({channels * kernel_h * kernel_w, 1 * height_out * width_out}, + input.options()); + + output = output.view({output.size(0), group, output.size(1) / group, + output.size(2), output.size(3)}); + + for (int b = 0; b < batch; b++) { + modulated_deformable_im2col_cuda( + input[b], offset[b], mask[b], 1, channels, height, width, height_out, + width_out, kernel_h, kernel_w, pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, deformable_group, columns); + + // divide into group + weight = weight.view({group, weight.size(0) / group, weight.size(1), + weight.size(2), weight.size(3)}); + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + + for (int g = 0; g < group; g++) { + output[b][g] = output[b][g] + .flatten(1) + .addmm_(weight[g].flatten(1), columns[g]) + .view_as(output[b][g]); + } + + weight = weight.view({weight.size(0) * weight.size(1), weight.size(2), + weight.size(3), weight.size(4)}); + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + } + + output = output.view({output.size(0), output.size(1) * output.size(2), + output.size(3), output.size(4)}); + + if (with_bias) { + output += bias.view({1, bias.size(0), 1, 1}); + } +} + +void modulated_deform_conv_cuda_backward( + at::Tensor input, at::Tensor weight, at::Tensor bias, at::Tensor ones, + at::Tensor offset, at::Tensor mask, at::Tensor columns, + at::Tensor grad_input, at::Tensor grad_weight, at::Tensor grad_bias, + at::Tensor grad_offset, at::Tensor grad_mask, at::Tensor grad_output, + int kernel_h, int kernel_w, int stride_h, int stride_w, int pad_h, + int pad_w, int dilation_h, int dilation_w, int group, int deformable_group, + const bool with_bias) { + TORCH_CHECK(input.is_contiguous(), "input tensor has to be contiguous"); + TORCH_CHECK(weight.is_contiguous(), "weight tensor has to be contiguous"); + + const int batch = input.size(0); + const int channels = input.size(1); + const int height = input.size(2); + const int width = input.size(3); + + const int channels_kernel = weight.size(1); + const int kernel_h_ = weight.size(2); + const int kernel_w_ = weight.size(3); + if (kernel_h_ != kernel_h || kernel_w_ != kernel_w) + TORCH_CHECK("Input shape and kernel shape wont match: (%d x %d vs %d x %d).", + kernel_h_, kernel_w, kernel_h_, kernel_w_); + if (channels != channels_kernel * group) + TORCH_CHECK("Input shape and kernel channels wont match: (%d vs %d).", + channels, channels_kernel * group); + + const int height_out = + (height + 2 * pad_h - (dilation_h * (kernel_h - 1) + 1)) / stride_h + 1; + const int width_out = + (width + 2 * pad_w - (dilation_w * (kernel_w - 1) + 1)) / stride_w + 1; + + if (ones.ndimension() != 2 || + ones.size(0) * ones.size(1) < height_out * width_out) { + // Resize plane and fill with ones... + ones = at::ones({height_out, width_out}, input.options()); + } + + grad_input = grad_input.view({batch, channels, height, width}); + columns = at::zeros({channels * kernel_h * kernel_w, height_out * width_out}, + input.options()); + + grad_output = + grad_output.view({grad_output.size(0), group, grad_output.size(1) / group, + grad_output.size(2), grad_output.size(3)}); + + for (int b = 0; b < batch; b++) { + // divide int group + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + weight = weight.view({group, weight.size(0) / group, weight.size(1), + weight.size(2), weight.size(3)}); + + for (int g = 0; g < group; g++) { + columns[g].addmm_(weight[g].flatten(1).transpose(0, 1), + grad_output[b][g].flatten(1), 0.0f, 1.0f); + } + + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + weight = weight.view({weight.size(0) * weight.size(1), weight.size(2), + weight.size(3), weight.size(4)}); + + // gradient w.r.t. input coordinate data + modulated_deformable_col2im_coord_cuda( + columns, input[b], offset[b], mask[b], 1, channels, height, width, + height_out, width_out, kernel_h, kernel_w, pad_h, pad_w, stride_h, + stride_w, dilation_h, dilation_w, deformable_group, grad_offset[b], + grad_mask[b]); + // gradient w.r.t. input data + modulated_deformable_col2im_cuda( + columns, offset[b], mask[b], 1, channels, height, width, height_out, + width_out, kernel_h, kernel_w, pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, deformable_group, grad_input[b]); + + // gradient w.r.t. weight, dWeight should accumulate across the batch and + // group + modulated_deformable_im2col_cuda( + input[b], offset[b], mask[b], 1, channels, height, width, height_out, + width_out, kernel_h, kernel_w, pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, deformable_group, columns); + + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + grad_weight = grad_weight.view({group, grad_weight.size(0) / group, + grad_weight.size(1), grad_weight.size(2), + grad_weight.size(3)}); + if (with_bias) + grad_bias = grad_bias.view({group, grad_bias.size(0) / group}); + + for (int g = 0; g < group; g++) { + grad_weight[g] = + grad_weight[g] + .flatten(1) + .addmm_(grad_output[b][g].flatten(1), columns[g].transpose(0, 1)) + .view_as(grad_weight[g]); + if (with_bias) { + grad_bias[g] = + grad_bias[g] + .view({-1, 1}) + .addmm_(grad_output[b][g].flatten(1), ones.view({-1, 1})) + .view(-1); + } + } + + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + grad_weight = grad_weight.view({grad_weight.size(0) * grad_weight.size(1), + grad_weight.size(2), grad_weight.size(3), + grad_weight.size(4)}); + if (with_bias) + grad_bias = grad_bias.view({grad_bias.size(0) * grad_bias.size(1)}); + } + grad_output = grad_output.view({grad_output.size(0) * grad_output.size(1), + grad_output.size(2), grad_output.size(3), + grad_output.size(4)}); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("deform_conv_forward_cuda", &deform_conv_forward_cuda, + "deform forward (CUDA)"); + m.def("deform_conv_backward_input_cuda", &deform_conv_backward_input_cuda, + "deform_conv_backward_input (CUDA)"); + m.def("deform_conv_backward_parameters_cuda", + &deform_conv_backward_parameters_cuda, + "deform_conv_backward_parameters (CUDA)"); + m.def("modulated_deform_conv_cuda_forward", + &modulated_deform_conv_cuda_forward, + "modulated deform conv forward (CUDA)"); + m.def("modulated_deform_conv_cuda_backward", + &modulated_deform_conv_cuda_backward, + "modulated deform conv backward (CUDA)"); +} diff --git a/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cuda_kernel.cu b/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cuda_kernel.cu new file mode 100644 index 0000000000..48c6d88253 --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cuda_kernel.cu @@ -0,0 +1,866 @@ +/*! + ******************* BEGIN Caffe Copyright Notice and Disclaimer **************** + * + * COPYRIGHT + * + * All contributions by the University of California: + * Copyright (c) 2014-2017 The Regents of the University of California (Regents) + * All rights reserved. + * + * All other contributions: + * Copyright (c) 2014-2017, the respective contributors + * All rights reserved. + * + * Caffe uses a shared copyright model: each contributor holds copyright over + * their contributions to Caffe. The project versioning records all such + * contribution and copyright details. If a contributor wants to further mark + * their specific copyright on a particular contribution, they should indicate + * their copyright solely in the commit message of the change when it is + * committed. + * + * LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * CONTRIBUTION AGREEMENT + * + * By contributing to the BVLC/caffe repository through pull-request, comment, + * or otherwise, the contributor releases their content to the + * license and copyright terms herein. + * + ***************** END Caffe Copyright Notice and Disclaimer ******************** + * + * Copyright (c) 2018 Microsoft + * Licensed under The MIT License [see LICENSE for details] + * \file modulated_deformable_im2col.cuh + * \brief Function definitions of converting an image to + * column matrix based on kernel, padding, dilation, and offset. + * These functions are mainly used in deformable convolution operators. + * \ref: https://arxiv.org/abs/1703.06211 + * \author Yuwen Xiong, Haozhi Qi, Jifeng Dai, Xizhou Zhu, Han Hu, Dazhi Cheng + */ + +// modify from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/blob/mmdetection/mmdet/ops/dcn/src/deform_conv_cuda_kernel.cu + +#include +#include +#include +#include +#include + +using namespace at; + +#define CUDA_KERNEL_LOOP(i, n) \ + for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < (n); \ + i += blockDim.x * gridDim.x) + +const int CUDA_NUM_THREADS = 1024; +const int kMaxGridNum = 65535; + +inline int GET_BLOCKS(const int N) +{ + return std::min(kMaxGridNum, (N + CUDA_NUM_THREADS - 1) / CUDA_NUM_THREADS); +} + +template +__device__ scalar_t deformable_im2col_bilinear(const scalar_t *bottom_data, const int data_width, + const int height, const int width, scalar_t h, scalar_t w) +{ + + int h_low = floor(h); + int w_low = floor(w); + int h_high = h_low + 1; + int w_high = w_low + 1; + + scalar_t lh = h - h_low; + scalar_t lw = w - w_low; + scalar_t hh = 1 - lh, hw = 1 - lw; + + scalar_t v1 = 0; + if (h_low >= 0 && w_low >= 0) + v1 = bottom_data[h_low * data_width + w_low]; + scalar_t v2 = 0; + if (h_low >= 0 && w_high <= width - 1) + v2 = bottom_data[h_low * data_width + w_high]; + scalar_t v3 = 0; + if (h_high <= height - 1 && w_low >= 0) + v3 = bottom_data[h_high * data_width + w_low]; + scalar_t v4 = 0; + if (h_high <= height - 1 && w_high <= width - 1) + v4 = bottom_data[h_high * data_width + w_high]; + + scalar_t w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; + + scalar_t val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + return val; +} + +template +__device__ scalar_t get_gradient_weight(scalar_t argmax_h, scalar_t argmax_w, + const int h, const int w, const int height, const int width) +{ + + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || argmax_w >= width) + { + //empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + scalar_t weight = 0; + if (h == argmax_h_low && w == argmax_w_low) + weight = (h + 1 - argmax_h) * (w + 1 - argmax_w); + if (h == argmax_h_low && w == argmax_w_high) + weight = (h + 1 - argmax_h) * (argmax_w + 1 - w); + if (h == argmax_h_high && w == argmax_w_low) + weight = (argmax_h + 1 - h) * (w + 1 - argmax_w); + if (h == argmax_h_high && w == argmax_w_high) + weight = (argmax_h + 1 - h) * (argmax_w + 1 - w); + return weight; +} + +template +__device__ scalar_t get_coordinate_weight(scalar_t argmax_h, scalar_t argmax_w, + const int height, const int width, const scalar_t *im_data, + const int data_width, const int bp_dir) +{ + + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || argmax_w >= width) + { + //empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + scalar_t weight = 0; + + if (bp_dir == 0) + { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_w_low + 1 - argmax_w) * im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += -1 * (argmax_w - argmax_w_low) * im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += (argmax_w_low + 1 - argmax_w) * im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_w - argmax_w_low) * im_data[argmax_h_high * data_width + argmax_w_high]; + } + else if (bp_dir == 1) + { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_h_low + 1 - argmax_h) * im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += (argmax_h_low + 1 - argmax_h) * im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += -1 * (argmax_h - argmax_h_low) * im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_h - argmax_h_low) * im_data[argmax_h_high * data_width + argmax_w_high]; + } + + return weight; +} + +template +__global__ void deformable_im2col_gpu_kernel(const int n, const scalar_t *data_im, const scalar_t *data_offset, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int channel_per_deformable_group, + const int batch_size, const int num_channels, const int deformable_group, + const int height_col, const int width_col, + scalar_t *data_col) +{ + CUDA_KERNEL_LOOP(index, n) + { + // index index of output matrix + const int w_col = index % width_col; + const int h_col = (index / width_col) % height_col; + const int b_col = (index / width_col / height_col) % batch_size; + const int c_im = (index / width_col / height_col) / batch_size; + const int c_col = c_im * kernel_h * kernel_w; + + // compute deformable group index + const int deformable_group_index = c_im / channel_per_deformable_group; + + const int h_in = h_col * stride_h - pad_h; + const int w_in = w_col * stride_w - pad_w; + scalar_t *data_col_ptr = data_col + ((c_col * batch_size + b_col) * height_col + h_col) * width_col + w_col; + //const scalar_t* data_im_ptr = data_im + ((b_col * num_channels + c_im) * height + h_in) * width + w_in; + const scalar_t *data_im_ptr = data_im + (b_col * num_channels + c_im) * height * width; + const scalar_t *data_offset_ptr = data_offset + (b_col * deformable_group + deformable_group_index) * 2 * kernel_h * kernel_w * height_col * width_col; + + for (int i = 0; i < kernel_h; ++i) + { + for (int j = 0; j < kernel_w; ++j) + { + const int data_offset_h_ptr = ((2 * (i * kernel_w + j)) * height_col + h_col) * width_col + w_col; + const int data_offset_w_ptr = ((2 * (i * kernel_w + j) + 1) * height_col + h_col) * width_col + w_col; + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + scalar_t val = static_cast(0); + const scalar_t h_im = h_in + i * dilation_h + offset_h; + const scalar_t w_im = w_in + j * dilation_w + offset_w; + if (h_im > -1 && w_im > -1 && h_im < height && w_im < width) + { + //const scalar_t map_h = i * dilation_h + offset_h; + //const scalar_t map_w = j * dilation_w + offset_w; + //const int cur_height = height - h_in; + //const int cur_width = width - w_in; + //val = deformable_im2col_bilinear(data_im_ptr, width, cur_height, cur_width, map_h, map_w); + val = deformable_im2col_bilinear(data_im_ptr, width, height, width, h_im, w_im); + } + *data_col_ptr = val; + data_col_ptr += batch_size * height_col * width_col; + } + } + } +} + +void deformable_im2col( + const at::Tensor data_im, const at::Tensor data_offset, const int channels, + const int height, const int width, const int ksize_h, const int ksize_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int parallel_imgs, + const int deformable_group, at::Tensor data_col) +{ + // num_axes should be smaller than block size + // todo: check parallel_imgs is correctly passed in + int height_col = (height + 2 * pad_h - (dilation_h * (ksize_h - 1) + 1)) / stride_h + 1; + int width_col = (width + 2 * pad_w - (dilation_w * (ksize_w - 1) + 1)) / stride_w + 1; + int num_kernels = channels * height_col * width_col * parallel_imgs; + int channel_per_deformable_group = channels / deformable_group; + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_im.type(), "deformable_im2col_gpu", ([&] { + const scalar_t *data_im_ = data_im.data(); + const scalar_t *data_offset_ = data_offset.data(); + scalar_t *data_col_ = data_col.data(); + + deformable_im2col_gpu_kernel<<>>( + num_kernels, data_im_, data_offset_, height, width, ksize_h, ksize_w, + pad_h, pad_w, stride_h, stride_w, dilation_h, dilation_w, + channel_per_deformable_group, parallel_imgs, channels, deformable_group, + height_col, width_col, data_col_); + })); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + { + printf("error in deformable_im2col: %s\n", cudaGetErrorString(err)); + } +} + +template +__global__ void deformable_col2im_gpu_kernel( + const int n, const scalar_t *data_col, const scalar_t *data_offset, + const int channels, const int height, const int width, + const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, + const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int channel_per_deformable_group, + const int batch_size, const int deformable_group, + const int height_col, const int width_col, + scalar_t *grad_im) +{ + CUDA_KERNEL_LOOP(index, n) + { + const int j = (index / width_col / height_col / batch_size) % kernel_w; + const int i = (index / width_col / height_col / batch_size / kernel_w) % kernel_h; + const int c = index / width_col / height_col / batch_size / kernel_w / kernel_h; + // compute the start and end of the output + + const int deformable_group_index = c / channel_per_deformable_group; + + int w_out = index % width_col; + int h_out = (index / width_col) % height_col; + int b = (index / width_col / height_col) % batch_size; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + + const scalar_t *data_offset_ptr = data_offset + (b * deformable_group + deformable_group_index) * + 2 * kernel_h * kernel_w * height_col * width_col; + const int data_offset_h_ptr = ((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out; + const int data_offset_w_ptr = ((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out; + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + const scalar_t cur_inv_h_data = h_in + i * dilation_h + offset_h; + const scalar_t cur_inv_w_data = w_in + j * dilation_w + offset_w; + + const scalar_t cur_top_grad = data_col[index]; + const int cur_h = (int)cur_inv_h_data; + const int cur_w = (int)cur_inv_w_data; + for (int dy = -2; dy <= 2; dy++) + { + for (int dx = -2; dx <= 2; dx++) + { + if (cur_h + dy >= 0 && cur_h + dy < height && + cur_w + dx >= 0 && cur_w + dx < width && + abs(cur_inv_h_data - (cur_h + dy)) < 1 && + abs(cur_inv_w_data - (cur_w + dx)) < 1) + { + int cur_bottom_grad_pos = ((b * channels + c) * height + cur_h + dy) * width + cur_w + dx; + scalar_t weight = get_gradient_weight(cur_inv_h_data, cur_inv_w_data, cur_h + dy, cur_w + dx, height, width); + atomicAdd(grad_im + cur_bottom_grad_pos, weight * cur_top_grad); + } + } + } + } +} + +void deformable_col2im( + const at::Tensor data_col, const at::Tensor data_offset, const int channels, + const int height, const int width, const int ksize_h, + const int ksize_w, const int pad_h, const int pad_w, + const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int parallel_imgs, const int deformable_group, + at::Tensor grad_im) +{ + + // todo: make sure parallel_imgs is passed in correctly + int height_col = (height + 2 * pad_h - (dilation_h * (ksize_h - 1) + 1)) / stride_h + 1; + int width_col = (width + 2 * pad_w - (dilation_w * (ksize_w - 1) + 1)) / stride_w + 1; + int num_kernels = channels * ksize_h * ksize_w * height_col * width_col * parallel_imgs; + int channel_per_deformable_group = channels / deformable_group; + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_col.type(), "deformable_col2im_gpu", ([&] { + const scalar_t *data_col_ = data_col.data(); + const scalar_t *data_offset_ = data_offset.data(); + scalar_t *grad_im_ = grad_im.data(); + + deformable_col2im_gpu_kernel<<>>( + num_kernels, data_col_, data_offset_, channels, height, width, ksize_h, + ksize_w, pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, channel_per_deformable_group, + parallel_imgs, deformable_group, height_col, width_col, grad_im_); + })); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + { + printf("error in deformable_col2im: %s\n", cudaGetErrorString(err)); + } +} + +template +__global__ void deformable_col2im_coord_gpu_kernel(const int n, const scalar_t *data_col, + const scalar_t *data_im, const scalar_t *data_offset, + const int channels, const int height, const int width, + const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, + const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int channel_per_deformable_group, + const int batch_size, const int offset_channels, const int deformable_group, + const int height_col, const int width_col, scalar_t *grad_offset) +{ + CUDA_KERNEL_LOOP(index, n) + { + scalar_t val = 0; + int w = index % width_col; + int h = (index / width_col) % height_col; + int c = (index / width_col / height_col) % offset_channels; + int b = (index / width_col / height_col) / offset_channels; + // compute the start and end of the output + + const int deformable_group_index = c / (2 * kernel_h * kernel_w); + const int col_step = kernel_h * kernel_w; + int cnt = 0; + const scalar_t *data_col_ptr = data_col + deformable_group_index * channel_per_deformable_group * + batch_size * width_col * height_col; + const scalar_t *data_im_ptr = data_im + (b * deformable_group + deformable_group_index) * + channel_per_deformable_group / kernel_h / kernel_w * height * width; + const scalar_t *data_offset_ptr = data_offset + (b * deformable_group + deformable_group_index) * 2 * + kernel_h * kernel_w * height_col * width_col; + + const int offset_c = c - deformable_group_index * 2 * kernel_h * kernel_w; + + for (int col_c = (offset_c / 2); col_c < channel_per_deformable_group; col_c += col_step) + { + const int col_pos = (((col_c * batch_size + b) * height_col) + h) * width_col + w; + const int bp_dir = offset_c % 2; + + int j = (col_pos / width_col / height_col / batch_size) % kernel_w; + int i = (col_pos / width_col / height_col / batch_size / kernel_w) % kernel_h; + int w_out = col_pos % width_col; + int h_out = (col_pos / width_col) % height_col; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + const int data_offset_h_ptr = (((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out); + const int data_offset_w_ptr = (((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out); + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + scalar_t inv_h = h_in + i * dilation_h + offset_h; + scalar_t inv_w = w_in + j * dilation_w + offset_w; + if (inv_h <= -1 || inv_w <= -1 || inv_h >= height || inv_w >= width) + { + inv_h = inv_w = -2; + } + const scalar_t weight = get_coordinate_weight( + inv_h, inv_w, + height, width, data_im_ptr + cnt * height * width, width, bp_dir); + val += weight * data_col_ptr[col_pos]; + cnt += 1; + } + + grad_offset[index] = val; + } +} + +void deformable_col2im_coord( + const at::Tensor data_col, const at::Tensor data_im, const at::Tensor data_offset, + const int channels, const int height, const int width, const int ksize_h, + const int ksize_w, const int pad_h, const int pad_w, const int stride_h, + const int stride_w, const int dilation_h, const int dilation_w, + const int parallel_imgs, const int deformable_group, at::Tensor grad_offset) +{ + + int height_col = (height + 2 * pad_h - (dilation_h * (ksize_h - 1) + 1)) / stride_h + 1; + int width_col = (width + 2 * pad_w - (dilation_w * (ksize_w - 1) + 1)) / stride_w + 1; + int num_kernels = height_col * width_col * 2 * ksize_h * ksize_w * deformable_group * parallel_imgs; + int channel_per_deformable_group = channels * ksize_h * ksize_w / deformable_group; + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_col.type(), "deformable_col2im_coord_gpu", ([&] { + const scalar_t *data_col_ = data_col.data(); + const scalar_t *data_im_ = data_im.data(); + const scalar_t *data_offset_ = data_offset.data(); + scalar_t *grad_offset_ = grad_offset.data(); + + deformable_col2im_coord_gpu_kernel<<>>( + num_kernels, data_col_, data_im_, data_offset_, channels, height, width, + ksize_h, ksize_w, pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, channel_per_deformable_group, + parallel_imgs, 2 * ksize_h * ksize_w * deformable_group, deformable_group, + height_col, width_col, grad_offset_); + })); +} + +template +__device__ scalar_t dmcn_im2col_bilinear(const scalar_t *bottom_data, const int data_width, + const int height, const int width, scalar_t h, scalar_t w) +{ + int h_low = floor(h); + int w_low = floor(w); + int h_high = h_low + 1; + int w_high = w_low + 1; + + scalar_t lh = h - h_low; + scalar_t lw = w - w_low; + scalar_t hh = 1 - lh, hw = 1 - lw; + + scalar_t v1 = 0; + if (h_low >= 0 && w_low >= 0) + v1 = bottom_data[h_low * data_width + w_low]; + scalar_t v2 = 0; + if (h_low >= 0 && w_high <= width - 1) + v2 = bottom_data[h_low * data_width + w_high]; + scalar_t v3 = 0; + if (h_high <= height - 1 && w_low >= 0) + v3 = bottom_data[h_high * data_width + w_low]; + scalar_t v4 = 0; + if (h_high <= height - 1 && w_high <= width - 1) + v4 = bottom_data[h_high * data_width + w_high]; + + scalar_t w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; + + scalar_t val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + return val; +} + +template +__device__ scalar_t dmcn_get_gradient_weight(scalar_t argmax_h, scalar_t argmax_w, + const int h, const int w, const int height, const int width) +{ + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || argmax_w >= width) + { + //empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + scalar_t weight = 0; + if (h == argmax_h_low && w == argmax_w_low) + weight = (h + 1 - argmax_h) * (w + 1 - argmax_w); + if (h == argmax_h_low && w == argmax_w_high) + weight = (h + 1 - argmax_h) * (argmax_w + 1 - w); + if (h == argmax_h_high && w == argmax_w_low) + weight = (argmax_h + 1 - h) * (w + 1 - argmax_w); + if (h == argmax_h_high && w == argmax_w_high) + weight = (argmax_h + 1 - h) * (argmax_w + 1 - w); + return weight; +} + +template +__device__ scalar_t dmcn_get_coordinate_weight(scalar_t argmax_h, scalar_t argmax_w, + const int height, const int width, const scalar_t *im_data, + const int data_width, const int bp_dir) +{ + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || argmax_w >= width) + { + //empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + scalar_t weight = 0; + + if (bp_dir == 0) + { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_w_low + 1 - argmax_w) * im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += -1 * (argmax_w - argmax_w_low) * im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += (argmax_w_low + 1 - argmax_w) * im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_w - argmax_w_low) * im_data[argmax_h_high * data_width + argmax_w_high]; + } + else if (bp_dir == 1) + { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_h_low + 1 - argmax_h) * im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += (argmax_h_low + 1 - argmax_h) * im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += -1 * (argmax_h - argmax_h_low) * im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_h - argmax_h_low) * im_data[argmax_h_high * data_width + argmax_w_high]; + } + + return weight; +} + +template +__global__ void modulated_deformable_im2col_gpu_kernel(const int n, + const scalar_t *data_im, const scalar_t *data_offset, const scalar_t *data_mask, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, + const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int channel_per_deformable_group, + const int batch_size, const int num_channels, const int deformable_group, + const int height_col, const int width_col, + scalar_t *data_col) +{ + CUDA_KERNEL_LOOP(index, n) + { + // index index of output matrix + const int w_col = index % width_col; + const int h_col = (index / width_col) % height_col; + const int b_col = (index / width_col / height_col) % batch_size; + const int c_im = (index / width_col / height_col) / batch_size; + const int c_col = c_im * kernel_h * kernel_w; + + // compute deformable group index + const int deformable_group_index = c_im / channel_per_deformable_group; + + const int h_in = h_col * stride_h - pad_h; + const int w_in = w_col * stride_w - pad_w; + + scalar_t *data_col_ptr = data_col + ((c_col * batch_size + b_col) * height_col + h_col) * width_col + w_col; + //const float* data_im_ptr = data_im + ((b_col * num_channels + c_im) * height + h_in) * width + w_in; + const scalar_t *data_im_ptr = data_im + (b_col * num_channels + c_im) * height * width; + const scalar_t *data_offset_ptr = data_offset + (b_col * deformable_group + deformable_group_index) * 2 * kernel_h * kernel_w * height_col * width_col; + + const scalar_t *data_mask_ptr = data_mask + (b_col * deformable_group + deformable_group_index) * kernel_h * kernel_w * height_col * width_col; + + for (int i = 0; i < kernel_h; ++i) + { + for (int j = 0; j < kernel_w; ++j) + { + const int data_offset_h_ptr = ((2 * (i * kernel_w + j)) * height_col + h_col) * width_col + w_col; + const int data_offset_w_ptr = ((2 * (i * kernel_w + j) + 1) * height_col + h_col) * width_col + w_col; + const int data_mask_hw_ptr = ((i * kernel_w + j) * height_col + h_col) * width_col + w_col; + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + const scalar_t mask = data_mask_ptr[data_mask_hw_ptr]; + scalar_t val = static_cast(0); + const scalar_t h_im = h_in + i * dilation_h + offset_h; + const scalar_t w_im = w_in + j * dilation_w + offset_w; + //if (h_im >= 0 && w_im >= 0 && h_im < height && w_im < width) { + if (h_im > -1 && w_im > -1 && h_im < height && w_im < width) + { + //const float map_h = i * dilation_h + offset_h; + //const float map_w = j * dilation_w + offset_w; + //const int cur_height = height - h_in; + //const int cur_width = width - w_in; + //val = dmcn_im2col_bilinear(data_im_ptr, width, cur_height, cur_width, map_h, map_w); + val = dmcn_im2col_bilinear(data_im_ptr, width, height, width, h_im, w_im); + } + *data_col_ptr = val * mask; + data_col_ptr += batch_size * height_col * width_col; + //data_col_ptr += height_col * width_col; + } + } + } +} + +template +__global__ void modulated_deformable_col2im_gpu_kernel(const int n, + const scalar_t *data_col, const scalar_t *data_offset, const scalar_t *data_mask, + const int channels, const int height, const int width, + const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, + const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int channel_per_deformable_group, + const int batch_size, const int deformable_group, + const int height_col, const int width_col, + scalar_t *grad_im) +{ + CUDA_KERNEL_LOOP(index, n) + { + const int j = (index / width_col / height_col / batch_size) % kernel_w; + const int i = (index / width_col / height_col / batch_size / kernel_w) % kernel_h; + const int c = index / width_col / height_col / batch_size / kernel_w / kernel_h; + // compute the start and end of the output + + const int deformable_group_index = c / channel_per_deformable_group; + + int w_out = index % width_col; + int h_out = (index / width_col) % height_col; + int b = (index / width_col / height_col) % batch_size; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + + const scalar_t *data_offset_ptr = data_offset + (b * deformable_group + deformable_group_index) * 2 * kernel_h * kernel_w * height_col * width_col; + const scalar_t *data_mask_ptr = data_mask + (b * deformable_group + deformable_group_index) * kernel_h * kernel_w * height_col * width_col; + const int data_offset_h_ptr = ((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out; + const int data_offset_w_ptr = ((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out; + const int data_mask_hw_ptr = ((i * kernel_w + j) * height_col + h_out) * width_col + w_out; + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + const scalar_t mask = data_mask_ptr[data_mask_hw_ptr]; + const scalar_t cur_inv_h_data = h_in + i * dilation_h + offset_h; + const scalar_t cur_inv_w_data = w_in + j * dilation_w + offset_w; + + const scalar_t cur_top_grad = data_col[index] * mask; + const int cur_h = (int)cur_inv_h_data; + const int cur_w = (int)cur_inv_w_data; + for (int dy = -2; dy <= 2; dy++) + { + for (int dx = -2; dx <= 2; dx++) + { + if (cur_h + dy >= 0 && cur_h + dy < height && + cur_w + dx >= 0 && cur_w + dx < width && + abs(cur_inv_h_data - (cur_h + dy)) < 1 && + abs(cur_inv_w_data - (cur_w + dx)) < 1) + { + int cur_bottom_grad_pos = ((b * channels + c) * height + cur_h + dy) * width + cur_w + dx; + scalar_t weight = dmcn_get_gradient_weight(cur_inv_h_data, cur_inv_w_data, cur_h + dy, cur_w + dx, height, width); + atomicAdd(grad_im + cur_bottom_grad_pos, weight * cur_top_grad); + } + } + } + } +} + +template +__global__ void modulated_deformable_col2im_coord_gpu_kernel(const int n, + const scalar_t *data_col, const scalar_t *data_im, + const scalar_t *data_offset, const scalar_t *data_mask, + const int channels, const int height, const int width, + const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, + const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int channel_per_deformable_group, + const int batch_size, const int offset_channels, const int deformable_group, + const int height_col, const int width_col, + scalar_t *grad_offset, scalar_t *grad_mask) +{ + CUDA_KERNEL_LOOP(index, n) + { + scalar_t val = 0, mval = 0; + int w = index % width_col; + int h = (index / width_col) % height_col; + int c = (index / width_col / height_col) % offset_channels; + int b = (index / width_col / height_col) / offset_channels; + // compute the start and end of the output + + const int deformable_group_index = c / (2 * kernel_h * kernel_w); + const int col_step = kernel_h * kernel_w; + int cnt = 0; + const scalar_t *data_col_ptr = data_col + deformable_group_index * channel_per_deformable_group * batch_size * width_col * height_col; + const scalar_t *data_im_ptr = data_im + (b * deformable_group + deformable_group_index) * channel_per_deformable_group / kernel_h / kernel_w * height * width; + const scalar_t *data_offset_ptr = data_offset + (b * deformable_group + deformable_group_index) * 2 * kernel_h * kernel_w * height_col * width_col; + const scalar_t *data_mask_ptr = data_mask + (b * deformable_group + deformable_group_index) * kernel_h * kernel_w * height_col * width_col; + + const int offset_c = c - deformable_group_index * 2 * kernel_h * kernel_w; + + for (int col_c = (offset_c / 2); col_c < channel_per_deformable_group; col_c += col_step) + { + const int col_pos = (((col_c * batch_size + b) * height_col) + h) * width_col + w; + const int bp_dir = offset_c % 2; + + int j = (col_pos / width_col / height_col / batch_size) % kernel_w; + int i = (col_pos / width_col / height_col / batch_size / kernel_w) % kernel_h; + int w_out = col_pos % width_col; + int h_out = (col_pos / width_col) % height_col; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + const int data_offset_h_ptr = (((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out); + const int data_offset_w_ptr = (((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out); + const int data_mask_hw_ptr = (((i * kernel_w + j) * height_col + h_out) * width_col + w_out); + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + const scalar_t mask = data_mask_ptr[data_mask_hw_ptr]; + scalar_t inv_h = h_in + i * dilation_h + offset_h; + scalar_t inv_w = w_in + j * dilation_w + offset_w; + if (inv_h <= -1 || inv_w <= -1 || inv_h >= height || inv_w >= width) + { + inv_h = inv_w = -2; + } + else + { + mval += data_col_ptr[col_pos] * dmcn_im2col_bilinear(data_im_ptr + cnt * height * width, width, height, width, inv_h, inv_w); + } + const scalar_t weight = dmcn_get_coordinate_weight( + inv_h, inv_w, + height, width, data_im_ptr + cnt * height * width, width, bp_dir); + val += weight * data_col_ptr[col_pos] * mask; + cnt += 1; + } + // KERNEL_ASSIGN(grad_offset[index], offset_req, val); + grad_offset[index] = val; + if (offset_c % 2 == 0) + // KERNEL_ASSIGN(grad_mask[(((b * deformable_group + deformable_group_index) * kernel_h * kernel_w + offset_c / 2) * height_col + h) * width_col + w], mask_req, mval); + grad_mask[(((b * deformable_group + deformable_group_index) * kernel_h * kernel_w + offset_c / 2) * height_col + h) * width_col + w] = mval; + } +} + +void modulated_deformable_im2col_cuda( + const at::Tensor data_im, const at::Tensor data_offset, const at::Tensor data_mask, + const int batch_size, const int channels, const int height_im, const int width_im, + const int height_col, const int width_col, const int kernel_h, const int kenerl_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int deformable_group, at::Tensor data_col) +{ + // num_axes should be smaller than block size + const int channel_per_deformable_group = channels / deformable_group; + const int num_kernels = channels * batch_size * height_col * width_col; + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_im.type(), "modulated_deformable_im2col_gpu", ([&] { + const scalar_t *data_im_ = data_im.data(); + const scalar_t *data_offset_ = data_offset.data(); + const scalar_t *data_mask_ = data_mask.data(); + scalar_t *data_col_ = data_col.data(); + + modulated_deformable_im2col_gpu_kernel<<>>( + num_kernels, data_im_, data_offset_, data_mask_, height_im, width_im, kernel_h, kenerl_w, + pad_h, pad_w, stride_h, stride_w, dilation_h, dilation_w, channel_per_deformable_group, + batch_size, channels, deformable_group, height_col, width_col, data_col_); + })); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + { + // printf("error in modulated_deformable_im2col_cuda: %s\n", cudaGetErrorString(err)); + } +} + +void modulated_deformable_col2im_cuda( + const at::Tensor data_col, const at::Tensor data_offset, const at::Tensor data_mask, + const int batch_size, const int channels, const int height_im, const int width_im, + const int height_col, const int width_col, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int deformable_group, at::Tensor grad_im) +{ + + const int channel_per_deformable_group = channels / deformable_group; + const int num_kernels = channels * kernel_h * kernel_w * batch_size * height_col * width_col; + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_col.type(), "modulated_deformable_col2im_gpu", ([&] { + const scalar_t *data_col_ = data_col.data(); + const scalar_t *data_offset_ = data_offset.data(); + const scalar_t *data_mask_ = data_mask.data(); + scalar_t *grad_im_ = grad_im.data(); + + modulated_deformable_col2im_gpu_kernel<<>>( + num_kernels, data_col_, data_offset_, data_mask_, channels, height_im, width_im, + kernel_h, kernel_w, pad_h, pad_h, stride_h, stride_w, + dilation_h, dilation_w, channel_per_deformable_group, + batch_size, deformable_group, height_col, width_col, grad_im_); + })); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + { + printf("error in modulated_deformable_col2im_cuda: %s\n", cudaGetErrorString(err)); + } +} + +void modulated_deformable_col2im_coord_cuda( + const at::Tensor data_col, const at::Tensor data_im, const at::Tensor data_offset, const at::Tensor data_mask, + const int batch_size, const int channels, const int height_im, const int width_im, + const int height_col, const int width_col, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int deformable_group, + at::Tensor grad_offset, at::Tensor grad_mask) +{ + const int num_kernels = batch_size * height_col * width_col * 2 * kernel_h * kernel_w * deformable_group; + const int channel_per_deformable_group = channels * kernel_h * kernel_w / deformable_group; + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_col.type(), "modulated_deformable_col2im_coord_gpu", ([&] { + const scalar_t *data_col_ = data_col.data(); + const scalar_t *data_im_ = data_im.data(); + const scalar_t *data_offset_ = data_offset.data(); + const scalar_t *data_mask_ = data_mask.data(); + scalar_t *grad_offset_ = grad_offset.data(); + scalar_t *grad_mask_ = grad_mask.data(); + + modulated_deformable_col2im_coord_gpu_kernel<<>>( + num_kernels, data_col_, data_im_, data_offset_, data_mask_, channels, height_im, width_im, + kernel_h, kernel_w, pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, channel_per_deformable_group, + batch_size, 2 * kernel_h * kernel_w * deformable_group, deformable_group, height_col, width_col, + grad_offset_, grad_mask_); + })); + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + { + printf("error in modulated_deformable_col2im_coord_cuda: %s\n", cudaGetErrorString(err)); + } +} diff --git a/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cuda.cpp b/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cuda.cpp new file mode 100644 index 0000000000..e19cf42aee --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cuda.cpp @@ -0,0 +1,87 @@ +// modify from +// https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/blob/mmdetection/mmdet/ops/dcn/src/modulated_dcn_cuda.c + +// based on +// author: Charles Shang +// https://github.com/torch/cunn/blob/master/lib/THCUNN/generic/SpatialConvolutionMM.cu + +#include + +#include +#include + +void DeformablePSROIPoolForward( + const at::Tensor data, const at::Tensor bbox, const at::Tensor trans, + at::Tensor out, at::Tensor top_count, const int batch, const int channels, + const int height, const int width, const int num_bbox, + const int channels_trans, const int no_trans, const float spatial_scale, + const int output_dim, const int group_size, const int pooled_size, + const int part_size, const int sample_per_part, const float trans_std); + +void DeformablePSROIPoolBackwardAcc( + const at::Tensor out_grad, const at::Tensor data, const at::Tensor bbox, + const at::Tensor trans, const at::Tensor top_count, at::Tensor in_grad, + at::Tensor trans_grad, const int batch, const int channels, + const int height, const int width, const int num_bbox, + const int channels_trans, const int no_trans, const float spatial_scale, + const int output_dim, const int group_size, const int pooled_size, + const int part_size, const int sample_per_part, const float trans_std); + +void deform_psroi_pooling_cuda_forward( + at::Tensor input, at::Tensor bbox, at::Tensor trans, at::Tensor out, + at::Tensor top_count, const int no_trans, const float spatial_scale, + const int output_dim, const int group_size, const int pooled_size, + const int part_size, const int sample_per_part, const float trans_std) { + TORCH_CHECK(input.is_contiguous(), "input tensor has to be contiguous"); + + const int batch = input.size(0); + const int channels = input.size(1); + const int height = input.size(2); + const int width = input.size(3); + const int channels_trans = no_trans ? 2 : trans.size(1); + + const int num_bbox = bbox.size(0); + if (num_bbox != out.size(0)) + AT_ERROR("Output shape and bbox number wont match: (%d vs %d).", + out.size(0), num_bbox); + + DeformablePSROIPoolForward( + input, bbox, trans, out, top_count, batch, channels, height, width, + num_bbox, channels_trans, no_trans, spatial_scale, output_dim, group_size, + pooled_size, part_size, sample_per_part, trans_std); +} + +void deform_psroi_pooling_cuda_backward( + at::Tensor out_grad, at::Tensor input, at::Tensor bbox, at::Tensor trans, + at::Tensor top_count, at::Tensor input_grad, at::Tensor trans_grad, + const int no_trans, const float spatial_scale, const int output_dim, + const int group_size, const int pooled_size, const int part_size, + const int sample_per_part, const float trans_std) { + TORCH_CHECK(out_grad.is_contiguous(), "out_grad tensor has to be contiguous"); + TORCH_CHECK(input.is_contiguous(), "input tensor has to be contiguous"); + + const int batch = input.size(0); + const int channels = input.size(1); + const int height = input.size(2); + const int width = input.size(3); + const int channels_trans = no_trans ? 2 : trans.size(1); + + const int num_bbox = bbox.size(0); + if (num_bbox != out_grad.size(0)) + AT_ERROR("Output shape and bbox number wont match: (%d vs %d).", + out_grad.size(0), num_bbox); + + DeformablePSROIPoolBackwardAcc( + out_grad, input, bbox, trans, top_count, input_grad, trans_grad, batch, + channels, height, width, num_bbox, channels_trans, no_trans, + spatial_scale, output_dim, group_size, pooled_size, part_size, + sample_per_part, trans_std); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("deform_psroi_pooling_cuda_forward", &deform_psroi_pooling_cuda_forward, + "deform psroi pooling forward(CUDA)"); + m.def("deform_psroi_pooling_cuda_backward", + &deform_psroi_pooling_cuda_backward, + "deform psroi pooling backward(CUDA)"); +} diff --git a/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cuda_kernel.cu b/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cuda_kernel.cu new file mode 100644 index 0000000000..e494460056 --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cuda_kernel.cu @@ -0,0 +1,364 @@ +/*! + * Copyright (c) 2017 Microsoft + * Licensed under The MIT License [see LICENSE for details] + * \file deformable_psroi_pooling.cu + * \brief + * \author Yi Li, Guodong Zhang, Jifeng Dai +*/ +/***************** Adapted by Charles Shang *********************/ +// modify from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/blob/mmdetection/mmdet/ops/dcn/src/cuda/deform_psroi_pooling_cuda.cu + +#include +#include +#include +#include +#include + +using namespace at; + +#define CUDA_KERNEL_LOOP(i, n) \ + for (int i = blockIdx.x * blockDim.x + threadIdx.x; \ + i < (n); \ + i += blockDim.x * gridDim.x) + +const int CUDA_NUM_THREADS = 1024; +inline int GET_BLOCKS(const int N) +{ + return (N + CUDA_NUM_THREADS - 1) / CUDA_NUM_THREADS; +} + +template +__device__ scalar_t bilinear_interp( + const scalar_t *data, + const scalar_t x, + const scalar_t y, + const int width, + const int height) +{ + int x1 = floor(x); + int x2 = ceil(x); + int y1 = floor(y); + int y2 = ceil(y); + scalar_t dist_x = (scalar_t)(x - x1); + scalar_t dist_y = (scalar_t)(y - y1); + scalar_t value11 = data[y1 * width + x1]; + scalar_t value12 = data[y2 * width + x1]; + scalar_t value21 = data[y1 * width + x2]; + scalar_t value22 = data[y2 * width + x2]; + scalar_t value = (1 - dist_x) * (1 - dist_y) * value11 + (1 - dist_x) * dist_y * value12 + dist_x * (1 - dist_y) * value21 + dist_x * dist_y * value22; + return value; +} + +template +__global__ void DeformablePSROIPoolForwardKernel( + const int count, + const scalar_t *bottom_data, + const scalar_t spatial_scale, + const int channels, + const int height, const int width, + const int pooled_height, const int pooled_width, + const scalar_t *bottom_rois, const scalar_t *bottom_trans, + const int no_trans, + const scalar_t trans_std, + const int sample_per_part, + const int output_dim, + const int group_size, + const int part_size, + const int num_classes, + const int channels_each_class, + scalar_t *top_data, + scalar_t *top_count) +{ + CUDA_KERNEL_LOOP(index, count) + { + // The output is in order (n, ctop, ph, pw) + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int ctop = (index / pooled_width / pooled_height) % output_dim; + int n = index / pooled_width / pooled_height / output_dim; + + // [start, end) interval for spatial sampling + const scalar_t *offset_bottom_rois = bottom_rois + n * 5; + int roi_batch_ind = offset_bottom_rois[0]; + scalar_t roi_start_w = (scalar_t)(round(offset_bottom_rois[1])) * spatial_scale - 0.5; + scalar_t roi_start_h = (scalar_t)(round(offset_bottom_rois[2])) * spatial_scale - 0.5; + scalar_t roi_end_w = (scalar_t)(round(offset_bottom_rois[3]) + 1.) * spatial_scale - 0.5; + scalar_t roi_end_h = (scalar_t)(round(offset_bottom_rois[4]) + 1.) * spatial_scale - 0.5; + + // Force too small ROIs to be 1x1 + scalar_t roi_width = max(roi_end_w - roi_start_w, 0.1); //avoid 0 + scalar_t roi_height = max(roi_end_h - roi_start_h, 0.1); + + // Compute w and h at bottom + scalar_t bin_size_h = roi_height / (scalar_t)(pooled_height); + scalar_t bin_size_w = roi_width / (scalar_t)(pooled_width); + + scalar_t sub_bin_size_h = bin_size_h / (scalar_t)(sample_per_part); + scalar_t sub_bin_size_w = bin_size_w / (scalar_t)(sample_per_part); + + int part_h = floor((scalar_t)(ph) / pooled_height * part_size); + int part_w = floor((scalar_t)(pw) / pooled_width * part_size); + int class_id = ctop / channels_each_class; + scalar_t trans_x = no_trans ? (scalar_t)(0) : bottom_trans[(((n * num_classes + class_id) * 2) * part_size + part_h) * part_size + part_w] * (scalar_t)trans_std; + scalar_t trans_y = no_trans ? (scalar_t)(0) : bottom_trans[(((n * num_classes + class_id) * 2 + 1) * part_size + part_h) * part_size + part_w] * (scalar_t)trans_std; + + scalar_t wstart = (scalar_t)(pw)*bin_size_w + roi_start_w; + wstart += trans_x * roi_width; + scalar_t hstart = (scalar_t)(ph)*bin_size_h + roi_start_h; + hstart += trans_y * roi_height; + + scalar_t sum = 0; + int count = 0; + int gw = floor((scalar_t)(pw)*group_size / pooled_width); + int gh = floor((scalar_t)(ph)*group_size / pooled_height); + gw = min(max(gw, 0), group_size - 1); + gh = min(max(gh, 0), group_size - 1); + + const scalar_t *offset_bottom_data = bottom_data + (roi_batch_ind * channels) * height * width; + for (int ih = 0; ih < sample_per_part; ih++) + { + for (int iw = 0; iw < sample_per_part; iw++) + { + scalar_t w = wstart + iw * sub_bin_size_w; + scalar_t h = hstart + ih * sub_bin_size_h; + // bilinear interpolation + if (w < -0.5 || w > width - 0.5 || h < -0.5 || h > height - 0.5) + { + continue; + } + w = min(max(w, 0.), width - 1.); + h = min(max(h, 0.), height - 1.); + int c = (ctop * group_size + gh) * group_size + gw; + scalar_t val = bilinear_interp(offset_bottom_data + c * height * width, w, h, width, height); + sum += val; + count++; + } + } + top_data[index] = count == 0 ? (scalar_t)(0) : sum / count; + top_count[index] = count; + } +} + +template +__global__ void DeformablePSROIPoolBackwardAccKernel( + const int count, + const scalar_t *top_diff, + const scalar_t *top_count, + const int num_rois, + const scalar_t spatial_scale, + const int channels, + const int height, const int width, + const int pooled_height, const int pooled_width, + const int output_dim, + scalar_t *bottom_data_diff, scalar_t *bottom_trans_diff, + const scalar_t *bottom_data, + const scalar_t *bottom_rois, + const scalar_t *bottom_trans, + const int no_trans, + const scalar_t trans_std, + const int sample_per_part, + const int group_size, + const int part_size, + const int num_classes, + const int channels_each_class) +{ + CUDA_KERNEL_LOOP(index, count) + { + // The output is in order (n, ctop, ph, pw) + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int ctop = (index / pooled_width / pooled_height) % output_dim; + int n = index / pooled_width / pooled_height / output_dim; + + // [start, end) interval for spatial sampling + const scalar_t *offset_bottom_rois = bottom_rois + n * 5; + int roi_batch_ind = offset_bottom_rois[0]; + scalar_t roi_start_w = (scalar_t)(round(offset_bottom_rois[1])) * spatial_scale - 0.5; + scalar_t roi_start_h = (scalar_t)(round(offset_bottom_rois[2])) * spatial_scale - 0.5; + scalar_t roi_end_w = (scalar_t)(round(offset_bottom_rois[3]) + 1.) * spatial_scale - 0.5; + scalar_t roi_end_h = (scalar_t)(round(offset_bottom_rois[4]) + 1.) * spatial_scale - 0.5; + + // Force too small ROIs to be 1x1 + scalar_t roi_width = max(roi_end_w - roi_start_w, 0.1); //avoid 0 + scalar_t roi_height = max(roi_end_h - roi_start_h, 0.1); + + // Compute w and h at bottom + scalar_t bin_size_h = roi_height / (scalar_t)(pooled_height); + scalar_t bin_size_w = roi_width / (scalar_t)(pooled_width); + + scalar_t sub_bin_size_h = bin_size_h / (scalar_t)(sample_per_part); + scalar_t sub_bin_size_w = bin_size_w / (scalar_t)(sample_per_part); + + int part_h = floor((scalar_t)(ph) / pooled_height * part_size); + int part_w = floor((scalar_t)(pw) / pooled_width * part_size); + int class_id = ctop / channels_each_class; + scalar_t trans_x = no_trans ? (scalar_t)(0) : bottom_trans[(((n * num_classes + class_id) * 2) * part_size + part_h) * part_size + part_w] * (scalar_t)trans_std; + scalar_t trans_y = no_trans ? (scalar_t)(0) : bottom_trans[(((n * num_classes + class_id) * 2 + 1) * part_size + part_h) * part_size + part_w] * (scalar_t)trans_std; + + scalar_t wstart = (scalar_t)(pw)*bin_size_w + roi_start_w; + wstart += trans_x * roi_width; + scalar_t hstart = (scalar_t)(ph)*bin_size_h + roi_start_h; + hstart += trans_y * roi_height; + + if (top_count[index] <= 0) + { + continue; + } + scalar_t diff_val = top_diff[index] / top_count[index]; + const scalar_t *offset_bottom_data = bottom_data + roi_batch_ind * channels * height * width; + scalar_t *offset_bottom_data_diff = bottom_data_diff + roi_batch_ind * channels * height * width; + int gw = floor((scalar_t)(pw)*group_size / pooled_width); + int gh = floor((scalar_t)(ph)*group_size / pooled_height); + gw = min(max(gw, 0), group_size - 1); + gh = min(max(gh, 0), group_size - 1); + + for (int ih = 0; ih < sample_per_part; ih++) + { + for (int iw = 0; iw < sample_per_part; iw++) + { + scalar_t w = wstart + iw * sub_bin_size_w; + scalar_t h = hstart + ih * sub_bin_size_h; + // bilinear interpolation + if (w < -0.5 || w > width - 0.5 || h < -0.5 || h > height - 0.5) + { + continue; + } + w = min(max(w, 0.), width - 1.); + h = min(max(h, 0.), height - 1.); + int c = (ctop * group_size + gh) * group_size + gw; + // backward on feature + int x0 = floor(w); + int x1 = ceil(w); + int y0 = floor(h); + int y1 = ceil(h); + scalar_t dist_x = w - x0, dist_y = h - y0; + scalar_t q00 = (1 - dist_x) * (1 - dist_y); + scalar_t q01 = (1 - dist_x) * dist_y; + scalar_t q10 = dist_x * (1 - dist_y); + scalar_t q11 = dist_x * dist_y; + int bottom_index_base = c * height * width; + atomicAdd(offset_bottom_data_diff + bottom_index_base + y0 * width + x0, q00 * diff_val); + atomicAdd(offset_bottom_data_diff + bottom_index_base + y1 * width + x0, q01 * diff_val); + atomicAdd(offset_bottom_data_diff + bottom_index_base + y0 * width + x1, q10 * diff_val); + atomicAdd(offset_bottom_data_diff + bottom_index_base + y1 * width + x1, q11 * diff_val); + + if (no_trans) + { + continue; + } + scalar_t U00 = offset_bottom_data[bottom_index_base + y0 * width + x0]; + scalar_t U01 = offset_bottom_data[bottom_index_base + y1 * width + x0]; + scalar_t U10 = offset_bottom_data[bottom_index_base + y0 * width + x1]; + scalar_t U11 = offset_bottom_data[bottom_index_base + y1 * width + x1]; + scalar_t diff_x = (U11 * dist_y + U10 * (1 - dist_y) - U01 * dist_y - U00 * (1 - dist_y)) * trans_std * diff_val; + diff_x *= roi_width; + scalar_t diff_y = (U11 * dist_x + U01 * (1 - dist_x) - U10 * dist_x - U00 * (1 - dist_x)) * trans_std * diff_val; + diff_y *= roi_height; + + atomicAdd(bottom_trans_diff + (((n * num_classes + class_id) * 2) * part_size + part_h) * part_size + part_w, diff_x); + atomicAdd(bottom_trans_diff + (((n * num_classes + class_id) * 2 + 1) * part_size + part_h) * part_size + part_w, diff_y); + } + } + } +} + +void DeformablePSROIPoolForward(const at::Tensor data, + const at::Tensor bbox, + const at::Tensor trans, + at::Tensor out, + at::Tensor top_count, + const int batch, + const int channels, + const int height, + const int width, + const int num_bbox, + const int channels_trans, + const int no_trans, + const float spatial_scale, + const int output_dim, + const int group_size, + const int pooled_size, + const int part_size, + const int sample_per_part, + const float trans_std) +{ + const int pooled_height = pooled_size; + const int pooled_width = pooled_size; + const int count = num_bbox * output_dim * pooled_height * pooled_width; + const int num_classes = no_trans ? 1 : channels_trans / 2; + const int channels_each_class = no_trans ? output_dim : output_dim / num_classes; + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data.type(), "deformable_psroi_pool_forward", ([&] { + const scalar_t *bottom_data = data.data(); + const scalar_t *bottom_rois = bbox.data(); + const scalar_t *bottom_trans = no_trans ? NULL : trans.data(); + scalar_t *top_data = out.data(); + scalar_t *top_count_data = top_count.data(); + + DeformablePSROIPoolForwardKernel<<>>( + count, bottom_data, (scalar_t)spatial_scale, channels, height, width, pooled_height, pooled_width, + bottom_rois, bottom_trans, no_trans, (scalar_t)trans_std, sample_per_part, output_dim, + group_size, part_size, num_classes, channels_each_class, top_data, top_count_data); + })); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + { + printf("error in DeformablePSROIPoolForward: %s\n", cudaGetErrorString(err)); + } +} + +void DeformablePSROIPoolBackwardAcc(const at::Tensor out_grad, + const at::Tensor data, + const at::Tensor bbox, + const at::Tensor trans, + const at::Tensor top_count, + at::Tensor in_grad, + at::Tensor trans_grad, + const int batch, + const int channels, + const int height, + const int width, + const int num_bbox, + const int channels_trans, + const int no_trans, + const float spatial_scale, + const int output_dim, + const int group_size, + const int pooled_size, + const int part_size, + const int sample_per_part, + const float trans_std) +{ + // LOG(INFO) << "DeformablePSROIPoolBackward"; + const int num_rois = num_bbox; + const int pooled_height = pooled_size; + const int pooled_width = pooled_size; + const int count = num_bbox * output_dim * pooled_height * pooled_width; + const int num_classes = no_trans ? 1 : channels_trans / 2; + const int channels_each_class = no_trans ? output_dim : output_dim / num_classes; + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + out_grad.type(), "deformable_psroi_pool_backward_acc", ([&] { + const scalar_t *top_diff = out_grad.data(); + const scalar_t *bottom_data = data.data(); + const scalar_t *bottom_rois = bbox.data(); + const scalar_t *bottom_trans = no_trans ? NULL : trans.data(); + scalar_t *bottom_data_diff = in_grad.data(); + scalar_t *bottom_trans_diff = no_trans ? NULL : trans_grad.data(); + const scalar_t *top_count_data = top_count.data(); + + DeformablePSROIPoolBackwardAccKernel<<>>( + count, top_diff, top_count_data, num_rois, (scalar_t)spatial_scale, channels, height, width, + pooled_height, pooled_width, output_dim, bottom_data_diff, bottom_trans_diff, + bottom_data, bottom_rois, bottom_trans, no_trans, (scalar_t)trans_std, sample_per_part, + group_size, part_size, num_classes, channels_each_class); + })); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + { + printf("error in DeformablePSROIPoolForward: %s\n", cudaGetErrorString(err)); + } +} \ No newline at end of file diff --git a/easyocr/DBNet/backbones/__init__.py b/easyocr/DBNet/backbones/__init__.py new file mode 100644 index 0000000000..ea8c226d19 --- /dev/null +++ b/easyocr/DBNet/backbones/__init__.py @@ -0,0 +1,2 @@ +from .resnet import resnet18, resnet34, resnet50, resnet101, deformable_resnet50, deformable_resnet18 +from .mobilenetv3 import mobilenet_v3_large, mobilenet_v3_small \ No newline at end of file diff --git a/easyocr/DBNet/backbones/mobilenetv3.py b/easyocr/DBNet/backbones/mobilenetv3.py new file mode 100644 index 0000000000..0ed056be76 --- /dev/null +++ b/easyocr/DBNet/backbones/mobilenetv3.py @@ -0,0 +1,252 @@ +# https://github.com/kuan-wang/pytorch-mobilenet-v3 +import torch +import torch.nn as nn +import torch.nn.functional as F + + +__all__ = ['MobileNetV3', 'mobilenetv3'] + + +def conv_bn(inp, oup, stride, conv_layer=nn.Conv2d, norm_layer=nn.BatchNorm2d, nlin_layer=nn.ReLU): + return nn.Sequential( + conv_layer(inp, oup, 3, stride, 1, bias=False), + norm_layer(oup), + nlin_layer(inplace=True) + ) + + +def conv_1x1_bn(inp, oup, conv_layer=nn.Conv2d, norm_layer=nn.BatchNorm2d, nlin_layer=nn.ReLU): + return nn.Sequential( + conv_layer(inp, oup, 1, 1, 0, bias=False), + norm_layer(oup), + nlin_layer(inplace=True) + ) + + +class Hswish(nn.Module): + def __init__(self, inplace=True): + super(Hswish, self).__init__() + self.inplace = inplace + + def forward(self, x): + return x * F.relu6(x + 3., inplace=self.inplace) / 6. + + +class Hsigmoid(nn.Module): + def __init__(self, inplace=True): + super(Hsigmoid, self).__init__() + self.inplace = inplace + + def forward(self, x): + return F.relu6(x + 3., inplace=self.inplace) / 6. + + +class SEModule(nn.Module): + def __init__(self, channel, reduction=4): + super(SEModule, self).__init__() + self.avg_pool = nn.AdaptiveAvgPool2d(1) + self.fc = nn.Sequential( + nn.Linear(channel, channel // reduction, bias=False), + nn.ReLU(inplace=True), + nn.Linear(channel // reduction, channel, bias=False), + Hsigmoid() + # nn.Sigmoid() + ) + + def forward(self, x): + b, c, _, _ = x.size() + y = self.avg_pool(x).view(b, c) + y = self.fc(y).view(b, c, 1, 1) + return x * y.expand_as(x) + + +class Identity(nn.Module): + def __init__(self, channel): + super(Identity, self).__init__() + + def forward(self, x): + return x + + +def make_divisible(x, divisible_by=8): + import numpy as np + return int(np.ceil(x * 1. / divisible_by) * divisible_by) + + +class MobileBottleneck(nn.Module): + def __init__(self, inp, oup, kernel, stride, exp, se=False, nl='RE'): + super(MobileBottleneck, self).__init__() + assert stride in [1, 2] + assert kernel in [3, 5] + padding = (kernel - 1) // 2 + self.use_res_connect = stride == 1 and inp == oup + + conv_layer = nn.Conv2d + norm_layer = nn.BatchNorm2d + if nl == 'RE': + nlin_layer = nn.ReLU # or ReLU6 + elif nl == 'HS': + nlin_layer = Hswish + else: + raise NotImplementedError + if se: + SELayer = SEModule + else: + SELayer = Identity + + self.conv = nn.Sequential( + # pw + conv_layer(inp, exp, 1, 1, 0, bias=False), + norm_layer(exp), + nlin_layer(inplace=True), + # dw + conv_layer(exp, exp, kernel, stride, padding, groups=exp, bias=False), + norm_layer(exp), + SELayer(exp), + nlin_layer(inplace=True), + # pw-linear + conv_layer(exp, oup, 1, 1, 0, bias=False), + norm_layer(oup), + ) + + def forward(self, x): + if self.use_res_connect: + return x + self.conv(x) + else: + return self.conv(x) + + +class MobileNetV3(nn.Module): + def __init__(self, n_class=1000, input_size=224, dropout=0.8, mode='small', width_mult=1.0): + super(MobileNetV3, self).__init__() + input_channel = 16 + last_channel = 1280 + if mode == 'large': + # refer to Table 1 in paper + mobile_setting = [ + # k, exp, c, se, nl, s, + [3, 16, 16, False, 'RE', 1], + [3, 64, 24, False, 'RE', 2], + [3, 72, 24, False, 'RE', 1], # 3 + [5, 72, 40, True, 'RE', 2], + [5, 120, 40, True, 'RE', 1], + [5, 120, 40, True, 'RE', 1], # 6 + [3, 240, 80, False, 'HS', 2], + [3, 200, 80, False, 'HS', 1], + [3, 184, 80, False, 'HS', 1], + [3, 184, 80, False, 'HS', 1], + [3, 480, 112, True, 'HS', 1], + [3, 672, 112, True, 'HS', 1], # 12 + [5, 672, 160, True, 'HS', 2], + [5, 960, 160, True, 'HS', 1], + [5, 960, 160, True, 'HS', 1], + ] + elif mode == 'small': + # refer to Table 2 in paper + mobile_setting = [ + # k, exp, c, se, nl, s, + [3, 16, 16, True, 'RE', 2], + [3, 72, 24, False, 'RE', 2], + [3, 88, 24, False, 'RE', 1], + [5, 96, 40, True, 'HS', 2], + [5, 240, 40, True, 'HS', 1], + [5, 240, 40, True, 'HS', 1], + [5, 120, 48, True, 'HS', 1], + [5, 144, 48, True, 'HS', 1], + [5, 288, 96, True, 'HS', 2], + [5, 576, 96, True, 'HS', 1], + [5, 576, 96, True, 'HS', 1], + ] + else: + raise NotImplementedError + + # building first layer + assert input_size % 32 == 0 + last_channel = make_divisible(last_channel * width_mult) if width_mult > 1.0 else last_channel + self.features = nn.ModuleList([conv_bn(3, input_channel, 2, nlin_layer=Hswish)]) # start_idx = 0: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same + self.classifier = [] + + # building mobile blocks + for k, exp, c, se, nl, s in mobile_setting: + output_channel = make_divisible(c * width_mult) + exp_channel = make_divisible(exp * width_mult) + self.features.append(MobileBottleneck(input_channel, output_channel, k, s, exp_channel, se, nl)) + input_channel = output_channel + + # building last several layers + if mode == 'large': + last_conv = make_divisible(960 * width_mult) + self.features.append(conv_1x1_bn(input_channel, last_conv, nlin_layer=Hswish)) # 16 + self.features.append(nn.AdaptiveAvgPool2d(1)) + self.features.append(nn.Conv2d(last_conv, last_channel, 1, 1, 0)) + self.features.append(Hswish(inplace=True)) + elif mode == 'small': + last_conv = make_divisible(576 * width_mult) + self.features.append(conv_1x1_bn(input_channel, last_conv, nlin_layer=Hswish)) + # self.features.append(SEModule(last_conv)) # refer to paper Table2, but I think this is a mistake + self.features.append(nn.AdaptiveAvgPool2d(1)) + self.features.append(nn.Conv2d(last_conv, last_channel, 1, 1, 0)) + self.features.append(Hswish(inplace=True)) + else: + raise NotImplementedError + + # make it nn.Sequential + #self.features = nn.Sequential(*self.features) del for dbnet + + # building classifier + self.classifier = nn.Sequential( + nn.Dropout(p=dropout), # refer to paper section 6 + nn.Linear(last_channel, n_class), + ) + + self._initialize_weights() + + def forward(self, x): + '''x = self.features(x) + x = x.mean(3).mean(2) + x = self.classifier(x) + return x''' + x2, x3, x4, x5 = None, None, None, None + for stage in range(17): # https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/ppocr/modeling/backbones/det_mobilenet_v3.py + x = self.features[stage](x) + if stage == 3: # if s == 2 and start_idx > 3 + x2 = x + elif stage == 6: + x3 = x + elif stage == 12: + x4 = x + elif stage == 16: + x5 = x + return x2, x3, x4, x5 + + def _initialize_weights(self): + # weight initialization + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out') + if m.bias is not None: + nn.init.zeros_(m.bias) + elif isinstance(m, nn.BatchNorm2d): + nn.init.ones_(m.weight) + nn.init.zeros_(m.bias) + elif isinstance(m, nn.Linear): + nn.init.normal_(m.weight, 0, 0.01) + if m.bias is not None: + nn.init.zeros_(m.bias) + + +def mobilenet_v3_large(pretrained=False, **kwargs): + model = MobileNetV3(mode='large', **kwargs) + if pretrained: + state_dict = torch.load('mobilenetv3_large.pth.tar') + model.load_state_dict(state_dict, strict=True) + # raise NotImplementedError + return model + +def mobilenet_v3_small(pretrained=False, **kwargs): + model = MobileNetV3(mode='small', **kwargs) + if pretrained: + state_dict = torch.load('mobilenetv3_small_67.4.pth.tar') + model.load_state_dict(state_dict, strict=True) + # raise NotImplementedError + return model diff --git a/easyocr/DBNet/backbones/resnet.py b/easyocr/DBNet/backbones/resnet.py new file mode 100644 index 0000000000..f48c7bcfdc --- /dev/null +++ b/easyocr/DBNet/backbones/resnet.py @@ -0,0 +1,340 @@ +import torch.nn as nn +import math +import torch.utils.model_zoo as model_zoo +BatchNorm2d = nn.BatchNorm2d + +__all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', + 'resnet152'] + + +model_urls = { + 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth', + 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth', + 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth', + 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth', + 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth', +} + + +def constant_init(module, constant, bias=0): + nn.init.constant_(module.weight, constant) + if hasattr(module, 'bias'): + nn.init.constant_(module.bias, bias) + + +def conv3x3(in_planes, out_planes, stride=1): + """3x3 convolution with padding""" + return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, + padding=1, bias=False) + + +class BasicBlock(nn.Module): + expansion = 1 + + def __init__(self, inplanes, planes, stride=1, downsample=None, dcn=None): + super(BasicBlock, self).__init__() + self.with_dcn = dcn is not None + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = BatchNorm2d(planes) + self.relu = nn.ReLU(inplace=True) + self.with_modulated_dcn = False + if self.with_dcn: + fallback_on_stride = dcn.get('fallback_on_stride', False) + self.with_modulated_dcn = dcn.get('modulated', False) + # self.conv2 = conv3x3(planes, planes) + if not self.with_dcn or fallback_on_stride: + self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, + padding=1, bias=False) + else: + deformable_groups = dcn.get('deformable_groups', 1) + if not self.with_modulated_dcn: + #from assets.ops.dcn import DeformConv + from ..assets.ops.dcn import DeformConv + conv_op = DeformConv + offset_channels = 18 + else: + #from assets.ops.dcn import ModulatedDeformConv + from ..assets.ops.dcn import ModulatedDeformConv + conv_op = ModulatedDeformConv + offset_channels = 27 + self.conv2_offset = nn.Conv2d( + planes, + deformable_groups * offset_channels, + kernel_size=3, + padding=1) + self.conv2 = conv_op( + planes, + planes, + kernel_size=3, + padding=1, + deformable_groups=deformable_groups, + bias=False) + self.bn2 = BatchNorm2d(planes) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + # out = self.conv2(out) + if not self.with_dcn: + out = self.conv2(out) + elif self.with_modulated_dcn: + offset_mask = self.conv2_offset(out) + offset = offset_mask[:, :18, :, :] + mask = offset_mask[:, -9:, :, :].sigmoid() + out = self.conv2(out, offset, mask) + else: + offset = self.conv2_offset(out) + out = self.conv2(out, offset) + out = self.bn2(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, downsample=None, dcn=None): + super(Bottleneck, self).__init__() + self.with_dcn = dcn is not None + self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) + self.bn1 = BatchNorm2d(planes) + fallback_on_stride = False + self.with_modulated_dcn = False + if self.with_dcn: + fallback_on_stride = dcn.get('fallback_on_stride', False) + self.with_modulated_dcn = dcn.get('modulated', False) + if not self.with_dcn or fallback_on_stride: + self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, + stride=stride, padding=1, bias=False) + else: + deformable_groups = dcn.get('deformable_groups', 1) + if not self.with_modulated_dcn: + #from assets.ops.dcn import DeformConv + from ..assets.ops.dcn import DeformConv + conv_op = DeformConv + offset_channels = 18 + else: + #from assets.ops.dcn import ModulatedDeformConv + from ..assets.ops.dcn import ModulatedDeformConv + conv_op = ModulatedDeformConv + offset_channels = 27 + self.conv2_offset = nn.Conv2d( + planes, deformable_groups * offset_channels, + kernel_size=3, + padding=1) + self.conv2 = conv_op( + planes, planes, kernel_size=3, padding=1, stride=stride, + deformable_groups=deformable_groups, bias=False) + self.bn2 = BatchNorm2d(planes) + self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False) + self.bn3 = BatchNorm2d(planes * 4) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + self.dcn = dcn + self.with_dcn = dcn is not None + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + # out = self.conv2(out) + if not self.with_dcn: + out = self.conv2(out) + elif self.with_modulated_dcn: + offset_mask = self.conv2_offset(out) + offset = offset_mask[:, :18, :, :] + mask = offset_mask[:, -9:, :, :].sigmoid() + out = self.conv2(out, offset, mask) + else: + offset = self.conv2_offset(out) + out = self.conv2(out, offset) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class ResNet(nn.Module): + def __init__(self, block, layers, num_classes=1000, + dcn=None, stage_with_dcn=(False, False, False, False)): + self.dcn = dcn + self.stage_with_dcn = stage_with_dcn + self.inplanes = 64 + super(ResNet, self).__init__() + self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, + bias=False) + self.bn1 = BatchNorm2d(64) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + self.layer1 = self._make_layer(block, 64, layers[0]) + self.layer2 = self._make_layer( + block, 128, layers[1], stride=2, dcn=dcn) + self.layer3 = self._make_layer( + block, 256, layers[2], stride=2, dcn=dcn) + self.layer4 = self._make_layer( + block, 512, layers[3], stride=2, dcn=dcn) + self.avgpool = nn.AvgPool2d(7, stride=1) + self.fc = nn.Linear(512 * block.expansion, num_classes) + + self.smooth = nn.Conv2d(2048, 256, kernel_size=1, stride=1, padding=1) + + for m in self.modules(): + if isinstance(m, nn.Conv2d): + n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + m.weight.data.normal_(0, math.sqrt(2. / n)) + elif isinstance(m, BatchNorm2d): + m.weight.data.fill_(1) + m.bias.data.zero_() + if self.dcn is not None: + for m in self.modules(): + if isinstance(m, Bottleneck) or isinstance(m, BasicBlock): + if hasattr(m, 'conv2_offset'): + constant_init(m.conv2_offset, 0) + + def _make_layer(self, block, planes, blocks, stride=1, dcn=None): + downsample = None + if stride != 1 or self.inplanes != planes * block.expansion: + downsample = nn.Sequential( + nn.Conv2d(self.inplanes, planes * block.expansion, + kernel_size=1, stride=stride, bias=False), + BatchNorm2d(planes * block.expansion), + ) + + layers = [] + layers.append(block(self.inplanes, planes, + stride, downsample, dcn=dcn)) + self.inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append(block(self.inplanes, planes, dcn=dcn)) + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + x = self.maxpool(x) + + x2 = self.layer1(x) + x3 = self.layer2(x2) + x4 = self.layer3(x3) + x5 = self.layer4(x4) + + return x2, x3, x4, x5 + + +def resnet18(pretrained=True, **kwargs): + """Constructs a ResNet-18 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url( + model_urls['resnet18']), strict=False) + return model + +def deformable_resnet18(pretrained=True, **kwargs): + """Constructs a ResNet-18 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(BasicBlock, [2, 2, 2, 2], + dcn=dict(modulated=True, + deformable_groups=1, + fallback_on_stride=False), + stage_with_dcn=[False, True, True, True], **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url( + model_urls['resnet18']), strict=False) + return model + + +def resnet34(pretrained=True, **kwargs): + """Constructs a ResNet-34 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url( + model_urls['resnet34']), strict=False) + return model + + +def resnet50(pretrained=True, **kwargs): + """Constructs a ResNet-50 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url( + model_urls['resnet50']), strict=False) + return model + + +def deformable_resnet50(pretrained=True, **kwargs): + """Constructs a ResNet-50 model with deformable conv. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(Bottleneck, [3, 4, 6, 3], + dcn=dict(modulated=True, + deformable_groups=1, + fallback_on_stride=False), + stage_with_dcn=[False, True, True, True], + **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url( + model_urls['resnet50']), strict=False) + return model + + +def resnet101(pretrained=True, **kwargs): + """Constructs a ResNet-101 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url( + model_urls['resnet101']), strict=False) + return model + + +def resnet152(pretrained=True, **kwargs): + """Constructs a ResNet-152 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url( + model_urls['resnet152']), strict=False) + return model diff --git a/easyocr/DBNet/configs/DBNet_inference.yaml b/easyocr/DBNet/configs/DBNet_inference.yaml new file mode 100644 index 0000000000..c85bac24d5 --- /dev/null +++ b/easyocr/DBNet/configs/DBNet_inference.yaml @@ -0,0 +1,50 @@ +resnet18: + model: + class: model.detector.Detector + structure: + class: model.detector.Model + builder: + class: model.detector.Builder + model: SegDetectorModel + model_args: + backbone: deformable_resnet18 + decoder: SegDetector + decoder_args: + adaptive: True + in_channels: + - 64 + - 128 + - 256 + - 512 + k: 50 + loss_class: L1BalanceCELoss + weight: + pretrained: pretrained_ic15_res18.pt +resnet50: + model: + class: model.detector.Detector + structure: + class: model.detector.Model + builder: + class: model.detector.Builder + model: SegDetectorModel + model_args: + backbone: deformable_resnet50 + decoder: SegDetector + decoder_args: + adaptive: True + in_channels: + - 256 + - 512 + - 1024 + - 2048 + k: 50 + loss_class: L1BalanceCELoss + weight: + pretrained: pretrained_ic15_res50.pt +BGR_MEAN: + - 122.67891434 + - 116.66876762 + - 104.00698793 +min_detection_size: 640 +max_detection_size: 2560 diff --git a/easyocr/DBNet/decoders/__init__.py b/easyocr/DBNet/decoders/__init__.py new file mode 100644 index 0000000000..3e06ab723f --- /dev/null +++ b/easyocr/DBNet/decoders/__init__.py @@ -0,0 +1,6 @@ +from .seg_detector import SegDetector +from .seg_detector_asf import SegSpatialScaleDetector +from .dice_loss import DiceLoss +from .pss_loss import PSS_Loss +from .l1_loss import MaskL1Loss +from .balance_cross_entropy_loss import BalanceCrossEntropyLoss diff --git a/easyocr/DBNet/decoders/balance_cross_entropy_loss.py b/easyocr/DBNet/decoders/balance_cross_entropy_loss.py new file mode 100644 index 0000000000..44c7bf781d --- /dev/null +++ b/easyocr/DBNet/decoders/balance_cross_entropy_loss.py @@ -0,0 +1,56 @@ +import torch +import torch.nn as nn + + +class BalanceCrossEntropyLoss(nn.Module): + ''' + Balanced cross entropy loss. + Shape: + - Input: :math:`(N, 1, H, W)` + - GT: :math:`(N, 1, H, W)`, same shape as the input + - Mask: :math:`(N, H, W)`, same spatial shape as the input + - Output: scalar. + + Examples:: + + >>> m = nn.Sigmoid() + >>> loss = nn.BCELoss() + >>> input = torch.randn(3, requires_grad=True) + >>> target = torch.empty(3).random_(2) + >>> output = loss(m(input), target) + >>> output.backward() + ''' + + def __init__(self, negative_ratio=3.0, eps=1e-6): + super(BalanceCrossEntropyLoss, self).__init__() + self.negative_ratio = negative_ratio + self.eps = eps + + def forward(self, + pred: torch.Tensor, + gt: torch.Tensor, + mask: torch.Tensor, + return_origin=False): + ''' + Args: + pred: shape :math:`(N, 1, H, W)`, the prediction of network + gt: shape :math:`(N, 1, H, W)`, the target + mask: shape :math:`(N, H, W)`, the mask indicates positive regions + ''' + positive = (gt[:,0,:,:] * mask).byte() + negative = ((1 - gt[:,0,:,:]) * mask).byte() + positive_count = int(positive.float().sum()) + negative_count = min(int(negative.float().sum()), + int(positive_count * self.negative_ratio)) + loss = nn.functional.binary_cross_entropy( + pred, gt, reduction='none')[:, 0, :, :] + positive_loss = loss * positive.float() + negative_loss = loss * negative.float() + negative_loss, _ = torch.topk(negative_loss.view(-1), negative_count) + + balance_loss = (positive_loss.sum() + negative_loss.sum()) /\ + (positive_count + negative_count + self.eps) + + if return_origin: + return balance_loss, loss + return balance_loss diff --git a/easyocr/DBNet/decoders/dice_loss.py b/easyocr/DBNet/decoders/dice_loss.py new file mode 100644 index 0000000000..e3681dbb28 --- /dev/null +++ b/easyocr/DBNet/decoders/dice_loss.py @@ -0,0 +1,186 @@ +import torch +import torch.nn as nn +import numpy as np +import cv2 +from scipy import ndimage + + +class DiceLoss(nn.Module): + ''' + Loss function from https://arxiv.org/abs/1707.03237, + where iou computation is introduced heatmap manner to measure the + diversity bwtween tow heatmaps. + ''' + def __init__(self, eps=1e-6): + super(DiceLoss, self).__init__() + self.eps = eps + + def forward(self, pred: torch.Tensor, gt, mask, weights=None): + ''' + pred: one or two heatmaps of shape (N, 1, H, W), + the losses of tow heatmaps are added together. + gt: (N, 1, H, W) + mask: (N, H, W) + ''' + assert pred.dim() == 4, pred.dim() + return self._compute(pred, gt, mask, weights) + + def _compute(self, pred, gt, mask, weights): + if pred.dim() == 4: + pred = pred[:, 0, :, :] + gt = gt[:, 0, :, :] + assert pred.shape == gt.shape + assert pred.shape == mask.shape + if weights is not None: + assert weights.shape == mask.shape + mask = weights * mask + + intersection = (pred * gt * mask).sum() + union = (pred * mask).sum() + (gt * mask).sum() + self.eps + loss = 1 - 2.0 * intersection / union + assert loss <= 1 + return loss + + +class LeakyDiceLoss(nn.Module): + ''' + Variation from DiceLoss. + The coverage and union are computed separately. + ''' + def __init__(self, eps=1e-6, coverage_scale=5.0): + super(LeakyDiceLoss, self).__init__() + self.eps = eps + self.coverage_scale = coverage_scale + + def forward(self, pred, gt, mask): + if pred.dim() == 4: + pred = pred[:, 0, :, :] + gt = gt[:, 0, :, :] + assert pred.shape == gt.shape + assert pred.shape == mask.shape + + coverage = (pred * mask * gt).sum() / ((gt * mask).sum() + self.eps) + assert coverage <= 1 + coverage = 1 - coverage + excede = (pred * mask * gt).sum() / ((pred * mask).sum() + self.eps) + assert excede <= 1 + excede = 1 - excede + loss = coverage * self.coverage_scale + excede + return loss, dict(coverage=coverage, excede=excede) + + +class InstanceDiceLoss(DiceLoss): + ''' + DiceLoss normalized on each instance. + Input: + pred: (N, 1, H, W) + gt: (N, 1, H, W) + mask: (N, H, W) + Note: This class assume that input tensors are on gpu, + while cput computation is required to find union areas. + ''' + REDUCTION = ['mean', 'sum', 'none'] + + def __init__(self, threshold=0.3, iou_thresh=0.2, reduction=None, + max_regions=100, eps=1e-6): + nn.Module.__init__(self) + self.threshold = threshold + self.iou_thresh = iou_thresh + self.reduction = reduction + if self.reduction is None: + self.reduction = 'mean' + assert self.reduction in self.REDUCTION + self.max_regions = max_regions + self.eps = eps + + def label(self, tensor_on_gpu, blur=None): + ''' + Args: + tensor_on_gpu: (N, 1, H, W) + blur: Lambda. If exists, each instance will be blured using `blur`. + ''' + tensor = tensor_on_gpu.cpu().detach().numpy() + + instance_maps = [] + instance_counts = [] + for batch_index in range(tensor_on_gpu.shape[0]): + instance = tensor[batch_index] + if blur is not None: + instance = blur(instance) + lable_map, instance_count = ndimage.label(instance[0]) + instance_count = min(self.max_regions, instance_count) + instance_map = [] + for index in range(1, instance_count): + instance = torch.from_numpy( + lable_map == index).to(tensor_on_gpu.device).type(torch.float32) + instance_map.append(instance) + instance_maps.append(instance_map) + return instance_maps, instance_counts + + def iou(self, pred, gt): + overlap = (pred * gt).sum() + return max(overlap / pred.sum(), overlap / gt.sum()) + + def replace_or_add(self, dest, value): + if dest is None: + return value + if value is None: + return dest + return dest + value + + def forward(self, pred, gt, mask): + # pred_label_maps: N, P, H, W, where P is the number of regions. + torch.cuda.synchronize() + pred_label_maps, _ = self.label(pred > self.threshold) + gt_label_maps, _ = self.label(gt) + + losses = [] + for batch_index, gt_instance_maps in enumerate(gt_label_maps): + pred_instance_maps = pred_label_maps[batch_index] + if gt_instance_maps is None or pred_instance_maps is None: + continue + + single_loss = None # loss on a single image in a batch + mask_not_matched = set(range(len(pred_instance_maps))) + for gt_instance_map in gt_instance_maps: + instance_loss = None # loss on a specific gt region + for instance_index, pred_instance_map in enumerate(pred_instance_maps): + if self.iou(pred_instance_map, gt_instance_map) > self.iou_thresh: + match_loss = self._compute( + pred[batch_index][0], gt[batch_index][0], + mask[batch_index] * (pred_instance_map + gt_instance_map > 0).type(torch.float32)) + instance_loss = self.replace_or_add(instance_loss, match_loss) + if instance_index in mask_not_matched: + mask_not_matched.remove(instance_index) + if instance_loss is None: + instance_loss = self._compute( + pred[batch_index][0], gt[batch_index][0], + mask[batch_index] * gt_instance_map) + single_loss = self.replace_or_add(single_loss, instance_loss) + + '''Whether to compute single loss on instances which contrain no positive sample. + if single_loss is None: + single_loss = self._compute( + pred[batch_index][0], gt[batch_index][0], + mask[batch_index]) + ''' + + for instance_index in mask_not_matched: + single_loss = self.replace_or_add( + single_loss, + self._compute( + pred[batch_index][0], gt[batch_index][0], + mask[batch_index] * pred_instance_maps[instance_index])) + + if single_loss is not None: + losses.append(single_loss) + + if self.reduction == 'none': + loss = losses + else: + assert self.reduction in ['sum', 'mean'] + count = len(losses) + loss = sum(losses) + if self.reduction == 'mean': + loss = loss / count + return loss diff --git a/easyocr/DBNet/decoders/feature_attention.py b/easyocr/DBNet/decoders/feature_attention.py new file mode 100644 index 0000000000..1c737cc470 --- /dev/null +++ b/easyocr/DBNet/decoders/feature_attention.py @@ -0,0 +1,145 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +class ScaleChannelAttention(nn.Module): + def __init__(self, in_planes, out_planes, num_features, init_weight=True): + super(ScaleChannelAttention, self).__init__() + self.avgpool = nn.AdaptiveAvgPool2d(1) + print(self.avgpool) + self.fc1 = nn.Conv2d(in_planes, out_planes, 1, bias=False) + self.bn = nn.BatchNorm2d(out_planes) + self.fc2 = nn.Conv2d(out_planes, num_features, 1, bias=False) + if init_weight: + self._initialize_weights() + + def _initialize_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') + if m.bias is not None: + nn.init.constant_(m.bias, 0) + if isinstance(m ,nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + + def forward(self, x): + global_x = self.avgpool(x) + global_x = self.fc1(global_x) + global_x = F.relu(self.bn(global_x)) + global_x = self.fc2(global_x) + global_x = F.softmax(global_x, 1) + return global_x + +class ScaleChannelSpatialAttention(nn.Module): + def __init__(self, in_planes, out_planes, num_features, init_weight=True): + super(ScaleChannelSpatialAttention, self).__init__() + self.channel_wise = nn.Sequential( + nn.AdaptiveAvgPool2d(1), + nn.Conv2d(in_planes, out_planes , 1, bias=False), + # nn.BatchNorm2d(out_planes), + nn.ReLU(), + nn.Conv2d(out_planes, in_planes, 1, bias=False) + ) + self.spatial_wise = nn.Sequential( + #Nx1xHxW + nn.Conv2d(1, 1, 3, bias=False, padding=1), + nn.ReLU(), + nn.Conv2d(1, 1, 1, bias=False), + nn.Sigmoid() + ) + self.attention_wise = nn.Sequential( + nn.Conv2d(in_planes, num_features, 1, bias=False), + nn.Sigmoid() + ) + if init_weight: + self._initialize_weights() + + def _initialize_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') + if m.bias is not None: + nn.init.constant_(m.bias, 0) + if isinstance(m ,nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + + def forward(self, x): + # global_x = self.avgpool(x) + #shape Nx4x1x1 + global_x = self.channel_wise(x).sigmoid() + #shape: NxCxHxW + global_x = global_x + x + #shape:Nx1xHxW + x = torch.mean(global_x, dim=1, keepdim=True) + global_x = self.spatial_wise(x) + global_x + global_x = self.attention_wise(global_x) + return global_x + +class ScaleSpatialAttention(nn.Module): + def __init__(self, in_planes, out_planes, num_features, init_weight=True): + super(ScaleSpatialAttention, self).__init__() + self.spatial_wise = nn.Sequential( + #Nx1xHxW + nn.Conv2d(1, 1, 3, bias=False, padding=1), + nn.ReLU(), + nn.Conv2d(1, 1, 1, bias=False), + nn.Sigmoid() + ) + self.attention_wise = nn.Sequential( + nn.Conv2d(in_planes, num_features, 1, bias=False), + nn.Sigmoid() + ) + if init_weight: + self._initialize_weights() + + def _initialize_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') + if m.bias is not None: + nn.init.constant_(m.bias, 0) + if isinstance(m ,nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + + def forward(self, x): + global_x = torch.mean(x, dim=1, keepdim=True) + global_x = self.spatial_wise(global_x) + x + global_x = self.attention_wise(global_x) + return global_x + +class ScaleFeatureSelection(nn.Module): + def __init__(self, in_channels, inter_channels , out_features_num=4, attention_type='scale_spatial'): + super(ScaleFeatureSelection, self).__init__() + self.in_channels=in_channels + self.inter_channels = inter_channels + self.out_features_num = out_features_num + self.conv = nn.Conv2d(in_channels, inter_channels, 3, padding=1) + self.type = attention_type + if self.type == 'scale_spatial': + self.enhanced_attention = ScaleSpatialAttention(inter_channels, inter_channels//4, out_features_num) + elif self.type == 'scale_channel_spatial': + self.enhanced_attention = ScaleChannelSpatialAttention(inter_channels, inter_channels // 4, out_features_num) + elif self.type == 'scale_channel': + self.enhanced_attention = ScaleChannelAttention(inter_channels, inter_channels//2, out_features_num) + + def _initialize_weights(self, m): + classname = m.__class__.__name__ + if classname.find('Conv') != -1: + nn.init.kaiming_normal_(m.weight.data) + elif classname.find('BatchNorm') != -1: + m.weight.data.fill_(1.) + m.bias.data.fill_(1e-4) + def forward(self, concat_x, features_list): + concat_x = self.conv(concat_x) + score = self.enhanced_attention(concat_x) + assert len(features_list) == self.out_features_num + if self.type not in ['scale_channel_spatial', 'scale_spatial']: + shape = features_list[0].shape[2:] + score = F.interpolate(score, size=shape, mode='bilinear') + x = [] + for i in range(self.out_features_num): + x.append(score[:, i:i+1] * features_list[i]) + return torch.cat(x, dim=1) \ No newline at end of file diff --git a/easyocr/DBNet/decoders/l1_loss.py b/easyocr/DBNet/decoders/l1_loss.py new file mode 100644 index 0000000000..c272700b1c --- /dev/null +++ b/easyocr/DBNet/decoders/l1_loss.py @@ -0,0 +1,41 @@ +import torch +import torch.nn as nn + + +class MaskL1Loss(nn.Module): + def __init__(self): + super(MaskL1Loss, self).__init__() + + def forward(self, pred: torch.Tensor, gt, mask): + mask_sum = mask.sum() + if mask_sum.item() == 0: + return mask_sum, dict(l1_loss=mask_sum) + else: + loss = (torch.abs(pred[:, 0] - gt) * mask).sum() / mask_sum + return loss, dict(l1_loss=loss) + + +class BalanceL1Loss(nn.Module): + def __init__(self, negative_ratio=3.): + super(BalanceL1Loss, self).__init__() + self.negative_ratio = negative_ratio + + def forward(self, pred: torch.Tensor, gt, mask): + ''' + Args: + pred: (N, 1, H, W). + gt: (N, H, W). + mask: (N, H, W). + ''' + loss = torch.abs(pred[:, 0] - gt) + positive = loss * mask + negative = loss * (1 - mask) + positive_count = int(mask.sum()) + negative_count = min( + int((1 - mask).sum()), + int(positive_count * self.negative_ratio)) + negative_loss, _ = torch.topk(negative.view(-1), negative_count) + negative_loss = negative_loss.sum() / negative_count + positive_loss = positive.sum() / positive_count + return positive_loss + negative_loss,\ + dict(l1_loss=positive_loss, nge_l1_loss=negative_loss) diff --git a/easyocr/DBNet/decoders/pss_loss.py b/easyocr/DBNet/decoders/pss_loss.py new file mode 100644 index 0000000000..734a6bf64d --- /dev/null +++ b/easyocr/DBNet/decoders/pss_loss.py @@ -0,0 +1,115 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +class PSS_Loss(nn.Module): + + def __init__(self, cls_loss): + super(PSS_Loss, self).__init__() + self.eps = 1e-6 + self.criterion = eval('self.' + cls_loss + '_loss') + + def dice_loss(self, pred, gt, m): + intersection = torch.sum(pred*gt*m) + union = torch.sum(pred*m) + torch.sum(gt*m) + self.eps + loss = 1 - 2.0*intersection/union + if loss > 1: + print(intersection, union) + return loss + + def dice_ohnm_loss(self, pred, gt, m): + pos_index = (gt == 1) * (m == 1) + neg_index = (gt == 0) * (m == 1) + pos_num = pos_index.float().sum().item() + neg_num = neg_index.float().sum().item() + if pos_num == 0 or neg_num < pos_num*3.0: + return self.dice_loss(pred, gt, m) + else: + neg_num = int(pos_num*3) + pos_pred = pred[pos_index] + neg_pred = pred[neg_index] + neg_sort, _ = torch.sort(neg_pred, descending=True) + sampled_neg_pred = neg_sort[:neg_num] + pos_gt = pos_pred.clone() + pos_gt.data.fill_(1.0) + pos_gt = pos_gt.detach() + neg_gt = sampled_neg_pred.clone() + neg_gt.data.fill_(0) + neg_gt = neg_gt.detach() + tpred = torch.cat((pos_pred, sampled_neg_pred)) + tgt = torch.cat((pos_gt, neg_gt)) + intersection = torch.sum(tpred * tgt) + union = torch.sum(tpred) + torch.sum(gt) + self.eps + loss = 1 - 2.0 * intersection / union + return loss + + def focal_loss(self, pred, gt, m, alpha=0.25, gamma=0.6): + pos_mask = (gt == 1).float() + neg_mask = (gt == 0).float() + mask = alpha*pos_mask * \ + torch.pow(1-pred.data, gamma)+(1-alpha) * \ + neg_mask*torch.pow(pred.data, gamma) + l = F.binary_cross_entropy(pred, gt, weight=mask, reduction='none') + loss = torch.sum(l*m)/(self.eps+m.sum()) + loss *= 10 + return loss + + def wbce_orig_loss(self, pred, gt, m): + n, h, w = pred.size() + assert (torch.max(gt) == 1) + pos_neg_p = pred[m.byte()] + pos_neg_t = gt[m.byte()] + pos_mask = (pos_neg_t == 1).squeeze() + w = pos_mask.float() * (1 - pos_mask).sum().item() + \ + (1 - pos_mask).float() * pos_mask.sum().item() + w = w / (pos_mask.size(0)) + loss = F.binary_cross_entropy(pos_neg_p, pos_neg_t, w, reduction='sum') + return loss + + def wbce_loss(self, pred, gt, m): + pos_mask = (gt == 1).float()*m + neg_mask = (gt == 0).float()*m + # mask=(pos_mask*neg_mask.sum()+neg_mask*pos_mask.sum())/m.sum() + # loss=torch.sum(l) + mask = pos_mask * neg_mask.sum() / pos_mask.sum() + neg_mask + l = F.binary_cross_entropy(pred, gt, weight=mask, reduction='none') + loss = torch.sum(l)/(m.sum()+self.eps) + return loss + + def bce_loss(self, pred, gt, m): + l = F.binary_cross_entropy(pred, gt, weight=m, reduction='sum') + loss = l/(m.sum()+self.eps) + return loss + + def dice_bce_loss(self, pred, gt, m): + return (self.dice_loss(pred, gt, m) + self.bce_loss(pred, gt, m)) / 2.0 + + def dice_ohnm_bce_loss(self, pred, gt, m): + return (self.dice_ohnm_loss(pred, gt, m) + self.bce_loss(pred, gt, m)) / 2.0 + + def forward(self, pred, gt, mask, gt_type='shrink'): + if gt_type == 'shrink': + loss = self.get_loss(pred, gt, mask) + return loss + elif gt_type == 'pss': + loss = self.get_loss(pred, gt[:, :4, :, :], mask) + g_g = gt[:, 4, :, :] + g_p, _ = torch.max(pred, 1) + loss += self.criterion(g_p, g_g, mask) + return loss + elif gt_type == 'both': + pss_loss = self.get_loss(pred[:, :4, :, :], gt[:, :4, :, :], mask) + g_g = gt[:, 4, :, :] + g_p, _ = torch.max(pred, 1) + pss_loss += self.criterion(g_p, g_g, mask) + shrink_loss = self.criterion( + pred[:, 4, :, :], gt[:, 5, :, :], mask) + return pss_loss, shrink_loss + else: + return NotImplementedError('gt_type [%s] is not implemented', gt_type) + + def get_loss(self, pred, gt, mask): + loss = torch.tensor(0.) + for ind in range(pred.size(1)): + loss += self.criterion(pred[:, ind, :, :], gt[:, ind, :, :], mask) + return loss diff --git a/easyocr/DBNet/decoders/seg_detector.py b/easyocr/DBNet/decoders/seg_detector.py new file mode 100644 index 0000000000..54290a7c66 --- /dev/null +++ b/easyocr/DBNet/decoders/seg_detector.py @@ -0,0 +1,152 @@ +from collections import OrderedDict + +import torch +import torch.nn as nn +BatchNorm2d = nn.BatchNorm2d + +class SegDetector(nn.Module): + def __init__(self, + in_channels=[64, 128, 256, 512], + inner_channels=256, k=10, + bias=False, adaptive=False, smooth=False, serial=False, + *args, **kwargs): + ''' + bias: Whether conv layers have bias or not. + adaptive: Whether to use adaptive threshold training or not. + smooth: If true, use bilinear instead of deconv. + serial: If true, thresh prediction will combine segmentation result as input. + ''' + super(SegDetector, self).__init__() + self.k = k + self.serial = serial + self.up5 = nn.Upsample(scale_factor=2, mode='nearest') + self.up4 = nn.Upsample(scale_factor=2, mode='nearest') + self.up3 = nn.Upsample(scale_factor=2, mode='nearest') + + self.in5 = nn.Conv2d(in_channels[-1], inner_channels, 1, bias=bias) + self.in4 = nn.Conv2d(in_channels[-2], inner_channels, 1, bias=bias) + self.in3 = nn.Conv2d(in_channels[-3], inner_channels, 1, bias=bias) + self.in2 = nn.Conv2d(in_channels[-4], inner_channels, 1, bias=bias) + + self.out5 = nn.Sequential( + nn.Conv2d(inner_channels, inner_channels // + 4, 3, padding=1, bias=bias), + nn.Upsample(scale_factor=8, mode='nearest')) + self.out4 = nn.Sequential( + nn.Conv2d(inner_channels, inner_channels // + 4, 3, padding=1, bias=bias), + nn.Upsample(scale_factor=4, mode='nearest')) + self.out3 = nn.Sequential( + nn.Conv2d(inner_channels, inner_channels // + 4, 3, padding=1, bias=bias), + nn.Upsample(scale_factor=2, mode='nearest')) + self.out2 = nn.Conv2d( + inner_channels, inner_channels//4, 3, padding=1, bias=bias) + + self.binarize = nn.Sequential( + nn.Conv2d(inner_channels, inner_channels // + 4, 3, padding=1, bias=bias), + BatchNorm2d(inner_channels//4), + nn.ReLU(inplace=True), + nn.ConvTranspose2d(inner_channels//4, inner_channels//4, 2, 2), + BatchNorm2d(inner_channels//4), + nn.ReLU(inplace=True), + nn.ConvTranspose2d(inner_channels//4, 1, 2, 2), + nn.Sigmoid()) + self.binarize.apply(self.weights_init) + + self.adaptive = adaptive + if adaptive: + self.thresh = self._init_thresh( + inner_channels, serial=serial, smooth=smooth, bias=bias) + self.thresh.apply(self.weights_init) + + self.in5.apply(self.weights_init) + self.in4.apply(self.weights_init) + self.in3.apply(self.weights_init) + self.in2.apply(self.weights_init) + self.out5.apply(self.weights_init) + self.out4.apply(self.weights_init) + self.out3.apply(self.weights_init) + self.out2.apply(self.weights_init) + + def weights_init(self, m): + classname = m.__class__.__name__ + if classname.find('Conv') != -1: + nn.init.kaiming_normal_(m.weight.data) + elif classname.find('BatchNorm') != -1: + m.weight.data.fill_(1.) + m.bias.data.fill_(1e-4) + + def _init_thresh(self, inner_channels, + serial=False, smooth=False, bias=False): + in_channels = inner_channels + if serial: + in_channels += 1 + self.thresh = nn.Sequential( + nn.Conv2d(in_channels, inner_channels // + 4, 3, padding=1, bias=bias), + BatchNorm2d(inner_channels//4), + nn.ReLU(inplace=True), + self._init_upsample(inner_channels // 4, inner_channels//4, smooth=smooth, bias=bias), + BatchNorm2d(inner_channels//4), + nn.ReLU(inplace=True), + self._init_upsample(inner_channels // 4, 1, smooth=smooth, bias=bias), + nn.Sigmoid()) + return self.thresh + + def _init_upsample(self, + in_channels, out_channels, + smooth=False, bias=False): + if smooth: + inter_out_channels = out_channels + if out_channels == 1: + inter_out_channels = in_channels + module_list = [ + nn.Upsample(scale_factor=2, mode='nearest'), + nn.Conv2d(in_channels, inter_out_channels, 3, 1, 1, bias=bias)] + if out_channels == 1: + module_list.append( + nn.Conv2d(in_channels, out_channels, + kernel_size=1, stride=1, padding=1, bias=True)) + + return nn.Sequential(module_list) + else: + return nn.ConvTranspose2d(in_channels, out_channels, 2, 2) + + def forward(self, features, gt=None, masks=None, training=False): + c2, c3, c4, c5 = features + in5 = self.in5(c5) + in4 = self.in4(c4) + in3 = self.in3(c3) + in2 = self.in2(c2) + + out4 = self.up5(in5) + in4 # 1/16 + out3 = self.up4(out4) + in3 # 1/8 + out2 = self.up3(out3) + in2 # 1/4 + + p5 = self.out5(in5) + p4 = self.out4(out4) + p3 = self.out3(out3) + p2 = self.out2(out2) + + fuse = torch.cat((p5, p4, p3, p2), 1) + # this is the pred module, not binarization module; + # We do not correct the name due to the trained model. + binary = self.binarize(fuse) + if self.training: + result = OrderedDict(binary=binary) + else: + return binary + if self.adaptive and self.training: + if self.serial: + fuse = torch.cat( + (fuse, nn.functional.interpolate( + binary, fuse.shape[2:])), 1) + thresh = self.thresh(fuse) + thresh_binary = self.step_function(binary, thresh) + result.update(thresh=thresh, thresh_binary=thresh_binary) + return result + + def step_function(self, x, y): + return torch.reciprocal(1 + torch.exp(-self.k * (x - y))) diff --git a/easyocr/DBNet/decoders/seg_detector_asf.py b/easyocr/DBNet/decoders/seg_detector_asf.py new file mode 100644 index 0000000000..d0d937bd5f --- /dev/null +++ b/easyocr/DBNet/decoders/seg_detector_asf.py @@ -0,0 +1,163 @@ +from collections import OrderedDict +import pdb +import torch +import torch.nn as nn +from .feature_attention import ScaleFeatureSelection +BatchNorm2d = nn.BatchNorm2d + + +class SegSpatialScaleDetector(nn.Module): + def __init__(self, + in_channels=[64, 128, 256, 512], + inner_channels=256, k=10, + bias=False, adaptive=False, smooth=False, serial=False,fpn=True, attention_type='scale_spatial', + *args, **kwargs): + ''' + bias: Whether conv layers have bias or not. + adaptive: Whether to use adaptive threshold training or not. + smooth: If true, use bilinear instead of deconv. + serial: If true, thresh prediction will combine segmentation result as input. + ''' + super(SegSpatialScaleDetector, self).__init__() + self.k = k + self.serial = serial + self.fpn = fpn + self.up5 = nn.Upsample(scale_factor=2, mode='nearest') + self.up4 = nn.Upsample(scale_factor=2, mode='nearest') + self.up3 = nn.Upsample(scale_factor=2, mode='nearest') + + self.in5 = nn.Conv2d(in_channels[-1], inner_channels, 1, bias=bias) + self.in4 = nn.Conv2d(in_channels[-2], inner_channels, 1, bias=bias) + self.in3 = nn.Conv2d(in_channels[-3], inner_channels, 1, bias=bias) + self.in2 = nn.Conv2d(in_channels[-4], inner_channels, 1, bias=bias) + + if self.fpn: + self.out5 = nn.Sequential( + nn.Conv2d(inner_channels, inner_channels // 4, 3, padding=1, bias=bias), + nn.Upsample(scale_factor=8, mode='nearest')) + self.out4 = nn.Sequential( + nn.Conv2d(inner_channels, inner_channels // 4, 3, padding=1, bias=bias), + nn.Upsample(scale_factor=4, mode='nearest')) + self.out3 = nn.Sequential( + nn.Conv2d(inner_channels, inner_channels // 4, 3, padding=1, bias=bias), + nn.Upsample(scale_factor=2, mode='nearest')) + self.out2 = nn.Conv2d(inner_channels, inner_channels//4, 3, padding=1, bias=bias) + self.out5.apply(self.weights_init) + self.out4.apply(self.weights_init) + self.out3.apply(self.weights_init) + self.out2.apply(self.weights_init) + + self.concat_attention = ScaleFeatureSelection(inner_channels, inner_channels//4, attention_type=attention_type) + self.binarize = nn.Sequential( + nn.Conv2d(inner_channels, inner_channels // 4, 3, bias=bias, padding=1), + BatchNorm2d(inner_channels//4), + nn.ReLU(inplace=True), + nn.ConvTranspose2d(inner_channels//4, inner_channels//4, 2, 2), + BatchNorm2d(inner_channels//4), + nn.ReLU(inplace=True), + nn.ConvTranspose2d(inner_channels//4, 1, 2, 2), + nn.Sigmoid()) + else: + self.concat_attention = ScaleFeatureSelection(inner_channels, inner_channels//4, ) + self.binarize = nn.Sequential( + nn.Conv2d(inner_channels, inner_channels // 4, 3, bias=bias, padding=1), + BatchNorm2d(inner_channels//4), + nn.ReLU(inplace=True), + nn.ConvTranspose2d(inner_channels//4, inner_channels//4, 2, 2), + BatchNorm2d(inner_channels//4), + nn.ReLU(inplace=True), + nn.ConvTranspose2d(inner_channels//4, 1, 2, 2), + nn.Sigmoid()) + + self.binarize.apply(self.weights_init) + self.adaptive = adaptive + if adaptive: + self.thresh = self._init_thresh( + inner_channels, serial=serial, smooth=smooth, bias=bias) + self.thresh.apply(self.weights_init) + + self.in5.apply(self.weights_init) + self.in4.apply(self.weights_init) + self.in3.apply(self.weights_init) + self.in2.apply(self.weights_init) + + def weights_init(self, m): + classname = m.__class__.__name__ + if classname.find('Conv') != -1: + nn.init.kaiming_normal_(m.weight.data) + elif classname.find('BatchNorm') != -1: + m.weight.data.fill_(1.) + m.bias.data.fill_(1e-4) + + def _init_thresh(self, inner_channels, + serial=False, smooth=False, bias=False): + in_channels = inner_channels + if serial: + in_channels += 1 + self.thresh = nn.Sequential( + nn.Conv2d(in_channels, inner_channels // + 4, 3, padding=1, bias=bias), + BatchNorm2d(inner_channels//4), + nn.ReLU(inplace=True), + self._init_upsample(inner_channels // 4, inner_channels//4, smooth=smooth, bias=bias), + BatchNorm2d(inner_channels//4), + nn.ReLU(inplace=True), + self._init_upsample(inner_channels // 4, 1, smooth=smooth, bias=bias), + nn.Sigmoid()) + return self.thresh + + def _init_upsample(self, + in_channels, out_channels, + smooth=False, bias=False): + if smooth: + inter_out_channels = out_channels + if out_channels == 1: + inter_out_channels = in_channels + module_list = [ + nn.Upsample(scale_factor=2, mode='nearest'), + nn.Conv2d(in_channels, inter_out_channels, 3, 1, 1, bias=bias)] + if out_channels == 1: + module_list.append( + nn.Conv2d(in_channels, out_channels, + kernel_size=1, stride=1, padding=1, bias=True)) + + return nn.Sequential(module_list) + else: + return nn.ConvTranspose2d(in_channels, out_channels, 2, 2) + + def forward(self, features, gt=None, masks=None, training=False): + c2, c3, c4, c5 = features + in5 = self.in5(c5) + in4 = self.in4(c4) + in3 = self.in3(c3) + in2 = self.in2(c2) + + out4 = self.up5(in5) + in4 # 1/16 + out3 = self.up4(out4) + in3 # 1/8 + out2 = self.up3(out3) + in2 # 1/4 + p5 = self.out5(in5) + p4 = self.out4(out4) + p3 = self.out3(out3) + p2 = self.out2(out2) + + fuse = torch.cat((p5, p4, p3, p2), 1) + fuse = self.concat_attention(fuse, [p5, p4, p3, p2]) + # this is the pred module, not binarization module; + # We do not correct the name due to the trained model. + binary = self.binarize(fuse) + if self.training: + result = OrderedDict(binary=binary) + else: + return binary + if self.adaptive and self.training: + if self.serial: + fuse = torch.cat( + (fuse, nn.functional.interpolate( + binary, fuse.shape[2:])), 1) + thresh = self.thresh(fuse) + thresh_binary = self.step_function(binary, thresh) + result.update(thresh=thresh, thresh_binary=thresh_binary) + return result + + def step_function(self, x, y): + return torch.reciprocal(1 + torch.exp(-self.k * (x - y))) \ No newline at end of file diff --git a/easyocr/DBNet/decoders/seg_detector_loss.py b/easyocr/DBNet/decoders/seg_detector_loss.py new file mode 100644 index 0000000000..3fa32c3a6c --- /dev/null +++ b/easyocr/DBNet/decoders/seg_detector_loss.py @@ -0,0 +1,264 @@ +import sys + +import torch +import torch.nn as nn + + +class SegDetectorLossBuilder(): + ''' + Build loss functions for SegDetector. + Details about the built functions: + Input: + pred: A dict which contains predictions. + thresh: The threshold prediction + binary: The text segmentation prediction. + thresh_binary: Value produced by `step_function(binary - thresh)`. + batch: + gt: Text regions bitmap gt. + mask: Ignore mask, + pexels where value is 1 indicates no contribution to loss. + thresh_mask: Mask indicates regions cared by thresh supervision. + thresh_map: Threshold gt. + Return: + (loss, metrics). + loss: A scalar loss value. + metrics: A dict contraining partial loss values. + ''' + + def __init__(self, loss_class, *args, **kwargs): + self.loss_class = loss_class + self.loss_args = args + self.loss_kwargs = kwargs + + def build(self): + return getattr(sys.modules[__name__], self.loss_class)(*self.loss_args, **self.loss_kwargs) + + +class DiceLoss(nn.Module): + ''' + DiceLoss on binary. + For SegDetector without adaptive module. + ''' + + def __init__(self, eps=1e-6): + super(DiceLoss, self).__init__() + from .dice_loss import DiceLoss as Loss + self.loss = Loss(eps) + + def forward(self, pred, batch): + loss = self.loss(pred['binary'], batch['gt'], batch['mask']) + return loss, dict(dice_loss=loss) + + +class BalanceBCELoss(nn.Module): + ''' + DiceLoss on binary. + For SegDetector without adaptive module. + ''' + + def __init__(self, eps=1e-6): + super(BalanceBCELoss, self).__init__() + from .balance_cross_entropy_loss import BalanceCrossEntropyLoss + self.loss = BalanceCrossEntropyLoss() + + def forward(self, pred, batch): + loss = self.loss(pred['binary'], batch['gt'], batch['mask']) + return loss, dict(dice_loss=loss) + + +class AdaptiveDiceLoss(nn.Module): + ''' + Integration of DiceLoss on both binary + prediction and thresh prediction. + ''' + + def __init__(self, eps=1e-6): + super(AdaptiveDiceLoss, self).__init__() + from .dice_loss import DiceLoss + self.main_loss = DiceLoss(eps) + self.thresh_loss = DiceLoss(eps) + + def forward(self, pred, batch): + assert isinstance(pred, dict) + assert 'binary' in pred + assert 'thresh_binary' in pred + + binary = pred['binary'] + thresh_binary = pred['thresh_binary'] + gt = batch['gt'] + mask = batch['mask'] + main_loss = self.main_loss(binary, gt, mask) + thresh_loss = self.thresh_loss(thresh_binary, gt, mask) + loss = main_loss + thresh_loss + return loss, dict(main_loss=main_loss, thresh_loss=thresh_loss) + + +class AdaptiveInstanceDiceLoss(nn.Module): + ''' + InstanceDiceLoss on both binary and thresh_bianry. + ''' + + def __init__(self, iou_thresh=0.2, thresh=0.3): + super(AdaptiveInstanceDiceLoss, self).__init__() + from .dice_loss import InstanceDiceLoss, DiceLoss + self.main_loss = DiceLoss() + self.main_instance_loss = InstanceDiceLoss() + self.thresh_loss = DiceLoss() + self.thresh_instance_loss = InstanceDiceLoss() + self.weights = nn.ParameterDict(dict( + main=nn.Parameter(torch.ones(1)), + thresh=nn.Parameter(torch.ones(1)), + main_instance=nn.Parameter(torch.ones(1)), + thresh_instance=nn.Parameter(torch.ones(1)))) + + def partial_loss(self, weight, loss): + return loss / weight + torch.log(torch.sqrt(weight)) + + def forward(self, pred, batch): + main_loss = self.main_loss(pred['binary'], batch['gt'], batch['mask']) + thresh_loss = self.thresh_loss(pred['thresh_binary'], batch['gt'], batch['mask']) + main_instance_loss = self.main_instance_loss( + pred['binary'], batch['gt'], batch['mask']) + thresh_instance_loss = self.thresh_instance_loss( + pred['thresh_binary'], batch['gt'], batch['mask']) + loss = self.partial_loss(self.weights['main'], main_loss) \ + + self.partial_loss(self.weights['thresh'], thresh_loss) \ + + self.partial_loss(self.weights['main_instance'], main_instance_loss) \ + + self.partial_loss(self.weights['thresh_instance'], thresh_instance_loss) + metrics = dict( + main_loss=main_loss, + thresh_loss=thresh_loss, + main_instance_loss=main_instance_loss, + thresh_instance_loss=thresh_instance_loss) + metrics.update(self.weights) + return loss, metrics + + +class L1DiceLoss(nn.Module): + ''' + L1Loss on thresh, DiceLoss on thresh_binary and binary. + ''' + + def __init__(self, eps=1e-6, l1_scale=10): + super(L1DiceLoss, self).__init__() + self.dice_loss = AdaptiveDiceLoss(eps=eps) + from .l1_loss import MaskL1Loss + self.l1_loss = MaskL1Loss() + self.l1_scale = l1_scale + + def forward(self, pred, batch): + dice_loss, metrics = self.dice_loss(pred, batch) + l1_loss, l1_metric = self.l1_loss( + pred['thresh'], batch['thresh_map'], batch['thresh_mask']) + + loss = dice_loss + self.l1_scale * l1_loss + metrics.update(**l1_metric) + return loss, metrics + + +class FullL1DiceLoss(L1DiceLoss): + ''' + L1loss on thresh, pixels with topk losses in non-text regions are also counted. + DiceLoss on thresh_binary and binary. + ''' + + def __init__(self, eps=1e-6, l1_scale=10): + nn.Module.__init__(self) + self.dice_loss = AdaptiveDiceLoss(eps=eps) + from .l1_loss import BalanceL1Loss + self.l1_loss = BalanceL1Loss() + self.l1_scale = l1_scale + + +class L1BalanceCELoss(nn.Module): + ''' + Balanced CrossEntropy Loss on `binary`, + MaskL1Loss on `thresh`, + DiceLoss on `thresh_binary`. + Note: The meaning of inputs can be figured out in `SegDetectorLossBuilder`. + ''' + + def __init__(self, eps=1e-6, l1_scale=10, bce_scale=5): + super(L1BalanceCELoss, self).__init__() + from .dice_loss import DiceLoss + from .l1_loss import MaskL1Loss + from .balance_cross_entropy_loss import BalanceCrossEntropyLoss + self.dice_loss = DiceLoss(eps=eps) + self.l1_loss = MaskL1Loss() + self.bce_loss = BalanceCrossEntropyLoss() + + self.l1_scale = l1_scale + self.bce_scale = bce_scale + + def forward(self, pred, batch): + bce_loss = self.bce_loss(pred['binary'], batch['gt'], batch['mask']) + metrics = dict(bce_loss=bce_loss) + if 'thresh' in pred: + l1_loss, l1_metric = self.l1_loss(pred['thresh'], batch['thresh_map'], batch['thresh_mask']) + dice_loss = self.dice_loss(pred['thresh_binary'], batch['gt'], batch['mask']) + metrics['thresh_loss'] = dice_loss + loss = dice_loss + self.l1_scale * l1_loss + bce_loss * self.bce_scale + metrics.update(**l1_metric) + else: + loss = bce_loss + return loss, metrics + + +class L1BCEMiningLoss(nn.Module): + ''' + Basicly the same with L1BalanceCELoss, where the bce loss map is used as + attention weigts for DiceLoss + ''' + + def __init__(self, eps=1e-6, l1_scale=10, bce_scale=5): + super(L1BCEMiningLoss, self).__init__() + from .dice_loss import DiceLoss + from .l1_loss import MaskL1Loss + from .balance_cross_entropy_loss import BalanceCrossEntropyLoss + self.dice_loss = DiceLoss(eps=eps) + self.l1_loss = MaskL1Loss() + self.bce_loss = BalanceCrossEntropyLoss() + + self.l1_scale = l1_scale + self.bce_scale = bce_scale + + def forward(self, pred, batch): + bce_loss, bce_map = self.bce_loss(pred['binary'], batch['gt'], batch['mask'], + return_origin=True) + l1_loss, l1_metric = self.l1_loss(pred['thresh'], batch['thresh_map'], batch['thresh_mask']) + bce_map = (bce_map - bce_map.min()) / (bce_map.max() - bce_map.min()) + dice_loss = self.dice_loss( + pred['thresh_binary'], batch['gt'], + batch['mask'], weights=bce_map + 1) + metrics = dict(bce_loss=bce_loss) + metrics['thresh_loss'] = dice_loss + loss = dice_loss + self.l1_scale * l1_loss + bce_loss * self.bce_scale + metrics.update(**l1_metric) + return loss, metrics + + +class L1LeakyDiceLoss(nn.Module): + ''' + LeakyDiceLoss on binary, + MaskL1Loss on thresh, + DiceLoss on thresh_binary. + ''' + + def __init__(self, eps=1e-6, coverage_scale=5, l1_scale=10): + super(L1LeakyDiceLoss, self).__init__() + from .dice_loss import DiceLoss, LeakyDiceLoss + from .l1_loss import MaskL1Loss + self.main_loss = LeakyDiceLoss(coverage_scale=coverage_scale) + self.l1_loss = MaskL1Loss() + self.thresh_loss = DiceLoss(eps=eps) + + self.l1_scale = l1_scale + + def forward(self, pred, batch): + main_loss, metrics = self.main_loss(pred['binary'], batch['gt'], batch['mask']) + thresh_loss = self.thresh_loss(pred['thresh_binary'], batch['gt'], batch['mask']) + l1_loss, l1_metric = self.l1_loss( + pred['thresh'], batch['thresh_map'], batch['thresh_mask']) + metrics.update(**l1_metric, thresh_loss=thresh_loss) + loss = main_loss + thresh_loss + l1_loss * self.l1_scale + return loss, metrics diff --git a/easyocr/DBNet/decoders/simple_detection.py b/easyocr/DBNet/decoders/simple_detection.py new file mode 100644 index 0000000000..70af6429cd --- /dev/null +++ b/easyocr/DBNet/decoders/simple_detection.py @@ -0,0 +1,191 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + + +from backbones.upsample_head import SimpleUpsampleHead + + +class SimpleDetectionDecoder(nn.Module): + def __init__(self, feature_channel=256): + nn.Module.__init__(self) + + self.feature_channel = feature_channel + self.head_layer = self.create_head_layer() + + self.pred_layers = nn.ModuleDict(self.create_pred_layers()) + + def create_head_layer(self): + return SimpleUpsampleHead( + self.feature_channel, + [self.feature_channel, self.feature_channel // 2, self.feature_channel // 4] + ) + + def create_pred_layer(self, channels): + return nn.Sequential( + nn.Conv2d(self.feature_channel // 4, channels, kernel_size=1, stride=1, padding=0, bias=False), + ) + + def create_pred_layers(self): + return {} + + def postprocess_pred(self, pred): + return pred + + def calculate_losses(self, preds, label): + raise NotImplementedError() + + def forward(self, input, label, meta, train): + feature = self.head_layer(input) + + pred = {} + for name, pred_layer in self.pred_layers.items(): + pred[name] = pred_layer(feature) + + if train: + losses = self.calculate_losses(pred, label) + pred = self.postprocess_pred(pred) + loss = sum(losses.values()) + return loss, pred, losses + else: + pred = self.postprocess_pred(pred) + return pred + + +class SimpleSegDecoder(SimpleDetectionDecoder): + def create_pred_layers(self): + return { + 'heatmap': self.create_pred_layer(1) + } + + def postprocess_pred(self, pred): + pred['heatmap'] = F.sigmoid(pred['heatmap']) + return pred + + def calculate_losses(self, pred, label): + heatmap = label['heatmap'] + heatmap_weight = label['heatmap_weight'] + + heatmap_pred = pred['heatmap'] + + heatmap_loss = F.binary_cross_entropy_with_logits(heatmap_pred, heatmap, reduction='none') + heatmap_loss = (heatmap_loss * heatmap_weight).mean(dim=(1, 2, 3)) + + return { + 'heatmap_loss': heatmap_loss, + } + + +class SimpleEASTDecoder(SimpleDetectionDecoder): + def __init__(self, feature_channels=256, densebox_ratio=1000.0, densebox_rescale_factor=512): + SimpleDetectionDecoder.__init__(self, feature_channels) + + self.densebox_ratio = densebox_ratio + self.densebox_rescale_factor = densebox_rescale_factor + + def create_pred_layers(self): + return { + 'heatmap': self.create_pred_layer(1), + 'densebox': self.create_pred_layer(8), + } + + def postprocess_pred(self, pred): + pred['heatmap'] = F.sigmoid(pred['heatmap']) + pred['densebox'] = pred['densebox'] * self.densebox_rescale_factor + return pred + + def calculate_losses(self, pred, label): + heatmap = label['heatmap'] + heatmap_weight = label['heatmap_weight'] + densebox = label['densebox'] / self.densebox_rescale_factor + densebox_weight = label['densebox_weight'] + + heatmap_pred = pred['heatmap'] + densebox_pred = pred['densebox'] + + heatmap_loss = F.binary_cross_entropy_with_logits(heatmap_pred, heatmap, reduction='none') + heatmap_loss = (heatmap_loss * heatmap_weight).mean(dim=(1, 2, 3)) + + densebox_loss = F.mse_loss(densebox_pred, densebox, reduction='none') + densebox_loss = (densebox_loss * densebox_weight).mean(dim=(1, 2, 3)) * self.densebox_ratio + + return { + 'heatmap_loss': heatmap_loss, + 'densebox_loss': densebox_loss, + } + + +class SimpleTextsnakeDecoder(SimpleDetectionDecoder): + def __init__(self, feature_channels=256, radius_ratio=10.0): + SimpleDetectionDecoder.__init__(self, feature_channels) + + self.radius_ratio = radius_ratio + + def create_pred_layers(self): + return { + 'heatmap': self.create_pred_layer(1), + 'radius': self.create_pred_layer(1), + } + + def postprocess_pred(self, pred): + pred['heatmap'] = F.sigmoid(pred['heatmap']) + pred['radius'] = torch.exp(pred['radius']) + return pred + + def calculate_losses(self, pred, label): + heatmap = label['heatmap'] + heatmap_weight = label['heatmap_weight'] + radius = torch.log(label['radius'] + 1) + radius_weight = label['radius_weight'] + + heatmap_pred = pred['heatmap'] + radius_pred = pred['radius'] + + heatmap_loss = F.binary_cross_entropy_with_logits(heatmap_pred, heatmap, reduction='none') + heatmap_loss = (heatmap_loss * heatmap_weight).mean(dim=(1, 2, 3)) + + radius_loss = F.smooth_l1_loss(radius_pred, radius, reduction='none') + radius_loss = (radius_loss * radius_weight).mean(dim=(1, 2, 3)) * self.radius_ratio + + return { + 'heatmap_loss': heatmap_loss, + 'radius_loss': radius_loss, + } + + +class SimpleMSRDecoder(SimpleDetectionDecoder): + def __init__(self, feature_channels=256, offset_ratio=1000.0, offset_rescale_factor=512): + SimpleDetectionDecoder.__init__(self, feature_channels) + + self.offset_ratio = offset_ratio + self.offset_rescale_factor = offset_rescale_factor + + def create_pred_layers(self): + return { + 'heatmap': self.create_pred_layer(1), + 'offset': self.create_pred_layer(2), + } + + def postprocess_pred(self, pred): + pred['heatmap'] = F.sigmoid(pred['heatmap']) + pred['offset'] = pred['offset'] * self.offset_rescale_factor + return pred + + def calculate_losses(self, pred, label): + heatmap = label['heatmap'] + heatmap_weight = label['heatmap_weight'] + offset = label['offset'] / self.offset_rescale_factor + offset_weight = label['offset_weight'] + + heatmap_pred = pred['heatmap'] + offset_pred = pred['offset'] + + heatmap_loss = F.binary_cross_entropy_with_logits(heatmap_pred, heatmap, reduction='none') + heatmap_loss = (heatmap_loss * heatmap_weight).mean(dim=(1, 2, 3)) + offset_loss = F.mse_loss(offset_pred, offset, reduction='none') + offset_loss = (offset_loss * offset_weight).mean(dim=(1, 2, 3)) * self.offset_ratio + + return { + 'heatmap_loss': heatmap_loss, + 'offset_loss': offset_loss, + } diff --git a/easyocr/DBNet/model/constructor.py b/easyocr/DBNet/model/constructor.py new file mode 100644 index 0000000000..c355df0f07 --- /dev/null +++ b/easyocr/DBNet/model/constructor.py @@ -0,0 +1,103 @@ +import importlib +from collections import OrderedDict + +class State: + def __init__(self, autoload=True, default=None): + self.autoload = autoload + self.default = default + + +class StateMeta(type): + def __new__(mcs, name, bases, attrs): + current_states = [] + for key, value in attrs.items(): + if isinstance(value, State): + current_states.append((key, value)) + + current_states.sort(key=lambda x: x[0]) + attrs['states'] = OrderedDict(current_states) + new_class = super(StateMeta, mcs).__new__(mcs, name, bases, attrs) + + # Walk through the MRO + states = OrderedDict() + for base in reversed(new_class.__mro__): + if hasattr(base, 'states'): + states.update(base.states) + new_class.states = states + + for key, value in states.items(): + setattr(new_class, key, value.default) + + return new_class + + +class Configurable(metaclass=StateMeta): + def __init__(self, *args, cmd={}, **kwargs): + self.load_all(cmd=cmd, **kwargs) + + @staticmethod + def construct_class_from_config(args): + cls = Configurable.extract_class_from_args(args) + return cls(**args) + + @staticmethod + def extract_class_from_args(args): + cls = args.copy().pop('class') + package, cls = cls.rsplit('.', 1) + module = importlib.import_module(package) + cls = getattr(module, cls) + return cls + + def load_all(self, **kwargs): + for name, state in self.states.items(): + if state.autoload: + self.load(name, **kwargs) + + def load(self, state_name, **kwargs): + # FIXME: kwargs should be filtered + # Args passed from command line + cmd = kwargs.pop('cmd', dict()) + if state_name in kwargs: + setattr(self, state_name, self.create_member_from_config( + (kwargs[state_name], cmd))) + else: + setattr(self, state_name, self.states[state_name].default) + + def create_member_from_config(self, conf): + args, cmd = conf + if args is None or isinstance(args, (int, float, str)): + return args + elif isinstance(args, (list, tuple)): + return [self.create_member_from_config((subargs, cmd)) for subargs in args] + elif isinstance(args, dict): + if 'class' in args: + cls = self.extract_class_from_args(args) + return cls(**args, cmd=cmd) + return {key: self.create_member_from_config((subargs, cmd)) for key, subargs in args.items()} + else: + return args + + def dump(self): + state = {} + state['class'] = self.__class__.__module__ + \ + '.' + self.__class__.__name__ + for name, value in self.states.items(): + obj = getattr(self, name) + state[name] = self.dump_obj(obj) + return state + + def dump_obj(self, obj): + if obj is None: + return None + elif hasattr(obj, 'dump'): + return obj.dump() + elif isinstance(obj, (int, float, str)): + return obj + elif isinstance(obj, (list, tuple)): + return [self.dump_obj(value) for value in obj] + elif isinstance(obj, dict): + return {key: self.dump_obj(value) for key, value in obj.items()} + else: + return str(obj) + + diff --git a/easyocr/DBNet/model/detector.py b/easyocr/DBNet/model/detector.py new file mode 100644 index 0000000000..233200ea65 --- /dev/null +++ b/easyocr/DBNet/model/detector.py @@ -0,0 +1,53 @@ +from . import model as structure_model +from .constructor import Configurable, State + +class Model(Configurable): + builder = State() + #representer = State() + + def __init__(self, **kwargs): + self.load_all(**kwargs) + + @property + def model_name(self): + return self.builder.model_name + + +class Builder(Configurable): + model = State() + model_args = State() + + def __init__(self, cmd={}, **kwargs): + self.load_all(**kwargs) + if 'backbone' in cmd: + self.model_args['backbone'] = cmd['backbone'] + + @property + def model_name(self): + return self.model + '-' + getattr(structure_model, self.model).model_name(self.model_args) + + def build(self, device, distributed=False, local_rank: int = 0): + Model = getattr(structure_model, self.model) + model = Model(self.model_args, device, + distributed=distributed, local_rank=local_rank) + return model + +class Detector(Configurable): + structure = State(autoload=False) + + def __init__(self, **kwargs): + self.load('structure', **kwargs) + + cmd = kwargs.get('cmd', {}) + if 'name' not in cmd: + cmd['name'] = self.structure.model_name + + self.load_all(**kwargs) + self.distributed = cmd.get('distributed', False) + self.local_rank = cmd.get('local_rank', 0) + + if cmd.get('validate', False): + self.load('validation', **kwargs) + else: + self.validation = None + diff --git a/easyocr/DBNet/model/model.py b/easyocr/DBNet/model/model.py new file mode 100644 index 0000000000..6c96a975fe --- /dev/null +++ b/easyocr/DBNet/model/model.py @@ -0,0 +1,71 @@ +import os + +import torch +import torch.nn as nn +import torch.nn.functional as F + +#import backbones +#import decoders +from .. import backbones +from .. import decoders + + +class BasicModel(nn.Module): + def __init__(self, args): + nn.Module.__init__(self) + + self.backbone = getattr(backbones, args['backbone'])(**args.get('backbone_args', {})) + self.decoder = getattr(decoders, args['decoder'])(**args.get('decoder_args', {})) + + def forward(self, data, *args, **kwargs): + return self.decoder(self.backbone(data), *args, **kwargs) + + +def parallelize(model, distributed, local_rank): + if distributed: + return nn.parallel.DistributedDataParallel( + model, + device_ids=[local_rank], + output_device=[local_rank], + find_unused_parameters=True) + else: + return nn.DataParallel(model) + +class SegDetectorModel(nn.Module): + def __init__(self, args, device, distributed: bool = False, local_rank: int = 0): + super(SegDetectorModel, self).__init__() + #from decoders.seg_detector_loss import SegDetectorLossBuilder + from ..decoders.seg_detector_loss import SegDetectorLossBuilder + + self.model = BasicModel(args) + # for loading models + self.model = parallelize(self.model, distributed, local_rank) + self.criterion = SegDetectorLossBuilder( + args['loss_class'], *args.get('loss_args', []), **args.get('loss_kwargs', {})).build() + self.criterion = parallelize(self.criterion, distributed, local_rank) + self.device = device + self.to(self.device) + + @staticmethod + def model_name(args): + return os.path.join('seg_detector', args['backbone'], args['loss_class']) + + def forward(self, batch, training=True): + if isinstance(batch, dict): + data = batch['image'].to(self.device) + else: + data = batch.to(self.device) + data = data.float() + #pred = self.model(data, training=self.training) + pred = self.model(data, training=training) + + #if self.training: + if training: + for key, value in batch.items(): + if value is not None: + if hasattr(value, 'to'): + batch[key] = value.to(self.device) + loss_with_metrics = self.criterion(pred, batch) + loss, metrics = loss_with_metrics + return loss, pred, metrics + return pred diff --git a/easyocr/character/ady_char.txt b/easyocr/character/ady_char.txt index a4c8f8ea68..8e4b809448 100644 --- a/easyocr/character/ady_char.txt +++ b/easyocr/character/ady_char.txt @@ -65,3 +65,4 @@ ю я Ӏ +ӏ diff --git a/easyocr/character/tjk_char.txt b/easyocr/character/tjk_char.txt index ae6f02679e..0f3fb5aa86 100644 --- a/easyocr/character/tjk_char.txt +++ b/easyocr/character/tjk_char.txt @@ -1,70 +1,88 @@ -А -Б -В -Г -Ғ -Д -Е -Ё -Ж -З -И -Ӣ -Й -К -Қ -Л -М -Н -О -П -Р -С -Т -У -Ӯ -Ф -Х -Ҳ -Ч -Ҷ -Ш -Ъ -Э -Ю -Я -а -б -в -г -ғ -д -е -ё -ж -з -и -ӣ -й -к -қ -л -м -н -о -п -р -с -т -у -ӯ -ф -х -ҳ -ч -ҷ -ш -ъ -э -ю -я \ No newline at end of file +А +Б +В +Г +Ғ +Д +Е +Ё +Ж +З +И +Ӣ +Й +К +Қ +Л +М +Н +О +П +Р +С +Т +У +Ӯ +Ф +Х +Ҳ +Ч +Ҷ +Ш +Ъ +Э +Ю +Я +а +б +в +г +ғ +д +е +ё +ж +з +и +ӣ +й +к +қ +л +м +н +о +п +р +с +т +у +ӯ +ф +х +ҳ +ч +ҷ +ш +ъ +э +ю +я +Ц +Щ +Ы +Ь +Ѓ +Ї +Њ +Ќ +Ў +ц +щ +ы +ь +ѓ +ї +њ +ќ +ў diff --git a/easyocr/config.py b/easyocr/config.py index 011bee4fb8..efc628cfb8 100644 --- a/easyocr/config.py +++ b/easyocr/config.py @@ -13,6 +13,16 @@ 'filename': 'craft_mlt_25k.pth', 'url': 'https://github.com/JaidedAI/EasyOCR/releases/download/pre-v1.1.6/craft_mlt_25k.zip', 'md5sum': '2f8227d2def4037cdb3b34389dcf9ec1' + }, + 'dbnet18' : { + 'filename': 'pretrained_ic15_res18.pt', + 'url': '', + 'md5sum': 'aee04f8ffe5fc5bd5abea73223800425' + }, + 'dbnet50' : { + 'filename': 'pretrained_ic15_res50.pt', + 'url': '', + 'md5sum': 'a8e90144c131c2467d1eb7886c2e93a6' } } @@ -188,5 +198,14 @@ 'symbols': '0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ ', 'characters': '0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZಂಃಅಆಇಈಉಊಋಎಏಐಒಓಔಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲಳವಶಷಸಹಾಿೀುೂೃೆೇೈೊೋೌ್೦೧೨೩೪೫೬೭೮೯' }, + 'cyrillic_g2':{ + 'filename': 'cyrillic_g2.pth', + 'model_script': 'cyrillic', + 'url': 'https://github.com/JaidedAI/EasyOCR/releases/download/pre-v1.1.6/cyrillic.zip', + 'md5sum': '19f85f43d9128a89ac21b8d6a06973fe', + 'symbols': '0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ €₽', + 'characters': '0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ €₽ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюяЂђЃѓЄєІіЇїЈјЉљЊњЋћЌќЎўЏџҐґҒғҚқҮүҲҳҶҷӀӏӢӣӨөӮӯ' + }, + } } diff --git a/easyocr/detection.py b/easyocr/detection.py index 6435443cdd..072178a233 100644 --- a/easyocr/detection.py +++ b/easyocr/detection.py @@ -89,7 +89,7 @@ def get_detector(trained_model, device='cpu', quantize=True, cudnn_benchmark=Fal net.eval() return net -def get_textbox(detector, image, canvas_size, mag_ratio, text_threshold, link_threshold, low_text, poly, device, optimal_num_chars=None): +def get_textbox(detector, image, canvas_size, mag_ratio, text_threshold, link_threshold, low_text, poly, device, optimal_num_chars=None, **kwargs): result = [] estimate_num_chars = optimal_num_chars is not None bboxes_list, polys_list = test_net(canvas_size, mag_ratio, detector, diff --git a/easyocr/detection_db.py b/easyocr/detection_db.py new file mode 100644 index 0000000000..c5b2faa29a --- /dev/null +++ b/easyocr/detection_db.py @@ -0,0 +1,209 @@ +''' +Created by Jaided AI +Released Date: 18/08/2022 +Description: +A wrapper for DBNet text detection module for EasyOCR +''' +import numpy as np + +import torch +import torch.backends.cudnn as cudnn + +from .DBNet.DBNet import DBNet + +def test_net(image, + detector, + threshold = 0.2, + bbox_min_score = 0.2, + bbox_min_size = 3, + max_candidates = 0, + canvas_size = None, + poly = False, + device = 'cpu' + ): + ''' + A wrapper for DBNet inference routine. + + Parameters + ---------- + image : np.ndarray or list of np.ndarray + OpenCV BGR image array or list of it. + detector : obj + DBNet text detection object. + threshold : float, optional + Minimum probability for each pixel of heatmap tensor to be considered + as a valid text pixel. The default is 0.2. + bbox_min_score : float, optional + Minimum score for each detected bounding box to be considered as a + valid text bounding box. The default is 0.2. + bbox_min_size : int, optional + Minimum size for each detected bounding box to be considered as a + valid text bounding box. The default is 3. + max_candidates : int, optional + Maximum number of detected bounding boxes to be considered as + candidates for valid text bounding boxes. Setting to 0 implies + no maximum. The default is 0. + canvas_size : int, optional + Target detection size. Input image will be resized such that it's + shorter side is equal to the closest multiple of 32 to the provided + canvas_size. If detection_size is not provided, it will be resized to + the closest multiple of 32 each side. If the original size exceeds the + min-/max-detection sizes (specified in DBNet_inference.yaml), it will be + resized to be within the min-/max-sizes. The default is None. + poly : boolean, optional + If true, return the bounding boxes as find polygons, otherwise, return + as rectagular. The default is False. + device : str, optional + Device to use. Options are "cpu" and "cuda". The default is 'cpu'. + + Returns + ------- + bboxes : list of lists + List of text bounding boxes in format [left, right, top, bottom]. + polys : list of lists + List of polygon text bounding boxes. If argument poly is set to false, + this output will also hold the value of output bboxes + ''' + if isinstance(image, np.ndarray) and len(image.shape) == 4: # image is batch of np arrays + image_arrs = image + else: # image is single numpy array + image_arrs = [image] + + # resize + images, original_shapes = zip(*[detector.resize_image(img, canvas_size) for img in image_arrs]) + # preprocessing + images = [np.transpose(detector.normalize_image(n_img), (2, 0, 1)) for n_img in images] + image_tensor = torch.from_numpy(np.array(images)).to(device) + # forward pass + with torch.no_grad(): + hmap = detector.image2hmap(image_tensor.to(device)) + bboxes, _ = detector.hmap2bbox( + image_tensor, + original_shapes, + hmap, + text_threshold = threshold, + bbox_min_score = bbox_min_score, + bbox_min_size = bbox_min_size, + max_candidates = max_candidates, + as_polygon=False) + if poly: + polys, _ = detector.hmap2bbox( + image_tensor, + original_shapes, + hmap, + text_threshold = threshold, + bbox_min_score = bbox_min_score, + bbox_min_size = bbox_min_size, + max_candidates = max_candidates, + as_polygon=True) + else: + polys = bboxes + + return bboxes, polys + +def get_detector(trained_model, device='cpu', quantize=True, cudnn_benchmark=False): + ''' + A wrapper to initialize DBNet text detection model + + Parameters + ---------- + trained_model : str + Path to trained weight to use. + device : str, optional + Device to use. Options are "cpu" and "cuda". The default is 'cpu'. + quantize : boolean, optional + If use, apply model quantization method to the model. The default is True. + cudnn_benchmark : boolen, optional + DESCRIPTION. The default is False. + + Returns + ------- + dbnet : obj + DBNet text detection object. + ''' + dbnet = DBNet(initialize_model = False, + dynamic_import_relative_path = "easyocr/DBNet", + device = device, + verbose = 0) + dbnet.construct_model(dbnet.configs['resnet18']['model']) + if device == 'cpu': + dbnet.load_weight(trained_model) + if quantize: + try: + torch.quantization.quantize_dynamic(dbnet, dtype=torch.qint8, inplace=True) + except: + pass + else: + dbnet.load_weight(trained_model) + dbnet.model = torch.nn.DataParallel(dbnet.model).to(device) + cudnn.benchmark = cudnn_benchmark + + dbnet.model.eval() + + return dbnet + +def get_textbox(detector, + image, + canvas_size = None, + poly = False, + threshold = 0.2, + bbox_min_score = 0.2, + bbox_min_size = 3, + max_candidates = 0, + device = 'cpu', + **kwargs + ): + ''' + A compatibility wrapper to allow supporting calling this method while + providing argument for other detector classes and reformat output accordingly. + + Parameters + ---------- + detector : obj + DBNet text detection object. + image : np.ndarray or list of np.ndarray + OpenCV BGR image array or list of it. + canvas_size : int, optional + Target detection size. Please see docstring under method resize_image() + for explanation. The default is None. + poly : boolean, optional + If true, return the bounding boxes as find polygons, otherwise, return + as rectagular. The default is False. + threshold : float, optional + Minimum probability for each pixel of heatmap tensor to be considered + as a valid text pixel. The default is 0.2. + bbox_min_score : float, optional + Minimum score for each detected bounding box to be considered as a + valid text bounding box. The default is 0.2. + bbox_min_size : int, optional + Minimum size for each detected bounding box to be considered as a + valid text bounding box. The default is 3. + max_candidates : int, optional + Maximum number of detected bounding boxes to be considered as + candidates for valid text bounding box. Setting it to 0 implies + no maximum. The default is 0. + device : str, optional + Device to use. Options are "cpu" and "cuda". The default is 'cpu'. + **kwargs : keyword arguments + Unused. Added to support calling this method while providing argument + for other detector class. + + Returns + ------- + result : list of lists + List of text bounding boxes in format [left, right, top, bottom]. + ''' + _, polys_list = test_net(image, + detector, + threshold = threshold, + bbox_min_score = bbox_min_score, + bbox_min_size = bbox_min_size, + max_candidates =max_candidates, + canvas_size = canvas_size, + poly = poly, + device = device + ) + + result = [[np.array(box).astype(np.int32).reshape((-1)) for box in polys] for polys in polys_list] + + return result diff --git a/easyocr/easyocr.py b/easyocr/easyocr.py index 7127c28f40..9c7529364b 100644 --- a/easyocr/easyocr.py +++ b/easyocr/easyocr.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- -from .detection import get_detector, get_textbox from .recognition import get_recognizer, get_text from .utils import group_text_box, get_image_list, calculate_md5, get_paragraph,\ download_and_unzip, printProgressBar, diff, reformat_input,\ @@ -30,9 +29,10 @@ class Reader(object): def __init__(self, lang_list, gpu=True, model_storage_directory=None, - user_network_directory=None, recog_network = 'standard', - download_enabled=True, detector=True, recognizer=True, - verbose=True, quantize=True, cudnn_benchmark=False): + user_network_directory=None, detect_network="craft", + recog_network='standard', download_enabled=True, + detector=True, recognizer=True, verbose=True, + quantize=True, cudnn_benchmark=False): """Create an EasyOCR Reader Parameters: @@ -50,6 +50,7 @@ def __init__(self, lang_list, gpu=True, model_storage_directory=None, download_enabled (bool): Enabled downloading of model data via HTTP (default). """ + self.verbose = verbose self.download_enabled = download_enabled self.model_storage_directory = MODULE_PATH + '/model' @@ -75,31 +76,17 @@ def __init__(self, lang_list, gpu=True, model_storage_directory=None, self.device = 'cuda' else: self.device = gpu + + self.detection_models = detection_models self.recognition_models = recognition_models # check and download detection model - detector_model = 'craft' - corrupt_msg = 'MD5 hash mismatch, possible file corruption' - detector_path = os.path.join(self.model_storage_directory, detection_models[detector_model]['filename']) + self.support_detection_network = ['craft', 'dbnet18'] + self.quantize=quantize, + self.cudnn_benchmark=cudnn_benchmark if detector: - if os.path.isfile(detector_path) == False: - if not self.download_enabled: - raise FileNotFoundError("Missing %s and downloads disabled" % detector_path) - LOGGER.warning('Downloading detection model, please wait. ' - 'This may take several minutes depending upon your network connection.') - download_and_unzip(detection_models[detector_model]['url'], detection_models[detector_model]['filename'], self.model_storage_directory, verbose) - assert calculate_md5(detector_path) == detection_models[detector_model]['md5sum'], corrupt_msg - LOGGER.info('Download complete') - elif calculate_md5(detector_path) != detection_models[detector_model]['md5sum']: - if not self.download_enabled: - raise FileNotFoundError("MD5 mismatch for %s and downloads disabled" % detector_path) - LOGGER.warning(corrupt_msg) - os.remove(detector_path) - LOGGER.warning('Re-downloading the detection model, please wait. ' - 'This may take several minutes depending upon your network connection.') - download_and_unzip(detection_models[detector_model]['url'], detection_models[detector_model]['filename'], self.model_storage_directory, verbose) - assert calculate_md5(detector_path) == detection_models[detector_model]['md5sum'], corrupt_msg - + detector_path = self.getDetectorPath(detect_network) + # recognition model separator_list = {} @@ -168,8 +155,8 @@ def __init__(self, lang_list, gpu=True, model_storage_directory=None, elif set(lang_list) & set(cyrillic_lang_list): self.setModelLanguage('cyrillic', lang_list, cyrillic_lang_list+['en'], '["ru","rs_cyrillic","be","bg","uk","mn","en"]') - model = recognition_models['gen1']['cyrillic_g1'] - recog_network = 'generation1' + model = recognition_models['gen2']['cyrillic_g2'] + recog_network = 'generation2' else: self.model_lang = 'latin' model = recognition_models['gen2']['latin_g2'] @@ -220,7 +207,8 @@ def __init__(self, lang_list, gpu=True, model_storage_directory=None, dict_list[lang] = os.path.join(BASE_PATH, 'dict', lang + ".txt") if detector: - self.detector = get_detector(detector_path, self.device, quantize, cudnn_benchmark=cudnn_benchmark) + self.detector = self.initDetector(detector_path) + if recognizer: if recog_network == 'generation1': network_params = { @@ -240,6 +228,53 @@ def __init__(self, lang_list, gpu=True, model_storage_directory=None, self.character, separator_list,\ dict_list, model_path, device = self.device, quantize=quantize) + def getDetectorPath(self, detect_network): + if detect_network in self.support_detection_network: + self.detect_network = detect_network + if self.detect_network == 'craft': + from .detection import get_detector, get_textbox + elif self.detect_network == 'dbnet18': + if os.path.isfile(os.path.join( os.path.dirname(__file__), "DBNet", "dcn_compiling_success")): + from .detection_db import get_detector, get_textbox + else: + trouble_url = "https://github.com/JaidedAI/EasyOCR/tree/master/easyocr/DBNet" + raise RuntimeError("dbnet is selected as the detection network, but DBNet is not compiled successfully during installation \ + or the indicating flag is missing. Please check {} for troubleshooting.".format(trouble_url)) + else: + raise RuntimeError("Unsupport detector network. Support networks are craft and dbnet18.") + self.get_textbox = get_textbox + self.get_detector = get_detector + corrupt_msg = 'MD5 hash mismatch, possible file corruption' + detector_path = os.path.join(self.model_storage_directory, self.detection_models[self.detect_network]['filename']) + if os.path.isfile(detector_path) == False: + if not self.download_enabled: + raise FileNotFoundError("Missing %s and downloads disabled" % detector_path) + LOGGER.warning('Downloading detection model, please wait. ' + 'This may take several minutes depending upon your network connection.') + download_and_unzip(self.detection_models[self.detect_network]['url'], self.detection_models[self.detect_network]['filename'], self.model_storage_directory, self.verbose) + assert calculate_md5(detector_path) == self.detection_models[self.detect_network]['md5sum'], corrupt_msg + LOGGER.info('Download complete') + elif calculate_md5(detector_path) != self.detection_models[self.detect_network]['md5sum']: + if not self.download_enabled: + raise FileNotFoundError("MD5 mismatch for %s and downloads disabled" % detector_path) + LOGGER.warning(corrupt_msg) + os.remove(detector_path) + LOGGER.warning('Re-downloading the detection model, please wait. ' + 'This may take several minutes depending upon your network connection.') + download_and_unzip(self.detection_models[self.detect_network]['url'], self.detection_models[self.detect_network]['filename'], self.model_storage_directory, self.verbose) + assert calculate_md5(detector_path) == self.detection_models[self.detect_network]['md5sum'], corrupt_msg + else: + raise RuntimeError("Unsupport detector network. Support networks are {}.".format(', '.join(self.support_detection_network))) + + return detector_path + + def initDetector(self, detector_path): + return self.get_detector(detector_path, self.device, self.quantize, cudnn_benchmark=self.cudnn_benchmark) + + def setDetector(self, detect_network): + detector_path = self.getDetectorPath(detect_network) + self.detector = self.initDetector(detector_path) + def setModelLanguage(self, language, lang_list, list_lang, list_lang_string): self.model_lang = language if set(lang_list) - set(list_lang) != set(): @@ -273,14 +308,28 @@ def setLanguageList(self, lang_list, model): def detect(self, img, min_size = 20, text_threshold = 0.7, low_text = 0.4,\ link_threshold = 0.4,canvas_size = 2560, mag_ratio = 1.,\ slope_ths = 0.1, ycenter_ths = 0.5, height_ths = 0.5,\ - width_ths = 0.5, add_margin = 0.1, reformat=True, optimal_num_chars=None): + width_ths = 0.5, add_margin = 0.1, reformat=True, optimal_num_chars=None, + threshold = 0.2, bbox_min_score = 0.2, bbox_min_size = 3, max_candidates = 0, + ): if reformat: img, img_cv_grey = reformat_input(img) - text_box_list = get_textbox(self.detector, img, canvas_size, mag_ratio, - text_threshold, link_threshold, low_text, - False, self.device, optimal_num_chars) + text_box_list = self.get_textbox(self.detector, + img, + canvas_size = canvas_size, + mag_ratio = mag_ratio, + text_threshold = text_threshold, + link_threshold = link_threshold, + low_text = low_text, + poly = False, + device = self.device, + optimal_num_chars = optimal_num_chars, + threshold = threshold, + bbox_min_score = bbox_min_score, + bbox_min_size = bbox_min_size, + max_candidates = max_candidates, + ) horizontal_list_agg, free_list_agg = [], [] for text_box in text_box_list: @@ -384,19 +433,25 @@ def readtext(self, image, decoder = 'greedy', beamWidth= 5, batch_size = 1,\ text_threshold = 0.7, low_text = 0.4, link_threshold = 0.4,\ canvas_size = 2560, mag_ratio = 1.,\ slope_ths = 0.1, ycenter_ths = 0.5, height_ths = 0.5,\ - width_ths = 0.5, y_ths = 0.5, x_ths = 1.0, add_margin = 0.1, output_format='standard'): + width_ths = 0.5, y_ths = 0.5, x_ths = 1.0, add_margin = 0.1, + threshold = 0.2, bbox_min_score = 0.2, bbox_min_size = 3, max_candidates = 0, + output_format='standard'): ''' Parameters: image: file path or numpy-array or a byte stream object ''' img, img_cv_grey = reformat_input(image) - horizontal_list, free_list = self.detect(img, min_size, text_threshold,\ - low_text, link_threshold,\ - canvas_size, mag_ratio,\ - slope_ths, ycenter_ths,\ - height_ths,width_ths,\ - add_margin, False) + horizontal_list, free_list = self.detect(img, + min_size = min_size, text_threshold = text_threshold,\ + low_text = low_text, link_threshold = link_threshold,\ + canvas_size = canvas_size, mag_ratio = mag_ratio,\ + slope_ths = slope_ths, ycenter_ths = ycenter_ths,\ + height_ths = height_ths, width_ths= width_ths,\ + add_margin = add_margin, reformat = False,\ + threshold = threshold, bbox_min_score = bbox_min_score,\ + bbox_min_size = bbox_min_size, max_candidates = max_candidates + ) # get the 1st result from hor & free list as self.detect returns a list of depth 3 horizontal_list, free_list = horizontal_list[0], free_list[0] result = self.recognize(img_cv_grey, horizontal_list, free_list,\ @@ -414,19 +469,25 @@ def readtextlang(self, image, decoder = 'greedy', beamWidth= 5, batch_size = 1,\ text_threshold = 0.7, low_text = 0.4, link_threshold = 0.4,\ canvas_size = 2560, mag_ratio = 1.,\ slope_ths = 0.1, ycenter_ths = 0.5, height_ths = 0.5,\ - width_ths = 0.5, y_ths = 0.5, x_ths = 1.0, add_margin = 0.1, output_format='standard'): + width_ths = 0.5, y_ths = 0.5, x_ths = 1.0, add_margin = 0.1, + threshold = 0.2, bbox_min_score = 0.2, bbox_min_size = 3, max_candidates = 0, + output_format='standard'): ''' Parameters: image: file path or numpy-array or a byte stream object ''' img, img_cv_grey = reformat_input(image) - horizontal_list, free_list = self.detect(img, min_size, text_threshold,\ - low_text, link_threshold,\ - canvas_size, mag_ratio,\ - slope_ths, ycenter_ths,\ - height_ths,width_ths,\ - add_margin, False) + horizontal_list, free_list = self.detect(img, + min_size = min_size, text_threshold = text_threshold,\ + low_text = low_text, link_threshold = link_threshold,\ + canvas_size = canvas_size, mag_ratio = mag_ratio,\ + slope_ths = slope_ths, ycenter_ths = ycenter_ths,\ + height_ths = height_ths, width_ths= width_ths,\ + add_margin = add_margin, reformat = False,\ + threshold = threshold, bbox_min_score = bbox_min_score,\ + bbox_min_size = bbox_min_size, max_candidates = max_candidates + ) # get the 1st result from hor & free list as self.detect returns a list of depth 3 horizontal_list, free_list = horizontal_list[0], free_list[0] result = self.recognize(img_cv_grey, horizontal_list, free_list,\ @@ -471,7 +532,9 @@ def readtext_batched(self, image, n_width=None, n_height=None,\ text_threshold = 0.7, low_text = 0.4, link_threshold = 0.4,\ canvas_size = 2560, mag_ratio = 1.,\ slope_ths = 0.1, ycenter_ths = 0.5, height_ths = 0.5,\ - width_ths = 0.5, y_ths = 0.5, x_ths = 1.0, add_margin = 0.1, output_format='standard'): + width_ths = 0.5, y_ths = 0.5, x_ths = 1.0, add_margin = 0.1, + threshold = 0.2, bbox_min_score = 0.2, bbox_min_size = 3, max_candidates = 0, + output_format='standard'): ''' Parameters: image: file path or numpy-array or a byte stream object @@ -482,12 +545,16 @@ def readtext_batched(self, image, n_width=None, n_height=None,\ ''' img, img_cv_grey = reformat_input_batched(image, n_width, n_height) - horizontal_list_agg, free_list_agg = self.detect(img, min_size, text_threshold,\ - low_text, link_threshold,\ - canvas_size, mag_ratio,\ - slope_ths, ycenter_ths,\ - height_ths, width_ths,\ - add_margin, False) + horizontal_list_agg, free_list_agg = self.detect(img, + min_size = min_size, text_threshold = text_threshold,\ + low_text = low_text, link_threshold = link_threshold,\ + canvas_size = canvas_size, mag_ratio = mag_ratio,\ + slope_ths = slope_ths, ycenter_ths = ycenter_ths,\ + height_ths = height_ths, width_ths= width_ths,\ + add_margin = add_margin, reformat = False,\ + threshold = threshold, bbox_min_score = bbox_min_score,\ + bbox_min_size = bbox_min_size, max_candidates = max_candidates + ) result_agg = [] # put img_cv_grey in a list if its a single img img_cv_grey = [img_cv_grey] if len(img_cv_grey.shape) == 2 else img_cv_grey diff --git a/easyocr/model/modules.py b/easyocr/model/modules.py index 89d914b5ac..d8b6d92eb1 100644 --- a/easyocr/model/modules.py +++ b/easyocr/model/modules.py @@ -1,10 +1,10 @@ import torch import torch.nn as nn +import torch.nn.functional as F import torch.nn.init as init - from torchvision import models from torchvision.models.vgg import model_urls - +from collections import namedtuple def init_weights(modules): for m in modules: @@ -19,7 +19,6 @@ def init_weights(modules): m.weight.data.normal_(0, 0.01) m.bias.data.zero_() - class vgg16_bn(torch.nn.Module): def __init__(self, pretrained=True, freeze=True): super(vgg16_bn, self).__init__() @@ -69,9 +68,9 @@ def forward(self, X): h_relu5_3 = h h = self.slice5(h) h_fc7 = h - - return h_fc7, h_relu5_3, h_relu4_3, h_relu3_2, h_relu2_2 - + vgg_outputs = namedtuple("VggOutputs", ['fc7', 'relu5_3', 'relu4_3', 'relu3_2', 'relu2_2']) + out = vgg_outputs(h_fc7, h_relu5_3, h_relu4_3, h_relu3_2, h_relu2_2) + return out class BidirectionalLSTM(nn.Module): @@ -81,11 +80,18 @@ def __init__(self, input_size, hidden_size, output_size): self.linear = nn.Linear(hidden_size * 2, output_size) def forward(self, input): + """ + input : visual feature [batch_size x T x input_size] + output : contextual feature [batch_size x T x output_size] + """ + try: # multi gpu needs this + self.rnn.flatten_parameters() + except: # quantization doesn't work with this + pass recurrent, _ = self.rnn(input) # batch_size x T x input_size -> batch_size x T x (2*hidden_size) output = self.linear(recurrent) # batch_size x T x output_size return output - class VGG_FeatureExtractor(nn.Module): def __init__(self, input_channel, output_channel=256): @@ -110,7 +116,6 @@ def __init__(self, input_channel, output_channel=256): def forward(self, input): return self.ConvNet(input) - class ResNet_FeatureExtractor(nn.Module): """ FeatureExtractor of FAN (http://openaccess.thecvf.com/content_ICCV_2017/papers/Cheng_Focusing_Attention_Towards_ICCV_2017_paper.pdf) """ @@ -121,7 +126,6 @@ def __init__(self, input_channel, output_channel=512): def forward(self, input): return self.ConvNet(input) - class BasicBlock(nn.Module): expansion = 1 @@ -152,13 +156,11 @@ def forward(self, x): if self.downsample is not None: residual = self.downsample(x) - out += residual out = self.relu(out) return out - class ResNet(nn.Module): def __init__(self, input_channel, output_channel, block, layers): diff --git a/easyocr/model/vgg_model.py b/easyocr/model/vgg_model.py index a720b189b5..b0f2ae1c65 100644 --- a/easyocr/model/vgg_model.py +++ b/easyocr/model/vgg_model.py @@ -1,27 +1,35 @@ -import torch import torch.nn as nn from .modules import VGG_FeatureExtractor, BidirectionalLSTM - class Model(nn.Module): + def __init__(self, input_channel, output_channel, hidden_size, num_class): super(Model, self).__init__() + """ FeatureExtraction """ self.FeatureExtraction = VGG_FeatureExtractor(input_channel, output_channel) self.FeatureExtraction_output = output_channel + self.AdaptiveAvgPool = nn.AdaptiveAvgPool2d((None, 1)) + """ Sequence modeling""" self.SequenceModeling = nn.Sequential( BidirectionalLSTM(self.FeatureExtraction_output, hidden_size, hidden_size), BidirectionalLSTM(hidden_size, hidden_size, hidden_size)) self.SequenceModeling_output = hidden_size + """ Prediction """ self.Prediction = nn.Linear(self.SequenceModeling_output, num_class) + def forward(self, input, text): + """ Feature extraction stage """ visual_feature = self.FeatureExtraction(input) - visual_feature = torch.mean(visual_feature.permute(0, 3, 1, 2), dim=3) + visual_feature = self.AdaptiveAvgPool(visual_feature.permute(0, 3, 1, 2)) + visual_feature = visual_feature.squeeze(3) + """ Sequence modeling stage """ contextual_feature = self.SequenceModeling(visual_feature) + """ Prediction stage """ prediction = self.Prediction(contextual_feature.contiguous()) return prediction diff --git a/easyocr/recognition.py b/easyocr/recognition.py index 625e802681..147370f7d0 100644 --- a/easyocr/recognition.py +++ b/easyocr/recognition.py @@ -1,31 +1,23 @@ -import importlib -import math -import types - -from collections import OrderedDict - +from PIL import Image import torch -import torch.nn.functional as F +import torch.backends.cudnn as cudnn import torch.utils.data +import torch.nn.functional as F import torchvision.transforms as transforms import numpy as np - -from PIL import Image - -from .model.modules import BidirectionalLSTM +from collections import OrderedDict +import importlib from .utils import CTCLabelConverter - +import math def custom_mean(x): return x.prod()**(2.0/np.sqrt(len(x))) - def contrast_grey(img): high = np.percentile(img, 90) low = np.percentile(img, 10) return (high-low)/np.maximum(10, high+low), high, low - def adjust_contrast_grey(img, target = 0.4): contrast, high, low = contrast_grey(img) if contrast < target: @@ -35,8 +27,8 @@ def adjust_contrast_grey(img, target = 0.4): img = np.maximum(np.full(img.shape, 0) ,np.minimum(np.full(img.shape, 255), img)).astype(np.uint8) return img - class NormalizePAD(object): + def __init__(self, max_size, PAD_type='right'): self.toTensor = transforms.ToTensor() self.max_size = max_size @@ -54,8 +46,8 @@ def __call__(self, img): return Pad_img - class ListDataset(torch.utils.data.Dataset): + def __init__(self, image_list): self.image_list = image_list self.nSamples = len(image_list) @@ -67,8 +59,8 @@ def __getitem__(self, index): img = self.image_list[index] return Image.fromarray(img, 'L') - class AlignCollate(object): + def __init__(self, imgH=32, imgW=100, keep_ratio_with_pad=False, adjust_contrast = 0.): self.imgH = imgH self.imgW = imgW @@ -104,9 +96,8 @@ def __call__(self, batch): image_tensors = torch.cat([t.unsqueeze(0) for t in resized_images], 0) return image_tensors - -def recognizer_predict(model, converter, test_loader, batch_max_length, - ignore_idx, char_group_idx, decoder='greedy', beamWidth=5, device='cpu'): +def recognizer_predict(model, converter, test_loader, batch_max_length,\ + ignore_idx, char_group_idx, decoder = 'greedy', beamWidth= 5, device = 'cpu'): model.eval() result = [] with torch.no_grad(): @@ -159,10 +150,9 @@ def recognizer_predict(model, converter, test_loader, batch_max_length, return result - -def get_recognizer(recog_network, network_params, character, - separator_list, dict_list, model_path, - device='cpu', quantize=True): +def get_recognizer(recog_network, network_params, character,\ + separator_list, dict_list, model_path,\ + device = 'cpu', quantize = True): converter = CTCLabelConverter(character, separator_list, dict_list) num_class = len(converter.character) @@ -188,22 +178,11 @@ def get_recognizer(recog_network, network_params, character, except: pass else: - # Override the forward method to flatten parameters when in a multi-GPU environment - def dp_forward(self, input): - self.rnn.flatten_parameters() - return self.forward_(input) - - for m in model.modules(): - if type(m) is BidirectionalLSTM: - m.forward_ = m.forward - m.forward = types.MethodType(dp_forward, m) - model = torch.nn.DataParallel(model).to(device) model.load_state_dict(torch.load(model_path, map_location=device)) return model, converter - def get_text(character, imgH, imgW, recognizer, converter, image_list,\ ignore_char = '',decoder = 'greedy', beamWidth =5, batch_size=1, contrast_ths=0.1,\ adjust_contrast=0.5, filter_ths = 0.003, workers = 1, device = 'cpu'): diff --git a/easyocr/scripts/compile_dbnet_dcn.py b/easyocr/scripts/compile_dbnet_dcn.py new file mode 100644 index 0000000000..03f7c79d6f --- /dev/null +++ b/easyocr/scripts/compile_dbnet_dcn.py @@ -0,0 +1,37 @@ +''' +Created by Jaided AI +Released Date: 19/08/2022 +Description: +A wrapper for DCN operator for DBNet. This script is called inside the setup.py +of EasyOCR. It can also be called as a standalone script to compile the operator +manually. +''' +import os +import subprocess + +def main(): + url = "https://github.com/JaidedAI/EasyOCR/tree/master/easyocr/DBNet" + cwd = os.getcwd() + parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + with open(os.path.join(parent_dir,'DBNet', 'log.txt'), "w") as fid: + try: + print("Compiling DCN operator...") + os.chdir(os.path.join(parent_dir,'DBNet','assets','ops','dcn')) + subprocess.run( + "python setup.py build_ext --inplace", shell=True, stdout = fid + ) + os.chdir(os.path.join(parent_dir,'DBNet')) + subprocess.run( + "touch dcn_compiling_success", shell=True, stdout = fid + ) + os.chdir(cwd) + print("DCN operator is compiled successfully.") + except Exception as error: + print("Failed to compile dcn operator for DBNet with the following error.", file = fid) + print("{}".format(error), file = fid) + print("Failed to compile dcn operator for DBNet.") + print("EasyOCR can still be used with CRAFT text detector (default).") + print("To use DBNet text detector, please check {} for troubleshoot and compile dcn operator manually.".format(url)) + +if __name__ == '__main__': + main() diff --git a/requirements.txt b/requirements.txt index e7617f011e..9a62026ed2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,3 +7,6 @@ Pillow scikit-image python-bidi PyYAML +Shapely +pyclipper +ninja diff --git a/setup.py b/setup.py index 291e626629..ffe3d3eb87 100644 --- a/setup.py +++ b/setup.py @@ -2,8 +2,12 @@ End-to-End Multi-Lingual Optical Character Recognition (OCR) Solution """ -from setuptools import setup +import subprocess from io import open +from setuptools import setup +from setuptools.command.install import install +from setuptools.command.develop import develop +from setuptools.command.egg_info import egg_info with open('requirements.txt', encoding="utf-8-sig") as f: requirements = f.readlines() @@ -13,6 +17,26 @@ def readme(): README = f.read() return README +def compile_dbnet_dcn(): + subprocess.run( + "python easyocr/scripts/compile_dbnet_dcn.py", shell=True + ) + +class CustomCommand_install(install): + def run(self): + install.run(self) + compile_dbnet_dcn() + +class CustomCommand_develop(develop): + def run(self): + develop.run(self) + compile_dbnet_dcn() + +class CustomCommand_egg_info(egg_info): + def run(self): + egg_info.run(self) + compile_dbnet_dcn() + setup( name='easyocr', packages=['easyocr'], @@ -32,4 +56,9 @@ def readme(): classifiers=[ 'Development Status :: 5 - Production/Stable' ], + cmdclass={ + 'install': CustomCommand_install, + 'develop': CustomCommand_develop, + 'egg_info': CustomCommand_egg_info, + } ) From 2837d8bb3889c11822f7aeb97f1b24f51268a842 Mon Sep 17 00:00:00 2001 From: rkcosmos Date: Tue, 23 Aug 2022 07:30:04 +0700 Subject: [PATCH 09/61] add download url --- easyocr/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/easyocr/config.py b/easyocr/config.py index efc628cfb8..3276b32261 100644 --- a/easyocr/config.py +++ b/easyocr/config.py @@ -16,12 +16,12 @@ }, 'dbnet18' : { 'filename': 'pretrained_ic15_res18.pt', - 'url': '', + 'url': 'https://github.com/JaidedAI/EasyOCR/releases/download/v1.6.0/pretrained_ic15_res18.zip', 'md5sum': 'aee04f8ffe5fc5bd5abea73223800425' }, 'dbnet50' : { 'filename': 'pretrained_ic15_res50.pt', - 'url': '', + 'url': 'https://github.com/JaidedAI/EasyOCR/releases/download/v1.6.0/pretrained_ic15_res50.zip', 'md5sum': 'a8e90144c131c2467d1eb7886c2e93a6' } } From 42860c71a77f1438f1c0070bac1d2ea676a071fe Mon Sep 17 00:00:00 2001 From: Jaided AI Team <110890633+JaidedTeam@users.noreply.github.com> Date: Tue, 23 Aug 2022 07:33:27 +0700 Subject: [PATCH 10/61] Update setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ffe3d3eb87..293d683650 100644 --- a/setup.py +++ b/setup.py @@ -41,7 +41,7 @@ def run(self): name='easyocr', packages=['easyocr'], include_package_data=True, - version='1.5.0', + version='1.6.0', install_requires=requirements, entry_points={"console_scripts": ["easyocr= easyocr.cli:main"]}, license='Apache License 2.0', From db6e9ae48a9fbd37d78b30aff29a25113c53e21b Mon Sep 17 00:00:00 2001 From: Jaided AI Team <110890633+JaidedTeam@users.noreply.github.com> Date: Tue, 23 Aug 2022 07:33:42 +0700 Subject: [PATCH 11/61] Update __init__.py --- easyocr/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easyocr/__init__.py b/easyocr/__init__.py index 5449d97807..5147a186c8 100644 --- a/easyocr/__init__.py +++ b/easyocr/__init__.py @@ -1,3 +1,3 @@ from .easyocr import Reader -__version__ = '1.5.0' +__version__ = '1.6.0' From b95fc235adb808e390a17bb89217b5884bceb2df Mon Sep 17 00:00:00 2001 From: rkcosmos Date: Tue, 23 Aug 2022 18:26:45 +0700 Subject: [PATCH 12/61] fix setup.py --- easyocr/DBNet/dcn_compiling_success | 0 easyocr/DBNet/log.txt | 15 +++++++++++++++ easyocr/__init__.py | 2 +- easyocr/scripts/compile_dbnet_dcn.py | 6 ++++-- setup.py | 21 ++++++++------------- 5 files changed, 28 insertions(+), 16 deletions(-) create mode 100644 easyocr/DBNet/dcn_compiling_success create mode 100644 easyocr/DBNet/log.txt diff --git a/easyocr/DBNet/dcn_compiling_success b/easyocr/DBNet/dcn_compiling_success new file mode 100644 index 0000000000..e69de29bb2 diff --git a/easyocr/DBNet/log.txt b/easyocr/DBNet/log.txt new file mode 100644 index 0000000000..8f07159e44 --- /dev/null +++ b/easyocr/DBNet/log.txt @@ -0,0 +1,15 @@ +running build_ext +building 'deform_conv_cuda' extension +Emitting ninja build file /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/build.ninja... +Compiling objects... +Allowing ninja to set a default number of workers... (overridable by setting the environment variable MAX_JOBS=N) +ninja: no work to do. +g++ -pthread -shared -B /home/rakpong/anaconda3/compiler_compat -L/home/rakpong/anaconda3/lib -Wl,-rpath=/home/rakpong/anaconda3/lib -Wl,--no-as-needed -Wl,--sysroot=/ /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/src/deform_conv_cuda.o /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/src/deform_conv_cuda_kernel.o -L/home/rakpong/anaconda3/lib/python3.8/site-packages/torch/lib -L/usr/local/cuda/lib64 -lc10 -ltorch -ltorch_cpu -ltorch_python -lcudart -lc10_cuda -ltorch_cuda_cu -ltorch_cuda_cpp -o build/lib.linux-x86_64-3.8/deform_conv_cuda.cpython-38-x86_64-linux-gnu.so +building 'deform_pool_cuda' extension +Emitting ninja build file /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/build.ninja... +Compiling objects... +Allowing ninja to set a default number of workers... (overridable by setting the environment variable MAX_JOBS=N) +ninja: no work to do. +g++ -pthread -shared -B /home/rakpong/anaconda3/compiler_compat -L/home/rakpong/anaconda3/lib -Wl,-rpath=/home/rakpong/anaconda3/lib -Wl,--no-as-needed -Wl,--sysroot=/ /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/src/deform_pool_cuda.o /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/src/deform_pool_cuda_kernel.o -L/home/rakpong/anaconda3/lib/python3.8/site-packages/torch/lib -L/usr/local/cuda/lib64 -lc10 -ltorch -ltorch_cpu -ltorch_python -lcudart -lc10_cuda -ltorch_cuda_cu -ltorch_cuda_cpp -o build/lib.linux-x86_64-3.8/deform_pool_cuda.cpython-38-x86_64-linux-gnu.so +copying build/lib.linux-x86_64-3.8/deform_conv_cuda.cpython-38-x86_64-linux-gnu.so -> +copying build/lib.linux-x86_64-3.8/deform_pool_cuda.cpython-38-x86_64-linux-gnu.so -> diff --git a/easyocr/__init__.py b/easyocr/__init__.py index 5449d97807..5147a186c8 100644 --- a/easyocr/__init__.py +++ b/easyocr/__init__.py @@ -1,3 +1,3 @@ from .easyocr import Reader -__version__ = '1.5.0' +__version__ = '1.6.0' diff --git a/easyocr/scripts/compile_dbnet_dcn.py b/easyocr/scripts/compile_dbnet_dcn.py index 03f7c79d6f..8c86bbdd56 100644 --- a/easyocr/scripts/compile_dbnet_dcn.py +++ b/easyocr/scripts/compile_dbnet_dcn.py @@ -24,14 +24,16 @@ def main(): subprocess.run( "touch dcn_compiling_success", shell=True, stdout = fid ) - os.chdir(cwd) - print("DCN operator is compiled successfully.") + print("DCN operator is compiled successfully at {}.".format(os.path.join(parent_dir,'DBNet'))) except Exception as error: print("Failed to compile dcn operator for DBNet with the following error.", file = fid) print("{}".format(error), file = fid) print("Failed to compile dcn operator for DBNet.") print("EasyOCR can still be used with CRAFT text detector (default).") print("To use DBNet text detector, please check {} for troubleshoot and compile dcn operator manually.".format(url)) + finally: + os.chdir(cwd) if __name__ == '__main__': main() + diff --git a/setup.py b/setup.py index ffe3d3eb87..3efe7d0df2 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ """ End-to-End Multi-Lingual Optical Character Recognition (OCR) Solution """ - +import os import subprocess from io import open from setuptools import setup @@ -17,31 +17,27 @@ def readme(): README = f.read() return README -def compile_dbnet_dcn(): +def compile_dbnet_dcn(script_dir): + script_path = os.path.join(script_dir, 'easyocr', 'scripts', 'compile_dbnet_dcn.py') subprocess.run( - "python easyocr/scripts/compile_dbnet_dcn.py", shell=True + "python {}".format(script_path), shell=True ) class CustomCommand_install(install): def run(self): install.run(self) - compile_dbnet_dcn() + compile_dbnet_dcn(self.install_lib) class CustomCommand_develop(develop): def run(self): develop.run(self) - compile_dbnet_dcn() + compile_dbnet_dcn(self.install_dir) -class CustomCommand_egg_info(egg_info): - def run(self): - egg_info.run(self) - compile_dbnet_dcn() - setup( name='easyocr', packages=['easyocr'], include_package_data=True, - version='1.5.0', + version='1.6.0', install_requires=requirements, entry_points={"console_scripts": ["easyocr= easyocr.cli:main"]}, license='Apache License 2.0', @@ -56,9 +52,8 @@ def run(self): classifiers=[ 'Development Status :: 5 - Production/Stable' ], - cmdclass={ + cmdclass={ 'install': CustomCommand_install, 'develop': CustomCommand_develop, - 'egg_info': CustomCommand_egg_info, } ) From 5d07a71103c1f974e8af670168f87f81e851694f Mon Sep 17 00:00:00 2001 From: rkcosmos Date: Wed, 24 Aug 2022 10:45:07 +0700 Subject: [PATCH 13/61] update readme v1.6 --- README.md | 3 +++ releasenotes.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index bd894624d9..61085bfbd8 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,9 @@ Integrated into [Huggingface Spaces 🤗](https://huggingface.co/spaces) using [ ## What's new +- 24 August 2022 - Version 1.6.0 + - Restructure code to support alternative text detectors. + - Add detector `DBNET`, see [paper](https://arxiv.org/abs/2202.10304v1). It can be used by initializing like this `reader = easyocr.Reader(['en'], detect_network = 'dbnet18')`. - 2 June 2022 - Version 1.5.0 - Add trainer for CRAFT detection model (thanks[@gmuffiness](https://github.com/gmuffiness), see [PR](https://github.com/JaidedAI/EasyOCR/pull/739)) - 9 April 2022 - Version 1.4.2 diff --git a/releasenotes.md b/releasenotes.md index 4d8a50ef43..311c40860c 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -1,3 +1,6 @@ +- 24 August 2022 - Version 1.6.0 + - Restructure code to support alternative text detectors. + - Add detector `DBNET`, see [paper](https://arxiv.org/abs/2202.10304v1). It can be used by initializing like this `reader = easyocr.Reader(['en'], detect_network = 'dbnet18')`. - 2 June 2022 - Version 1.5.0 - Add trainer for CRAFT detection model (thanks[@gmuffiness](https://github.com/gmuffiness), see [PR](https://github.com/JaidedAI/EasyOCR/pull/739)) - 9 April 2022 - Version 1.4.2 From 0b5c02f03c155db36e17018bbbd1a7587cd3dbd6 Mon Sep 17 00:00:00 2001 From: Sergei Garkusha Date: Wed, 24 Aug 2022 17:24:20 +0400 Subject: [PATCH 14/61] fix fa_char.txt --- easyocr/character/fa_char.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/easyocr/character/fa_char.txt b/easyocr/character/fa_char.txt index 7ea5f9b6c7..31affb6301 100644 --- a/easyocr/character/fa_char.txt +++ b/easyocr/character/fa_char.txt @@ -31,7 +31,6 @@ و ه ی -اً ء ئ ِ From 10cadc7df0b13e62f7ae4d5f0de002adbf7cfe99 Mon Sep 17 00:00:00 2001 From: rkcosmos Date: Mon, 29 Aug 2022 21:27:51 +0700 Subject: [PATCH 15/61] fix windows path --- easyocr/DBNet/DBNet.py | 23 +++++++---- easyocr/DBNet/README.md | 4 +- easyocr/DBNet/dcn_compiling_success | 0 easyocr/detection_db.py | 3 +- easyocr/scripts/compile_dbnet_dcn.py | 61 +++++++++++++++++++--------- 5 files changed, 61 insertions(+), 30 deletions(-) delete mode 100644 easyocr/DBNet/dcn_compiling_success diff --git a/easyocr/DBNet/DBNet.py b/easyocr/DBNet/DBNet.py index eeac4f1d84..b1e2a07d76 100644 --- a/easyocr/DBNet/DBNet.py +++ b/easyocr/DBNet/DBNet.py @@ -20,7 +20,7 @@ class DBNet: def __init__(self, backbone = "resnet18", - weight_dir = "./DBNet/weights/", + weight_dir = None, weight_name = 'pretrained', initialize_model = True, dynamic_import_relative_path = None, @@ -34,7 +34,8 @@ def __init__(self, backbone : str, optional Backbone to use. Options are "resnet18" and "resnet50". The default is "resnet18". weight_dir : str, optional - Path to directory that contains weight files. The default is "./DBNet/weights/". + Path to directory that contains weight files. If set to None, the path will be set + to "../weights/". The default is None. weight_name : str, optional Name of the weight to use as specified in DBNet_inference.yaml or a filename in weight_dir. The default is 'pretrained'. @@ -77,12 +78,18 @@ def __init__(self, else: raise ValueError("Invalid backbone. Current support backbone are {}.".format(",".join(self.configs.keys()))) + if weight_dir is not None: + self.weight_dir = weight_dir + else: + self.weight_dir = os.path.join(os.path.dirname(__file__), 'weights') + + if initialize_model: if weight_name in self.configs[backbone]['weight'].keys(): - weight_path = os.path.join(os.path.dirname(__file__), 'weights', self.configs[backbone]['weight'][weight_name]) + weight_path = os.path.join(self.weight_dir, self.configs[backbone]['weight'][weight_name]) error_message = "A weight with a name {} is found in DBNet_inference.yaml but cannot be find file: {}." else: - weight_path = os.path.join(os.path.dirname(__file__), 'weights', weight_name) + weight_path = os.path.join(self.weight_dir, weight_name) error_message = "A weight with a name {} is not found in DBNet_inference.yaml and cannot be find file: {}." if not os.path.isfile(weight_path): @@ -411,9 +418,10 @@ def hmap2bbox(self, scores_batch.append(scores) boxes_batch, scores_batch = zip(*[zip(*[(box, score) - for (box,score) in zip(boxes, scores) if score > 0]) - for (boxes, scores) in zip(boxes_batch, scores_batch)] - ) + for (box,score) in zip(boxes, scores) if score > 0] + ) if any(scores > 0) else [(),()] + for (boxes, scores) in zip(boxes_batch, scores_batch)] + ) return boxes_batch, scores_batch @@ -755,4 +763,3 @@ def inference(self, return batch_boxes, batch_scores else: return batch_boxes - diff --git a/easyocr/DBNet/README.md b/easyocr/DBNet/README.md index a95f73e246..062d741393 100644 --- a/easyocr/DBNet/README.md +++ b/easyocr/DBNet/README.md @@ -2,7 +2,7 @@ This text detection module is adapted from [DBNet++](https://github.com/MhLiao/DB). ## Overview -DBNet works as an image segmentation which performs classification at pixel-level. The model classifies if each pixel from the input image is a part of a text region. This module uses dynamic import and class construction from a config file. Config files are expected to be found in `./configs/`. At the input, the input image are expected to have width and height as multiple of 32. Input images that does not have these dimension will be resized accordingly. In addition, minimum and maximum sizes can be specified in the config file. +DBNet works as an image segmentation which performs classification at pixel-level. The model classifies if each pixel from the input image is a part of a text region. This module uses dynamic import and class construction from a config file. Config files are expected to be found in `./configs/`. At the input, the input image are expected to have width and height as multiple of 32. Input images that does not have these dimension will be resized accordingly. In addition, minimum and maximum sizes can be specified in the config file. *Currently, DBNet text detector requires running with GPU.* ### Terminology * Probability Heatmap: A tensor represent classification confidence of each pixel for being a part of text region. @@ -11,7 +11,7 @@ DBNet works as an image segmentation which performs classification at pixel-leve * detection_size: This term is used to refer to the size of the image on which the detection routine will be performed. Input images that are not of this size will be resized accordingly. ### Compiling DCN operator -DBNet requires DCN operator to be compiled. The instruction from the original repo can be found [here](https://github.com/MhLiao/DB#requirements). If EasyOCR is install via `pypi`, this process should be done automatically. If the operator is compiled successfully, a flag `dcn_compiling_success` will be added to `./DBNet/`. If the compilation failed during installation, the flag will be missing. Although, EasyOCR **can work** without DBNet and DCN operator by using CRAFT text detection (default). +DBNet requires DCN operator to be compiled with GPU. The instruction from the original repo can be found [here](https://github.com/MhLiao/DB#requirements). If EasyOCR is install via `pypi`, this process should be done automatically. If the operator is compiled successfully, a flag `dcn_compiling_success` will be added to `./DBNet/`. If the compilation failed during installation, the flag will be missing. Although, EasyOCR **can work** without DBNet and DCN operator by using CRAFT text detection (default). ### Changes from the original repo 1. Scripts inside `./concerns/` and multiple `.yaml` files are consolidated and pruned for inference-only implementation and dependencies reduction. diff --git a/easyocr/DBNet/dcn_compiling_success b/easyocr/DBNet/dcn_compiling_success deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/easyocr/detection_db.py b/easyocr/detection_db.py index c5b2faa29a..f32b1b4c8e 100644 --- a/easyocr/detection_db.py +++ b/easyocr/detection_db.py @@ -4,6 +4,7 @@ Description: A wrapper for DBNet text detection module for EasyOCR ''' +import os import numpy as np import torch @@ -122,7 +123,7 @@ def get_detector(trained_model, device='cpu', quantize=True, cudnn_benchmark=Fal DBNet text detection object. ''' dbnet = DBNet(initialize_model = False, - dynamic_import_relative_path = "easyocr/DBNet", + dynamic_import_relative_path = os.path.join("easyocr", "DBNet"), device = device, verbose = 0) dbnet.construct_model(dbnet.configs['resnet18']['model']) diff --git a/easyocr/scripts/compile_dbnet_dcn.py b/easyocr/scripts/compile_dbnet_dcn.py index 8c86bbdd56..bea340ea17 100644 --- a/easyocr/scripts/compile_dbnet_dcn.py +++ b/easyocr/scripts/compile_dbnet_dcn.py @@ -7,32 +7,55 @@ manually. ''' import os +from datetime import datetime import subprocess -def main(): +def print_error(errors, log_path): + if not isinstance(errors, list): + errors = [errors] + errors = [error if isinstance(error, bytes) else error.encode('utf-8') for error in errors] url = "https://github.com/JaidedAI/EasyOCR/tree/master/easyocr/DBNet" + print("Failed to compile dcn operator for DBNet.") + with open(log_path, "wb") as fid: + fid.write((datetime.now().strftime("%H:%M:%S - %d %b %Y") + "\n").encode('utf-8')) + fid.write("Failed to compile dcn operator for DBNet with the following error.\n".encode('utf-8')) + fid.write(("#"*42 + '\n').encode('utf-8')) + [fid.write(error) for error in errors] + print("Error message can be found in {}.".format(os.path.abspath(log_path))) + print("#"*42) + print("EasyOCR can still be used with CRAFT text detector (default).") + print("To use DBNet text detector, please check {} for troubleshoot and compile dcn operator manually.".format(url)) + +def print_success(text, log_path): + with open(log_path, "wb") as fid: + fid.write((datetime.now().strftime("%H:%M:%S - %d %b %Y") + "\n").encode('utf-8')) + fid.write((text + "\n").encode('utf-8')) + print(text) + +def main(): cwd = os.getcwd() parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - with open(os.path.join(parent_dir,'DBNet', 'log.txt'), "w") as fid: - try: - print("Compiling DCN operator...") - os.chdir(os.path.join(parent_dir,'DBNet','assets','ops','dcn')) - subprocess.run( - "python setup.py build_ext --inplace", shell=True, stdout = fid - ) + log_path = os.path.join(parent_dir,'DBNet', 'log.txt') + try: + print("Compiling DCN operator...") + os.chdir(os.path.join(parent_dir,'DBNet','assets','ops','dcn')) + result = subprocess.run( + "python setup.py build_ext --inplace", shell=True, capture_output = True + ) + if result.returncode == 0: os.chdir(os.path.join(parent_dir,'DBNet')) - subprocess.run( - "touch dcn_compiling_success", shell=True, stdout = fid + result = subprocess.run( + "touch dcn_compiling_success", shell=True, capture_output = True ) - print("DCN operator is compiled successfully at {}.".format(os.path.join(parent_dir,'DBNet'))) - except Exception as error: - print("Failed to compile dcn operator for DBNet with the following error.", file = fid) - print("{}".format(error), file = fid) - print("Failed to compile dcn operator for DBNet.") - print("EasyOCR can still be used with CRAFT text detector (default).") - print("To use DBNet text detector, please check {} for troubleshoot and compile dcn operator manually.".format(url)) - finally: - os.chdir(cwd) + success_message = "DCN operator is compiled successfully at {}.".format(os.path.abspath(os.path.join(parent_dir,'DBNet'))) + print_success(success_message, log_path) + else: + print(result.__dict__) + print_error([result.stdout, result.stderr], log_path) + except Exception as error: + print_error("{}".format(error), log_path) + finally: + os.chdir(cwd) if __name__ == '__main__': main() From 0560fb59b0c280666ded24e533899638ec56e11a Mon Sep 17 00:00:00 2001 From: Rakpong Kittinaradorn Date: Mon, 29 Aug 2022 21:31:57 +0700 Subject: [PATCH 16/61] Delete log.txt --- easyocr/DBNet/log.txt | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 easyocr/DBNet/log.txt diff --git a/easyocr/DBNet/log.txt b/easyocr/DBNet/log.txt deleted file mode 100644 index 8f07159e44..0000000000 --- a/easyocr/DBNet/log.txt +++ /dev/null @@ -1,15 +0,0 @@ -running build_ext -building 'deform_conv_cuda' extension -Emitting ninja build file /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/build.ninja... -Compiling objects... -Allowing ninja to set a default number of workers... (overridable by setting the environment variable MAX_JOBS=N) -ninja: no work to do. -g++ -pthread -shared -B /home/rakpong/anaconda3/compiler_compat -L/home/rakpong/anaconda3/lib -Wl,-rpath=/home/rakpong/anaconda3/lib -Wl,--no-as-needed -Wl,--sysroot=/ /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/src/deform_conv_cuda.o /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/src/deform_conv_cuda_kernel.o -L/home/rakpong/anaconda3/lib/python3.8/site-packages/torch/lib -L/usr/local/cuda/lib64 -lc10 -ltorch -ltorch_cpu -ltorch_python -lcudart -lc10_cuda -ltorch_cuda_cu -ltorch_cuda_cpp -o build/lib.linux-x86_64-3.8/deform_conv_cuda.cpython-38-x86_64-linux-gnu.so -building 'deform_pool_cuda' extension -Emitting ninja build file /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/build.ninja... -Compiling objects... -Allowing ninja to set a default number of workers... (overridable by setting the environment variable MAX_JOBS=N) -ninja: no work to do. -g++ -pthread -shared -B /home/rakpong/anaconda3/compiler_compat -L/home/rakpong/anaconda3/lib -Wl,-rpath=/home/rakpong/anaconda3/lib -Wl,--no-as-needed -Wl,--sysroot=/ /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/src/deform_pool_cuda.o /home/rakpong/team/EasyOCR/easyocr/DBNet/assets/ops/dcn/build/temp.linux-x86_64-3.8/src/deform_pool_cuda_kernel.o -L/home/rakpong/anaconda3/lib/python3.8/site-packages/torch/lib -L/usr/local/cuda/lib64 -lc10 -ltorch -ltorch_cpu -ltorch_python -lcudart -lc10_cuda -ltorch_cuda_cu -ltorch_cuda_cpp -o build/lib.linux-x86_64-3.8/deform_pool_cuda.cpython-38-x86_64-linux-gnu.so -copying build/lib.linux-x86_64-3.8/deform_conv_cuda.cpython-38-x86_64-linux-gnu.so -> -copying build/lib.linux-x86_64-3.8/deform_pool_cuda.cpython-38-x86_64-linux-gnu.so -> From 8b1f23c9044f987c76a08792b37de54ca005b2e5 Mon Sep 17 00:00:00 2001 From: fathom-tim Date: Thu, 1 Sep 2022 00:45:41 -0400 Subject: [PATCH 17/61] Update deprecated pretrained parameter --- easyocr/model/modules.py | 5 ++++- trainer/craft/model/vgg16_bn.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/easyocr/model/modules.py b/easyocr/model/modules.py index d8b6d92eb1..be089fb6ea 100644 --- a/easyocr/model/modules.py +++ b/easyocr/model/modules.py @@ -3,6 +3,7 @@ import torch.nn.functional as F import torch.nn.init as init from torchvision import models +from torchvision.models import VGG16_BN_Weights from torchvision.models.vgg import model_urls from collections import namedtuple @@ -23,7 +24,9 @@ class vgg16_bn(torch.nn.Module): def __init__(self, pretrained=True, freeze=True): super(vgg16_bn, self).__init__() model_urls['vgg16_bn'] = model_urls['vgg16_bn'].replace('https://', 'http://') - vgg_pretrained_features = models.vgg16_bn(pretrained=pretrained).features + vgg_pretrained_features = models.vgg16_bn( + weights=VGG16_BN_Weights.DEFAULT if pretrained else None + ).features self.slice1 = torch.nn.Sequential() self.slice2 = torch.nn.Sequential() self.slice3 = torch.nn.Sequential() diff --git a/trainer/craft/model/vgg16_bn.py b/trainer/craft/model/vgg16_bn.py index a2e9782ba0..553b2f423c 100644 --- a/trainer/craft/model/vgg16_bn.py +++ b/trainer/craft/model/vgg16_bn.py @@ -3,6 +3,7 @@ import torch.nn.init as init from torchvision import models +from torchvision.models import VGG16_BN_Weights from torchvision.models.vgg import model_urls @@ -24,7 +25,9 @@ class vgg16_bn(torch.nn.Module): def __init__(self, pretrained=True, freeze=True): super(vgg16_bn, self).__init__() model_urls['vgg16_bn'] = model_urls['vgg16_bn'].replace('https://', 'http://') - vgg_pretrained_features = models.vgg16_bn(pretrained=pretrained).features + vgg_pretrained_features = models.vgg16_bn( + weights=VGG16_BN_Weights.DEFAULT if pretrained else None + ).features self.slice1 = torch.nn.Sequential() self.slice2 = torch.nn.Sequential() self.slice3 = torch.nn.Sequential() From f1d975e8b819f73db004ade1e535f068a13b3ca0 Mon Sep 17 00:00:00 2001 From: rkcosmos Date: Thu, 1 Sep 2022 15:18:35 +0700 Subject: [PATCH 18/61] v1.6.1 --- README.md | 5 ++++- easyocr/__init__.py | 2 +- easyocr/config.py | 2 +- releasenotes.md | 5 ++++- setup.py | 2 +- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 61085bfbd8..186aece4f9 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,12 @@ Integrated into [Huggingface Spaces 🤗](https://huggingface.co/spaces) using [ ## What's new +- 1 September 2022 - Version 1.6.1 + - Fix DBNET path bug for Windows + - Add new built-in model `cyrillic_g2`. This model is a new default for Cyrillic script. - 24 August 2022 - Version 1.6.0 - Restructure code to support alternative text detectors. - - Add detector `DBNET`, see [paper](https://arxiv.org/abs/2202.10304v1). It can be used by initializing like this `reader = easyocr.Reader(['en'], detect_network = 'dbnet18')`. + - Add detector `DBNET`, see [paper](https://arxiv.org/abs/2202.10304v1). It can be used by initializing like this `reader = easyocr.Reader(['en'], detect_network = 'dbnet18')`. *Currently, DBNet text detector requires running with GPU.* - 2 June 2022 - Version 1.5.0 - Add trainer for CRAFT detection model (thanks[@gmuffiness](https://github.com/gmuffiness), see [PR](https://github.com/JaidedAI/EasyOCR/pull/739)) - 9 April 2022 - Version 1.4.2 diff --git a/easyocr/__init__.py b/easyocr/__init__.py index 5147a186c8..b9cb76c184 100644 --- a/easyocr/__init__.py +++ b/easyocr/__init__.py @@ -1,3 +1,3 @@ from .easyocr import Reader -__version__ = '1.6.0' +__version__ = '1.6.1' diff --git a/easyocr/config.py b/easyocr/config.py index 3276b32261..355b7e6319 100644 --- a/easyocr/config.py +++ b/easyocr/config.py @@ -201,7 +201,7 @@ 'cyrillic_g2':{ 'filename': 'cyrillic_g2.pth', 'model_script': 'cyrillic', - 'url': 'https://github.com/JaidedAI/EasyOCR/releases/download/pre-v1.1.6/cyrillic.zip', + 'url': 'https://github.com/JaidedAI/EasyOCR/releases/download/v1.6.1/cyrillic_g2.zip', 'md5sum': '19f85f43d9128a89ac21b8d6a06973fe', 'symbols': '0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ €₽', 'characters': '0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ €₽ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюяЂђЃѓЄєІіЇїЈјЉљЊњЋћЌќЎўЏџҐґҒғҚқҮүҲҳҶҷӀӏӢӣӨөӮӯ' diff --git a/releasenotes.md b/releasenotes.md index 311c40860c..36b2924828 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -1,6 +1,9 @@ +- 1 September 2022 - Version 1.6.1 + - Fix DBNET path bug for Windows + - Add new built-in model `cyrillic_g2`. This model is a new default for Cyrillic script. - 24 August 2022 - Version 1.6.0 - Restructure code to support alternative text detectors. - - Add detector `DBNET`, see [paper](https://arxiv.org/abs/2202.10304v1). It can be used by initializing like this `reader = easyocr.Reader(['en'], detect_network = 'dbnet18')`. + - Add detector `DBNET`, see [paper](https://arxiv.org/abs/2202.10304v1). It can be used by initializing like this `reader = easyocr.Reader(['en'], detect_network = 'dbnet18')`. *Currently, DBNet text detector requires running with GPU.* - 2 June 2022 - Version 1.5.0 - Add trainer for CRAFT detection model (thanks[@gmuffiness](https://github.com/gmuffiness), see [PR](https://github.com/JaidedAI/EasyOCR/pull/739)) - 9 April 2022 - Version 1.4.2 diff --git a/setup.py b/setup.py index 3efe7d0df2..31b2b8b45e 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,7 @@ def run(self): name='easyocr', packages=['easyocr'], include_package_data=True, - version='1.6.0', + version='1.6.1', install_requires=requirements, entry_points={"console_scripts": ["easyocr= easyocr.cli:main"]}, license='Apache License 2.0', From 626ead05c34d1d04637e1f8634ae783fea163d29 Mon Sep 17 00:00:00 2001 From: Marco Rubin <20150305+Rubo3@users.noreply.github.com> Date: Thu, 1 Sep 2022 09:08:26 +0000 Subject: [PATCH 19/61] Fix setuptools warning --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 224a77957f..08aedd7e61 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,2 +1,2 @@ [metadata] -description-file = README.md \ No newline at end of file +description_file = README.md From 8a8b98fecfed2855bc77e959801c1da58e632a68 Mon Sep 17 00:00:00 2001 From: rkcosmos Date: Mon, 12 Sep 2022 08:26:50 +0700 Subject: [PATCH 20/61] update 1.6.2 --- easyocr/DBNet/DBNet.py | 7 +- easyocr/DBNet/README.md | 176 +++- .../assets/ops/dcn/functions/deform_conv.py | 124 ++- .../assets/ops/dcn/functions/deform_pool.py | 93 ++- easyocr/DBNet/assets/ops/dcn/setup.py | 32 +- .../assets/ops/dcn/src/deform_conv_cpu.cpp | 759 +++++++++++++++++ .../ops/dcn/src/deform_conv_cpu_kernel.cpp | 766 ++++++++++++++++++ .../ops/dcn/src/deform_conv_cpu_kernel.h | 64 ++ .../assets/ops/dcn/src/deform_pool_cpu.cpp | 86 ++ .../ops/dcn/src/deform_pool_cpu_kernel.cpp | 314 +++++++ .../ops/dcn/src/deform_pool_cpu_kernel.h | 35 + easyocr/__init__.py | 2 +- easyocr/detection_db.py | 20 +- easyocr/easyocr.py | 15 +- easyocr/scripts/compile_dbnet_dcn.py | 38 +- setup.py | 28 +- 16 files changed, 2437 insertions(+), 122 deletions(-) create mode 100644 easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu.cpp create mode 100644 easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu_kernel.cpp create mode 100644 easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu_kernel.h create mode 100644 easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu.cpp create mode 100644 easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu_kernel.cpp create mode 100644 easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu_kernel.h diff --git a/easyocr/DBNet/DBNet.py b/easyocr/DBNet/DBNet.py index b1e2a07d76..c07b584f9c 100644 --- a/easyocr/DBNet/DBNet.py +++ b/easyocr/DBNet/DBNet.py @@ -83,7 +83,6 @@ def __init__(self, else: self.weight_dir = os.path.join(os.path.dirname(__file__), 'weights') - if initialize_model: if weight_name in self.configs[backbone]['weight'].keys(): weight_path = os.path.join(self.weight_dir, self.configs[backbone]['weight'][weight_name]) @@ -158,7 +157,7 @@ def load_weight(self, weight_path): raise RuntimeError("model has not yet been constructed.") self.model.load_state_dict(torch.load(weight_path, map_location=self.device), strict=False) self.model.eval() - + def construct_model(self, config): ''' Contruct text detection model based on the configuration in .yaml file. @@ -192,7 +191,9 @@ def initialize_model(self, model_config, weight_path): ''' self.construct_model(model_config) self.load_weight(weight_path) - + if isinstance(self.model.model, torch.nn.DataParallel) and self.device == 'cpu': + self.model.model = self.model.model.module.to(self.device) + def get_cv2_image(self, image): ''' Load or convert input to OpenCV BGR image numpy array. diff --git a/easyocr/DBNet/README.md b/easyocr/DBNet/README.md index 062d741393..f4c3843fcc 100644 --- a/easyocr/DBNet/README.md +++ b/easyocr/DBNet/README.md @@ -1,70 +1,172 @@ # DBNet - Inference Only This text detection module is adapted from [DBNet++](https://github.com/MhLiao/DB). -## Overview -DBNet works as an image segmentation which performs classification at pixel-level. The model classifies if each pixel from the input image is a part of a text region. This module uses dynamic import and class construction from a config file. Config files are expected to be found in `./configs/`. At the input, the input image are expected to have width and height as multiple of 32. Input images that does not have these dimension will be resized accordingly. In addition, minimum and maximum sizes can be specified in the config file. *Currently, DBNet text detector requires running with GPU.* +## 1. Overview +DBNet works as an image segmentation which performs classification at pixel-level. The model classifies if each pixel from the input image is a part of a text region. This module uses dynamic import and class construction from a config file. Config files are expected to be found in `./configs/`. At the input, the input image is expected to have width and height as multiple of 32. Input images that does not have these dimension will be resized accordingly. In addition, minimum and maximum sizes can be specified in the config file. -### Terminology - * Probability Heatmap: A tensor represent classification confidence of each pixel for being a part of text region. - * Segmentation: A boolean-like tensor represent region that is determined as being a part of a text region. - * text_threshold: A threshold for each element of the probability heatmap to be consider as text region. +### 1.1) Terminology + * Probability Heatmap: A tensor represents classification confidence of each pixel for being a part of a text region. + * Segmentation: A boolean-like tensor represents region that is determined as being a text region. + * text_threshold: A threshold for each element of the probability heatmap to be considered as a text region. * detection_size: This term is used to refer to the size of the image on which the detection routine will be performed. Input images that are not of this size will be resized accordingly. -### Compiling DCN operator -DBNet requires DCN operator to be compiled with GPU. The instruction from the original repo can be found [here](https://github.com/MhLiao/DB#requirements). If EasyOCR is install via `pypi`, this process should be done automatically. If the operator is compiled successfully, a flag `dcn_compiling_success` will be added to `./DBNet/`. If the compilation failed during installation, the flag will be missing. Although, EasyOCR **can work** without DBNet and DCN operator by using CRAFT text detection (default). - -### Changes from the original repo +### 1.2) Changes from the original repo 1. Scripts inside `./concerns/` and multiple `.yaml` files are consolidated and pruned for inference-only implementation and dependencies reduction. - 2. A flag file `dcn_compiling_success` is added to indicate when DCN operator is compiled successfully. In addition, a log file `log.txt` is created to collect warning and error messages from compilation process. - 3. Pretrained weights are renamed for easy referring and adding file extension. + 2. DCN operators, which are required to be compiled with Ahead-of-Time (AoT) in the original repo, are changed to compile with Just-in-Time (JIT) approach as the default. AoT approach is still support. + 3. DCN CPU version is provided in addition to the CUDA version from the original repo. + 4. Pretrained weights are renamed for easy referring and adding file extension. + | Original name | New name | |-----------------------------------------------------|---------------------------| |synthtext_finetune_ic15_res18_dcn_fpn_dbv2 |pretrained_ic15_resnet18.pt| |synthtext_finetune_ic15_res50_dcn_fpn_dbv2_thresh0.25|pretrained_ic15_resnet50.pt| -### Troubleshoot -If DCN operators are failed to compile. You can try compile it manually. The following procedure may serve as a guideline. -#### Locate EasyOCR and DBNet module inside it -In python console environment (Linux/Mac terminal, Jupyter notebook, Spyder IDE, etc.); +## 2. Using and Compiling DCN operators +DBNet requires DCN operators to be compiled. There are two versions of DCN provided; CPU version and CUDA version (original). CUDA version works significantly faster, but requires CUDA-support GPU and CUDA developer toolkit. The CPU version can work without GPU and CUDA. The compilation prerequisites and instruction can be found below. + +Please not that, EasyOCR **can work** without DBNet and DCN operators by using CRAFT text detection (the default detector module). + +### 2.1) Prerequisites +##### CPU version + * GCC compiler > 4.9 + +##### CUDA version + * GCC compiler > 4.9 + * [CUDA Developer Toolkits](https://developer.nvidia.com/cuda-toolkit) > 9.0 (Tested on 11.3). + +### 2.2) Installing Dependencies + +Some step-by-step procedure to install the prerequisites is listed below. Please note that there are other methods that work as well. These methods are listed only to serve as a guideline. + +#### Installing GCC Compiler +*Step 1*: Check if your machine already has GCC installed. + +On command line terminal (Linux/Mac/Windows); ``` -> import os -> import easyocr -> print(os.dirname(easyocr.__file__)) +> gcc --version +``` +If you already have GCC installed, it will report the version of GCC on your machine. If the command gives an error message along the line of command not found, it implies you do not have GCC installed. + +*Step 2*: Install GCC. + +To install GCC, you can do one of the following commands, depending on the privileges of your user account on your machine (Linux/Debian/Ubuntu) +``` +> apt-get install build-essential +``` +or +``` +> sudo apt-get install build-essential +``` +For Mac and Windows users, please follow the respective official instructions. + +*Step 3*: Verification +Repeat Step 1 to make sure that you now have GCC installed. + +#### Installing CUDA and NVCC Compiler +*Step 1*: Check if your machine already has NVCC and CUDA toolkit installed. +On command line terminal (Linux/Mac/Windows); +``` +> nvcc --version +``` +If you already have NVCC installed, it will report the NVCC version on your machine. If the command gives an error message along the line of command not found, it implies you do not have NVCC installed. + +*Step 2*: Install NVCC and CUDA developer toolkit. + +Option 1: The official instruction can be found [here](https://developer.nvidia.com/cuda-downloads). + +Option 2: +Alternatively, you can try install NVCC with [conda](https://docs.conda.io/projects/conda/en/latest/index.html) (package management system and environment management system). + +To use conda to install NVCC, you can do; +*Linux/Mac/Windows* ``` -This should show the location of easyocr on the machine. +> conda install -c conda-forge cudatoolkit-dev +``` +Note that the above command may fail if your machine is missing some library, such as libxml2. If such error occurs, please install the missing libraries and try again. + +*Step 3*: Verification +Repeat Step 1 to make sure that you now have NVCC installed. -The exact output of the above command depends on many factors and will be likely unique for each user, especially the `username`. For the sake of troubleshooting, let's assuming the command above returns something like; +#### Installing conda +Step 1: Check if your machine already has conda installed. +On command line terminal, (Linux/Mac/Windows) ``` -/home/username/anaconda3/lib/python3.8/site-packages/easyocr +> conda --version ``` +If you already have conda installed, it will report the version of conda on your machine. If the command gives an error message along the line of command not found, it implies you do not have conda installed. -#### Check for error messages from previous compilation +Step 2: Install conda +Please follow the [official instruction](https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html) to install it according to your OS. -We want to go into the directory where `DBNet` and the compile script are located within EasyOCR which can be done by appending `DBNet` to the path obtained above. For example; +Step 3: Verification +Repeat Step 1 to make sure that you now have conda installed. + +#### Using Docker image +For Docker users, please use development level images. For example, pytorch/pytorch:x.xx.x-cudax.x-cudnnx-devel. You can verify if all prerequisites are provided by the image by checking +``` +gcc --version ``` -> cd /home/username/anaconda3/lib/python3.8/site-packages/easyocr/DBNet +and ``` -If the compilation had been attempted, there would be a log file `log.txt` in this directory. You can open the log file to check for any error and resolve it. If the compilation hadn't been attempted before, the file would be missing (this is expected). +nvcc --version +``` + +If you already have GCC/NVCC installed, each command will report the version of GCC/NVCC on your machine. If the command gives an error message along the line of command not found, it implies you do not have GCC/NVCC installed. + +### 2.3 Compiling DCN Just-in-Time (JiT) +Once all of the prerequisites have been installed, you can start using `dbnet18` as the detect_network for EasyOCR. The module will compile the source codes automatically when needed. The compilation may take a while if the modules are being loaded and compiled for the first time. -#### Compiling DCN operator manually +### 2.4 Compiling DCN Ahead-of-Time (AoT) +You can also try compiling DCN with Ahead-of-Time approach. The following procedure may serve as a guideline. + +#### 2.4.1 Locate EasyOCR and DBNet module inside it +Start python console environment of your choice, such as Jupyter notebook and Spyder IDE. You can also start one from command line interface (Linux/Mac terminal, etc.) by calling `python` or `python3`; + +In python console environment; +``` +> import os +> import easyocr +> print(os.dirname(easyocr.__file__)) +``` +This should show the installation location of easyocr on your machine. -Once the error, if any, from the previous compilation attempt has been resolved, you can try compile the operator again manual. To do so, first go to EasyOCR directory (e.g. `/home/username/anaconda3/lib/python3.8/site-packages/easyocr`) by; +The exact output of the above command depends on many factors and will be likely unique for each user, especially the `username`. As an example, let's assuming the command above returns something like; ``` -> cd /home/username/anaconda3/lib/python3.8/site-packages/easyocr +> /home/username/anaconda3/lib/python3.8/site-packages/easyocr ``` -Then, change the directory to subdirectory `scritps/`, by; + +We want to go into the directory where `DBNet` and the DCN source files are located within EasyOCR which can be done by appending `DBNet/assets/ops/dcn` to the path obtained above. For example; ``` -> cd scripts +/home/username/anaconda3/lib/python3.8/site-packages/easyocr/DBNet/assets/ops/dcn ``` -To verify if you have the compiling script, you can look for a file `compile_dbnet_dcn.py` under subdirectory `scripts` by; +Access the above directory with any File Manager app on your machine of your choice, for example, Explorer (Windows), Nautilus (Linux/GNOME), Finder (MAC). Or use the following command in the command line interface; ``` -> ls +> cd /home/username/anaconda3/lib/python3.8/site-packages/easyocr/DBNet/assets/ops/dcn ``` -This will list all files and subdirectories in the current directory. -Then, to start the compilation, run; +#### 2.4.2 Compiling DCN operator manually with setup.py script + +First go to DCN operator subdirectory inside DBNet module inside EasyOCR directory (e.g. `/home/username/anaconda3/lib/python3.8/site-packages/easyocr/DBNet/assets/ops/dcn`) by; + +Verify that a script `setup.py` is found in that directory. (This version of `setup.py` script is different from the original version from [DBNet++](https://github.com/MhLiao/DB) since the support for CPU has been added.) Once the script is located, run the following command; +``` +> python setup.py build_ext --inplace +``` +This will start the compilation process and you can monitor the progress, including error messages, if any, on the command line interface. If there is any error, please resolve them, and try again. Once the compilation has been completed, new files will be added to the current directory (i.e. `/home/username/anaconda3/lib/python3.8/site-packages/easyocr/DBNet/assets/ops/dcn`). If your machine has only CPU, but no CUDA device (GPU), two files will be added to the directory. **Please note that the exact names of the files will be different depending on the configuration of your machine.** The file names should look like; +``` +deform_conv_cpu.******.so +deform_pool_cpu.******.so ``` -> python compile_dbnet_dcn.py +If your machine also has CUDA device, two additional files will be added (4 files in total). The file names of these files should look like; ``` -This will start the compilation process. If the compilation is completed successfully, a flag (blank file) `dcn_compiling_success` will be added to `/home/username/anaconda3/lib/python3.8/site-packages/easyocr/DBNet`. If the compilation failed, a new `log.txt` will be written and you can check for any other error messages, resolve them, and try again. +deform_conv_cuda.******.so +deform_pool_cuda.******.so +``` + +### 3. Using DBNet Detector +When initializing EasyOCR with DBNet as the detect network for the first time in the current working session, messages will be print to indicate if the DCN operators are loaded from objects compiled with AoT approach (pre-compiled) or the source codes are compiling with JiT approach. + + + + diff --git a/easyocr/DBNet/assets/ops/dcn/functions/deform_conv.py b/easyocr/DBNet/assets/ops/dcn/functions/deform_conv.py index 6af75a758b..84db861a82 100644 --- a/easyocr/DBNet/assets/ops/dcn/functions/deform_conv.py +++ b/easyocr/DBNet/assets/ops/dcn/functions/deform_conv.py @@ -1,12 +1,80 @@ +''' +Modified by Jaided AI +Released Date: 31/08/2022 +Description: +- Add support for Deformable convolution operator on CPU for forward propagation. +- Change to Just-in-Time loading approach +''' +import os import torch +import warnings from torch.autograd import Function from torch.nn.modules.utils import _pair +from torch.utils import cpp_extension -from .. import deform_conv_cuda +# TODO - Jaided AI: +# 1. Find a better way to handle and support both Ahead-of-Time (AoT) and Just-in-Time (JiT) compilation. +# 2. Find a better way to report error to help pinpointing issues if there is any. +# Note on JiT and AoT compilation: +# This module supports both AoT and JiT compilation approaches. JiT is hardcoded as the default. If AoT compiled objects are present, it will supercede JiT compilation. + +def custom_formatwarning(msg, *args, **kwargs): + # ignore everything except the message + return str(msg) + '\n' +warnings.formatwarning = custom_formatwarning +dcn_dir = os.path.dirname(os.path.dirname(__file__)) +try: + from .. import deform_conv_cpu + warnings.warn("Using precompiled deform_conv_cpu from {}".format(deform_conv_cpu.__file__)) + dcn_cpu_ready = True +except: + try: + warnings.warn("Compiling deform_conv_cpu ...") + warnings.warn("(This may take a while if this module is loaded for the first time.)") + deform_conv_cpu = cpp_extension.load( + name="deform_conv_cpu", + sources=[os.path.join(dcn_dir, 'src', "deform_conv_cpu.cpp"), + os.path.join(dcn_dir, 'src', "deform_conv_cpu_kernel.cpp")]) + warnings.warn("Done.") + dcn_cpu_ready = True + except Exception as error: + warnings.warn(' '.join([ + "Failed to import and/or compile 'deform_conv_cpu' with the following error", + "{}".format(error), + "Deformable convulution and DBNet will not be able to run on CPU." + ])) + dcn_cpu_ready = False -class DeformConvFunction(Function): +if torch.cuda.is_available(): + try: + from .. import deform_conv_cuda + warnings.warn("Using precompiled deform_conv_cuda from {}".format(deform_conv_cuda.__file__)) + dcn_cuda_ready = True + except: + try: + warnings.warn("Compiling deform_conv_cuda ...") + warnings.warn("(This may take a while if this module is loaded for the first time.)") + cuda_sources = [os.path.join(dcn_dir, 'src', src_file) + for src_file in ["deform_conv_cuda.cpp", + "deform_conv_cuda_kernel.cu"] + ] + deform_conv_cuda = cpp_extension.load( + name="deform_conv_cuda", + sources=[os.path.join(dcn_dir, 'src', "deform_conv_cuda.cpp"), + os.path.join(dcn_dir, 'src', "deform_conv_cuda_kernel.cu")]) + warnings.warn("Done.") + dcn_cuda_ready = True + except Exception as error: + warnings.warn(' '.join([ + "Failed to import or compile 'deform_conv_cuda' with the following error", + "{}".format(error), + "Deformable convulution and DBNet will not be able to run on GPU." + ])) + dcn_cuda_ready = False +class DeformConvFunction(Function): + @staticmethod def forward(ctx, input, @@ -37,18 +105,29 @@ def forward(ctx, ctx.bufs_ = [input.new_empty(0), input.new_empty(0)] # columns, ones - if not input.is_cuda: - raise NotImplementedError - else: - cur_im2col_step = min(ctx.im2col_step, input.shape[0]) - assert (input.shape[0] % - cur_im2col_step) == 0, 'im2col step must divide batchsize' + cur_im2col_step = min(ctx.im2col_step, input.shape[0]) + assert (input.shape[0] % + cur_im2col_step) == 0, 'im2col step must divide batchsize' + if not input.is_cuda and dcn_cpu_ready: + deform_conv_cpu.deform_conv_forward_cpu( + input, weight, offset, output, ctx.bufs_[0], ctx.bufs_[1], + weight.size(3), weight.size(2), ctx.stride[1], ctx.stride[0], + ctx.padding[1], ctx.padding[0], ctx.dilation[1], + ctx.dilation[0], ctx.groups, ctx.deformable_groups, + cur_im2col_step) + elif input.is_cuda and dcn_cuda_ready: deform_conv_cuda.deform_conv_forward_cuda( input, weight, offset, output, ctx.bufs_[0], ctx.bufs_[1], weight.size(3), weight.size(2), ctx.stride[1], ctx.stride[0], ctx.padding[1], ctx.padding[0], ctx.dilation[1], ctx.dilation[0], ctx.groups, ctx.deformable_groups, cur_im2col_step) + else: + device_ = input.device.type + raise RuntimeError( + "Input type is {}, but 'deform_conv_{}.*.so' is not imported successfully.".format(device_, device_), + ) + return output @staticmethod @@ -58,7 +137,7 @@ def backward(ctx, grad_output): grad_input = grad_offset = grad_weight = None if not grad_output.is_cuda: - raise NotImplementedError + raise NotImplementedError("DCN operator for cpu for backward propagation is not implemented.") else: cur_im2col_step = min(ctx.im2col_step, input.shape[0]) assert (input.shape[0] % @@ -127,25 +206,36 @@ def forward(ctx, ctx.with_bias = bias is not None if not ctx.with_bias: bias = input.new_empty(1) # fake tensor - if not input.is_cuda: - raise NotImplementedError + if weight.requires_grad or mask.requires_grad or offset.requires_grad \ or input.requires_grad: ctx.save_for_backward(input, offset, mask, weight, bias) output = input.new_empty( ModulatedDeformConvFunction._infer_shape(ctx, input, weight)) ctx._bufs = [input.new_empty(0), input.new_empty(0)] - deform_conv_cuda.modulated_deform_conv_cuda_forward( - input, weight, bias, ctx._bufs[0], offset, mask, output, - ctx._bufs[1], weight.shape[2], weight.shape[3], ctx.stride, - ctx.stride, ctx.padding, ctx.padding, ctx.dilation, ctx.dilation, - ctx.groups, ctx.deformable_groups, ctx.with_bias) + if not input.is_cuda and dcn_cpu_ready: + deform_conv_cpu.modulated_deform_conv_cpu_forward( + input, weight, bias, ctx._bufs[0], offset, mask, output, + ctx._bufs[1], weight.shape[2], weight.shape[3], ctx.stride, + ctx.stride, ctx.padding, ctx.padding, ctx.dilation, ctx.dilation, + ctx.groups, ctx.deformable_groups, ctx.with_bias) + elif input.is_cuda and dcn_cuda_ready: + deform_conv_cuda.modulated_deform_conv_cuda_forward( + input, weight, bias, ctx._bufs[0], offset, mask, output, + ctx._bufs[1], weight.shape[2], weight.shape[3], ctx.stride, + ctx.stride, ctx.padding, ctx.padding, ctx.dilation, ctx.dilation, + ctx.groups, ctx.deformable_groups, ctx.with_bias) + else: + device_ = input.device.type + raise RuntimeError( + "Input type is {}, but 'deform_conv_{}.*.so' is not imported successfully.".format(device_, device_), + ) return output @staticmethod def backward(ctx, grad_output): if not grad_output.is_cuda: - raise NotImplementedError + raise NotImplementedError("DCN operator for CPU for backward propagation is not implemented.") input, offset, mask, weight, bias = ctx.saved_tensors grad_input = torch.zeros_like(input) grad_offset = torch.zeros_like(offset) diff --git a/easyocr/DBNet/assets/ops/dcn/functions/deform_pool.py b/easyocr/DBNet/assets/ops/dcn/functions/deform_pool.py index 65ff0efb57..b4c9943cbc 100644 --- a/easyocr/DBNet/assets/ops/dcn/functions/deform_pool.py +++ b/easyocr/DBNet/assets/ops/dcn/functions/deform_pool.py @@ -1,8 +1,72 @@ +''' +Modified by Jaided AI +Released Date: 31/08/2022 +Description: +- Add support for Deformable convolution operator on CPU for forward propagation. +- Change to Just-in-Time loading approach +''' +import os +import warnings import torch from torch.autograd import Function +from torch.utils import cpp_extension -from .. import deform_pool_cuda +# TODO - Jaided AI: +# 1. Find a better way to handle and support both Ahead-of-Time (AoT) and Just-in-Time (JiT) compilation. +# 2. Find a better way to report error to help pinpointing issues if there is any. +# Note on JiT and AoT compilation: +# This module supports both AoT and JiT compilation approaches. JiT is hardcoded as the default. If AoT compiled objects are present, it will supercede JiT compilation. + +def custom_formatwarning(msg, *args, **kwargs): + # ignore everything except the message + return str(msg) + '\n' +warnings.formatwarning = custom_formatwarning +dcn_dir = os.path.dirname(os.path.dirname(__file__)) +try: + from .. import deform_pool_cpu + warnings.warn("Using precompiled deform_pool_cpu from {}".format(deform_pool_cpu.__file__)) + dcn_cpu_ready = True +except: + try: + warnings.warn("Compiling deform_pool_cpu ...") + warnings.warn("(This may take a while if this module is loaded for the first time.)") + deform_pool_cpu = cpp_extension.load( + name="deform_pool_cpu", + sources=[os.path.join(dcn_dir, 'src', "deform_pool_cpu.cpp"), + os.path.join(dcn_dir, 'src', "deform_pool_cpu_kernel.cpp")]) + warnings.warn("Done.") + dcn_cpu_ready = True + except Exception as error: + warnings.warn(' '.join([ + "Failed to import or compile 'deform_pool_cpu' with the following error", + "{}".format(error), + "Deformable convulution and DBNet will not be able to run on CPU." + ])) + dcn_cpu_ready = False + +if torch.cuda.is_available(): + try: + from .. import deform_pool_cuda + warnings.warn("Using precompiled deform_pool_cuda from {}".format(deform_pool_cuda.__file__)) + dcn_cuda_ready = True + except: + try: + warnings.warn("Compiling deform_pool_cuda ...") + warnings.warn("(This may take a while if this module is loaded for the first time.)") + deform_pool_cuda = cpp_extension.load( + name="deform_pool_cuda", + sources=[os.path.join(dcn_dir, 'src', "deform_pool_cuda.cpp"), + os.path.join(dcn_dir, 'src', "deform_pool_cuda_kernel.cu")]) + warnings.warn("Done.") + dcn_cuda_ready = True + except Exception as error: + warnings.warn(' '.join([ + "Failed to import or compile 'deform_pool_cuda' with the following error", + "{}".format(error), + "Deformable convulution and DBNet will not be able to run on GPU." + ])) + dcn_cuda_ready = False class DeformRoIPoolingFunction(Function): @@ -29,17 +93,26 @@ def forward(ctx, ctx.trans_std = trans_std assert 0.0 <= ctx.trans_std <= 1.0 - if not data.is_cuda: - raise NotImplementedError - + n = rois.shape[0] output = data.new_empty(n, out_channels, out_size, out_size) output_count = data.new_empty(n, out_channels, out_size, out_size) - deform_pool_cuda.deform_psroi_pooling_cuda_forward( - data, rois, offset, output, output_count, ctx.no_trans, - ctx.spatial_scale, ctx.out_channels, ctx.group_size, ctx.out_size, - ctx.part_size, ctx.sample_per_part, ctx.trans_std) - + if not data.is_cuda and dcn_cpu_ready: + deform_pool_cpu.deform_psroi_pooling_cpu_forward( + data, rois, offset, output, output_count, ctx.no_trans, + ctx.spatial_scale, ctx.out_channels, ctx.group_size, ctx.out_size, + ctx.part_size, ctx.sample_per_part, ctx.trans_std) + elif data.is_cuda and dcn_cuda_ready: + deform_pool_cuda.deform_psroi_pooling_cuda_forward( + data, rois, offset, output, output_count, ctx.no_trans, + ctx.spatial_scale, ctx.out_channels, ctx.group_size, ctx.out_size, + ctx.part_size, ctx.sample_per_part, ctx.trans_std) + else: + device_ = input.device.type + raise RuntimeError( + "Input type is {}, but 'deform_conv_{}.*.so' is not imported successfully.".format(device_, device_), + ) + if data.requires_grad or rois.requires_grad or offset.requires_grad: ctx.save_for_backward(data, rois, offset) ctx.output_count = output_count @@ -49,7 +122,7 @@ def forward(ctx, @staticmethod def backward(ctx, grad_output): if not grad_output.is_cuda: - raise NotImplementedError + raise NotImplementedError("DCN operator for cpu for backward propagation is not implemented.") data, rois, offset = ctx.saved_tensors output_count = ctx.output_count diff --git a/easyocr/DBNet/assets/ops/dcn/setup.py b/easyocr/DBNet/assets/ops/dcn/setup.py index 020d5edc4b..bd19888b72 100644 --- a/easyocr/DBNet/assets/ops/dcn/setup.py +++ b/easyocr/DBNet/assets/ops/dcn/setup.py @@ -1,15 +1,33 @@ +import torch from setuptools import setup -from torch.utils.cpp_extension import BuildExtension, CUDAExtension +from torch.utils.cpp_extension import BuildExtension +from torch.utils.cpp_extension import CppExtension +from torch.utils.cpp_extension import CUDAExtension -setup( - name='deform_conv', - ext_modules=[ +modules = [ + CppExtension('deform_conv_cpu', [ + 'src/deform_conv_cpu.cpp', + 'src/deform_conv_cpu_kernel.cpp', + ]), + CppExtension('deform_pool_cpu', [ + 'src/deform_pool_cpu.cpp', + 'src/deform_pool_cpu_kernel.cpp' + ]) +] + +if torch.cuda.is_available(): + modules.extend([ CUDAExtension('deform_conv_cuda', [ 'src/deform_conv_cuda.cpp', 'src/deform_conv_cuda_kernel.cu', ]), CUDAExtension('deform_pool_cuda', [ - 'src/deform_pool_cuda.cpp', 'src/deform_pool_cuda_kernel.cu' - ]), - ], + 'src/deform_pool_cuda.cpp', + 'src/deform_pool_cuda_kernel.cu' + ]) + ]) + +setup( + name='deform_conv', + ext_modules=modules, cmdclass={'build_ext': BuildExtension}) diff --git a/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu.cpp b/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu.cpp new file mode 100644 index 0000000000..13ab4b683b --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu.cpp @@ -0,0 +1,759 @@ +/* +Created by Jaided AI +Released Date: 31/08/2022 +Description: +Deformable convolution operator for CPU. +This code is adapted from; +https://github.com/MhLiao/DB/blob/master/assets/ops/dcn/src/deform_conv_cuda.cpp +https://github.com/CharlesShang/DCNv2 +https://github.com/lbin/DCNv2 +*/ + +#include +#include "deform_conv_cpu_kernel.h" +#include +#include + +void shape_check( + at::Tensor input, at::Tensor offset, + at::Tensor *gradOutput, at::Tensor weight, + int kH, int kW, int dH, int dW, + int padH, int padW, int dilationH, int dilationW, + int group, int deformable_group) { + + TORCH_CHECK(weight.ndimension() == 4, + "4D weight tensor (nOutputPlane,nInputPlane,kH,kW) expected, " + "but got: %s", + weight.ndimension()); + + TORCH_CHECK(weight.is_contiguous(), "weight tensor has to be contiguous"); + + TORCH_CHECK(kW > 0 && kH > 0, + "kernel size should be greater than zero, but got kH: %d kW: %d", kH, + kW); + + TORCH_CHECK((weight.size(2) == kH && weight.size(3) == kW), + "kernel size should be consistent with weight, ", + "but got kH: %d kW: %d weight.size(2): %d, weight.size(3): %d", kH, + kW, weight.size(2), weight.size(3)); + + TORCH_CHECK(dW > 0 && dH > 0, + "stride should be greater than zero, but got dH: %d dW: %d", dH, dW); + + TORCH_CHECK( + dilationW > 0 && dilationH > 0, + "dilation should be greater than 0, but got dilationH: %d dilationW: %d", + dilationH, dilationW); + + int ndim = input.ndimension(); + int dimf = 0; + int dimh = 1; + int dimw = 2; + + if (ndim == 4) { + dimf++; + dimh++; + dimw++; + } + + TORCH_CHECK(ndim == 3 || ndim == 4, "3D or 4D input tensor expected but got: %s", + ndim); + + long nInputPlane = weight.size(1) * group; + long inputHeight = input.size(dimh); + long inputWidth = input.size(dimw); + long nOutputPlane = weight.size(0); + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + + TORCH_CHECK(nInputPlane % deformable_group == 0, + "input channels must divide deformable group size"); + + if (outputWidth < 1 || outputHeight < 1) + AT_ERROR( + "Given input size: (%ld x %ld x %ld). " + "Calculated output size: (%ld x %ld x %ld). Output size is too small", + nInputPlane, inputHeight, inputWidth, nOutputPlane, outputHeight, + outputWidth); + + TORCH_CHECK(input.size(1) == nInputPlane, + "invalid number of input planes, expected: %d, but got: %d", + nInputPlane, input.size(1)); + + TORCH_CHECK((inputHeight >= kH && inputWidth >= kW), + "input image is smaller than kernel"); + + TORCH_CHECK((offset.size(2) == outputHeight && offset.size(3) == outputWidth), + "invalid spatial size of offset, expected height: %d width: %d, but " + "got height: %d width: %d", + outputHeight, outputWidth, offset.size(2), offset.size(3)); + + TORCH_CHECK((offset.size(1) == deformable_group * 2 * kH * kW), + "invalid number of channels of offset"); + + if (gradOutput != NULL) { + TORCH_CHECK(gradOutput->size(dimf) == nOutputPlane, + "invalid number of gradOutput planes, expected: %d, but got: %d", + nOutputPlane, gradOutput->size(dimf)); + + TORCH_CHECK((gradOutput->size(dimh) == outputHeight && + gradOutput->size(dimw) == outputWidth), + "invalid size of gradOutput, expected height: %d width: %d , but " + "got height: %d width: %d", + outputHeight, outputWidth, gradOutput->size(dimh), + gradOutput->size(dimw)); + } +} + +int deform_conv_forward_cpu( + at::Tensor input, at::Tensor weight, + at::Tensor offset, at::Tensor output, + at::Tensor columns, at::Tensor ones, + int kW, int kH, int dW, int dH, + int padW, int padH, int dilationW, int dilationH, + int group, int deformable_group, int im2col_step) { + // todo: resize columns to include im2col: done + // todo: add im2col_step as input + // todo: add new output buffer and transpose it to output (or directly + // transpose output) todo: possibly change data indexing because of + // parallel_imgs + + shape_check( + input, offset, + NULL, weight, + kH, kW, dH, dW, + padH, padW, dilationH, dilationW, + group, deformable_group); + + input = input.contiguous(); + offset = offset.contiguous(); + weight = weight.contiguous(); + + int batch = 1; + if (input.ndimension() == 3) { + // Force batch + batch = 0; + input.unsqueeze_(0); + offset.unsqueeze_(0); + } + + // todo: assert batchsize dividable by im2col_step + + long batchSize = input.size(0); + long nInputPlane = input.size(1); + long inputHeight = input.size(2); + long inputWidth = input.size(3); + + long nOutputPlane = weight.size(0); + + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + + TORCH_CHECK((offset.size(0) == batchSize), "invalid batch size of offset"); + + output = output.view({batchSize / im2col_step, im2col_step, nOutputPlane, + outputHeight, outputWidth}); + columns = at::zeros( + {nInputPlane * kW * kH, im2col_step * outputHeight * outputWidth}, + input.options()); + + if (ones.ndimension() != 2 || + ones.size(0) * ones.size(1) < outputHeight * outputWidth) { + ones = at::ones({outputHeight, outputWidth}, input.options()); + } + + input = input.view({batchSize / im2col_step, im2col_step, nInputPlane, + inputHeight, inputWidth}); + offset = + offset.view({batchSize / im2col_step, im2col_step, + deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + at::Tensor output_buffer = + at::zeros({batchSize / im2col_step, nOutputPlane, + im2col_step * outputHeight, outputWidth}, + output.options()); + + output_buffer = output_buffer.view( + {output_buffer.size(0), group, output_buffer.size(1) / group, + output_buffer.size(2), output_buffer.size(3)}); + using scalar_t = float; + for (int elt = 0; elt < batchSize / im2col_step; elt++) { + auto input_n = input.select(0, elt); + auto offset_n = offset.select(0, elt); + auto columns_n = columns.select(0, elt); + + deformable_im2col( + input_n.data_ptr(), + offset_n.data_ptr(), + nInputPlane, + inputHeight, inputWidth, kH, kW, + padH, padW, dH, dW, + dilationH, dilationW, + im2col_step, deformable_group, + columns_n.data_ptr() + ); + + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + weight = weight.view({group, weight.size(0) / group, weight.size(1), + weight.size(2), weight.size(3)}); + + for (int g = 0; g < group; g++) { + output_buffer[elt][g] = output_buffer[elt][g] + .flatten(1) + .addmm_(weight[g].flatten(1), columns[g]) + .view_as(output_buffer[elt][g]); + } + } + + output_buffer = output_buffer.view( + {output_buffer.size(0), output_buffer.size(1) * output_buffer.size(2), + output_buffer.size(3), output_buffer.size(4)}); + + output_buffer = output_buffer.view({batchSize / im2col_step, nOutputPlane, + im2col_step, outputHeight, outputWidth}); + output_buffer.transpose_(1, 2); + output.copy_(output_buffer); + output = output.view({batchSize, nOutputPlane, outputHeight, outputWidth}); + + input = input.view({batchSize, nInputPlane, inputHeight, inputWidth}); + offset = offset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + if (batch == 0) { + output = output.view({nOutputPlane, outputHeight, outputWidth}); + input = input.view({nInputPlane, inputHeight, inputWidth}); + offset = offset.view({offset.size(1), offset.size(2), offset.size(3)}); + } + + return 1; +} + +int deform_conv_backward_input_cpu( + at::Tensor input, at::Tensor offset, + at::Tensor gradOutput, at::Tensor gradInput, + at::Tensor gradOffset, at::Tensor weight, + at::Tensor columns, + int kW, int kH, int dW, int dH, + int padW, int padH, int dilationW, int dilationH, + int group, int deformable_group, int im2col_step) { + + shape_check( + input, offset, + &gradOutput, weight, + kH, kW, dH, dW, + padH, padW, dilationH, dilationW, + group, deformable_group); + + input = input.contiguous(); + offset = offset.contiguous(); + gradOutput = gradOutput.contiguous(); + weight = weight.contiguous(); + + int batch = 1; + + if (input.ndimension() == 3) { + // Force batch + batch = 0; + input = input.view({1, input.size(0), input.size(1), input.size(2)}); + offset = offset.view({1, offset.size(0), offset.size(1), offset.size(2)}); + gradOutput = gradOutput.view( + {1, gradOutput.size(0), gradOutput.size(1), gradOutput.size(2)}); + } + + long batchSize = input.size(0); + long nInputPlane = input.size(1); + long inputHeight = input.size(2); + long inputWidth = input.size(3); + + long nOutputPlane = weight.size(0); + + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + + TORCH_CHECK((offset.size(0) == batchSize), 3, "invalid batch size of offset"); + gradInput = gradInput.view({batchSize, nInputPlane, inputHeight, inputWidth}); + columns = at::zeros( + {nInputPlane * kW * kH, im2col_step * outputHeight * outputWidth}, + input.options()); + + // change order of grad output + gradOutput = gradOutput.view({batchSize / im2col_step, im2col_step, + nOutputPlane, outputHeight, outputWidth}); + gradOutput.transpose_(1, 2); + + gradInput = gradInput.view({batchSize / im2col_step, im2col_step, nInputPlane, + inputHeight, inputWidth}); + input = input.view({batchSize / im2col_step, im2col_step, nInputPlane, + inputHeight, inputWidth}); + gradOffset = gradOffset.view({batchSize / im2col_step, im2col_step, + deformable_group * 2 * kH * kW, outputHeight, + outputWidth}); + offset = + offset.view({batchSize / im2col_step, im2col_step, + deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + using scalar_t = float; + + for (int elt = 0; elt < batchSize / im2col_step; elt++) { + auto input_n = input.select(0, elt); + auto offset_n = offset.select(0, elt); + auto gradInput_n = gradInput.select(0, elt); + auto gradOffset_n = gradOffset.select(0, elt); + + + // divide into groups + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + weight = weight.view({group, weight.size(0) / group, weight.size(1), + weight.size(2), weight.size(3)}); + gradOutput = gradOutput.view( + {gradOutput.size(0), group, gradOutput.size(1) / group, + gradOutput.size(2), gradOutput.size(3), gradOutput.size(4)}); + + for (int g = 0; g < group; g++) { + columns[g] = columns[g].addmm_(weight[g].flatten(1).transpose(0, 1), + gradOutput[elt][g].flatten(1), 0.0f, 1.0f); + } + + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + gradOutput = gradOutput.view( + {gradOutput.size(0), gradOutput.size(1) * gradOutput.size(2), + gradOutput.size(3), gradOutput.size(4), gradOutput.size(5)}); + + auto columns_n = columns.select(0, elt); + + deformable_col2im_coord( + columns_n.data_ptr(), + input_n.data_ptr(), + offset_n.data_ptr(), + nInputPlane, + inputHeight, inputWidth, kH, kW, + padH, padW, dH, dW, + dilationH, dilationW, + im2col_step, deformable_group, + gradOffset_n.data_ptr()); + + deformable_col2im( + columns_n.data_ptr(), + offset_n.data_ptr(), + nInputPlane, + inputHeight, inputWidth, kH, kW, + padH, padW, dH, dW, + dilationH, dilationW, + im2col_step, deformable_group, + gradInput_n.data_ptr()); + } + + gradOutput.transpose_(1, 2); + gradOutput = + gradOutput.view({batchSize, nOutputPlane, outputHeight, outputWidth}); + + gradInput = gradInput.view({batchSize, nInputPlane, inputHeight, inputWidth}); + input = input.view({batchSize, nInputPlane, inputHeight, inputWidth}); + gradOffset = gradOffset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + offset = offset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + if (batch == 0) { + gradOutput = gradOutput.view({nOutputPlane, outputHeight, outputWidth}); + input = input.view({nInputPlane, inputHeight, inputWidth}); + gradInput = gradInput.view({nInputPlane, inputHeight, inputWidth}); + offset = offset.view({offset.size(1), offset.size(2), offset.size(3)}); + gradOffset = + gradOffset.view({offset.size(1), offset.size(2), offset.size(3)}); + } + + return 1; +} + +int deform_conv_backward_parameters_cpu( + at::Tensor input, at::Tensor offset, + at::Tensor gradOutput, at::Tensor gradWeight, // at::Tensor gradBias, + at::Tensor columns, at::Tensor ones, + int kW, int kH, int dW, int dH, + int padW, int padH, int dilationW, int dilationH, + int group, int deformable_group, + float scale, int im2col_step) { + // todo: transpose and reshape outGrad + // todo: reshape columns + // todo: add im2col_step as input + + shape_check( + input, offset, + &gradOutput, gradWeight, + kH, kW, dH, dW, + padH, padW, dilationH, dilationW, + group, deformable_group); + + input = input.contiguous(); + offset = offset.contiguous(); + gradOutput = gradOutput.contiguous(); + + int batch = 1; + + if (input.ndimension() == 3) { + // Force batch + batch = 0; + input = input.view( + at::IntList({1, input.size(0), input.size(1), input.size(2)})); + gradOutput = gradOutput.view( + {1, gradOutput.size(0), gradOutput.size(1), gradOutput.size(2)}); + } + + long batchSize = input.size(0); + long nInputPlane = input.size(1); + long inputHeight = input.size(2); + long inputWidth = input.size(3); + + long nOutputPlane = gradWeight.size(0); + + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + + TORCH_CHECK((offset.size(0) == batchSize), "invalid batch size of offset"); + + columns = at::zeros( + {nInputPlane * kW * kH, im2col_step * outputHeight * outputWidth}, + input.options()); + + gradOutput = gradOutput.view({batchSize / im2col_step, im2col_step, + nOutputPlane, outputHeight, outputWidth}); + gradOutput.transpose_(1, 2); + + at::Tensor gradOutputBuffer = at::zeros_like(gradOutput); + gradOutputBuffer = + gradOutputBuffer.view({batchSize / im2col_step, nOutputPlane, im2col_step, + outputHeight, outputWidth}); + gradOutputBuffer.copy_(gradOutput); + gradOutputBuffer = + gradOutputBuffer.view({batchSize / im2col_step, nOutputPlane, + im2col_step * outputHeight, outputWidth}); + + gradOutput.transpose_(1, 2); + gradOutput = + gradOutput.view({batchSize, nOutputPlane, outputHeight, outputWidth}); + + input = input.view({batchSize / im2col_step, im2col_step, nInputPlane, + inputHeight, inputWidth}); + offset = + offset.view({batchSize / im2col_step, im2col_step, + deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + using scalar_t = float; + for (int elt = 0; elt < batchSize / im2col_step; elt++) { + auto input_n = input.select(0, elt); + auto offset_n = offset.select(0, elt); + auto columns_n = columns.select(0, elt); + + deformable_im2col( + input_n.data_ptr(), + offset_n.data_ptr(), + nInputPlane, + inputHeight, inputWidth, + kH, kW, padH, padW, dH, dW, + dilationH, dilationW, + im2col_step, deformable_group, + columns_n.data_ptr()); + + // divide into group + gradOutputBuffer = gradOutputBuffer.view( + {gradOutputBuffer.size(0), group, gradOutputBuffer.size(1) / group, + gradOutputBuffer.size(2), gradOutputBuffer.size(3)}); + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + gradWeight = + gradWeight.view({group, gradWeight.size(0) / group, gradWeight.size(1), + gradWeight.size(2), gradWeight.size(3)}); + + for (int g = 0; g < group; g++) { + gradWeight[g] = gradWeight[g] + .flatten(1) + .addmm_(gradOutputBuffer[elt][g].flatten(1), + columns[g].transpose(1, 0), 1.0, scale) + .view_as(gradWeight[g]); + } + gradOutputBuffer = gradOutputBuffer.view( + {gradOutputBuffer.size(0), + gradOutputBuffer.size(1) * gradOutputBuffer.size(2), + gradOutputBuffer.size(3), gradOutputBuffer.size(4)}); + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + gradWeight = gradWeight.view({gradWeight.size(0) * gradWeight.size(1), + gradWeight.size(2), gradWeight.size(3), + gradWeight.size(4)}); + } + + input = input.view({batchSize, nInputPlane, inputHeight, inputWidth}); + offset = offset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + if (batch == 0) { + gradOutput = gradOutput.view({nOutputPlane, outputHeight, outputWidth}); + input = input.view({nInputPlane, inputHeight, inputWidth}); + } + + return 1; +} + +void modulated_deform_conv_cpu_forward( + at::Tensor input, at::Tensor weight, at::Tensor bias, at::Tensor ones, + at::Tensor offset, at::Tensor mask, at::Tensor output, at::Tensor columns, + int kernel_h, int kernel_w, const int stride_h, const int stride_w, + const int pad_h, const int pad_w, const int dilation_h, const int dilation_w, + const int group, const int deformable_group, + const bool with_bias) { + + TORCH_CHECK(input.is_contiguous(), "input tensor has to be contiguous"); + TORCH_CHECK(weight.is_contiguous(), "weight tensor has to be contiguous"); + + const int batch = input.size(0); + const int channels = input.size(1); + const int height = input.size(2); + const int width = input.size(3); + + const int channels_out = weight.size(0); + const int channels_kernel = weight.size(1); + const int kernel_h_ = weight.size(2); + const int kernel_w_ = weight.size(3); + + if (kernel_h_ != kernel_h || kernel_w_ != kernel_w) + AT_ERROR("Input shape and kernel shape wont match: (%d x %d vs %d x %d).", + kernel_h_, kernel_w, kernel_h_, kernel_w_); + if (channels != channels_kernel * group) + AT_ERROR("Input shape and kernel channels wont match: (%d vs %d).", + channels, channels_kernel * group); + + const int height_out = + (height + 2 * pad_h - (dilation_h * (kernel_h - 1) + 1)) / stride_h + 1; + const int width_out = + (width + 2 * pad_w - (dilation_w * (kernel_w - 1) + 1)) / stride_w + 1; + + if (ones.ndimension() != 2 || + ones.size(0) * ones.size(1) < height_out * width_out) { + // Resize plane and fill with ones... + ones = at::ones({height_out, width_out}, input.options()); + } + + // resize output + output = output.view({batch, channels_out, height_out, width_out}).zero_(); + // resize temporary columns + columns = + at::zeros({channels * kernel_h * kernel_w, 1 * height_out * width_out}, + input.options()); + + output = output.view({output.size(0), group, output.size(1) / group, + output.size(2), output.size(3)}); + using scalar_t = float; + + for (int b = 0; b < batch; b++) { + auto input_n = input.select(0, b); + auto offset_n = offset.select(0, b); + auto mask_n = mask.select(0, b); + auto output_n = output.select(0, b); + + + modulated_deformable_im2col_cpu( + input_n.data_ptr(), + offset_n.data_ptr(), + mask_n.data_ptr(), + 1, channels, height, width, + height_out, width_out, kernel_h, kernel_w, + pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, deformable_group, + columns.data_ptr()); + + // divide into group + weight = weight.view({group, weight.size(0) / group, weight.size(1), + weight.size(2), weight.size(3)}); + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + + for (int g = 0; g < group; g++) { + output[b][g] = output[b][g] + .flatten(1) + .addmm_(weight[g].flatten(1), columns[g]) + .view_as(output[b][g]); + } + + weight = weight.view({weight.size(0) * weight.size(1), weight.size(2), + weight.size(3), weight.size(4)}); + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + } + + output = output.view({output.size(0), output.size(1) * output.size(2), + output.size(3), output.size(4)}); + + if (with_bias) { + output += bias.view({1, bias.size(0), 1, 1}); + } +} + +void modulated_deform_conv_cpu_backward( + at::Tensor input, at::Tensor weight, at::Tensor bias, at::Tensor ones, + at::Tensor offset, at::Tensor mask, at::Tensor columns, + at::Tensor grad_input, at::Tensor grad_weight, at::Tensor grad_bias, + at::Tensor grad_offset, at::Tensor grad_mask, at::Tensor grad_output, + int kernel_h, int kernel_w, int stride_h, int stride_w, + int pad_h, int pad_w, int dilation_h, int dilation_w, + int group, int deformable_group, + const bool with_bias) { + + TORCH_CHECK(input.is_contiguous(), "input tensor has to be contiguous"); + TORCH_CHECK(weight.is_contiguous(), "weight tensor has to be contiguous"); + + const int batch = input.size(0); + const int channels = input.size(1); + const int height = input.size(2); + const int width = input.size(3); + + const int channels_kernel = weight.size(1); + const int kernel_h_ = weight.size(2); + const int kernel_w_ = weight.size(3); + if (kernel_h_ != kernel_h || kernel_w_ != kernel_w) + TORCH_CHECK("Input shape and kernel shape wont match: (%d x %d vs %d x %d).", + kernel_h_, kernel_w, kernel_h_, kernel_w_); + if (channels != channels_kernel * group) + TORCH_CHECK("Input shape and kernel channels wont match: (%d vs %d).", + channels, channels_kernel * group); + + const int height_out = + (height + 2 * pad_h - (dilation_h * (kernel_h - 1) + 1)) / stride_h + 1; + const int width_out = + (width + 2 * pad_w - (dilation_w * (kernel_w - 1) + 1)) / stride_w + 1; + + if (ones.ndimension() != 2 || + ones.size(0) * ones.size(1) < height_out * width_out) { + // Resize plane and fill with ones... + ones = at::ones({height_out, width_out}, input.options()); + } + + grad_input = grad_input.view({batch, channels, height, width}); + columns = at::zeros({channels * kernel_h * kernel_w, height_out * width_out}, + input.options()); + + grad_output = + grad_output.view({grad_output.size(0), group, grad_output.size(1) / group, + grad_output.size(2), grad_output.size(3)}); + + using scalar_t = float; + for (int b = 0; b < batch; b++) { + // divide int group + auto input_n = input.select(0, b); + auto offset_n = offset.select(0, b); + auto mask_n = mask.select(0, b); + auto grad_output_n = grad_output.select(0, b); + auto grad_input_n = grad_input.select(0, b); + auto grad_offset_n = grad_offset.select(0, b); + auto grad_mask_n = grad_mask.select(0, b); + + + + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + weight = weight.view({group, weight.size(0) / group, weight.size(1), + weight.size(2), weight.size(3)}); + + for (int g = 0; g < group; g++) { + columns[g].addmm_(weight[g].flatten(1).transpose(0, 1), + grad_output[b][g].flatten(1), 0.0f, 1.0f); + } + + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + weight = weight.view({weight.size(0) * weight.size(1), weight.size(2), + weight.size(3), weight.size(4)}); + + // gradient w.r.t. input coordinate data + modulated_deformable_col2im_coord_cpu( + columns.data_ptr(), + input_n.data_ptr(), + offset_n.data_ptr(), + mask_n.data_ptr(), + 1, channels, height, width, + height_out, width_out, kernel_h, kernel_w, + pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, deformable_group, + grad_offset_n.data_ptr(), + grad_mask_n.data_ptr() + ); + // gradient w.r.t. input data + modulated_deformable_col2im_cpu( + columns.data_ptr(), + offset_n.data_ptr(), + mask_n.data_ptr(), + 1, channels, height, width, + height_out, width_out, kernel_h, kernel_w, + pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, deformable_group, + grad_input_n.data_ptr() + ); + // gradient w.r.t. weight, dWeight should accumulate across the batch and group + modulated_deformable_im2col_cpu( + input_n.data_ptr(), + offset_n.data_ptr(), + mask_n.data_ptr(), + 1, channels, height, width, + height_out, width_out, kernel_h, kernel_w, + pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, deformable_group, + columns.data_ptr() + ); + + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + grad_weight = grad_weight.view({group, grad_weight.size(0) / group, + grad_weight.size(1), grad_weight.size(2), + grad_weight.size(3)}); + if (with_bias) + grad_bias = grad_bias.view({group, grad_bias.size(0) / group}); + + for (int g = 0; g < group; g++) { + grad_weight[g] = + grad_weight[g] + .flatten(1) + .addmm_(grad_output[b][g].flatten(1), columns[g].transpose(0, 1)) + .view_as(grad_weight[g]); + if (with_bias) { + grad_bias[g] = + grad_bias[g] + .view({-1, 1}) + .addmm_(grad_output[b][g].flatten(1), ones.view({-1, 1})) + .view(-1); + } + } + + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + grad_weight = grad_weight.view({grad_weight.size(0) * grad_weight.size(1), + grad_weight.size(2), grad_weight.size(3), + grad_weight.size(4)}); + if (with_bias) + grad_bias = grad_bias.view({grad_bias.size(0) * grad_bias.size(1)}); + } + grad_output = grad_output.view({grad_output.size(0) * grad_output.size(1), + grad_output.size(2), grad_output.size(3), + grad_output.size(4)}); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("deform_conv_forward_cpu", + &deform_conv_forward_cpu, + "deform forward (CPU)"); + m.def("deform_conv_backward_input_cpu", + &deform_conv_backward_input_cpu, + "deform_conv_backward_input (CPU)"); + m.def("deform_conv_backward_parameters_cpu", + &deform_conv_backward_parameters_cpu, + "deform_conv_backward_parameters (CPU)"); + m.def("modulated_deform_conv_cpu_forward", + &modulated_deform_conv_cpu_forward, + "modulated deform conv forward (CPU)"); + m.def("modulated_deform_conv_cpu_backward", + &modulated_deform_conv_cpu_backward, + "modulated deform conv backward (CPU)"); +} diff --git a/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu_kernel.cpp b/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu_kernel.cpp new file mode 100644 index 0000000000..05f91fc5e0 --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu_kernel.cpp @@ -0,0 +1,766 @@ +/*! + ******************* BEGIN Caffe Copyright Notice and Disclaimer **************** + * + * COPYRIGHT + * + * All contributions by the University of California: + * Copyright (c) 2014-2017 The Regents of the University of California (Regents) + * All rights reserved. + * + * All other contributions: + * Copyright (c) 2014-2017, the respective contributors + * All rights reserved. + * + * Caffe uses a shared copyright model: each contributor holds copyright over + * their contributions to Caffe. The project versioning records all such + * contribution and copyright details. If a contributor wants to further mark + * their specific copyright on a particular contribution, they should indicate + * their copyright solely in the commit message of the change when it is + * committed. + * + * LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * CONTRIBUTION AGREEMENT + * + * By contributing to the BVLC/caffe repository through pull-request, comment, + * or otherwise, the contributor releases their content to the + * license and copyright terms herein. + * + ***************** END Caffe Copyright Notice and Disclaimer ******************** + * + * Copyright (c) 2018 Microsoft + * Licensed under The MIT License [see LICENSE for details] + * \file modulated_deformable_im2col.cuh + * \brief Function definitions of converting an image to + * column matrix based on kernel, padding, dilation, and offset. + * These functions are mainly used in deformable convolution operators. + * \ref: https://arxiv.org/abs/1703.06211 + * \author Yuwen Xiong, Haozhi Qi, Jifeng Dai, Xizhou Zhu, Han Hu, Dazhi Cheng + */ + +/* +Modified by Jaided AI +Released Date: 31/08/2022 +Description: +Deformable convolution kernel for CPU. +This code is adapted from; +https://github.com/MhLiao/DB/blob/master/assets/ops/dcn/src/deform_conv_cuda_kernel.cu +https://github.com/CharlesShang/DCNv2 +https://github.com/lbin/DCNv2 +*/ + +#include "deform_conv_cpu_kernel.h" +#include +#include +#include +#include + +using namespace at; + +float deformable_im2col_bilinear( + const float *bottom_data, const int data_width, + const int height, const int width, + float h, float w) { + + int h_low = floor(h); + int w_low = floor(w); + int h_high = h_low + 1; + int w_high = w_low + 1; + + float lh = h - h_low; + float lw = w - w_low; + float hh = 1 - lh, hw = 1 - lw; + + float v1 = 0; + if (h_low >= 0 && w_low >= 0) + v1 = bottom_data[h_low * data_width + w_low]; + float v2 = 0; + if (h_low >= 0 && w_high <= width - 1) + v2 = bottom_data[h_low * data_width + w_high]; + float v3 = 0; + if (h_high <= height - 1 && w_low >= 0) + v3 = bottom_data[h_high * data_width + w_low]; + float v4 = 0; + if (h_high <= height - 1 && w_high <= width - 1) + v4 = bottom_data[h_high * data_width + w_high]; + + float w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; + + float val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + return val; +} + +float get_gradient_weight( + float argmax_h, float argmax_w, + const int h, const int w, + const int height, const int width) { + + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || argmax_w >= width) + { + //empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + float weight = 0; + if (h == argmax_h_low && w == argmax_w_low) + weight = (h + 1 - argmax_h) * (w + 1 - argmax_w); + if (h == argmax_h_low && w == argmax_w_high) + weight = (h + 1 - argmax_h) * (argmax_w + 1 - w); + if (h == argmax_h_high && w == argmax_w_low) + weight = (argmax_h + 1 - h) * (w + 1 - argmax_w); + if (h == argmax_h_high && w == argmax_w_high) + weight = (argmax_h + 1 - h) * (argmax_w + 1 - w); + return weight; +} + +float get_coordinate_weight( + float argmax_h, float argmax_w, + const int height, const int width, + const float *im_data, const int data_width, + const int bp_dir) { + + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || argmax_w >= width) + { + //empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + float weight = 0; + + if (bp_dir == 0) + { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_w_low + 1 - argmax_w) * im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += -1 * (argmax_w - argmax_w_low) * im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += (argmax_w_low + 1 - argmax_w) * im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_w - argmax_w_low) * im_data[argmax_h_high * data_width + argmax_w_high]; + } + else if (bp_dir == 1) + { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_h_low + 1 - argmax_h) * im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += (argmax_h_low + 1 - argmax_h) * im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += -1 * (argmax_h - argmax_h_low) * im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_h - argmax_h_low) * im_data[argmax_h_high * data_width + argmax_w_high]; + } + + return weight; +} + +void deformable_im2col_cpu_kernel( + const int n, const float *data_im, const float *data_offset, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int channel_per_deformable_group, + const int batch_size, const int num_channels, const int deformable_group, + const int height_col, const int width_col, + float *data_col) { + + for(int index=0; index(0); + const float h_im = h_in + i * dilation_h + offset_h; + const float w_im = w_in + j * dilation_w + offset_w; + if (h_im > -1 && w_im > -1 && h_im < height && w_im < width) + { + val = deformable_im2col_bilinear(data_im_ptr, width, height, width, h_im, w_im); + } + *data_col_ptr = val; + data_col_ptr += height_col * width_col; + } + } + } +} + +void deformable_im2col( + const float* data_im, const float* data_offset, const int channels, + const int height, const int width, const int ksize_h, const int ksize_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int parallel_imgs, + const int deformable_group, float* data_col) { + + // num_axes should be smaller than block size + // todo: check parallel_imgs is correctly passed in + int height_col = (height + 2 * pad_h - (dilation_h * (ksize_h - 1) + 1)) / stride_h + 1; + int width_col = (width + 2 * pad_w - (dilation_w * (ksize_w - 1) + 1)) / stride_w + 1; + int num_kernels = channels * height_col * width_col * parallel_imgs; + int channel_per_deformable_group = channels / deformable_group; + + deformable_im2col_cpu_kernel( + num_kernels, data_im, data_offset, + height, width, ksize_h, ksize_w, + pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, channel_per_deformable_group, + parallel_imgs, channels, deformable_group, + height_col, width_col, data_col); + +} + +void deformable_col2im_cpu_kernel( + const int n, const float *data_col, const float *data_offset, const int channels, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int channel_per_deformable_group, + const int batch_size, const int deformable_group, + const int height_col, const int width_col, float *grad_im) { + + for(int index = 0; index < n; index++) + { + const int j = (index / width_col / height_col / batch_size) % kernel_w; + const int i = (index / width_col / height_col / batch_size / kernel_w) % kernel_h; + const int c = index / width_col / height_col / batch_size / kernel_w / kernel_h; + // compute the start and end of the output + + const int deformable_group_index = c / channel_per_deformable_group; + + int w_out = index % width_col; + int h_out = (index / width_col) % height_col; + int b = (index / width_col / height_col) % batch_size; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + + const float *data_offset_ptr = data_offset + (b * deformable_group + deformable_group_index) * + 2 * kernel_h * kernel_w * height_col * width_col; + const int data_offset_h_ptr = ((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out; + const int data_offset_w_ptr = ((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out; + const float offset_h = data_offset_ptr[data_offset_h_ptr]; + const float offset_w = data_offset_ptr[data_offset_w_ptr]; + const float cur_inv_h_data = h_in + i * dilation_h + offset_h; + const float cur_inv_w_data = w_in + j * dilation_w + offset_w; + + const float cur_top_grad = data_col[index]; + const int cur_h = (int)cur_inv_h_data; + const int cur_w = (int)cur_inv_w_data; + for (int dy = -2; dy <= 2; dy++) + { + for (int dx = -2; dx <= 2; dx++) + { + if (cur_h + dy >= 0 && cur_h + dy < height && + cur_w + dx >= 0 && cur_w + dx < width && + abs(cur_inv_h_data - (cur_h + dy)) < 1 && + abs(cur_inv_w_data - (cur_w + dx)) < 1) + { + int cur_bottom_grad_pos = ((b * channels + c) * height + cur_h + dy) * width + cur_w + dx; + float weight = get_gradient_weight(cur_inv_h_data, cur_inv_w_data, cur_h + dy, cur_w + dx, height, width); + *(grad_im + cur_bottom_grad_pos) += weight * cur_top_grad; + } + } + } + } +} + +void deformable_col2im( + const float* data_col, const float* data_offset, const int channels, + const int height, const int width, const int ksize_h, const int ksize_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int parallel_imgs, const int deformable_group, float* grad_im) { + + // todo: make sure parallel_imgs is passed in correctly + int height_col = (height + 2 * pad_h - (dilation_h * (ksize_h - 1) + 1)) / stride_h + 1; + int width_col = (width + 2 * pad_w - (dilation_w * (ksize_w - 1) + 1)) / stride_w + 1; + int num_kernels = channels * ksize_h * ksize_w * height_col * width_col * parallel_imgs; + int channel_per_deformable_group = channels / deformable_group; + + deformable_col2im_cpu_kernel( + num_kernels, data_col, data_offset, channels, + height, width, ksize_h, ksize_w, + pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, channel_per_deformable_group, + parallel_imgs, deformable_group, height_col, width_col, grad_im); + +} + +void deformable_col2im_coord_cpu_kernel( + const int n, const float *data_col, const float *data_im, + const float *data_offset, const int channels, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int channel_per_deformable_group, + const int batch_size, const int offset_channels, const int deformable_group, + const int height_col, const int width_col, float *grad_offset) { + + for(int index = 0; index < n; index++) + { + float val = 0; + int w = index % width_col; + int h = (index / width_col) % height_col; + int c = (index / width_col / height_col) % offset_channels; + int b = (index / width_col / height_col) / offset_channels; + // compute the start and end of the output + + const int deformable_group_index = c / (2 * kernel_h * kernel_w); + const int col_step = kernel_h * kernel_w; + int cnt = 0; + const float *data_col_ptr = data_col + deformable_group_index * channel_per_deformable_group * + batch_size * width_col * height_col; + const float *data_im_ptr = data_im + (b * deformable_group + deformable_group_index) * + channel_per_deformable_group / kernel_h / kernel_w * height * width; + const float *data_offset_ptr = data_offset + (b * deformable_group + deformable_group_index) * 2 * + kernel_h * kernel_w * height_col * width_col; + + const int offset_c = c - deformable_group_index * 2 * kernel_h * kernel_w; + + for (int col_c = (offset_c / 2); col_c < channel_per_deformable_group; col_c += col_step) + { + const int col_pos = (((col_c * batch_size + b) * height_col) + h) * width_col + w; + const int bp_dir = offset_c % 2; + + int j = (col_pos / width_col / height_col / batch_size) % kernel_w; + int i = (col_pos / width_col / height_col / batch_size / kernel_w) % kernel_h; + int w_out = col_pos % width_col; + int h_out = (col_pos / width_col) % height_col; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + const int data_offset_h_ptr = (((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out); + const int data_offset_w_ptr = (((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out); + const float offset_h = data_offset_ptr[data_offset_h_ptr]; + const float offset_w = data_offset_ptr[data_offset_w_ptr]; + float inv_h = h_in + i * dilation_h + offset_h; + float inv_w = w_in + j * dilation_w + offset_w; + if (inv_h <= -1 || inv_w <= -1 || inv_h >= height || inv_w >= width) + { + inv_h = inv_w = -2; + } + + const float weight = get_coordinate_weight( + inv_h, inv_w, + height, width, data_im_ptr + cnt * height * width, width, bp_dir); + val += weight * data_col_ptr[col_pos]; + cnt += 1; + } + + grad_offset[index] = val; + } +} + +void deformable_col2im_coord( + const float* data_col, const float* data_im, + const float* data_offset, const int channels, + const int height, const int width, const int ksize_h, const int ksize_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int parallel_imgs, + const int deformable_group, float* grad_offset) { + + int height_col = (height + 2 * pad_h - (dilation_h * (ksize_h - 1) + 1)) / stride_h + 1; + int width_col = (width + 2 * pad_w - (dilation_w * (ksize_w - 1) + 1)) / stride_w + 1; + int num_kernels = height_col * width_col * 2 * ksize_h * ksize_w * deformable_group * parallel_imgs; + int channel_per_deformable_group = channels * ksize_h * ksize_w / deformable_group; + + deformable_col2im_coord_cpu_kernel( + num_kernels, data_col, data_im, + data_offset, channels, + height, width, ksize_h, ksize_w, + pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, channel_per_deformable_group, + parallel_imgs, 2 * ksize_h * ksize_w * deformable_group, deformable_group, + height_col, width_col, grad_offset); + +} + +float dmcn_im2col_bilinear_cpu( + const float *bottom_data, const int data_width, + const int height, const int width, + float h, float w) { + + int h_low = floor(h); + int w_low = floor(w); + int h_high = h_low + 1; + int w_high = w_low + 1; + + float lh = h - h_low; + float lw = w - w_low; + float hh = 1 - lh, hw = 1 - lw; + + float v1 = 0; + if (h_low >= 0 && w_low >= 0) + v1 = bottom_data[h_low * data_width + w_low]; + float v2 = 0; + if (h_low >= 0 && w_high <= width - 1) + v2 = bottom_data[h_low * data_width + w_high]; + float v3 = 0; + if (h_high <= height - 1 && w_low >= 0) + v3 = bottom_data[h_high * data_width + w_low]; + float v4 = 0; + if (h_high <= height - 1 && w_high <= width - 1) + v4 = bottom_data[h_high * data_width + w_high]; + + float w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; + + float val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + return val; +} + +float dmcn_get_gradient_weight_cpu( + float argmax_h, float argmax_w, + const int h, const int w, + const int height, const int width) { + + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || argmax_w >= width) + { + //empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + float weight = 0; + if (h == argmax_h_low && w == argmax_w_low) + weight = (h + 1 - argmax_h) * (w + 1 - argmax_w); + if (h == argmax_h_low && w == argmax_w_high) + weight = (h + 1 - argmax_h) * (argmax_w + 1 - w); + if (h == argmax_h_high && w == argmax_w_low) + weight = (argmax_h + 1 - h) * (w + 1 - argmax_w); + if (h == argmax_h_high && w == argmax_w_high) + weight = (argmax_h + 1 - h) * (argmax_w + 1 - w); + return weight; +} + +float dmcn_get_coordinate_weight_cpu( + float argmax_h, float argmax_w, + const int height, const int width, + const float *im_data, const int data_width, + const int bp_dir) { + + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || argmax_w >= width) + { + //empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + float weight = 0; + + if (bp_dir == 0) + { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_w_low + 1 - argmax_w) * im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += -1 * (argmax_w - argmax_w_low) * im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += (argmax_w_low + 1 - argmax_w) * im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_w - argmax_w_low) * im_data[argmax_h_high * data_width + argmax_w_high]; + } + else if (bp_dir == 1) + { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_h_low + 1 - argmax_h) * im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += (argmax_h_low + 1 - argmax_h) * im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += -1 * (argmax_h - argmax_h_low) * im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_h - argmax_h_low) * im_data[argmax_h_high * data_width + argmax_w_high]; + } + + return weight; +} + +void modulated_deformable_im2col_cpu_kernel( + const int n, const float *data_im, const float *data_offset, const float *data_mask, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int channel_per_deformable_group, + const int batch_size, const int num_channels, const int deformable_group, + const int height_col, const int width_col, float *data_col) { + + for(int index=0; index(0); + const float h_im = h_in + i * dilation_h + offset_h; + const float w_im = w_in + j * dilation_w + offset_w; + if (h_im > -1 && w_im > -1 && h_im < height && w_im < width) + { + val = dmcn_im2col_bilinear_cpu(data_im_ptr, width, height, width, h_im, w_im); + } + *data_col_ptr = val * mask; + data_col_ptr += height_col * width_col; + } + } + } +} + +void modulated_deformable_col2im_cpu_kernel( + const int n, const float *data_col, const float *data_offset, + const float *data_mask, const int channels, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int channel_per_deformable_group, + const int batch_size, const int deformable_group, + const int height_col, const int width_col, float *grad_im) { + + for(int index = 0; index < n; index++) + { + const int j = (index / width_col / height_col / batch_size) % kernel_w; + const int i = (index / width_col / height_col / batch_size / kernel_w) % kernel_h; + const int c = index / width_col / height_col / batch_size / kernel_w / kernel_h; + // compute the start and end of the output + + const int deformable_group_index = c / channel_per_deformable_group; + + int w_out = index % width_col; + int h_out = (index / width_col) % height_col; + int b = (index / width_col / height_col) % batch_size; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + + const float *data_offset_ptr = data_offset + (b * deformable_group + deformable_group_index) * 2 * kernel_h * kernel_w * height_col * width_col; + const float *data_mask_ptr = data_mask + (b * deformable_group + deformable_group_index) * kernel_h * kernel_w * height_col * width_col; + const int data_offset_h_ptr = ((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out; + const int data_offset_w_ptr = ((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out; + const int data_mask_hw_ptr = ((i * kernel_w + j) * height_col + h_out) * width_col + w_out; + const float offset_h = data_offset_ptr[data_offset_h_ptr]; + const float offset_w = data_offset_ptr[data_offset_w_ptr]; + const float mask = data_mask_ptr[data_mask_hw_ptr]; + const float cur_inv_h_data = h_in + i * dilation_h + offset_h; + const float cur_inv_w_data = w_in + j * dilation_w + offset_w; + + const float cur_top_grad = data_col[index] * mask; + const int cur_h = (int)cur_inv_h_data; + const int cur_w = (int)cur_inv_w_data; + + for (int dy = -2; dy <= 2; dy++) + { + for (int dx = -2; dx <= 2; dx++) + { + if (cur_h + dy >= 0 && cur_h + dy < height && + cur_w + dx >= 0 && cur_w + dx < width && + abs(cur_inv_h_data - (cur_h + dy)) < 1 && + abs(cur_inv_w_data - (cur_w + dx)) < 1) + { + int cur_bottom_grad_pos = ((b * channels + c) * height + cur_h + dy) * width + cur_w + dx; + float weight = dmcn_get_gradient_weight_cpu(cur_inv_h_data, cur_inv_w_data, cur_h + dy, cur_w + dx, height, width); + *(grad_im + cur_bottom_grad_pos) += weight * cur_top_grad; + + } + } + } + } +} + +void modulated_deformable_col2im_coord_cpu_kernel( + const int n, const float *data_col, const float *data_im, + const float *data_offset, const float *data_mask, const int channels, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int channel_per_deformable_group, + const int batch_size, const int offset_channels, const int deformable_group, + const int height_col, const int width_col, float *grad_offset, float *grad_mask) { + + for(int index = 0; index < n; index++) + { + float val = 0, mval = 0; + int w = index % width_col; + int h = (index / width_col) % height_col; + int c = (index / width_col / height_col) % offset_channels; + int b = (index / width_col / height_col) / offset_channels; + // compute the start and end of the output + + const int deformable_group_index = c / (2 * kernel_h * kernel_w); + const int col_step = kernel_h * kernel_w; + int cnt = 0; + const float *data_col_ptr = data_col + deformable_group_index * channel_per_deformable_group * batch_size * width_col * height_col; + const float *data_im_ptr = data_im + (b * deformable_group + deformable_group_index) * channel_per_deformable_group / kernel_h / kernel_w * height * width; + const float *data_offset_ptr = data_offset + (b * deformable_group + deformable_group_index) * 2 * kernel_h * kernel_w * height_col * width_col; + const float *data_mask_ptr = data_mask + (b * deformable_group + deformable_group_index) * kernel_h * kernel_w * height_col * width_col; + + const int offset_c = c - deformable_group_index * 2 * kernel_h * kernel_w; + + for (int col_c = (offset_c / 2); col_c < channel_per_deformable_group; col_c += col_step) + { + const int col_pos = (((col_c * batch_size + b) * height_col) + h) * width_col + w; + const int bp_dir = offset_c % 2; + + int j = (col_pos / width_col / height_col / batch_size) % kernel_w; + int i = (col_pos / width_col / height_col / batch_size / kernel_w) % kernel_h; + int w_out = col_pos % width_col; + int h_out = (col_pos / width_col) % height_col; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + const int data_offset_h_ptr = (((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out); + const int data_offset_w_ptr = (((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out); + const int data_mask_hw_ptr = (((i * kernel_w + j) * height_col + h_out) * width_col + w_out); + const float offset_h = data_offset_ptr[data_offset_h_ptr]; + const float offset_w = data_offset_ptr[data_offset_w_ptr]; + const float mask = data_mask_ptr[data_mask_hw_ptr]; + float inv_h = h_in + i * dilation_h + offset_h; + float inv_w = w_in + j * dilation_w + offset_w; + if (inv_h <= -1 || inv_w <= -1 || inv_h >= height || inv_w >= width) + { + inv_h = inv_w = -2; + } + else + { + mval += data_col_ptr[col_pos] * dmcn_im2col_bilinear_cpu(data_im_ptr + cnt * height * width, width, height, width, inv_h, inv_w); + } + const float weight = dmcn_get_coordinate_weight_cpu( + inv_h, inv_w, + height, width, data_im_ptr + cnt * height * width, width, bp_dir); + val += weight * data_col_ptr[col_pos] * mask; + cnt += 1; + } + grad_offset[index] = val; + if (offset_c % 2 == 0) + grad_mask[(((b * deformable_group + deformable_group_index) * kernel_h * kernel_w + offset_c / 2) * height_col + h) * width_col + w] = mval; + } +} + +void modulated_deformable_im2col_cpu( + const float* data_im, const float* data_offset, const float* data_mask, + const int batch_size, const int channels, const int height_im, const int width_im, + const int height_col, const int width_col, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int deformable_group, + float* data_col) { + + // num_axes should be smaller than block size + const int channel_per_deformable_group = channels / deformable_group; + const int num_kernels = channels * batch_size * height_col * width_col; + modulated_deformable_im2col_cpu_kernel( + num_kernels, data_im, data_offset, data_mask, + height_im, width_im, kernel_h, kernel_w, + pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, channel_per_deformable_group, + batch_size, channels, deformable_group, + height_col, width_col, data_col); +} + +void modulated_deformable_col2im_cpu( + const float* data_col, const float* data_offset, const float* data_mask, + const int batch_size, const int channels, const int height_im, const int width_im, + const int height_col, const int width_col, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int deformable_group, + float* grad_im) { + + const int channel_per_deformable_group = channels / deformable_group; + const int num_kernels = channels * kernel_h * kernel_w * batch_size * height_col * width_col; + modulated_deformable_col2im_cpu_kernel( + num_kernels, data_col, data_offset, data_mask, channels, + height_im, width_im, kernel_h, kernel_w, + pad_h, pad_h, stride_h, stride_w, + dilation_h, dilation_w, channel_per_deformable_group, + batch_size, deformable_group, + height_col, width_col, grad_im); +} + +void modulated_deformable_col2im_coord_cpu( + const float* data_col, const float* data_im, const float* data_offset, const float* data_mask, + const int batch_size, const int channels, const int height_im, const int width_im, + const int height_col, const int width_col, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int deformable_group, + float* grad_offset, float* grad_mask) { + + const int num_kernels = batch_size * height_col * width_col * 2 * kernel_h * kernel_w * deformable_group; + const int channel_per_deformable_group = channels * kernel_h * kernel_w / deformable_group; + modulated_deformable_col2im_coord_cpu_kernel( + num_kernels, data_col, data_im, + data_offset, data_mask, channels, + height_im, width_im, kernel_h, kernel_w, + pad_h, pad_w, stride_h, stride_w, + dilation_h, dilation_w, channel_per_deformable_group, + batch_size, 2 * kernel_h * kernel_w * deformable_group, deformable_group, + height_col, width_col, grad_offset, grad_mask); +} diff --git a/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu_kernel.h b/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu_kernel.h new file mode 100644 index 0000000000..aec9b2cee5 --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/src/deform_conv_cpu_kernel.h @@ -0,0 +1,64 @@ +/* +Created by Jaided AI +Released Date: 31/08/2022 +Description: +Deformable convolution kernel for CPU. +This code is adapted from; +https://github.com/MhLiao/DB/blob/master/assets/ops/dcn/src/deform_conv_cuda.cpp +https://github.com/CharlesShang/DCNv2 +https://github.com/lbin/DCNv2 +*/ + +#pragma once +#ifndef DEFORM_CONV_CPU_KERNEL +#define DEFORM_CONV_CPU_KERNEL + +void deformable_im2col( + const float *data_im, const float *data_offset, const int channels, + const int height, const int width, const int ksize_h, const int ksize_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int parallel_imgs, + const int deformable_group, float *data_col); + +void deformable_col2im( + const float *data_col, const float *data_offset, const int channels, + const int height, const int width, const int ksize_h, const int ksize_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int parallel_imgs, + const int deformable_group, float *grad_im); + +void deformable_col2im_coord( + const float *data_col, const float *data_im, + const float *data_offset, const int channels, + const int height, const int width, const int ksize_h, const int ksize_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int parallel_imgs, + const int deformable_group, float *grad_offset); + +void modulated_deformable_im2col_cpu( + const float *data_im, const float *data_offset, const float *data_mask, + const int batch_size, const int channels, const int height_im, const int width_im, + const int height_col, const int width_col, const int kernel_h, const int kenerl_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int deformable_group, + float *data_col); + +void modulated_deformable_col2im_cpu( + const float *data_col, const float *data_offset, const float *data_mask, + const int batch_size, const int channels, const int height_im, const int width_im, + const int height_col, const int width_col, const int kernel_h, const int kenerl_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int deformable_group, + float *grad_im); + +void modulated_deformable_col2im_coord_cpu( + const float *data_col, const float *data_im, const float *data_offset, const float *data_mask, + const int batch_size, const int channels, const int height_im, const int width_im, + const int height_col, const int width_col, const int kernel_h, const int kenerl_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, const int deformable_group, + float *grad_offset, float *grad_mask); + +#endif + + diff --git a/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu.cpp b/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu.cpp new file mode 100644 index 0000000000..2512ab4745 --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu.cpp @@ -0,0 +1,86 @@ +/* +Created by Jaided AI +Released Date: 31/08/2022 +Description: +Deformable convolution operator for CPU. +This code is adapted from; +https://github.com/MhLiao/DB/blob/master/assets/ops/dcn/src/deform_pool_cuda.cpp +https://github.com/CharlesShang/DCNv2 +https://github.com/lbin/DCNv2 +*/ + +#include "deform_pool_cpu_kernel.h" +#include +#include +#include + +void deform_psroi_pooling_cpu_forward( + at::Tensor input, at::Tensor bbox, at::Tensor trans, + at::Tensor out, at::Tensor top_count, const int no_trans, + const float spatial_scale, const int output_dim, const int group_size, + const int pooled_size, const int part_size, const int sample_per_part, + const float trans_std) { + + TORCH_CHECK(input.is_contiguous(), "input tensor has to be contiguous"); + + const int batch = input.size(0); + const int channels = input.size(1); + const int height = input.size(2); + const int width = input.size(3); + const int channels_trans = no_trans ? 2 : trans.size(1); + + const int num_bbox = bbox.size(0); + + if (num_bbox != out.size(0)) + AT_ERROR("Output shape and bbox number wont match: (%d vs %d).", + out.size(0), num_bbox); + + DeformablePSROIPoolForward( + input, bbox, trans, + out, top_count, + batch, channels, height, width, + num_bbox, channels_trans, no_trans, + spatial_scale, output_dim, group_size, + pooled_size, part_size, sample_per_part, + trans_std); +} + +void deform_psroi_pooling_cpu_backward( + at::Tensor out_grad, at::Tensor input, at::Tensor bbox, + at::Tensor trans, at::Tensor top_count, at::Tensor input_grad, + at::Tensor trans_grad, const int no_trans, + const float spatial_scale, const int output_dim, const int group_size, + const int pooled_size, const int part_size, const int sample_per_part, + const float trans_std) { + TORCH_CHECK(out_grad.is_contiguous(), "out_grad tensor has to be contiguous"); + TORCH_CHECK(input.is_contiguous(), "input tensor has to be contiguous"); + + const int batch = input.size(0); + const int channels = input.size(1); + const int height = input.size(2); + const int width = input.size(3); + const int channels_trans = no_trans ? 2 : trans.size(1); + + const int num_bbox = bbox.size(0); + if (num_bbox != out_grad.size(0)) + AT_ERROR("Output shape and bbox number wont match: (%d vs %d).", + out_grad.size(0), num_bbox); + + DeformablePSROIPoolBackwardAcc( + out_grad, input, bbox, + trans, top_count, input_grad, trans_grad, + batch, channels, height, width, + num_bbox, channels_trans, no_trans, + spatial_scale, output_dim, group_size, + pooled_size, part_size, sample_per_part, + trans_std); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("deform_psroi_pooling_cpu_forward", + &deform_psroi_pooling_cpu_forward, + "deform psroi pooling forward(CPU)"); + m.def("deform_psroi_pooling_cpu_backward", + &deform_psroi_pooling_cpu_backward, + "deform psroi pooling backward(CPU)"); +} diff --git a/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu_kernel.cpp b/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu_kernel.cpp new file mode 100644 index 0000000000..655fc4949e --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu_kernel.cpp @@ -0,0 +1,314 @@ +/*! + * Copyright (c) 2017 Microsoft + * Licensed under The MIT License [see LICENSE for details] + * \file deformable_psroi_pooling.cu + * \brief + * \author Yi Li, Guodong Zhang, Jifeng Dai +*/ +/***************** Adapted by Charles Shang *********************/ +// modify from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/blob/mmdetection/mmdet/ops/dcn/src/cuda/deform_psroi_pooling_cuda.cu + +/* +Modified by Jaided AI +Released Date: 31/08/2022 +Description: +Deformable convolution kernel for CPU. +This code is adapted from; +https://github.com/MhLiao/DB/blob/master/assets/ops/dcn/src/deform_pool_cuda_kernel.cu +https://github.com/CharlesShang/DCNv2 +https://github.com/lbin/DCNv2 +*/ + +#include +#include "deform_pool_cpu_kernel.h" +#include +#include +#include +#include + +template +T bilinear_interp_cpu( + const T *data, const T x, const T y, + const int width, const int height) { + + int x1 = floor(x); + int x2 = ceil(x); + int y1 = floor(y); + int y2 = ceil(y); + T dist_x = static_cast(x - x1); + T dist_y = static_cast(y - y1); + T value11 = data[y1 * width + x1]; + T value12 = data[y2 * width + x1]; + T value21 = data[y1 * width + x2]; + T value22 = data[y2 * width + x2]; + T value = (1 - dist_x) * (1 - dist_y) * value11 + + (1 - dist_x) * dist_y * value12 + + dist_x * (1 - dist_y) * value21 + + dist_x * dist_y * value22; + return value; +} + +template +void DeformablePSROIPoolForwardKernelCpu( + const int count, const T *bottom_data, const T spatial_scale, + const int channels, const int height, const int width, + const int pooled_height, const int pooled_width, + const T *bottom_rois, const T *bottom_trans, + const int no_trans, const T trans_std, const int sample_per_part, + const int output_dim, const int group_size, const int part_size, + const int num_classes, const int channels_each_class, + T *top_data, T *top_count) { + + for(int index = 0; index < count; index++) + { + // The output is in order (n, ctop, ph, pw) + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int ctop = (index / pooled_width / pooled_height) % output_dim; + int n = index / pooled_width / pooled_height / output_dim; + + // [start, end) interval for spatial sampling + const T *offset_bottom_rois = bottom_rois + n * 5; + int roi_batch_ind = offset_bottom_rois[0]; + T roi_start_w = static_cast(round(offset_bottom_rois[1])) * spatial_scale - 0.5; + T roi_start_h = static_cast(round(offset_bottom_rois[2])) * spatial_scale - 0.5; + T roi_end_w = static_cast(round(offset_bottom_rois[3]) + 1.) * spatial_scale - 0.5; + T roi_end_h = static_cast(round(offset_bottom_rois[4]) + 1.) * spatial_scale - 0.5; + + // Force too small ROIs to be 1x1 + T roi_width = std::max(roi_end_w - roi_start_w, T(0.1)); //avoid 0 + T roi_height = std::max(roi_end_h - roi_start_h, T(0.1)); + + // Compute w and h at bottom + T bin_size_h = roi_height / static_cast(pooled_height); + T bin_size_w = roi_width / static_cast(pooled_width); + + T sub_bin_size_h = bin_size_h / static_cast(sample_per_part); + T sub_bin_size_w = bin_size_w / static_cast(sample_per_part); + + int part_h = floor(static_cast(ph) / pooled_height * part_size); + int part_w = floor(static_cast(pw) / pooled_width * part_size); + int class_id = ctop / channels_each_class; + T trans_x = no_trans ? static_cast(0) : bottom_trans[(((n * num_classes + class_id) * 2) * part_size + part_h) * part_size + part_w] * trans_std; + T trans_y = no_trans ? static_cast(0) : bottom_trans[(((n * num_classes + class_id) * 2 + 1) * part_size + part_h) * part_size + part_w] * trans_std; + + T wstart = static_cast(pw) * bin_size_w + roi_start_w; + wstart += trans_x * roi_width; + T hstart = static_cast(ph) * bin_size_h + roi_start_h; + hstart += trans_y * roi_height; + + T sum = 0; + int count = 0; + int gw = floor(static_cast(pw) * group_size / pooled_width); + int gh = floor(static_cast(ph) * group_size / pooled_height); + gw = std::min(std::max(gw, 0), group_size - 1); + gh = std::min(std::max(gh, 0), group_size - 1); + + const T *offset_bottom_data = bottom_data + (roi_batch_ind * channels) * height * width; + for (int ih = 0; ih < sample_per_part; ih++) + { + for (int iw = 0; iw < sample_per_part; iw++) + { + T w = wstart + iw * sub_bin_size_w; + T h = hstart + ih * sub_bin_size_h; + // bilinear interpolation + if (w < -0.5 || w > width - 0.5 || h < -0.5 || h > height - 0.5) + { + continue; + } + w = std::min(std::max(w, T(0.)), width - T(1.)); + h = std::min(std::max(h, T(0.)), height - T(1.)); + int c = (ctop * group_size + gh) * group_size + gw; + T val = bilinear_interp_cpu(offset_bottom_data + c * height * width, w, h, width, height); + sum += val; + count++; + } + } + top_data[index] = count == 0 ? static_cast(0) : sum / count; + top_count[index] = count; + } +} + +template +void DeformablePSROIPoolBackwardAccKernelCpu( + const int count, const T *top_diff, const T *top_count, + const int num_rois, const T spatial_scale, + const int channels, const int height, const int width, + const int pooled_height, const int pooled_width, const int output_dim, + T *bottom_data_diff, T *bottom_trans_diff, + const T *bottom_data, const T *bottom_rois, const T *bottom_trans, + const int no_trans, const T trans_std, const int sample_per_part, + const int group_size, const int part_size, const int num_classes, + const int channels_each_class) { + + for(int index = 0; index < count; index++) + { + // The output is in order (n, ctop, ph, pw) + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int ctop = (index / pooled_width / pooled_height) % output_dim; + int n = index / pooled_width / pooled_height / output_dim; + + // [start, end) interval for spatial sampling + const T *offset_bottom_rois = bottom_rois + n * 5; + int roi_batch_ind = offset_bottom_rois[0]; + T roi_start_w = static_cast(round(offset_bottom_rois[1])) * spatial_scale - 0.5; + T roi_start_h = static_cast(round(offset_bottom_rois[2])) * spatial_scale - 0.5; + T roi_end_w = static_cast(round(offset_bottom_rois[3]) + 1.) * spatial_scale - 0.5; + T roi_end_h = static_cast(round(offset_bottom_rois[4]) + 1.) * spatial_scale - 0.5; + + // Force too small ROIs to be 1x1 + T roi_width = std::max(roi_end_w - roi_start_w, T(0.1)); //avoid 0 + T roi_height = std::max(roi_end_h - roi_start_h, T(0.1)); + + // Compute w and h at bottom + T bin_size_h = roi_height / static_cast(pooled_height); + T bin_size_w = roi_width / static_cast(pooled_width); + + T sub_bin_size_h = bin_size_h / static_cast(sample_per_part); + T sub_bin_size_w = bin_size_w / static_cast(sample_per_part); + + int part_h = floor(static_cast(ph) / pooled_height * part_size); + int part_w = floor(static_cast(pw) / pooled_width * part_size); + int class_id = ctop / channels_each_class; + T trans_x = no_trans ? static_cast(0) : bottom_trans[(((n * num_classes + class_id) * 2) * part_size + part_h) * part_size + part_w] * trans_std; + T trans_y = no_trans ? static_cast(0) : bottom_trans[(((n * num_classes + class_id) * 2 + 1) * part_size + part_h) * part_size + part_w] * trans_std; + + T wstart = static_cast(pw) * bin_size_w + roi_start_w; + wstart += trans_x * roi_width; + T hstart = static_cast(ph) * bin_size_h + roi_start_h; + hstart += trans_y * roi_height; + + if (top_count[index] <= 0) + { + continue; + } + T diff_val = top_diff[index] / top_count[index]; + const T *offset_bottom_data = bottom_data + roi_batch_ind * channels * height * width; + T *offset_bottom_data_diff = bottom_data_diff + roi_batch_ind * channels * height * width; + int gw = floor(static_cast(pw) * group_size / pooled_width); + int gh = floor(static_cast(ph) * group_size / pooled_height); + gw = std::min(std::max(gw, 0), group_size - 1); + gh = std::min(std::max(gh, 0), group_size - 1); + + for (int ih = 0; ih < sample_per_part; ih++) + { + for (int iw = 0; iw < sample_per_part; iw++) + { + T w = wstart + iw * sub_bin_size_w; + T h = hstart + ih * sub_bin_size_h; + // bilinear interpolation + if (w < -0.5 || w > width - 0.5 || h < -0.5 || h > height - 0.5) + { + continue; + } + w = std::min(std::max(w, T(0.)), width - T(1.)); + h = std::min(std::max(h, T(0.)), height - T(1.)); + int c = (ctop * group_size + gh) * group_size + gw; + // backward on feature + int x0 = floor(w); + int x1 = ceil(w); + int y0 = floor(h); + int y1 = ceil(h); + T dist_x = w - x0, dist_y = h - y0; + T q00 = (1 - dist_x) * (1 - dist_y); + T q01 = (1 - dist_x) * dist_y; + T q10 = dist_x * (1 - dist_y); + T q11 = dist_x * dist_y; + int bottom_index_base = c * height * width; + *(offset_bottom_data_diff + bottom_index_base + y0 * width + x0) += q00 * diff_val; + *(offset_bottom_data_diff + bottom_index_base + y1 * width + x0) += q01 * diff_val; + *(offset_bottom_data_diff + bottom_index_base + y0 * width + x1) += q10 * diff_val; + *(offset_bottom_data_diff + bottom_index_base + y1 * width + x1) += q11 * diff_val; + + + if (no_trans) + { + continue; + } + T U00 = offset_bottom_data[bottom_index_base + y0 * width + x0]; + T U01 = offset_bottom_data[bottom_index_base + y1 * width + x0]; + T U10 = offset_bottom_data[bottom_index_base + y0 * width + x1]; + T U11 = offset_bottom_data[bottom_index_base + y1 * width + x1]; + T diff_x = (U11 * dist_y + U10 * (1 - dist_y) - U01 * dist_y - U00 * (1 - dist_y)) * trans_std * diff_val; + diff_x *= roi_width; + T diff_y = (U11 * dist_x + U01 * (1 - dist_x) - U10 * dist_x - U00 * (1 - dist_x)) * trans_std * diff_val; + diff_y *= roi_height; + + *(bottom_trans_diff + (((n * num_classes + class_id) * 2) * part_size + part_h) * part_size + part_w) += diff_x; + *(bottom_trans_diff + (((n * num_classes + class_id) * 2 + 1) * part_size + part_h) * part_size + part_w) += diff_y; + } + } + } +} + +void DeformablePSROIPoolForward( + const at::Tensor input, const at::Tensor bbox, + const at::Tensor trans, at::Tensor out, at::Tensor top_count, + const int batch, const int channels, const int height, const int width, + const int num_bbox, const int channels_trans, const int no_trans, + const float spatial_scale, const int output_dim, + const int group_size, const int pooled_size, const int part_size, + const int sample_per_part, const float trans_std) { + + const int pooled_height = pooled_size; + const int pooled_width = pooled_size; + + long out_size = num_bbox * output_dim * pooled_height * pooled_width; + const int num_classes = no_trans ? 1 : channels_trans / 2; + const int channels_each_class = no_trans ? output_dim : output_dim / num_classes; + + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "DeformablePSROIPoolForward", [&] { + DeformablePSROIPoolForwardKernelCpu( + out_size, input.contiguous().data_ptr(), spatial_scale, + channels, height, width, + pooled_height, pooled_width, + bbox.contiguous().data_ptr(), + trans.contiguous().data_ptr(), + no_trans, trans_std, sample_per_part, + output_dim, group_size, part_size, + num_classes, channels_each_class, + out.data_ptr(), + top_count.data_ptr()); + + }); + +} + +void DeformablePSROIPoolBackwardAcc( + const at::Tensor out_grad, const at::Tensor input, const at::Tensor bbox, + const at::Tensor trans, const at::Tensor top_count, + at::Tensor in_grad, at::Tensor trans_grad, + const int batch, const int channels, const int height, const int width, + const int num_bbox, const int channels_trans, const int no_trans, + const float spatial_scale, const int output_dim, + const int group_size, const int pooled_size, const int part_size, + const int sample_per_part, const float trans_std) { + // LOG(INFO) << "DeformablePSROIPoolBackward"; + const int num_rois = num_bbox; + const int pooled_height = pooled_size; + const int pooled_width = pooled_size; + long out_size = num_bbox * output_dim * pooled_height * pooled_width; + const int num_classes = no_trans ? 1 : channels_trans / 2; + const int channels_each_class = no_trans ? output_dim : output_dim / num_classes; + + AT_DISPATCH_FLOATING_TYPES(out_grad.scalar_type(), "DeformablePSROIPoolBackwardAcc", [&] { + DeformablePSROIPoolBackwardAccKernelCpu( + out_size, + out_grad.contiguous().data_ptr(), + top_count.contiguous().data_ptr(), + num_rois, spatial_scale, + channels, height, width, + pooled_height, pooled_width, output_dim, + in_grad.contiguous().data_ptr(), + trans_grad.contiguous().data_ptr(), + input.contiguous().data_ptr(), + bbox.contiguous().data_ptr(), + trans.contiguous().data_ptr(), + no_trans, trans_std, sample_per_part, + group_size, part_size, num_classes, + channels_each_class); + }); + + +} diff --git a/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu_kernel.h b/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu_kernel.h new file mode 100644 index 0000000000..1872ca2672 --- /dev/null +++ b/easyocr/DBNet/assets/ops/dcn/src/deform_pool_cpu_kernel.h @@ -0,0 +1,35 @@ +/* +Created by Jaided AI +Released Date: 31/08/2022 +Description: +Deformable convolution kernel for CPU. +This code is adapted from; +https://github.com/MhLiao/DB/blob/master/assets/ops/dcn/src/deform_pool_cuda_kernel.cu +https://github.com/CharlesShang/DCNv2 +https://github.com/lbin/DCNv2 +*/ + +#include +#pragma once +#ifndef DEFORM_POOL_CPU_KERNEL +#define DEFORM_POOL_CPU_KERNEL + +void DeformablePSROIPoolForward( + const at::Tensor data, const at::Tensor bbox, const at::Tensor trans, + at::Tensor out, at::Tensor top_count, + const int batch, const int channels, const int height, const int width, + const int num_bbox, const int channels_trans, const int no_trans, + const float spatial_scale, const int output_dim, const int group_size, + const int pooled_size, const int part_size, const int sample_per_part, + const float trans_std); + +void DeformablePSROIPoolBackwardAcc( + const at::Tensor out_grad, const at::Tensor data, const at::Tensor bbox, + const at::Tensor trans, const at::Tensor top_count, at::Tensor in_grad, at::Tensor trans_grad, + const int batch, const int channels, const int height, const int width, + const int num_bbox, const int channels_trans, const int no_trans, + const float spatial_scale, const int output_dim, const int group_size, + const int pooled_size, const int part_size, const int sample_per_part, + const float trans_std); + +#endif diff --git a/easyocr/__init__.py b/easyocr/__init__.py index b9cb76c184..56260c9939 100644 --- a/easyocr/__init__.py +++ b/easyocr/__init__.py @@ -1,3 +1,3 @@ from .easyocr import Reader -__version__ = '1.6.1' +__version__ = '1.6.2' diff --git a/easyocr/detection_db.py b/easyocr/detection_db.py index f32b1b4c8e..0a2978d637 100644 --- a/easyocr/detection_db.py +++ b/easyocr/detection_db.py @@ -102,7 +102,7 @@ def test_net(image, return bboxes, polys -def get_detector(trained_model, device='cpu', quantize=True, cudnn_benchmark=False): +def get_detector(trained_model, backbone = 'resnet18', device='cpu', quantize=True, cudnn_benchmark=False): ''' A wrapper to initialize DBNet text detection model @@ -110,6 +110,8 @@ def get_detector(trained_model, device='cpu', quantize=True, cudnn_benchmark=Fal ---------- trained_model : str Path to trained weight to use. + backbone : str + Backbone to use. Options are 'resnet18' or 'resnet50'. The default is 'resnet18'. device : str, optional Device to use. Options are "cpu" and "cuda". The default is 'cpu'. quantize : boolean, optional @@ -126,16 +128,17 @@ def get_detector(trained_model, device='cpu', quantize=True, cudnn_benchmark=Fal dynamic_import_relative_path = os.path.join("easyocr", "DBNet"), device = device, verbose = 0) - dbnet.construct_model(dbnet.configs['resnet18']['model']) - if device == 'cpu': - dbnet.load_weight(trained_model) + if backbone not in ['resnet18', 'resnet50']: + raise ValueError("Invalid backbone. Options are 'resnet18' or 'resnet50'.") + dbnet.initialize_model(dbnet.configs[backbone]['model'], + trained_model) + if torch.device(device).type == 'cpu': if quantize: try: torch.quantization.quantize_dynamic(dbnet, dtype=torch.qint8, inplace=True) except: pass else: - dbnet.load_weight(trained_model) dbnet.model = torch.nn.DataParallel(dbnet.model).to(device) cudnn.benchmark = cudnn_benchmark @@ -194,6 +197,13 @@ def get_textbox(detector, result : list of lists List of text bounding boxes in format [left, right, top, bottom]. ''' + if torch.device(device).type != detector.device: + raise RuntimeError(' '.join([ + "DBNet detector is initialized with {} device, but detection routine", + "is called with device = {}.", + "To use this detector both have to be the same." + ]).format(detector.device, device)) + _, polys_list = test_net(image, detector, threshold = threshold, diff --git a/easyocr/easyocr.py b/easyocr/easyocr.py index 9c7529364b..1b0770ecaa 100644 --- a/easyocr/easyocr.py +++ b/easyocr/easyocr.py @@ -233,13 +233,8 @@ def getDetectorPath(self, detect_network): self.detect_network = detect_network if self.detect_network == 'craft': from .detection import get_detector, get_textbox - elif self.detect_network == 'dbnet18': - if os.path.isfile(os.path.join( os.path.dirname(__file__), "DBNet", "dcn_compiling_success")): - from .detection_db import get_detector, get_textbox - else: - trouble_url = "https://github.com/JaidedAI/EasyOCR/tree/master/easyocr/DBNet" - raise RuntimeError("dbnet is selected as the detection network, but DBNet is not compiled successfully during installation \ - or the indicating flag is missing. Please check {} for troubleshooting.".format(trouble_url)) + elif self.detect_network in ['dbnet18']: + from .detection_db import get_detector, get_textbox else: raise RuntimeError("Unsupport detector network. Support networks are craft and dbnet18.") self.get_textbox = get_textbox @@ -269,7 +264,11 @@ def getDetectorPath(self, detect_network): return detector_path def initDetector(self, detector_path): - return self.get_detector(detector_path, self.device, self.quantize, cudnn_benchmark=self.cudnn_benchmark) + return self.get_detector(detector_path, + device = self.device, + quantize = self.quantize, + cudnn_benchmark = self.cudnn_benchmark + ) def setDetector(self, detect_network): detector_path = self.getDetectorPath(detect_network) diff --git a/easyocr/scripts/compile_dbnet_dcn.py b/easyocr/scripts/compile_dbnet_dcn.py index bea340ea17..f916016e42 100644 --- a/easyocr/scripts/compile_dbnet_dcn.py +++ b/easyocr/scripts/compile_dbnet_dcn.py @@ -7,6 +7,7 @@ manually. ''' import os +import glob from datetime import datetime import subprocess @@ -31,24 +32,45 @@ def print_success(text, log_path): fid.write((datetime.now().strftime("%H:%M:%S - %d %b %Y") + "\n").encode('utf-8')) fid.write((text + "\n").encode('utf-8')) print(text) + +def validate_compilation(parent_dir, log_path, cpu_or_cuda): + dcn_dir = os.path.join(parent_dir, 'DBNet', 'assets', 'ops', 'dcn') + #Just to be safe, check explicitly. + if cpu_or_cuda == 'cpu': + conv_cpu_exist = glob.glob(os.path.join(dcn_dir, 'deform_conv_cpu.*.so')) + pool_cpu_exist = glob.glob(os.path.join(dcn_dir, 'deform_pool_cpu.*.so')) + success_message = "DCN CPU operator is compiled successfully at {}.".format(os.path.abspath(os.path.join(parent_dir,'DBNet'))) + print_success(success_message, log_path) + return conv_cpu_exist and pool_cpu_exist + elif cpu_or_cuda == 'cuda': + conv_cuda_exist = glob.glob(os.path.join(dcn_dir, 'deform_conv_cuda.*.so')) + pool_cuda_exist = glob.glob(os.path.join(dcn_dir, 'deform_pool_cuda.*.so')) + success_message = "DCN CUDA operator is compiled successfully at {}.".format(os.path.abspath(os.path.join(parent_dir,'DBNet'))) + print_success(success_message, log_path) + return conv_cuda_exist and pool_cuda_exist + else: + raise ValueError("'cpu_or_cuda' must be either 'cpu' or 'cuda'") def main(): cwd = os.getcwd() parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) log_path = os.path.join(parent_dir,'DBNet', 'log.txt') try: - print("Compiling DCN operator...") + print("Compiling DCN operators...") os.chdir(os.path.join(parent_dir,'DBNet','assets','ops','dcn')) result = subprocess.run( "python setup.py build_ext --inplace", shell=True, capture_output = True ) - if result.returncode == 0: - os.chdir(os.path.join(parent_dir,'DBNet')) - result = subprocess.run( - "touch dcn_compiling_success", shell=True, capture_output = True - ) - success_message = "DCN operator is compiled successfully at {}.".format(os.path.abspath(os.path.join(parent_dir,'DBNet'))) - print_success(success_message, log_path) + if result.returncode == 0: + os.chdir(os.path.join(parent_dir, 'DBNet')) + if validate_compilation(parent_dir, log_path, 'cpu'): + result = subprocess.run( + "touch dcn_cpu_compiling_success", shell=True, capture_output = True + ) + if validate_compilation(parent_dir, log_path, 'cuda'): + result = subprocess.run( + "touch dcn_cuda_compiling_success", shell=True, capture_output = True + ) else: print(result.__dict__) print_error([result.stdout, result.stderr], log_path) diff --git a/setup.py b/setup.py index 31b2b8b45e..09b703c14d 100644 --- a/setup.py +++ b/setup.py @@ -1,13 +1,8 @@ """ End-to-End Multi-Lingual Optical Character Recognition (OCR) Solution """ -import os -import subprocess from io import open from setuptools import setup -from setuptools.command.install import install -from setuptools.command.develop import develop -from setuptools.command.egg_info import egg_info with open('requirements.txt', encoding="utf-8-sig") as f: requirements = f.readlines() @@ -17,27 +12,11 @@ def readme(): README = f.read() return README -def compile_dbnet_dcn(script_dir): - script_path = os.path.join(script_dir, 'easyocr', 'scripts', 'compile_dbnet_dcn.py') - subprocess.run( - "python {}".format(script_path), shell=True - ) - -class CustomCommand_install(install): - def run(self): - install.run(self) - compile_dbnet_dcn(self.install_lib) - -class CustomCommand_develop(develop): - def run(self): - develop.run(self) - compile_dbnet_dcn(self.install_dir) - setup( name='easyocr', packages=['easyocr'], include_package_data=True, - version='1.6.1', + version='1.6.2', install_requires=requirements, entry_points={"console_scripts": ["easyocr= easyocr.cli:main"]}, license='Apache License 2.0', @@ -52,8 +31,5 @@ def run(self): classifiers=[ 'Development Status :: 5 - Production/Stable' ], - cmdclass={ - 'install': CustomCommand_install, - 'develop': CustomCommand_develop, - } + ) From b079926797ab97694ae8c1de7e85b1eb9400e870 Mon Sep 17 00:00:00 2001 From: jaidedteam Date: Thu, 15 Sep 2022 18:13:51 +0700 Subject: [PATCH 21/61] fix torchvision backward compatibility --- easyocr/model/modules.py | 18 +++++++++++------- trainer/craft/model/vgg16_bn.py | 18 ++++++++++-------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/easyocr/model/modules.py b/easyocr/model/modules.py index be089fb6ea..0850b0cd89 100644 --- a/easyocr/model/modules.py +++ b/easyocr/model/modules.py @@ -1,11 +1,11 @@ import torch import torch.nn as nn -import torch.nn.functional as F import torch.nn.init as init +import torchvision from torchvision import models -from torchvision.models import VGG16_BN_Weights -from torchvision.models.vgg import model_urls from collections import namedtuple +from packaging import version + def init_weights(modules): for m in modules: @@ -23,10 +23,14 @@ def init_weights(modules): class vgg16_bn(torch.nn.Module): def __init__(self, pretrained=True, freeze=True): super(vgg16_bn, self).__init__() - model_urls['vgg16_bn'] = model_urls['vgg16_bn'].replace('https://', 'http://') - vgg_pretrained_features = models.vgg16_bn( - weights=VGG16_BN_Weights.DEFAULT if pretrained else None - ).features + if version.parse(torchvision.__version__) >= version.parse('0.13'): + vgg_pretrained_features = models.vgg16_bn( + weights=models.VGG16_BN_Weights.DEFAULT if pretrained else None + ).features + else: #torchvision.__version__ < 0.13 + models.vgg.model_urls['vgg16_bn'] = models.vgg.model_urls['vgg16_bn'].replace('https://', 'http://') + vgg_pretrained_features = models.vgg16_bn(pretrained=pretrained).features + self.slice1 = torch.nn.Sequential() self.slice2 = torch.nn.Sequential() self.slice3 = torch.nn.Sequential() diff --git a/trainer/craft/model/vgg16_bn.py b/trainer/craft/model/vgg16_bn.py index 553b2f423c..fde415fc2c 100644 --- a/trainer/craft/model/vgg16_bn.py +++ b/trainer/craft/model/vgg16_bn.py @@ -1,11 +1,9 @@ import torch import torch.nn as nn import torch.nn.init as init - +import torchvision from torchvision import models -from torchvision.models import VGG16_BN_Weights -from torchvision.models.vgg import model_urls - +from packaging import version def init_weights(modules): for m in modules: @@ -24,10 +22,14 @@ def init_weights(modules): class vgg16_bn(torch.nn.Module): def __init__(self, pretrained=True, freeze=True): super(vgg16_bn, self).__init__() - model_urls['vgg16_bn'] = model_urls['vgg16_bn'].replace('https://', 'http://') - vgg_pretrained_features = models.vgg16_bn( - weights=VGG16_BN_Weights.DEFAULT if pretrained else None - ).features + if version.parse(torchvision.__version__) >= version.parse('0.13'): + vgg_pretrained_features = models.vgg16_bn( + weights=models.VGG16_BN_Weights.DEFAULT if pretrained else None + ).features + else: # torchvision.__version__ < 0.13 + models.vgg.model_urls['vgg16_bn'] = models.vgg.model_urls['vgg16_bn'].replace('https://', 'http://') + vgg_pretrained_features = models.vgg16_bn(pretrained=pretrained).features + self.slice1 = torch.nn.Sequential() self.slice2 = torch.nn.Sequential() self.slice3 = torch.nn.Sequential() From 4ee282a3b7abb51e3432475401ef4e39cf7d6611 Mon Sep 17 00:00:00 2001 From: rkcosmos Date: Thu, 15 Sep 2022 18:31:42 +0700 Subject: [PATCH 22/61] update v1.6.2 --- README.md | 7 +++++-- releasenotes.md | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 186aece4f9..55f8a8cd7a 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,15 @@ Integrated into [Huggingface Spaces 🤗](https://huggingface.co/spaces) using [ ## What's new +- 15 September 2022 - Version 1.6.2 + - Add CPU support for DBnet + - DBnet will only be compiled when users initialize DBnet detector. - 1 September 2022 - Version 1.6.1 - - Fix DBNET path bug for Windows + - Fix DBnet path bug for Windows - Add new built-in model `cyrillic_g2`. This model is a new default for Cyrillic script. - 24 August 2022 - Version 1.6.0 - Restructure code to support alternative text detectors. - - Add detector `DBNET`, see [paper](https://arxiv.org/abs/2202.10304v1). It can be used by initializing like this `reader = easyocr.Reader(['en'], detect_network = 'dbnet18')`. *Currently, DBNet text detector requires running with GPU.* + - Add detector `DBnet`, see [paper](https://arxiv.org/abs/2202.10304v1). It can be used by initializing like this `reader = easyocr.Reader(['en'], detect_network = 'dbnet18')`. - 2 June 2022 - Version 1.5.0 - Add trainer for CRAFT detection model (thanks[@gmuffiness](https://github.com/gmuffiness), see [PR](https://github.com/JaidedAI/EasyOCR/pull/739)) - 9 April 2022 - Version 1.4.2 diff --git a/releasenotes.md b/releasenotes.md index 36b2924828..ef4698911d 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -1,9 +1,12 @@ +- 15 September 2022 - Version 1.6.2 + - Add CPU support for DBnet + - DBNet will only be compiled when users initialize DBnet detector. - 1 September 2022 - Version 1.6.1 - - Fix DBNET path bug for Windows + - Fix DBNet path bug for Windows - Add new built-in model `cyrillic_g2`. This model is a new default for Cyrillic script. - 24 August 2022 - Version 1.6.0 - Restructure code to support alternative text detectors. - - Add detector `DBNET`, see [paper](https://arxiv.org/abs/2202.10304v1). It can be used by initializing like this `reader = easyocr.Reader(['en'], detect_network = 'dbnet18')`. *Currently, DBNet text detector requires running with GPU.* + - Add detector `DBNet`, see [paper](https://arxiv.org/abs/2202.10304v1). It can be used by initializing like this `reader = easyocr.Reader(['en'], detect_network = 'dbnet18')`. *Currently, DBNet text detector requires running with GPU.* - 2 June 2022 - Version 1.5.0 - Add trainer for CRAFT detection model (thanks[@gmuffiness](https://github.com/gmuffiness), see [PR](https://github.com/JaidedAI/EasyOCR/pull/739)) - 9 April 2022 - Version 1.4.2 From 29e39cbe7122ccccbc0620a3b55228c024806cda Mon Sep 17 00:00:00 2001 From: rkcosmos Date: Sat, 17 Sep 2022 13:20:09 +0700 Subject: [PATCH 23/61] update custom model readme --- custom_model.md | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/custom_model.md b/custom_model.md index e411cfdef1..3dead0b050 100644 --- a/custom_model.md +++ b/custom_model.md @@ -1,12 +1,8 @@ -# Custom model +# Custom recognition models ## How to train your custom model -There are 2 options to train your own recognition model: - -**1. Open-source approach** - -For the open-source approach, you can use your own data or generate your own dataset. To generate your own data, we recommend using +You can use your own data or generate your own dataset. To generate your own data, we recommend using [TextRecognitionDataGenerator](https://github.com/Belval/TextRecognitionDataGenerator). We provide an example of a dataset [here](https://jaided.ai/easyocr/modelhub/). After you have a dataset, you can train your own model by following this repository [deep-text-recognition-benchmark](https://github.com/clovaai/deep-text-recognition-benchmark). @@ -18,13 +14,9 @@ Please do not create an issue about data generation and model training in this r Note: We also provide our version of a training script [here](https://github.com/JaidedAI/EasyOCR/tree/master/trainer). It is a modified version from [deep-text-recognition-benchmark](https://github.com/clovaai/deep-text-recognition-benchmark). -**2. Web-based approach** - -Jaided AI provides a web-based (paid) service for training your own model [here](https://jaided.ai/). You can train your model on the cloud and export it for local deployment. All 3 files are downloadable once the model has finished training. - ## How to use your custom model -To use your own recognition model, you need the three files from the open-source or web-based approach above. These three files have to share the same name (i.e. `yourmodel.pth`, `yourmodel.yaml`, `yourmodel.py`) that you will then use to call your model with in the EasyOCR API. +To use your own recognition model, you need the three files as explained above. These three files have to share the same name (i.e. `yourmodel.pth`, `yourmodel.yaml`, `yourmodel.py`) that you will then use to call your model with EasyOCR API. We provide [custom_example.zip](https://jaided.ai/easyocr/modelhub/) as an example. Please download, extract and place `custom_example.py`, `custom_example.yaml` in the `user_network_directory` (default = `~/.EasyOCR/user_network`) and place `custom_example.pth` in model directory (default = `~/.EasyOCR/model`) From f463e9709a7dc83a2acbf0c405f21af9b3363740 Mon Sep 17 00:00:00 2001 From: Uguudei E <1560166+Uguudei@users.noreply.github.com> Date: Tue, 20 Sep 2022 10:23:00 +0800 Subject: [PATCH 24/61] =?UTF-8?q?remove=20duplicate=20"=D1=8E"=20character?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- easyocr/character/mn_char.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/easyocr/character/mn_char.txt b/easyocr/character/mn_char.txt index b1d9dfe598..e5c68b5258 100644 --- a/easyocr/character/mn_char.txt +++ b/easyocr/character/mn_char.txt @@ -56,7 +56,6 @@ т у ү -ю ф х ц From 700e74851ebb0c0a8251c45264b2083cb2ad89c1 Mon Sep 17 00:00:00 2001 From: kfjt Date: Fri, 23 Sep 2022 06:57:03 +0000 Subject: [PATCH 25/61] receive cli option 'output_format' --- easyocr/cli.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/easyocr/cli.py b/easyocr/cli.py index 4d18ce7fba..37dd284cab 100644 --- a/easyocr/cli.py +++ b/easyocr/cli.py @@ -226,6 +226,13 @@ def parse_args(): default=0.1, help="Extend bounding boxes in all direction by certain value. This is important for language with complex script (E.g. Thai).", ) + parser.add_argument( + "--output_format", + type=str, + choices=["standard", 'dict'], + default='standard', + help="output format.", + ) args = parser.parse_args() return args @@ -267,7 +274,8 @@ def main(): width_ths=args.width_ths,\ y_ths=args.y_ths,\ x_ths=args.x_ths,\ - add_margin=args.add_margin): + add_margin=args.add_margin,\ + output_format=args.output_format): print(line) From e76a89541aaad74833b288a349745db3b7e7eb5e Mon Sep 17 00:00:00 2001 From: kfjt Date: Fri, 23 Sep 2022 07:40:04 +0000 Subject: [PATCH 26/61] Add json output --- easyocr/cli.py | 2 +- easyocr/easyocr.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/easyocr/cli.py b/easyocr/cli.py index 37dd284cab..ac3043d776 100644 --- a/easyocr/cli.py +++ b/easyocr/cli.py @@ -229,7 +229,7 @@ def parse_args(): parser.add_argument( "--output_format", type=str, - choices=["standard", 'dict'], + choices=["standard", 'dict', 'json'], default='standard', help="output format.", ) diff --git a/easyocr/easyocr.py b/easyocr/easyocr.py index 1b0770ecaa..4ef9434010 100644 --- a/easyocr/easyocr.py +++ b/easyocr/easyocr.py @@ -15,6 +15,7 @@ from PIL import Image from logging import getLogger import yaml +import json if sys.version_info[0] == 2: from io import open @@ -422,6 +423,8 @@ def recognize(self, img_cv_grey, horizontal_list=None, free_list=None,\ return [item[1] for item in result] elif output_format == 'dict': return [ {'boxes':item[0],'text':item[1],'confident':item[2]} for item in result] + elif output_format == 'json': + return [json.dumps({'boxes':[list(map(int, lst)) for lst in item[0]],'text':item[1],'confident':item[2]}, ensure_ascii=False) for item in result] else: return result From f94dcffa5d49fccd7d203f0d8082a64a9bdf87f7 Mon Sep 17 00:00:00 2001 From: Rakpong Kittinaradorn Date: Thu, 13 Oct 2022 10:13:21 +0700 Subject: [PATCH 27/61] Update releasenotes.md --- releasenotes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releasenotes.md b/releasenotes.md index ef4698911d..9ce543b85c 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -3,7 +3,7 @@ - DBNet will only be compiled when users initialize DBnet detector. - 1 September 2022 - Version 1.6.1 - Fix DBNet path bug for Windows - - Add new built-in model `cyrillic_g2`. This model is a new default for Cyrillic script. + - Add new built-in model `cyrillic_g2`. This model is a new default for Cyrillic script. (partial financial support by Alejandro Cabrerizo) - 24 August 2022 - Version 1.6.0 - Restructure code to support alternative text detectors. - Add detector `DBNet`, see [paper](https://arxiv.org/abs/2202.10304v1). It can be used by initializing like this `reader = easyocr.Reader(['en'], detect_network = 'dbnet18')`. *Currently, DBNet text detector requires running with GPU.* From 43720846f0b67779c551d0af89a8ccbf9d392a93 Mon Sep 17 00:00:00 2001 From: vallimaylv <116088249+vallimaylv@users.noreply.github.com> Date: Sun, 13 Nov 2022 18:38:49 +0530 Subject: [PATCH 28/61] Update config.py --- easyocr/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easyocr/config.py b/easyocr/config.py index 355b7e6319..a46d286a3a 100644 --- a/easyocr/config.py +++ b/easyocr/config.py @@ -130,7 +130,7 @@ 'url': 'https://github.com/JaidedAI/EasyOCR/releases/download/v1.1.7/tamil.zip', 'md5sum': '4b93972fdacdcdabe6d57097025d4dc2', 'symbols': "0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ", - 'characters': '0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZஃஅஆஇஈஉஊஎஏஐஒஓஔகஙசஜஞடணதநனபமயரறலளழவஷஸஹாிீுூெேைொோௌ்' + 'characters': '0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZஃஅஆஇஈஉஊஎஏஐஒஓஔகஙசஜஞடணதநனபமயரறலளழ' }, 'bengali_g1':{ 'filename': 'bengali.pth', From c8fa1a9beee6acf662876fb15c1927123b34a914 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Nov 2022 10:36:50 +0000 Subject: [PATCH 29/61] Bump pillow from 9.0.1 to 9.3.0 in /trainer/craft Bumps [pillow](https://github.com/python-pillow/Pillow) from 9.0.1 to 9.3.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/9.0.1...9.3.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- trainer/craft/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trainer/craft/requirements.txt b/trainer/craft/requirements.txt index c4144d63c5..a3ba70c8e0 100644 --- a/trainer/craft/requirements.txt +++ b/trainer/craft/requirements.txt @@ -1,6 +1,6 @@ conda==4.10.3 opencv-python==4.5.3.56 -Pillow==9.0.1 +Pillow==9.3.0 Polygon3==3.0.9.1 PyYAML==5.4.1 scikit-image==0.17.2 From 42cde105987a68437a90533e68cb4501874b2e9f Mon Sep 17 00:00:00 2001 From: beuaaa Date: Tue, 6 Dec 2022 16:16:05 +0100 Subject: [PATCH 30/61] Fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix the word "“plug-in” to "plug in". Noun/verb confusion : The word “plug-in” is a noun. The verb is spelled with a space. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 55f8a8cd7a..4ccd7f1002 100644 --- a/README.md +++ b/README.md @@ -154,7 +154,7 @@ The api should be as easy as ``` python reader = easyocr.Reader(['en'], detection='DB', recognition = 'Transformer') ``` -The idea is to be able to plug-in any state-of-the-art model into EasyOCR. There are a lot of geniuses trying to make better detection/recognition models, but we are not trying to be geniuses here. We just want to make their works quickly accessible to the public ... for free. (well, we believe most geniuses want their work to create a positive impact as fast/big as possible) The pipeline should be something like the below diagram. Grey slots are placeholders for changeable light blue modules. +The idea is to be able to plug in any state-of-the-art model into EasyOCR. There are a lot of geniuses trying to make better detection/recognition models, but we are not trying to be geniuses here. We just want to make their works quickly accessible to the public ... for free. (well, we believe most geniuses want their work to create a positive impact as fast/big as possible) The pipeline should be something like the below diagram. Grey slots are placeholders for changeable light blue modules. ![plan](examples/easyocr_framework.jpeg) From a4e0350cc66bc9f19908ef77292fc060bd42cc04 Mon Sep 17 00:00:00 2001 From: Vladimir Panteleev Date: Sat, 10 Dec 2022 15:19:33 +0000 Subject: [PATCH 31/61] Dockerfile: Specify container registry Allows the container to be built with e.g. podman without additional configuration. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7fc0a57ee6..d581da6f32 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM pytorch/pytorch +FROM docker.io/pytorch/pytorch # if you forked EasyOCR, you can pass in your own GitHub username to use your fork # i.e. gh_username=myname From d076db5ca776b06c7acf4dac97387d9f5f509055 Mon Sep 17 00:00:00 2001 From: Khanbala Rashidov <50279392+KhanbalaRashidov@users.noreply.github.com> Date: Wed, 14 Dec 2022 11:03:58 +0300 Subject: [PATCH 32/61] update az.txt Added ID card and passport field name --- easyocr/dict/az.txt | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/easyocr/dict/az.txt b/easyocr/dict/az.txt index a84e26041c..a63fa5d8da 100644 --- a/easyocr/dict/az.txt +++ b/easyocr/dict/az.txt @@ -1,3 +1,38 @@ +Azərbaycan +AZE +aze +Şəxsiyyət +Vəsiqəsi +doğulduğu +yer +və +Siyəzən +Lənkəran +Ailə +Hərbi +vəzifə +gözlərinin +rəngi +yaşayış +Vəsiqəni +Verən +Səlahiyyətli +RPŞ +Vəsiqənin +verilmə +Etibarlıdır +Pasport +Vətəndaşlığı +Etibarlılıq +Pasportu +Fərdi +identifikasiya +nömrəsi +işlər +DAXİLİ +İŞLƏR +NAZİRLİYİ +sah bir bu olan From e588fab1f8ad95ad5df437aec577df5e19070532 Mon Sep 17 00:00:00 2001 From: DongJinLee <96943196+ldj7672@users.noreply.github.com> Date: Thu, 15 Dec 2022 03:11:08 +0900 Subject: [PATCH 33/61] Update trainSynth.py Modify code to save model properly when training with multi-gpu. (if self.gpu == 0) --- trainer/craft/trainSynth.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/trainer/craft/trainSynth.py b/trainer/craft/trainSynth.py index 4d1d0dc727..fd97e4ae8d 100644 --- a/trainer/craft/trainSynth.py +++ b/trainer/craft/trainSynth.py @@ -291,8 +291,9 @@ def train(self, buffer_dict): + repr(train_step) + ".pth" ) - - torch.save(save_param_dic, save_param_path) + + if self.gpu == 0: + torch.save(save_param_dic, save_param_path) # validation self.iou_eval( From 565907dbf67632336fc6bfee4c77f4f4c21635b4 Mon Sep 17 00:00:00 2001 From: Khanbala Rashidov <50279392+KhanbalaRashidov@users.noreply.github.com> Date: Mon, 19 Dec 2022 15:31:32 +0300 Subject: [PATCH 34/61] Update tr.txt add residence permit field --- easyocr/dict/tr.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/easyocr/dict/tr.txt b/easyocr/dict/tr.txt index 9ab954748a..d7c93c4d29 100644 --- a/easyocr/dict/tr.txt +++ b/easyocr/dict/tr.txt @@ -1,3 +1,22 @@ +residence +RESIDENCE +permit +PERMIT +document +DOCUMENT +Yabancı +Foreigner +Nationality +Province +Residence +Mother's +Father's +Valid +Until +Issued +YABANCILAR +İLETİŞİM +MERKEZİ ve bir ile From 0f39722d50cc0b3254955faeb8897335a5f56a7b Mon Sep 17 00:00:00 2001 From: Hitbee-dev Date: Tue, 3 Jan 2023 04:17:43 +0900 Subject: [PATCH 35/61] :sparkles: Add: merge_to_free --- easyocr/easyocr.py | 4 +- easyocr/utils.py | 108 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 102 insertions(+), 10 deletions(-) diff --git a/easyocr/easyocr.py b/easyocr/easyocr.py index 4ef9434010..565dc5bd42 100644 --- a/easyocr/easyocr.py +++ b/easyocr/easyocr.py @@ -4,7 +4,7 @@ from .utils import group_text_box, get_image_list, calculate_md5, get_paragraph,\ download_and_unzip, printProgressBar, diff, reformat_input,\ make_rotated_img_list, set_result_with_confidence,\ - reformat_input_batched + reformat_input_batched, merge_to_free from .config import * from bidi.algorithm import get_display import numpy as np @@ -425,6 +425,8 @@ def recognize(self, img_cv_grey, horizontal_list=None, free_list=None,\ return [ {'boxes':item[0],'text':item[1],'confident':item[2]} for item in result] elif output_format == 'json': return [json.dumps({'boxes':[list(map(int, lst)) for lst in item[0]],'text':item[1],'confident':item[2]}, ensure_ascii=False) for item in result] + elif output_format == 'free_merge': + return merge_to_free(result, free_list) else: return result diff --git a/easyocr/utils.py b/easyocr/utils.py index 64435cfdba..f55860b07a 100644 --- a/easyocr/utils.py +++ b/easyocr/utils.py @@ -383,6 +383,96 @@ def decode_wordbeamsearch(self, mat, beamWidth=5): texts.append(string) return texts +def merge_to_free(merge_result, free_list): + free_flag = False + result_buf, r_buf, free_list_buf = [], [], [] + axis_y_min = {} + idx_min = 0 + + def append_to_buf(axis_y_min, idx_min, result_buf, r_buf): + axis_y_min[idx_min] = min([i[0][0][1] for i in r_buf]) + result_buf.append(r_buf) + return axis_y_min, idx_min+1, result_buf, [] + + for idx, r in enumerate(merge_result): + # free True + if len(free_list) != 0 and idx >= len(merge_result)-len(free_list): + if free_flag == False: + axis_y_min, idx_min, result_buf, r_buf = append_to_buf(axis_y_min, idx_min, result_buf, r_buf) + ### + # axis_y_min[idx_min] = min([i[0][0][1] for i in r_buf]) + # idx_min += 1 + # result_buf.append(r_buf) + # r_buf = [] + ### + free_flag = True + + r_buf.append(r) + + if idx == len(merge_result)-1: + axis_y_min, idx_min, result_buf, r_buf = append_to_buf(axis_y_min, idx_min, result_buf, r_buf) + ### + # axis_y_min[idx_min] = min([i[0][0][1] for i in r_buf]) + # idx_min += 1 + # result_buf.append(r_buf) + # r_buf = [] + ### + continue + + # end + if idx == len(merge_result)-1: + r_buf.append(r) + axis_y_min, idx_min, result_buf, r_buf = append_to_buf(axis_y_min, idx_min, result_buf, r_buf) + ### + # axis_y_min[idx_min] = min([i[0][0][1] for i in r_buf]) + # idx_min += 1 + # result_buf.append(r_buf) + # r_buf = [] + ### + continue + + if (r_buf == []) or (r_buf[-1][0] < r[0]): + r_buf.append(r) + else: + axis_y_min, idx_min, result_buf, r_buf = append_to_buf(axis_y_min, idx_min, result_buf, r_buf) + ### + # axis_y_min[idx_min] = min([i[0][0][1] for i in r_buf]) + # idx_min += 1 + # result_buf.append(r_buf) + # r_buf = [] + ### + r_buf.append(r) + + if len(free_list) != 0: + merge_result = [] + # remove free_list buffer + print(result_buf) + free_list_buf = result_buf.pop(-1) + print(result_buf) + print(free_list_buf) + # remove free_list buffer + axis_y_min.pop(len(axis_y_min)-1) + print(axis_y_min) + + # sort(searching) + for fl in free_list_buf: + free_list_merged = False + for k, v in axis_y_min.items(): + if free_list_merged == True: + break + + if v > fl[0][0][1]: + if k == 0: k = 1 + for r_idx, r_b in enumerate(result_buf[k-1]): + if r_b[0][0][0] > fl[0][0][0]: + result_buf[k-1].insert(r_idx, fl) + free_list_merged = True + break + + for r in result_buf: + merge_result.extend(r) + return merge_result + def four_point_transform(image, rect): (tl, tr, br, bl) = rect @@ -416,8 +506,8 @@ def group_text_box(polys, slope_ths = 0.1, ycenter_ths = 0.5, height_ths = 0.5, x_max = max([poly[0],poly[2],poly[4],poly[6]]) x_min = min([poly[0],poly[2],poly[4],poly[6]]) y_max = max([poly[1],poly[3],poly[5],poly[7]]) - y_min = min([poly[1],poly[3],poly[5],poly[7]]) - horizontal_list.append([x_min, x_max, y_min, y_max, 0.5*(y_min+y_max), y_max-y_min]) + axis_y_min = min([poly[1],poly[3],poly[5],poly[7]]) + horizontal_list.append([x_min, x_max, axis_y_min, y_max, 0.5*(axis_y_min+y_max), y_max-axis_y_min]) else: height = np.linalg.norm([poly[6]-poly[0],poly[7]-poly[1]]) width = np.linalg.norm([poly[2]-poly[0],poly[3]-poly[1]]) @@ -493,14 +583,14 @@ def group_text_box(polys, slope_ths = 0.1, ycenter_ths = 0.5, height_ths = 0.5, # do I need to add margin here? x_min = min(mbox, key=lambda x: x[0])[0] x_max = max(mbox, key=lambda x: x[1])[1] - y_min = min(mbox, key=lambda x: x[2])[2] + axis_y_min = min(mbox, key=lambda x: x[2])[2] y_max = max(mbox, key=lambda x: x[3])[3] box_width = x_max - x_min - box_height = y_max - y_min + box_height = y_max - axis_y_min margin = int(add_margin * (min(box_width, box_height))) - merged_list.append([x_min-margin, x_max+margin, y_min-margin, y_max+margin]) + merged_list.append([x_min-margin, x_max+margin, axis_y_min-margin, y_max+margin]) else: # non adjacent box in same line box = mbox[0] @@ -558,18 +648,18 @@ def get_image_list(horizontal_list, free_list, img, model_height = 64, sort_outp for box in horizontal_list: x_min = max(0,box[0]) x_max = min(box[1],maximum_x) - y_min = max(0,box[2]) + axis_y_min = max(0,box[2]) y_max = min(box[3],maximum_y) - crop_img = img[y_min : y_max, x_min:x_max] + crop_img = img[axis_y_min : y_max, x_min:x_max] width = x_max - x_min - height = y_max - y_min + height = y_max - axis_y_min ratio = calculate_ratio(width,height) new_width = int(model_height*ratio) if new_width == 0: pass else: crop_img,ratio = compute_ratio_and_resize(crop_img,width,height,model_height) - image_list.append( ( [[x_min,y_min],[x_max,y_min],[x_max,y_max],[x_min,y_max]] ,crop_img) ) + image_list.append( ( [[x_min,axis_y_min],[x_max,axis_y_min],[x_max,y_max],[x_min,y_max]] ,crop_img) ) max_ratio_hori = max(ratio, max_ratio_hori) max_ratio_hori = math.ceil(max_ratio_hori) From cdbffbb0c5c101749a9420a734e2140e1d7c1018 Mon Sep 17 00:00:00 2001 From: k9714 Date: Tue, 3 Jan 2023 05:30:12 +0900 Subject: [PATCH 36/61] merge_to_free fix --- easyocr/utils.py | 109 +++++++++++++---------------------------------- 1 file changed, 29 insertions(+), 80 deletions(-) diff --git a/easyocr/utils.py b/easyocr/utils.py index f55860b07a..3ccf8829c0 100644 --- a/easyocr/utils.py +++ b/easyocr/utils.py @@ -384,93 +384,42 @@ def decode_wordbeamsearch(self, mat, beamWidth=5): return texts def merge_to_free(merge_result, free_list): - free_flag = False - result_buf, r_buf, free_list_buf = [], [], [] - axis_y_min = {} - idx_min = 0 + merge_result_buf, mr_buf = [], [] - def append_to_buf(axis_y_min, idx_min, result_buf, r_buf): - axis_y_min[idx_min] = min([i[0][0][1] for i in r_buf]) - result_buf.append(r_buf) - return axis_y_min, idx_min+1, result_buf, [] + free_list_buf = merge_result[-len(free_list):] + merge_result = merge_result[:-len(free_list)] for idx, r in enumerate(merge_result): - # free True - if len(free_list) != 0 and idx >= len(merge_result)-len(free_list): - if free_flag == False: - axis_y_min, idx_min, result_buf, r_buf = append_to_buf(axis_y_min, idx_min, result_buf, r_buf) - ### - # axis_y_min[idx_min] = min([i[0][0][1] for i in r_buf]) - # idx_min += 1 - # result_buf.append(r_buf) - # r_buf = [] - ### - free_flag = True - - r_buf.append(r) - - if idx == len(merge_result)-1: - axis_y_min, idx_min, result_buf, r_buf = append_to_buf(axis_y_min, idx_min, result_buf, r_buf) - ### - # axis_y_min[idx_min] = min([i[0][0][1] for i in r_buf]) - # idx_min += 1 - # result_buf.append(r_buf) - # r_buf = [] - ### - continue - - # end if idx == len(merge_result)-1: - r_buf.append(r) - axis_y_min, idx_min, result_buf, r_buf = append_to_buf(axis_y_min, idx_min, result_buf, r_buf) - ### - # axis_y_min[idx_min] = min([i[0][0][1] for i in r_buf]) - # idx_min += 1 - # result_buf.append(r_buf) - # r_buf = [] - ### + mr_buf.append(r) + merge_result_buf.append(mr_buf) + mr_buf=[] continue - if (r_buf == []) or (r_buf[-1][0] < r[0]): - r_buf.append(r) + if (mr_buf == []) or (mr_buf[-1][0] < r[0]): + mr_buf.append(r) else: - axis_y_min, idx_min, result_buf, r_buf = append_to_buf(axis_y_min, idx_min, result_buf, r_buf) - ### - # axis_y_min[idx_min] = min([i[0][0][1] for i in r_buf]) - # idx_min += 1 - # result_buf.append(r_buf) - # r_buf = [] - ### - r_buf.append(r) - - if len(free_list) != 0: - merge_result = [] - # remove free_list buffer - print(result_buf) - free_list_buf = result_buf.pop(-1) - print(result_buf) - print(free_list_buf) - # remove free_list buffer - axis_y_min.pop(len(axis_y_min)-1) - print(axis_y_min) - - # sort(searching) - for fl in free_list_buf: - free_list_merged = False - for k, v in axis_y_min.items(): - if free_list_merged == True: - break + merge_result_buf.append(mr_buf) + mr_buf=[] + mr_buf.append(r) + + for free_pos in free_list_buf: + y_pos = len(merge_result_buf) + x_pos = len(merge_result_buf[y_pos-1]) + for i, result_pos in enumerate(merge_result_buf[1:]): + if free_pos[0][0][1] < result_pos[0][0][0][1]: + y_pos = i + break - if v > fl[0][0][1]: - if k == 0: k = 1 - for r_idx, r_b in enumerate(result_buf[k-1]): - if r_b[0][0][0] > fl[0][0][0]: - result_buf[k-1].insert(r_idx, fl) - free_list_merged = True - break - - for r in result_buf: - merge_result.extend(r) + for i, result_pos in enumerate(merge_result_buf[y_pos]): + if free_pos[0][0][0] < result_pos[0][0][0]: + x_pos = i + break + + merge_result_buf[y_pos].insert(x_pos, free_pos) + + merge_result = [] + [merge_result.extend(r) for r in merge_result_buf] return merge_result def four_point_transform(image, rect): @@ -880,4 +829,4 @@ def set_result_with_confidence(results): key=lambda x: x[1])[0] final_result.append(results[best_row][col_ix]) - return final_result + return final_result \ No newline at end of file From a1689f631f83343f10fffa1c85068559f80d2076 Mon Sep 17 00:00:00 2001 From: Hitbee-dev Date: Tue, 3 Jan 2023 05:35:47 +0900 Subject: [PATCH 37/61] :sparkles: Add: Test Image, Test Code --- images/test_image.png | Bin 0 -> 3159322 bytes test_easyocr.ipynb | 545 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 545 insertions(+) create mode 100644 images/test_image.png create mode 100644 test_easyocr.ipynb diff --git a/images/test_image.png b/images/test_image.png new file mode 100644 index 0000000000000000000000000000000000000000..627877afbc667d028ed4efc92e00bc051c126cb9 GIT binary patch literal 3159322 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

j-6?ow{m3E+wQ(TxqDzq<_vKgB#=)fOdB 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 qH!hv|XD9S`UUCIF>bKd4 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 W1(Agk*ZCYT4+h3a1&-$U@3FR!Yr= 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�)z=~#M2D>Uu`qgww+Oa2;M)Uoo}=Yjf@RDyRa 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 z zYq@zsLEOo^AsJfaOZ-*;=#ztZMWNVxmRu8+lQXlIb1)){T;pS(f5e)_!&A%XF-t_R z53wg-QkK8W%?595CKJWWd(xiVc+(BJ!Q@UH{q{5Bw|raP zg`GGo>tZE-_rdu3|6JGAf5PA77?~}l1_S%@o7^=6yp@tl)!#J-an+yLnmBNNWS#4A z=X#7F+1i$;E*m?;9&9Dnm2Iqsrj4D^5@&q5$0Aq#GUSRuemf_Q-;8;$@p4?5)m~s& zf6KAyTTHClFScThY{7?5E!l@JJBX#!4Nr2~?;vUOLF6EF?Ue!dl-0(=sQja!I+Gjc zni(DKN&P>S+aE~<`i-wlJEQ)x_d4g>ak+2ljTtPIok76qE7AjwrI~ZZWX}a`?0Nz% z{>(lpQktXhvQy%8uL~a=dhAxk)e%?Gd+fEhfyJD$Qi0z^Zrj3E9wn;{eaG9*h3ING z7vIW11$!OoH=e0G<(_5~@zqW~9d<6RXPNlosR^IUBnK8;W-pEGe#c%OKSNyL&mE5J6$weF4>ExiC z4GX!TxeP8j-R4%@f4K`#=@#2a`@y;*UIXAJ;;w^^<8^FRhyER6$@1J&sEt+o;%tjXRg{F<( z3gdOE9Z1g9rqDmfm7VYXiPP4b{=~%D&{DsK$p5Qf02}z}SBFSXlY4FB+sR)!*EThB zvOT(FAo~F(*?}Q4W4j?KUicI~)Wm!2uRT2Fuk?V,G`UMp7&21Eb!+SqwKrW{#| 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

I}fUtVG;5fRbrwl6$}@A4V%!lp1h- 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

U_@?_8`gm(Ez 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