From b44f5934300b3916afeb699d7f2f14ab634dd53c Mon Sep 17 00:00:00 2001 From: PhanThanhTrung Date: Tue, 2 Apr 2024 13:12:21 +0700 Subject: [PATCH 1/3] change detail report format --- cope2n-api/fwd_api/utils/file.py | 24 ++++++++++++------------ cope2n-api/report_detail.xlsx | Bin 6772 -> 6817 bytes 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cope2n-api/fwd_api/utils/file.py b/cope2n-api/fwd_api/utils/file.py index b3ea680..1e790ac 100755 --- a/cope2n-api/fwd_api/utils/file.py +++ b/cope2n-api/fwd_api/utils/file.py @@ -557,18 +557,18 @@ def dump_excel_report_detail(input: json): 'G': "imei_ocr_retrieved", 'H': "imei_revised", 'I': "imei1_accuracy", - 'J': "invoice_number_user", - 'K': "invoice_number_ocr", - 'L': "invoice_number_revised", - 'M': "invoice_number_accuracy", - 'N': "invoice_purchase_date_consumer", - 'O': "invoice_purchase_date_ocr", - 'P': "invoice_purchase_date_revised", - 'Q': "invoice_purchase_date_accuracy", - 'R': "invoice_retailer_consumer", - 'S': "invoice_retailer_ocr", - 'T': 'invoice_retailer_revised', - 'U': "invoice_retailer_accuracy", + 'J': "invoice_purchase_date_consumer", + 'K': "invoice_purchase_date_ocr", + 'L': "invoice_purchase_date_revised", + 'M': "invoice_purchase_date_accuracy", + 'N': "invoice_retailer_consumer", + 'O': "invoice_retailer_ocr", + 'P': 'invoice_retailer_revised', + 'Q': "invoice_retailer_accuracy", + 'R': "invoice_number_user", + 'S': "invoice_number_ocr", + 'T': "invoice_number_revised", + 'U': "invoice_number_accuracy", 'V': "ocr_image_accuracy", 'W': "ocr_image_speed_(seconds)", 'X': "is_reviewed", diff --git a/cope2n-api/report_detail.xlsx b/cope2n-api/report_detail.xlsx index 5f574dac90c743a58add0e7130b8c5855d02652c..e35b230a54897a38f611601764e164eec4a7a60c 100644 GIT binary patch delta 2636 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 From 9b253c33527970d097e3b270b1faf42d13d1d2e8 Mon Sep 17 00:00:00 2001 From: PhanThanhTrung Date: Thu, 4 Apr 2024 13:58:16 +0700 Subject: [PATCH 2/3] update --- cope2n-api/fwd_api/utils/accuracy.py | 164 ++++++++++++++++----------- 1 file changed, 96 insertions(+), 68 deletions(-) diff --git a/cope2n-api/fwd_api/utils/accuracy.py b/cope2n-api/fwd_api/utils/accuracy.py index 833a4fd..55b32b3 100755 --- a/cope2n-api/fwd_api/utils/accuracy.py +++ b/cope2n-api/fwd_api/utils/accuracy.py @@ -16,8 +16,10 @@ import redis from fwd import settings from ..models import SubscriptionRequest, Report, ReportFile import json +from typing import Union, List, Dict valid_keys = ["retailername", "sold_to_party", "invoice_no", "purchase_date", "imei_number"] +optional_keys = ['invoice_no'] class ReportAccumulateByRequest: def __init__(self, sub): @@ -533,6 +535,13 @@ def first_of_list(the_list): return None return the_list[0] +def _feedback_invoice_no_exist(feedback_result): + invoice_no = feedback_result.get("invoice_no", None) + if invoice_no in ["", [], None]: + return False + else: + return True + def extract_report_detail_list(report_detail_list, lower=False, in_percent=True): data = [] for report_file in report_detail_list: @@ -549,7 +558,7 @@ def extract_report_detail_list(report_detail_list, lower=False, in_percent=True) "Invoice_Number_User": report_file.feedback_result.get("invoice_no", None) if report_file.feedback_result else None, "Invoice_Number_OCR": report_file.predict_result.get("invoice_no", None), "Invoice_Number Revised": report_file.reviewed_result.get("invoice_no", None) if report_file.reviewed_result else None, - "Invoice_Number_Accuracy": first_of_list(report_file.feedback_accuracy.get("invoice_no", [None])), + "Invoice_Number_Accuracy": first_of_list(report_file.feedback_accuracy.get("invoice_no", [None])) if _feedback_invoice_no_exist(report_file.feedback_result) else None, "Invoice_Purchase Date_Consumer": report_file.feedback_result.get("purchase_date", None) if report_file.feedback_result else None, "Invoice_Purchase Date_OCR": format_purchase_date_ocr_for_report(report_file.predict_result.get("purchase_date", [])), "Invoice_Purchase Date Revised": report_file.reviewed_result.get("purchase_date", None) if report_file.reviewed_result else None, @@ -644,57 +653,60 @@ def predict_result_to_ready(result): dict_result["invoice_no"] = result.get("content", {}).get("document", [{}])[0].get("content", [{}, {}, {}, {}, {}])[4].get("value", None) return dict_result -def align_fine_result(ready_predict, fine_result): - # print(f"[DEBUG]: fine_result: {fine_result}") - # print(f"[DEBUG]: ready_predict: {ready_predict}") - if fine_result: - if fine_result["purchase_date"] and len(ready_predict["purchase_date"]) == 0: - ready_predict["purchase_date"] = [None] - if fine_result["retailername"] and not ready_predict["retailername"]: - ready_predict["retailername"] = [None] - if ready_predict.get("invoice_no", None) and not fine_result.get("invoice_no", None): - fine_result["invoice_no"] = [None] - fine_result["purchase_date"] = [fine_result["purchase_date"] for _ in range(len(ready_predict["purchase_date"]))] - return ready_predict, fine_result - def update_temp_accuracy(accuracy, acc, keys): for key in keys: accuracy[key].add(acc[key]) return accuracy -def calculate_accuracy(key_name, inference, target): +def _accuracy_calculate_formatter(inference, target): """_summary_ + format type of inference, and target from str/None to List of str/None. + Make both list inference and target to be the same length. + """ + if not isinstance(inference, list): + inference = [] if inference is None else [inference] + if not isinstance(target, list): + target = [] if target is None else [target] + + length = max(len(target), len(inference)) + target = target + (length - len(target))*[None] + inference = inference + (length - len(inference))*[None] + return inference, target + +def _acc_will_be_ignored(key_name, _target, type): + is_optional_key = key_name in optional_keys + is_empty_target = _target in [[], None, ''] + if is_optional_key and is_empty_target and type == 'feedback': + return True + else: + return False + +def calculate_accuracy(key_name: str, inference: Dict[str, Union[str, List]], target: Dict[str, Union[str, List]], type: str): + """_summary_ + NOTE: This has been changed to return accuracy = None if Args: key_name (string): key to calculate accuracy on, ex: retailername inference (dict): result from ocr, refined to align with the target down below target (dict): result of type + is_optional_keyname: default is set to False (which mean this is not an optional keyname) + currently we have invoice_no is an optional keyname. """ acc = [] data = [] - if not target or not inference: return acc, data - if not isinstance(inference[key_name], list): - if inference[key_name] is None: - inference[key_name] = [] - else: - inference[key_name] = [inference[key_name]] - if not isinstance(target[key_name], list): - if target[key_name] is None: - target[key_name] = [] - else: - target[key_name] = [target[key_name]] - # Realign lenght for mis predicted/feedback/reivew result - if len(target[key_name]) == 0 and len(inference[key_name]) > 0: - target[key_name] = [None for _ in range(len(inference[key_name]))] - elif len(inference[key_name]) == 0 and len(target[key_name]) > 0: - target[key_name] = [None for _ in range(len(inference[key_name]))] + + _inference = inference[key_name] + _target = target[key_name] + _will_acc_be_ignored = _acc_will_be_ignored(key_name, _target, type) + _inference = _accuracy_calculate_formatter(_inference) + _target = _accuracy_calculate_formatter(_target) - for i, v in enumerate(inference[key_name]): - # TODO: target[key_name][i] is None, "" - x = post_processing_str(key_name, inference[key_name][i], is_gt=False) - y = post_processing_str(key_name, target[key_name][i], is_gt=True) + for i, v in enumerate(_inference): + # TODO: target[i] is None, "" + x = post_processing_str(key_name, _inference[i], is_gt=False) + y = post_processing_str(key_name, _target[i], is_gt=True) score = eval_ocr_metric( [x], @@ -705,7 +717,8 @@ def calculate_accuracy(key_name, inference, target): # "line_acc", # "one_minus_ned_word", ]) - acc.append(list(score.values())[0]) + if not _will_acc_be_ignored: + acc.append(list(score.values())[0]) data.append([x, y]) return acc, data @@ -821,30 +834,43 @@ def calculate_a_request(report, request): if status != 200: continue image.feedback_accuracy = att["acc"]["feedback"] # dict {key: [values]} - image.reviewed_accuracy = att["acc"]["reviewed"] # dict {key: [values]} - image.is_bad_image_quality = att["is_bad_image"] + image.is_bad_image_quality = att["is_bad_image"] # is_bad_image=avg_acc 0: - image.predict_result["purchase_date"] = [att["normalized_data"]["feedback"]["purchase_date"][i][0] for i in range(len(att["normalized_data"]["feedback"]["purchase_date"]))] + image.predict_result["purchase_date"] = [value_pair[0] for value_pair in att["normalized_data"]["feedback"]["purchase_date"]] image.feedback_result["purchase_date"] = att["normalized_data"]["feedback"]["purchase_date"][fb_max_indexes["purchase_date"]][1] if len(att["normalized_data"]["reviewed"].get("purchase_date", [])) > 0: - image.predict_result["purchase_date"] = [att["normalized_data"]["reviewed"]["purchase_date"][i][0] for i in range(len(att["normalized_data"]["reviewed"]["purchase_date"]))] + image.predict_result["purchase_date"] = [value_pair[0] for value_pair in att["normalized_data"]["reviewed"]["purchase_date"]] image.reviewed_result["purchase_date"] = att["normalized_data"]["reviewed"]["purchase_date"][rv_max_indexes["purchase_date"]][1] - # if request.is_reviewed: - # att["is_reviewed"] = 1 request_att["is_reviewed"].append(att["is_reviewed"]) + + if att["is_reviewed"] == -1: # -1 means "not required" + att["acc"]["reviewed"] = {} + reviewed_result = {} + reason = None + counter_measure = None + else: + if att["is_reviewed"] == 1: + reviewed_result = image.reviewed_result + reason = image.reason + counter_measure = image.counter_measures + new_report_file = ReportFile(report=report, subsidiary=_sub, correspond_request_id=request.request_id, @@ -853,15 +879,15 @@ def calculate_a_request(report, request): doc_type=image.doc_type, predict_result=image.predict_result, feedback_result=image.feedback_result, - reviewed_result=image.reviewed_result, + reviewed_result=reviewed_result, feedback_accuracy=att["acc"]["feedback"], reviewed_accuracy=att["acc"]["reviewed"], acc=att["avg_acc"], is_bad_image=att["is_bad_image"], is_reviewed= review_status_map(att["is_reviewed"]), time_cost=image.processing_time, - bad_image_reason=image.reason, - counter_measures=image.counter_measures, + bad_image_reason=reason, + counter_measures=counter_measure, error="|".join(att["err"]), review_status=att["is_reviewed"], ) @@ -889,18 +915,18 @@ def calculate_a_request(report, request): request_att["acc"]["feedback"]["retailername"] += _att["acc"]["feedback"]["retailername"] request_att["acc"]["feedback"]["sold_to_party"] += _att["acc"]["feedback"]["sold_to_party"] request_att["acc"]["feedback"]["invoice_no"] += _att["acc"]["feedback"]["invoice_no"] + + request_att["acc"]["reviewed"]["imei_number"] += _att["acc"]["reviewed"]["imei_number"] if _att["is_reviewed"]==1 else [] + request_att["acc"]["reviewed"]["purchase_date"] += _att["acc"]["reviewed"]["purchase_date"] if _att["is_reviewed"]==1 else [] + request_att["acc"]["reviewed"]["retailername"] += _att["acc"]["reviewed"]["retailername"] if _att["is_reviewed"]==1 else [] + request_att["acc"]["reviewed"]["sold_to_party"] += _att["acc"]["reviewed"]["sold_to_party"] if _att["is_reviewed"]==1 else [] + request_att["acc"]["reviewed"]["invoice_no"] += _att["acc"]["reviewed"]["invoice_no"] if _att["is_reviewed"]==1 else [] - request_att["acc"]["reviewed"]["imei_number"] += _att["acc"]["reviewed"]["imei_number"] - request_att["acc"]["reviewed"]["purchase_date"] += _att["acc"]["reviewed"]["purchase_date"] - request_att["acc"]["reviewed"]["retailername"] += _att["acc"]["reviewed"]["retailername"] - request_att["acc"]["reviewed"]["sold_to_party"] += _att["acc"]["reviewed"]["sold_to_party"] - request_att["acc"]["reviewed"]["invoice_no"] += _att["acc"]["reviewed"]["invoice_no"] - - request_att["acc"]["acumulated"]["imei_number"] += _att["acc"]["reviewed"]["imei_number"] if _att["acc"]["reviewed"]["imei_number"] else _att["acc"]["feedback"]["imei_number"] - request_att["acc"]["acumulated"]["purchase_date"] += _att["acc"]["reviewed"]["purchase_date"] if _att["acc"]["reviewed"]["purchase_date"] else _att["acc"]["feedback"]["purchase_date"] - request_att["acc"]["acumulated"]["retailername"] += _att["acc"]["reviewed"]["retailername"] if _att["acc"]["reviewed"]["retailername"] else _att["acc"]["feedback"]["retailername"] - request_att["acc"]["acumulated"]["sold_to_party"] += _att["acc"]["reviewed"]["sold_to_party"] if _att["acc"]["reviewed"]["sold_to_party"] else _att["acc"]["feedback"]["sold_to_party"] - request_att["acc"]["acumulated"]["invoice_no"] += _att["acc"]["reviewed"]["invoice_no"] if _att["acc"]["reviewed"]["invoice_no"] else _att["acc"]["feedback"]["invoice_no"] + request_att["acc"]["acumulated"]["imei_number"] += _att["acc"]["reviewed"]["imei_number"] if _att["acc"]["reviewed"]["imei_number"] and _att["is_reviewed"]==1 else _att["acc"]["feedback"]["imei_number"] + request_att["acc"]["acumulated"]["purchase_date"] += _att["acc"]["reviewed"]["purchase_date"] if _att["acc"]["reviewed"]["purchase_date"] and _att["is_reviewed"]==1 else _att["acc"]["feedback"]["purchase_date"] + request_att["acc"]["acumulated"]["retailername"] += _att["acc"]["reviewed"]["retailername"] if _att["acc"]["reviewed"]["retailername"] and _att["is_reviewed"]==1 else _att["acc"]["feedback"]["retailername"] + request_att["acc"]["acumulated"]["sold_to_party"] += _att["acc"]["reviewed"]["sold_to_party"] if _att["acc"]["reviewed"]["sold_to_party"] and _att["is_reviewed"]==1 else _att["acc"]["feedback"]["sold_to_party"] + request_att["acc"]["acumulated"]["invoice_no"] += _att["acc"]["reviewed"]["invoice_no"] if _att["acc"]["reviewed"]["invoice_no"] and _att["is_reviewed"]==1 else _att["acc"]["feedback"]["invoice_no"] if image.reason not in settings.ACC_EXCLUDE_RESEASONS: request_att["bad_images"] += int(_att["is_bad_image"]) @@ -926,33 +952,35 @@ def calculate_subcription_file(subcription_request_file): return 400, att inference_result = copy.deepcopy(subcription_request_file.predict_result) - inference_result, feedback_result = align_fine_result(inference_result, copy.deepcopy(subcription_request_file.feedback_result)) - inference_result, reviewed_result = align_fine_result(inference_result, copy.deepcopy(subcription_request_file.reviewed_result)) + feedback_result = copy.deepcopy(subcription_request_file.feedback_result) + reviewed_result = copy.deepcopy(subcription_request_file.reviewed_result) for key_name in valid_keys: try: - att["acc"]["feedback"][key_name], att["normalized_data"]["feedback"][key_name] = calculate_accuracy(key_name, inference_result, feedback_result) - att["acc"]["reviewed"][key_name], att["normalized_data"]["reviewed"][key_name] = calculate_accuracy(key_name, inference_result, reviewed_result) + att["acc"]["feedback"][key_name], att["normalized_data"]["feedback"][key_name] = calculate_accuracy(key_name, inference_result, feedback_result, "feedback") + att["acc"]["reviewed"][key_name], att["normalized_data"]["reviewed"][key_name] = calculate_accuracy(key_name, inference_result, reviewed_result, "reviewed") except Exception as e: att["err"].append(str(e)) - # print(f"[DEBUG]: predict_result: {subcription_request_file.predict_result}") - # print(f"[DEBUG]: e: {e} -key_name: {key_name}") subcription_request_file.feedback_accuracy = att["acc"]["feedback"] subcription_request_file.reviewed_accuracy = att["acc"]["reviewed"] - avg_reviewed = calculate_avg_accuracy(att["acc"], "reviewed", ["retailername", "sold_to_party", "invoice_no", "purchase_date", "imei_number"]) - avg_feedback = calculate_avg_accuracy(att["acc"], "feedback", ["retailername", "sold_to_party", "invoice_no", "purchase_date", "imei_number"]) + + avg_reviewed = calculate_avg_accuracy(att["acc"], "reviewed", valid_keys) + avg_feedback = calculate_avg_accuracy(att["acc"], "feedback", valid_keys) + if avg_feedback is not None or avg_reviewed is not None: avg_acc = 0 if avg_feedback is not None: avg_acc = avg_feedback if avg_feedback < settings.NEED_REVIEW: att["is_reviewed"] = 0 - if avg_reviewed is not None: + else: + att["is_reviewed"] = -1 + if avg_reviewed is not None and att["is_reviewed"]!=-1: avg_acc = avg_reviewed att["is_reviewed"] = 1 # Little trick to overcome issue caused by misleading manually review process - if subcription_request_file.reason or subcription_request_file.counter_measures: + if (subcription_request_file.reason or subcription_request_file.counter_measures) and att["is_reviewed"]!=-1: att["is_reviewed"] = 1 att["avg_acc"] = avg_acc From 7cb21817ed06d7b46a06b3f2d43c45ca2bdc2396 Mon Sep 17 00:00:00 2001 From: dx-tan Date: Thu, 4 Apr 2024 15:18:22 +0700 Subject: [PATCH 3/3] fix minor bug --- cope2n-api/fwd_api/utils/accuracy.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/cope2n-api/fwd_api/utils/accuracy.py b/cope2n-api/fwd_api/utils/accuracy.py index 55b32b3..ce19ebd 100755 --- a/cope2n-api/fwd_api/utils/accuracy.py +++ b/cope2n-api/fwd_api/utils/accuracy.py @@ -536,6 +536,10 @@ def first_of_list(the_list): return the_list[0] def _feedback_invoice_no_exist(feedback_result): + if feedback_result is None: + return True + if not isinstance(feedback_result, dict): + return True invoice_no = feedback_result.get("invoice_no", None) if invoice_no in ["", [], None]: return False @@ -700,8 +704,7 @@ def calculate_accuracy(key_name: str, inference: Dict[str, Union[str, List]], ta _inference = inference[key_name] _target = target[key_name] _will_acc_be_ignored = _acc_will_be_ignored(key_name, _target, type) - _inference = _accuracy_calculate_formatter(_inference) - _target = _accuracy_calculate_formatter(_target) + _inference, _target = _accuracy_calculate_formatter(_inference, _target) for i, v in enumerate(_inference): # TODO: target[i] is None, "" @@ -860,16 +863,15 @@ def calculate_a_request(report, request): image.reviewed_result["purchase_date"] = att["normalized_data"]["reviewed"]["purchase_date"][rv_max_indexes["purchase_date"]][1] request_att["is_reviewed"].append(att["is_reviewed"]) - if att["is_reviewed"] == -1: # -1 means "not required" + if att["is_reviewed"] !=1: att["acc"]["reviewed"] = {} reviewed_result = {} reason = None counter_measure = None else: - if att["is_reviewed"] == 1: - reviewed_result = image.reviewed_result - reason = image.reason - counter_measure = image.counter_measures + reviewed_result = image.reviewed_result + reason = image.reason + counter_measure = image.counter_measures new_report_file = ReportFile(report=report, subsidiary=_sub, @@ -935,7 +937,7 @@ def calculate_a_request(report, request): except Exception as e: print(f"[ERROR]: failed to calculate request: {request.request_id} - request_file: {image.file_name} because of {e}") continue - + return request_att, report_files def calculate_subcription_file(subcription_request_file):