Spaces:
Build error
Build error
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]")
|