boostcampaitech3 / final-project-level3-cv-16

👀 너의 알약이 보여 💊 : 알약 이미지 분류 프로젝트
5 stars 6 forks source link

[ML][Experiment] Text Similarity 계산 #41

Closed seoulsky-field closed 2 years ago

seoulsky-field commented 2 years ago

What

OCR 모델의 최종 결과물인 Text 예측 string을 정답과 비교하기 위한 Similarity 등의 metric을 찾고 가장 적합한 metric을 적용하여 넘깁니다.

Why

OCR 모델의 정확도를 고려해보면 "완전히 일치"만 하는 상황이 나타나지 않습니다. 또한, '일치'가 아닌 '포함'만을 사용한다고 했을 때, 너무 많은 후보군이 발생하게 됩니다. 따라서 '포함'과 '일치'를 모두 아우를 수 있는 유사도를 이용하기로 생각하였습니다.

How

seoulsky-field commented 2 years ago

scikit-learn에 있는 CountVectorizer를 이용하여 Vectorize 후 word count등을 이용하여 Euclidean distance를 구해보았으나 inference하는 시간이 너무 오래 걸리는 것으로 보여 Stop함

seoulsky-field commented 2 years ago

Jaccard similarity 기법을 이용해보았는데 생각했던 방법과 가장 유사하고 시간도 나쁘지 않게 걸리는 것으로 보여 해당 기법을 이용하는 것으로 결정함

seoulsky-field commented 2 years ago

적용 완료 후 issue close하겠습니다.

seoulsky-field commented 2 years ago

jaccard simlarity 단편적인 결과 공유 (1)

image

  1. test image 중 하나를 사용하였습니다.
  2. text는 앞, 뒷면 포함해서 “CLS”하나밖에 없었습니다.
  3. 아직 결과물에 직접 jaccard 유사도를 바로 적용시켜 출력할 수 없어서 string에 “CLS”를 임의로 입력하였습니다.
  4. jaccard 유사도를 돌린 결과 7개가 동일한 유사도를 갖았음을 확인할 수 있었습니다. (출력물은 (index, similarity)형태 입니다.)
  5. 정답은 index가 7794인 약이며, 유사도가 1.0이 나온 다른 약들을 보았을 때를 조사한 결과 다음과 같습니다.

index 181번 // 앞면: "SL" // 뒷면: "CL" index 377번 // 앞면: "SL // 뒷면: SC" index 7796번 // 앞면: "CLS" // 뒷면: None index 7822번 // 앞면: "SCL" // 뒷면: None index 19154번 // 앞면: "CLS" // 뒷면: None index 19208번 // 앞면: "CLS" // 뒷면: None index 23081번 // 앞면: "SC" // 뒷면: "LC"

단, 대부분의 알약이 색상 및 제형으로 구분 가능함

seoulsky-field commented 2 years ago

jaccard simlarity 단편적인 결과 공유 (2)

image

  1. test image: 오티렌정[애엽이소프로판올연조엑스(20→1)] [201206163]
  2. text는 앞, 뒷면 포함해서 “DWP”와 "60" 두 개 있습니다.
  3. CRAFT-pytorch 모델에서 60을 인식하지 못했습니다.
  4. 아직 결과물에 직접 jaccard 유사도를 바로 적용시켜 출력할 수 없어서 string에 “DWP”를 임의로 입력하였습니다.
  5. jaccard 유사도를 돌린 결과 7개가 동일한 유사도를 갖는 것을 확인할 수 있었습니다. (출력물은 (index, similarity)형태 입니다.)
  6. 정답은 index가 1336인 약이며, 유사도가 1.0이 나온 다른 약들을 보았을 때를 조사한 결과 다음과 같습니다. index 303번(데일리원정) // 앞면: PP // 뒷면: WD // 색상앞: 갈색 & nan, 제형: 장방형 index 6648번(대원리세드론산정35밀리그램(리세드론산나트륨2.5수화물)) // 앞면: DWP // 뒷면: nan // 색상앞: 주황 & nan, 제형: 타원형 index 6701번(원살탄정(로사르탄칼륨)) // 앞면: 분할선 // 뒷면: DWP // 색상앞: 하양 & nan, 제형: 타원형 index 8422번(다벤돌정(알리벤돌)(수출용)) // 앞면: DDDWP // 뒷면: nan // 색상앞: 분홍 & nan, 제형: 장방형 index 9166번(코미닌정) // 앞면: 분할선 // 뒷면: DWP // 색상앞: 파랑 & nan, 제형: 타원형 index 11166번(뮤리나제정(스트렙토키나제·스트렙토도르나제)) // 앞면: DWP // 뒷면: 분할선 // 색상앞: 분홍 & nan, 제형: 원형 index 11588번(스피락톤정50mg(스피로노락톤)) // 앞면: DWP // 뒷면: 분할선 // 색상앞: 하양 & nan, 제형: 원형

