File size: 10,113 Bytes
ce3f819
 
 
 
79ef1e1
 
ce3f819
 
 
 
 
 
 
 
 
 
ad20aad
 
 
 
ce3f819
 
 
 
 
ad20aad
ce3f819
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad20aad
 
ce3f819
 
 
 
 
 
ad20aad
ce3f819
 
 
 
ad20aad
ce3f819
 
ad20aad
 
 
ce3f819
 
dd1c7ae
 
 
 
 
 
 
 
 
 
 
 
 
 
ce3f819
 
 
 
 
 
 
ad20aad
ce3f819
 
 
 
ad20aad
ce3f819
 
ad20aad
 
 
ce3f819
 
 
 
 
 
 
 
 
 
 
ad20aad
 
ce3f819
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad20aad
ce3f819
 
 
 
 
ad20aad
 
 
e8f128f
ad20aad
 
 
ce3f819
 
 
 
23ca6cc
ad20aad
ce3f819
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad20aad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import streamlit as st  #Web App
from PIL import Image, ImageOps #Image Processing
import time
from unittest import result
from icevision.all import *
from icevision.models.checkpoint import *


st.sidebar.image("./logo.png")
st.sidebar.header("ATK-OCR classification (AOC) Webapp.")
def load_image(image_file):
    img = Image.open(image_file)
    return img



activities = ["Detection (วิเคราะห์โรค)", "About (เกี่ยวกับ)"]
choice = st.sidebar.selectbox("Select option.. (เลือกโหมด)",activities)

