//
Search
🔨

[1_2_1] (선행 태스크에서 학습시킨 detection 모델) + recognition 모델(w/pretrained weight)을 결합해 결과물을 출력한다.

상태
Not started
담당
마감일
2022/11/17
요약
E2E 모델을 로드하고 샘플 데이터로 추론 I/O 를 하면 끝
선행 태스크 상태
In progress
후행 태스크
관련 마일스톤
2 more properties
Detection + Recognition 파이프라인 동작 확인
MMOCR 에서 제공하는 모델들 사용하기
모델 뼈대 제공자 (구조)
모델 가중치 제공자 (데이터셋)
detection
MMOCR (DBNet+ResNet18)
MMOCR (ICDAR2015)
recognition
MMOCR (CRNN+VGG)
MMOCR (MJ)
# command python3 -m mmocr.ocr \ --det DB_r18 \ --recog CRNN \ demo/demo_text_ocr.jpg \ --print-result
Bash
복사
# output {'rec_texts': ['cbanke', 'docece', 'sroumats', 'chounsonse', 'doceca', 'c', '', 'sond', 'abrandso', 'sretane', '1', 'tosl', 'roundi', 'slen', 'yet', 'ally', 's', 'sue', 'salle', 'v'], 'rec_scores': [[0.8619992733001709, 0.36385664343833923, 0.9858603477478027, 0.9518407583236694, 0.9930170774459839, 0.31124499440193176], [0.603811502456665, 0.9717150330543518, 0.7536140084266663, 0.635711669921875, 0.3684174716472626, 0.7006852626800537], [0.3165825307369232, 0.4354405999183655, 0.7616592049598694, 0.24985525012016296, 0.11498068273067474, 0.4541493058204651, 0.26512041687965393, 0.3715744614601135], [0.8028814196586609, 0.910198986530304, 0.9163530468940735, 0.4574192464351654, 0.5324037075042725, 0.5541525483131409, 0.9137442708015442, 0.9557316899299622, 0.7589272856712341, 0.31070515513420105], [0.21017417311668396, 0.3346722424030304, 0.448085755109787, 0.7173428535461426, 0.7552263736724854, 0.49773702025413513], [0.10961470007896423], [], [0.2084926813840866, 0.5548771619796753, 0.34605976939201355, 0.17222023010253906], [0.14993661642074585, 0.5194820165634155, 0.6817272901535034, 0.9225133657455444, 0.9417058229446411, 0.49175670742988586, 0.4860944151878357, 0.37305018305778503], [0.1518675684928894, 0.7475733757019043, 0.9624982476234436, 0.8942293524742126, 0.7488994598388672, 0.20486858487129211, 0.4237891137599945], [0.34772947430610657], [0.2306438684463501, 0.4761553704738617, 0.270092248916626, 0.19700223207473755], [0.9994327425956726, 0.99998939037323, 0.9999531507492065, 0.9998949766159058, 0.997684121131897, 0.7471207976341248], [0.33092543482780457, 0.559290885925293, 0.6441397666931152, 0.26473215222358704], [0.7110418081283569, 0.6032110452651978, 0.22102908790111542], [0.943224310874939, 0.9997072815895081, 0.9994528889656067, 0.9901089668273926], [0.30900728702545166], [0.8827105164527893, 0.4190119802951813, 0.4245325028896332], [0.9821732044219971, 0.6946443319320679, 0.7953684329986572, 0.4656343162059784, 0.22275066375732422], [0.2870538830757141]], 'det_polygons': [array([556.17420011, 416.03663942, 557.86561931, 381.36996518, 624.06553025, 384.59862958, 622.37411106, 419.26530382]), array([465.63763574, 404.75384215, 468.27924496, 375.32390221, 558.43082552, 383.41288898, 555.78921631, 412.84282892]), array([588.39388902, 313.44696003, 681.2664131 , 311.51249305, 681.59478015, 327.27019642, 588.72225608, 329.2046634 ]), array([497.72005811, 319.43320482, 499.63318832, 303.26160514, 589.76311386, 313.92011808, 587.84998366, 330.09171776]), array([439.91551621, 310.44231664, 442.42638576, 294.12492752, 499.67265308, 302.93036668, 497.16178353, 319.2477558 ]), array([618.4059293 , 307.48641304, 618.4059293 , 292.56793478, 639.1299886 , 292.56793478, 639.1299886 , 307.48641304]), array([635.3269011 , 292.08847875, 676.00474849, 289.829046 , 676.92296194, 306.35414206, 636.24511454, 308.61357482]), array([580.75816604, 306.4211182 , 581.30419643, 288.40489263, 623.69309422, 289.68917515, 623.14706383, 307.70540072]), array([515.73384962, 298.5973296 , 517.18949217, 282.83138068, 581.31487216, 288.74951114, 579.85922962, 304.51546006]), array([459.59325337, 292.61766102, 462.17961192, 274.51655181, 516.37717583, 282.25760667, 513.79081728, 300.35871589]), array([446.81071836, 289.25271739, 446.81071836, 277.64945652, 462.56100342, 277.64945652, 462.56100342, 289.25271739]), array([ 12.8301204 , 239.8501052 , 14.70560097, 207.34801458, 75.82943288, 210.87372116, 73.95395232, 243.37581178]), array([452.04941245, 222.5203597 , 456.34368444, 175.29209427, 665.62278408, 194.31384709, 661.32851209, 241.54211252]), array([ 19.21348231, 113.51580599, 21.07439443, 88.70833843, 85.042064 , 93.50500439, 83.18115504, 118.31247827]), array([585.57094429, 116.43690628, 591.16138071, 66.13252546, 713.07956437, 79.67640587, 707.48912795, 129.980793 ]), array([460.06748825, 104.78617658, 464.34354574, 53.00814696, 587.83080783, 63.20239554, 583.55475034, 114.98042832]), array([229.62257697, 61.33152174, 229.62257697, 50.55706522, 254.49144812, 50.55706522, 254.49144812, 61.33152174]), array([30.65122395, 57.4116854 , 32.57414445, 36.26358898, 70.16962322, 39.68070911, 68.24670273, 60.8288087 ]), array([156.19550451, 38.71662777, 158.49920936, 9.92588799, 220.44074607, 14.88026987, 218.13704122, 43.67100887]), array([705.40427544, 23.92425459, 709.81400716, 14.00423382, 724.42770709, 20.49795939, 720.01797538, 30.41798016])], 'det_scores': tensor([0.8443, 0.8401, 0.8440, 0.8488, 0.8146, 0.6879, 0.8354, 0.8199, 0.8820, 0.8532, 0.5870, 0.8671, 0.9009, 0.8786, 0.9155, 0.9403, 0.6059, 0.8203, 0.8601, 0.4475])}
Python
복사
내부적으로 위 커맨드의 DB_r18CRNN 은 사전에 정의되어 있는 config 파일 경로와 ckpt 경로를 사용하도록 되어 있다. config 파일은 평가 데이터로더(test_dataloader)가 정의되어 있는 dbnet_resnet18_fpnc_1200e_icdar2015.py 가 사용되고 있음을 알 수 있다. 학습시킬 때 사용했던 파일과 동일한 계위에 있는 파일이다.
mmocr/ocr.py
'DB_r18': { 'config': 'textdet/dbnet/dbnet_resnet18_fpnc_1200e_icdar2015.py', 'ckpt': 'textdet/dbnet/dbnet_resnet18_fpnc_1200e_icdar2015/dbnet_resnet18_fpnc_1200e_icdar2015_20220825_221614-7c0e94f2.pth' # noqa: E501 }, 'CRNN': { 'config': 'textrecog/crnn/crnn_mini-vgg_5e_mj.py', 'ckpt': 'textrecog/crnn/crnn_mini-vgg_5e_mj/crnn_mini-vgg_5e_mj_20220826_224120-8afbedbb.pth' # noqa: E501 },
Python
복사
recognition 모델은 그대로 두고 우리가 학습시킨 detection 모델을 사용하기
case1
모델 뼈대 제공자 (구조)
모델 가중치 제공자 (데이터셋)
detection
MMOCR (DBNet+ResNet18)
직접 학습 (MINI ICDAR2015)
recognition
MMOCR (CRNN+VGG)
MMOCR (MJ)
# command python3 -m mmocr.ocr \ --det-ckpt work_dirs/dbnet_resnet18_fpnc_1200e_icdar2015_mini/epoch_400.pth \ --det-config configs/textdet/dbnet/dbnet_resnet18_fpnc_1200e_icdar2015_mini.py \ --recog CRNN \ demo/demo_text_ocr.jpg \ --print-result
Bash
복사
# output {'rec_texts': ['oocecbanke', 'tuinson', 'l', 'seoe', 'ao', 'lorands', 'sretae', 'to3', 'roundi', 'sale', 'allyeart', 'sier', 'salll'], 'rec_scores': [[0.3045749366283417, 0.9961498975753784, 0.9709365367889404, 0.8832354545593262, 0.9272087812423706, 0.7922130227088928, 0.9928860068321228, 0.9620616436004639, 0.9969092011451721, 0.36201852560043335], [0.17807458341121674, 0.3693395256996155, 0.583509087562561, 0.63894122838974, 0.3284166157245636, 0.9740874171257019, 0.9694632887840271], [0.15253552794456482], [0.20202766358852386, 0.41136130690574646, 0.17319726943969727, 0.4089261591434479], [0.1688283532857895, 0.18596301972866058], [0.22080107033252716, 0.40271151065826416, 0.5823227763175964, 0.9874448776245117, 0.8036066293716431, 0.35923129320144653, 0.5860781669616699], [0.21926847100257874, 0.5356891751289368, 0.707502007484436, 0.8713536858558655, 0.5021427869796753, 0.2051667422056198], [0.5931355953216553, 0.7412654161453247, 0.18288785219192505], [0.9971087574958801, 0.999784529209137, 0.9995691180229187, 0.9967269897460938, 0.9929400682449341, 0.4045396149158478], [0.4004712402820587, 0.8048446178436279, 0.6160678863525391, 0.7333834171295166], [0.8492299914360046, 0.9997541308403015, 0.9996984004974365, 0.9869753122329712, 0.7130239009857178, 0.9557566046714783, 0.8743549585342407, 0.24416102468967438], [0.879269540309906, 0.29027503728866577, 0.5527241230010986, 0.16870945692062378], [0.9890600442886353, 0.8914905786514282, 0.7379021644592285, 0.32760027050971985, 0.19695629179477692]], 'det_polygons': [array([446.69242527, 397.95025079, 449.84404063, 371.25950316, 611.25127165, 390.31087419, 608.09965628, 417.00162183]), array([517.70708769, 318.84964238, 518.31879149, 311.51044431, 578.1412982 , 316.49470288, 577.5295944 , 323.83390095]), array([502.8869061 , 314.80537663, 503.48626451, 310.01106926, 519.30030035, 311.9874722 , 518.70094193, 316.78177958]), array([449.70874733, 311.02704255, 452.21556921, 297.24235286, 491.09726401, 304.31040888, 488.59044213, 318.09509858]), array([587.73432155, 303.3423913 , 587.73432155, 294.22554348, 611.77423033, 294.22554348, 611.77423033, 303.3423913 ]), array([513.46234903, 297.66634112, 514.48944475, 283.63160382, 573.39434515, 287.94089069, 572.36724944, 301.97562798]), array([463.55273264, 293.16032451, 464.64550176, 278.59316743, 513.83711248, 282.28181217, 512.74434336, 296.84896925]), array([ 24.03990878, 215.48913043, 68.80387685, 215.48913043, 68.80387685, 238.69565217, 24.03990878, 238.69565217]), array([444.49186005, 227.85669824, 450.63702935, 164.88075816, 672.68712815, 186.54006295, 666.54195885, 249.51599038]), array([ 19.89509692, 116.86141304, 19.89509692, 89.51086957, 68.80387685, 89.51086957, 68.80387685, 116.86141304]), array([464.6693324 , 109.27126947, 469.61325508, 53.2512105 , 712.80027529, 74.70479385, 707.85635261, 130.72485281]), array([39.79019384, 55.5298913 , 39.79019384, 41.44021739, 65.48802737, 41.44021739, 65.48802737, 55.5298913 ]), array([160.58016599, 14.83810311, 214.58134212, 10.51883179, 216.9931197 , 40.6601655 , 162.99194357, 44.97943681])], 'det_scores': tensor([0.6240, 0.3478, 0.3266, 0.4452, 0.3848, 0.4611, 0.4581, 0.4876, 0.7522, 0.5830, 0.7643, 0.4713, 0.6297])}
Python
복사
case2
모델 뼈대 제공자 (구조)
모델 가중치 제공자 (데이터셋)
detection
MMOCR (DBNet+ResNet18)
직접 학습 (MINI ICDAR2015)
recognition
MMOCR (SAR+ResNet31)
전이 학습 (MMOCR Pretrained + ICDAR2015)
콘솔 출력 확인
추론 결과 이미지를 파일로 저장
# command python3 -m mmocr.ocr \ --det-ckpt work_dirs/dbnet_resnet18_fpnc_1200e_icdar2015_mini/epoch_400.pth \ --det-config configs/textdet/dbnet/dbnet_resnet18_fpnc_1200e_icdar2015_mini.py \ --recog-ckpt work_dirs/sar_resnet31_parallel-decoder_500e_icdar2015/epoch_50.pth \ --recog-config configs/textrecog/sar/sar_resnet31_parallel-decoder_500e_icdar2015.py \ demo/demo_text_ocr.jpg \ --img-out-dir work_dirs/sar_resnet31_parallel-decoder_500e_icdar2015
Bash
복사
피클 파일 형태로 저장 확인
# command python3 -m mmocr.ocr \ --det-ckpt work_dirs/dbnet_resnet18_fpnc_1200e_icdar2015_mini/epoch_400.pth \ --det-config configs/textdet/dbnet/dbnet_resnet18_fpnc_1200e_icdar2015_mini.py \ --recog-ckpt work_dirs/sar_resnet31_parallel-decoder_500e_icdar2015/epoch_50.pth \ --recog-config configs/textrecog/sar/sar_resnet31_parallel-decoder_500e_icdar2015.py \ demo/demo_text_ocr.jpg \ --img-out-dir work_dirs/sar_resnet31_parallel-decoder_500e_icdar2015 \ --pred-out-file work_dirs/sar_resnet31_parallel-decoder_500e_icdar2015/demo_text_ocr.pkl
Bash
복사
부가적으로, 이 작업을 처리하던 중 버그를 발견해서 해당 부분을 고쳐 커밋했다.
json 파일 형태로 저장 확인
기본적으로 이 mmocr.ocr 은 피클파일이 아니면 결과물 저장을 못하게 되어있다. json 파일로 저장하려고 한다면 오류를 반환하는데, 그 이유는 json 파일로 직렬화해서 저장해야 하는 데이터에 파이토치 텐서 타입이 포함되어 있기 때문이다.
따라서 피클파일이 아니라 json 파일으로 변환할 수 있도록 만들 수 있는 방법은 두 가지 정도로 요약해볼 수 있다.
둘째, 일단 피클파일로 저장하고, 피클 파일을 읽고, 후처리해서 json 파일로 저장한다.
첫째 방법대로 이렇게 kwargs 를 통해 저 깊숙한 함수까지 전달을 해 보려고 했지만 실패.
애초에 postprocess(위 json.dump() 동작은 postporcess 함수에서 처리된다)는 함수에서 값을 쓸 때 torch tensor 의 item 만 꺼내서 쓰도록 하던지… 그런데 이건 클래스 내부를 건드리는 일이니까 별로 이렇게 하고싶지는 않고.
def main(): args = parse_args() kwargs = vars(args) ocr = MMOCR(**kwargs) kwargs.update({'postprocess': {'default': pytorch_tensor_serializer}}) ocr.readtext(**kwargs)
Python
복사
def readtext(self, img: InputsType, img_out_dir: str = '', show: bool = False, print_result: bool = False, pred_out_file: str = '', **kwargs) -> Union[Dict, List[Dict]]: return self.inferencer( img, img_out_dir=img_out_dir, show=show, print_result=print_result, pred_out_file=pred_out_file)
Python
복사
self.inferencer 에 **kwargs 를 전달하는 부분이 없다. 하지만 무턱대고 전달할수도 없는 노릇이다. inferencer 객체는 kwargs 에 불필요없는 것이 존재하지는 않는지 검사하는데 이 부분을 아예 뜯어내지 않고는 kwargs 를 그대로 사용할 수 없다. readtext 함수에서 적절히 kwargs 에 들어 있는 것들을 pop 해주는 것이 가장 현실적인 편.
End2End F1 Score 출력하기
모델 뼈대 제공자 (구조)
모델 가중치 제공자 (데이터셋)
detection
MMOCR (DBNet+ResNet18)
직접 학습 (MINI ICDAR2015)
recognition
MMOCR (CRNN+VGG)
MMOCR (MJ)
# command
Bash
복사
# output
Bash
복사
앞서 MMOCR 인스턴스를 이용해 호출하는 방식은 정말 말 그대로 API 처럼 활용하는 방식이라고 할 수 있음. 반대로 ‘평가’ 를 하고 싶다면, tools/test.py 를 이용하는 것이 좋다.