도배 하자 유형 분류 AI 경진대회

알고리즘 | 비전 | 분류 | MLOps | Weighted F1 Score

  • moneyIcon 상금 : 1,000 만원
  • 2,093명 마감

 

[Baseline / For Window] 한글 라벨로 인한 데이터 로드 에러 및 연속 폭발 수정 코드

2023.04.10 19:21 4,492 조회 language

베이스라인 돌리려 했지만, 윈도우 환경에서 대폭발이 일어나는 것을 확인했습니다.
1. /로 스플릿하는 부분을 \\에 [2]에서 [1]로 변경했습니다.

2. 이미지 주소에 한글이 있는 경우, cv2가 이미지 데이터를 읽지 못하는 문제를 해결합니다.
(중요!)이 코드는 train 폴더 내부의 각 폴더명을 0부터 18까지 변경하시고 돌리셔야 합니다.

3. 라벨을 숫자로 바꾸었기 때문에, label의 데이터 형식을 LongTensor로 변경했습니다.

4. 결과물 라벨이 한글이기에 엑셀에서 바로 열리지 않습니다. 
submit. to_csv("이름.csv", encoding = "ansi")를  사용하면 결과물을 열어보실 수 있으나,
ansi로 인코딩된 csv파일을 제출하실 경우 0점을 경험하실 수 있습니다.(이 사실을 확인하기 위해 첫 날의 2회 제출 기회를 날렸습니다ㅠ)

완전 처음 배울 때 베이스라인을 돌릴 수 있도록 도움 주셨던 많은 고수분들처럼 
많은 초보 분들이 익히시는 데에도 도움이 되었으면 좋겠습니다.
실력이 부족해 어거지로 돌아가게 만든 느낌이 강합니다 ㅠ
코드가 잘 돌아가지 않을 경우 댓글로 말씀해주세요!
늘 좋은 대회 제공해주시는 데이콘에도 감사합니다.

코드
로그인이 필요합니다
0 / 1000
usxxng
2023.04.11 20:30

그냥 제출하려다가 확인해보니 한글깨짐으로 큰일날 뻔 했네요.. 감사합니다!!

이세의인공지능
2023.04.13 11:11

저야말로 감사합니다!

누리고
2023.04.13 09:58

많이 배워갑니다. 감사합니다.
3. 라벨을 숫자로 바꾸었기 때문에, label의 데이터 형식을 LongTensor로 변경
이 부분에 대해서 제가 공부한 것 공유 드립니다.
우선 제일 먼저 label의 형식을 LongTensor로 변경한 이유는
'CrossEntropyLoss'를 계산 할 때 발생 할 수 있는 데이터 타입의 불일치 문제 때문일거라 추측합니다.
'CrossEntropyLoss'은 머신러닝에서 분류 문제를 해결 하기 위한 손실 함수입니다.
PyTorch의 nn.CrossEntropyLoss는 기본적으로 두 가지 입력을 받습니다.
1.모델 출력 (logits): 이 값들은 일반적으로 float 타입인 torch.FloatTensor입니다.
2.정답 레이블 (ground truth labels): 이 값들은 일반적으로 정수 타입인 torch.LongTensor 또는 torch.int64로 표현됩니다.
'CrossEntropyLoss'를 계산할 때 데이터 타입의 불일치가 발생하는 이유는 
1.입력 데이터가 전처리 과정에서 type이 바뀌었을 경우
(numpy->PyTorch 텐서로 변환중 데이터 타입변경)
2.데이터 로더(DataLoader)를 사용하여 배치로 데이터를 가져올 떄 자동변환 X 원래 타입을 가져왔을 경우 
->이를 해결 하기위해 레이블 텐서의 데이터 타입을 명시적으로 'torch.LongTenor'로 변환하면 됩니다.
조금이라도 도움이 되었으면 좋겠습니다! 

이세의인공지능
2023.04.13 11:11

보다 체계적인 피드백 정말 감사합니다. 
에러가 나면 고치는 법만 알아 이러한 배경은 잘 몰랐습니다!ㅎㅎ

신도림조기축구회_김덕배
2023.04.13 14:28

맥쓰는데 저는 그런 현상이 없긴했는데 여튼 코드 감사합니다!

이세의인공지능
2023.04.14 09:22

네! 맥 환경에선 문제가 안생기네요!ㅎㅎ 디렉토리 주소 다르게 저장되거나 cv2 한글 디렉토리 못잡는 문제들은 자주 겪는 것 같습니다..

yun_way
2023.04.17 00:16

저는 이상하게 list index out of range가 발생했습니다.
df['label'] = df['img_path'].apply(lambda x : str(x).split('/')[-2])로 처리하니 해결되었습니다. 혹시 저랑 비슷한 상황이시면 참고하시면 도움이 될 듯 합니다.

사냥꾼쪰
2023.04.29 07:30

같은 오류로 해결하느라 오래 걸렸는데 알려주셔서 감사합니다!!!!!

c4big2
2023.05.16 18:25

감사합니다. 좋은정보 감사합니다.