#set default size as image_scale x image_scale
def img_resize(input_path,img_size): # padding
  desired_size = img_size
  im = Image.open(input_path)
  im = ImageOps.exif_transpose(im) # fix image rotating
  width, height = im.size # get img_input size
  if (width == image_scale) and (height == image_scale):
    new_im = im
  else:
    #im = im.convert('L') #Convert to gray
    old_size = im.size  # old_size[0] is in (width, height) format
    ratio = float(desired_size)/max(old_size)
    new_size = tuple([int(x*ratio) for x in old_size])
    im = im.resize(new_size, Image.ANTIALIAS)
    new_im = Image.new("RGB", (desired_size, desired_size))
    new_im.paste(im, ((desired_size-new_size[0])//2,
                        (desired_size-new_size[1])//2))

  return new_im

checkpoint_path = "./AOC_weight_97.4.pth"

checkpoint_and_model = model_from_checkpoint(checkpoint_path, 
    model_name='ross.efficientdet', 
    backbone_name='tf_d2',
    img_size=384, 
    is_coco=False)

model_type = checkpoint_and_model["model_type"]
backbone = checkpoint_and_model["backbone"]
class_map = checkpoint_and_model["class_map"]
img_size = checkpoint_and_model["img_size"]
#model_type, backbone, class_map, img_size

model = checkpoint_and_model["model"]

device=next(model.parameters()).device

img_size = checkpoint_and_model["img_size"]
valid_tfms = tfms.A.Adapter([*tfms.A.resize_and_pad(img_size), tfms.A.Normalize()])

image_scale = 768 # change image input / ouput size here

def get_detection(img_path):
 
  #Get_Idcard_detail(file_path=img_path)
  img = Image.open(img_path)
  img = ImageOps.exif_transpose(img) # fix image rotating
  width, height = img.size # get img_input size
  if (width == image_scale) and (height == image_scale):
    pred_dict  = model_type.end2end_detect(img, valid_tfms, model, class_map=class_map, detection_threshold=0.6)
  else:
    #im = im.convert('L') #Convert to gray
    old_size = img.size  # old_size[0] is in (width, height) format
    ratio = float(image_scale)/max(old_size)
    new_size = tuple([int(x*ratio) for x in old_size])
    img = img.resize(new_size, Image.ANTIALIAS)
    new_im = Image.new("RGB", (image_scale, image_scale))
    new_im.paste(img, ((image_scale-new_size[0])//2,
                        (image_scale-new_size[1])//2))
    pred_dict  = model_type.end2end_detect(new_im, valid_tfms, model, class_map=class_map, detection_threshold=0.6)

    if (len(pred_dict['detection']['labels'])) > 0:
      num_count = 1
      for i,j in zip(pred_dict['detection']['labels'], pred_dict['detection']['scores']):
        labels = i
        acc = round((j*100),2)
        if labels == "Neg":
          labels = "Negative"
          st.success(f"{num_count}. '{labels}' with {acc} % confidence.")
        elif labels == "Pos":
          labels = "Positive"
          st.error(f"{num_count}. '{labels}' with {acc} % confidence.")
        num_count += 1
    else: # when not found imgs
      st.warning("Not found 'Antigen Test Kit' image ; please recheck and try again !!")

def get_img_detection(img_path):
   
  #Get_Idcard_detail(file_path=img_path)
  img = Image.open(img_path)
  img = ImageOps.exif_transpose(img) # fix image rotating
  width, height = img.size # get img_input size
  if (width == image_scale) and (height == image_scale):
    new_im = img
  else:
    #im = im.convert('L') #Convert to gray
    old_size = img.size  # old_size[0] is in (width, height) format
    ratio = float(image_scale)/max(old_size)
    new_size = tuple([int(x*ratio) for x in old_size])
    img = img.resize(new_size, Image.ANTIALIAS)
    new_im = Image.new("RGB", (image_scale, image_scale))
    new_im.paste(img, ((image_scale-new_size[0])//2,
                        (image_scale-new_size[1])//2))
  
  pred_dict  = model_type.end2end_detect(new_im, valid_tfms, model, class_map=class_map, detection_threshold=0.6)


  return pred_dict['img']






if choice =='About (เกี่ยวกับ)' :
    st.header("About... (เกี่ยวกับ)")

    st.subheader("AOC คืออะไร ?")
    st.write("- เป็นระบบที่สามารถคัดกรองผลตรวจเชื้อของ COVID-19 ได้ผ่าน ที่ตรวจ ATK (Antigen Test Kit) ควบคู่กับบัตรประชาชน จากรูปภาพได้โดยอัตโนมัติ")

    st.subheader("AOC ทำอะไรได้บ้าง ?")
    st.write("- ตรวจจับผลตรวจ ATK (Obj detection)")
    st.write("- ตรวจจับชื่อ-นามสกุล (OCR)")
    st.write("- ตรวจจับเลขบัตรประชาชน (OCR)")

    st.subheader("AOC ดีกว่ายังไง ?")
    st.write("จากผลที่ได้จากการเปรียบเทียบกันระหว่าง model (AOC) กับ คน (Baseline) จำนวน 30 ภาพ / คน ได้ผลดังนี้")
    st.image("./acc_table.png")
    st.write("จากผลที่ได้สรุปได้ว่า ส่วนที่ผ่าน Baseline และมีประสิทธิภาพดีกว่าคัดกรองด้วยคนคือ ผลตรวจ ATK ได้ผลที่ 100 %, เลขบัตรประชน ได้ผลที่ 100 % และ ความเร็วในการคัดกรอง ได้ผลที่ 4.84 วินาที ซึ่งมีความเร็วมากกว่า 81% เมื่อเทียบกับคัดกรองด้วยคน ถือว่ามีประสิทธิภาพที่สูงมากในการคัดกรอง และ มีประสิทธิภาพมากกว่าการคัดแยกด้วยมนุษย์")
    st.write("** ความเร็วที่โมเดลทำได้อาจไม่ตรงตามที่ deploy บนเว็บ เนื่องจากในเว็บ ไม่มี GPU ในการประมวลผลอาจทำให้โมเดลใช้เวลาในการประมวลที่นานกว่าตอนใช้ GPU")


    st.subheader("คำแนะนำในการใช้งาน")
    st.write("- ในการใช้งานให้ถ่ายรูปภาพบัตรประชาชนในแนวตั้งเท่านั้น เนื่องจากถ้าเป็นแนวอื่นอาจทำให้การตรวจจับคลาดเคลื่อนเอาได้")#3
    st.write("- ภาพไม่ควรมีแสงที่สว่างมากเกืนไป และ มืดเกินไป มิฉะนั้นอาจทำให้การตรวจจับคลาดเคลื่อนเอาได้")#4
    st.write("- ภาพไม่ควรที่จะอยู่ไกลเกินไป และ ควรมีความชัด มิฉะนั้นอาจทำให้การตรวจจับคลาดเคลื่อน หรือ ไม่สามารถตรวจจับได้")#5

    st.subheader("รายละเอียดเพิ่มเติม")
    st.write('[Medium blog](https://medium.com/@mjsalyjoh/atk-ocr-classification-aoc-%E0%B8%A3%E0%B8%B0%E0%B8%9A%E0%B8%9A%E0%B8%84%E0%B8%B1%E0%B8%94%E0%B8%81%E0%B8%A3%E0%B8%AD%E0%B8%87%E0%B8%9C%E0%B8%A5%E0%B8%95%E0%B8%A3%E0%B8%A7%E0%B8%88-atk-%E0%B9%81%E0%B8%A5%E0%B8%B0-%E0%B8%9A%E0%B8%B1%E0%B8%95%E0%B8%A3%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%8A%E0%B8%B2%E0%B8%8A%E0%B8%99-fa32a8d47599)')
    st.write('[Github Link](https://github.com/Tanaanan/AOC_ATK_OCR_Classification)')

    
     
       
elif choice == "Detection (วิเคราะห์โรค)":
    st.header(" Antigen test kit + Identification card detector.")

    image = st.file_uploader(label = "upload ATK + Idcard img here.. OwO",type=['png','jpg','jpeg'])
    if image is not None:
        new_img = img_resize(image, 1280)
        st.image(get_img_detection(image))
        with st.spinner("🤖 On Working... "):
            t1 = time.perf_counter()
            st.subheader("Detection result...")
            get_detection(image)
            t2 = time.perf_counter()
            st.write('time taken to run: {:.2f} sec'.format(t2-t1))
    else:
        st.write("## Waiting for image..")
        st.image('atk_idcard.jpeg')

    st.warning("""[On debugging..] ในตอนนี้ระบบ AOC สามารถใช้ได้ในการตรวจจับ ATK เพียงอย่างเดียว (กำลังอยู่ในขั้นตอนการพัฒนาให้สามารถใช้งานควบคู่กับระบบ OCR บัตรประชาชน)""")

    st.caption("Made by Tanaanan .M")


st.sidebar.subheader('More image for test..')
st.sidebar.write('[Github img test set.](https://github.com/Tanaanan/AOC_ATK_OCR_Classification/tree/main/test_set(img))')
    









st.sidebar.markdown('---')
st.sidebar.subheader('Recomend / Issues report..')
st.sidebar.write('[Google form](https://forms.gle/zYpYFKcTpBoFGxN58)')


st.sidebar.markdown('---')
st.sidebar.subheader('Made by Tanaanan .M')
st.sidebar.write("Contact : [email protected]")