단, 대부분의 알약이 색상 및 제형으로 구분 가능하며 Custom Jaccard Similarity를 적용할 경우 유사도 1.0을 보입니다.

seoulsky-field commented 2 years ago

노션에 추가적으로 기록하였습니다. (https://seoulsky-field.notion.site/06-07-61ad6224eede44ffb99d9ae901e4582b) 보시고 의견 부탁드립니다. @tnsgh9603 @sodabeans @justbeaver97 @SSANGYOON

yehyunsuh commented 2 years ago

저만 이런가요..? 사진이 너무 많아서 그런지 로딩 자체가 안 되네요..ㅜㅜ

image
seoulsky-field commented 2 years ago

@justbeaver97 너무 안보이신다면 https://seoulsky-field.notion.site/Model-OCR-Text-Recognition-8bdeb0b8c8cc47e7a65e2a7bde36aff0 에서 제일 하단에 토글로 "아주 작은 결과 추가 분석..!"을 참고하시면 됩니다!

yehyunsuh commented 2 years ago

읽어봤는데, 저는 유사도가 높은 알약이 많은 것은 상관이 없을 것 같습니다. 이미 색상/알약 타입/모양 이 3가지로 분류를 한 것에 유사도가 높은 것들을 걸러낸다면, 후보군을 더 줄일 수 있는 오히려 좋은 기회라고 생각합니다. 다만, 유사도가 높은 알약 중에 ground truth가 무조건 존재하면 되겠죠.

ghost commented 2 years ago

@seoulsky-field 공유해주신 2번째 케이스 같은 경우는 정답 index가 1336인데 유사도가 1.0인 7개의 케이스 중에 없는 경우인가요?

seoulsky-field commented 2 years ago

@tnsgh9603 넵. Jaccard Similarity에 계산하였을 때 유사도가 1.0인 7개의 케이스에는 없고 (아마 pred에 대한 Jaccard Similarity가 0.6일거에요.) Custom Jaccard Similarity(분모를 Union(gt, pred)의 len이 아닌 pred의 len으로만 따졌을 때)에 계산하였을 때 유사도가 1.0입니다.

ghost commented 2 years ago

@seoulsky-field 오 좋습니다. 이걸로 후보군을 더 줄일 수 있으면 안 쓸 이유가 없을 것 같네요. 다만, 예현님이 말씀하신 것처럼 GT가 후보 중에 있다는 게 전제가 되기만 하면 될 것 같습니다.

sodabeans commented 2 years ago

필터링해서 어느 정도 걸러주는 작업만 잘 된다면 적용하는게 좋겠습니다! 다만 앞서 말씀하신 것처럼 GT가 후보군에 있어야 할 텐데, 그건 전 단계인 텍스트 모델 prediction에서 문제없다면 괜찮지 않을까 싶습니다.

seoulsky-field commented 2 years ago

Custom data에 대해서 deep-text-recognition-benchmark의 성능이 좋지 않은 것으로 판별되어 OCR은 "추후 연구"로 진행하는 것으로 결정되었습니다.