인프런 커뮤니티 질문&답변

xindongmin님의 프로필 이미지

작성한 질문수

차량 번호판 인식 프로젝트와 TensorFlow로 배우는 딥러닝 영상인식 올인원

커스텀데이터셋을 만들고 싶습니다

해결된 질문

24.06.27 14:39 작성

·

133

0

labelme를 이용해서 CRAFT 학습용 커스텀데이터셋을 만드려고 하는데

선생님이 제공해주신 CRAFT 디텍션 커스텀데이터셋 처럼

935 362 1034 362 1034 411 935 411 "YG9X2G"

좌표 "정답" txt 파일로 안나오고

json 파일로 저장이 되는데

어떻게 해야되나요?

답변 2

0

AISchool님의 프로필 이미지
AISchool
지식공유자

2024. 06. 29. 17:28

안녕하세요~. 반갑습니다.


결론적으로 핵심은 groundtruth 데이터를 잘 파싱해서 dataset이라는 변수에 아래와 같은 포맷의 데이터를 지정하는 것인데요.

[('./icdar2013/Challenge2_Training_Task12_Images/229.jpg',
  [[(array([[231,  80],
            [282,  80],
            [282, 141],
            [231, 141]]), 'N'), (array([[302,  82],
            [341,  82],
            [341, 142],
            [302, 142]]), 'E'), (array([[354,  83],
            [423,  83],
            [423, 143],
            [354, 143]]), 'W')], [(array([[146, 164],
            [189, 164],
            [189, 223],
            [146, 223]]), 'T'), (array([[200, 164],
            [242, 164],
            [242, 224],
            [200, 224]]), 'R'), (array([[252, 165],
            [303, 165],
            [303, 225],
            [252, 225]]), 'A'), (array([[317, 167],
            [354, 167],
            [354, 226],
            [317, 226]]), 'F'), (array([[367, 167],
            [404, 167],
            [404, 227],
            [367, 227]]), 'F'), (array([[416, 168],
            [427, 168],
            [427, 227],
            [416, 227]]), 'I'), (array([[442, 167],
            [493, 167],
            [493, 230],
            [442, 230]]), 'C')], [(array([[134, 246],
            [180, 246],
            [180, 308],
            [134, 308]]), 'S'), (array([[196, 248],
            [207, 248],
            [207, 308],
            [196, 308]]), 'I'), (array([[222, 247],
            [274, 247],
            [274, 310],
            [222, 310]]), 'G'), (array([[292, 250],
            [343, 250],
            [343, 309],
            [292, 309]]), 'N'), (array([[355, 251],
            [405, 251],
            [405, 310],
            [355, 310]]), 'A'), (array([[418, 251],
            [451, 251],
            [451, 311],
            [418, 311]]), 'L'), (array([[458, 251],
            [503, 251],
            [503, 312],
            [458, 312]]), 'S')], [(array([[172, 332],
            [223, 332],
            [223, 391],
            [172, 391]]), 'A'), (array([[236, 332],
            [283, 332],
            [283, 391],
            [236, 391]]), 'H'), (array([[302, 333],
            [341, 333],
            [341, 392],
            [302, 392]]), 'E'), (array([[350, 334],
            [401, 334],
            [401, 393],
            [350, 393]]), 'A'), (array([[414, 334],
            [462, 334],
            [462, 393],
            [414, 393]]), 'D')]],
  1),
 ('./icdar2013/Challenge2_Training_Task12_Images/174.jpg',
  [[(array([[1350, 1880],
            [1638, 1880],
            [1638, 2129],
            [1350, 2129]]), 'w'), (array([[1684, 1881],
            [1968, 1881],
            [1968, 2128],
            [1684, 2128]]), 'w'), (array([[2016, 1882],
            [2295, 1882],
            [2295, 2128],
            [2016, 2128]]), 'w'), (array([[2337, 2059],
            [2401, 2059],
            [2401, 2128],
            [2337, 2128]]), '.'), (array([[2437, 1776],
            [2637, 1776],
            [2637, 2134],
            [2437, 2134]]), 'b'), (array([[2680, 1806],
            [2912, 1806],
            [2912, 2128],
            [2680, 2128]]), '4'), (array([[2915, 1886],
            [3111, 1886],
            [3111, 2128],
            [2915, 2128]]), 'v'), (array([[3158, 1880],
            [3340, 1880],
            [3340, 2134],
            [3158, 2134]]), 'a'), (array([[3366, 1777],
            [3462, 1777],
            [3462, 2126],
            [3366, 2126]]), 'l'), (array([[3501, 1880],
            [3711, 1880],
            [3711, 2130],
            [3501, 2130]]), 'u')], [(array([[   0,    0],
            [ 988,    0],
            [ 988, 1328],
            [   0, 1328]]), '')], [(array([[1264,    0],
            [2576,    0],
            [2576, 1376],
            [1264, 1376]]), '')], [(array([[3736, 1864],
            [3887, 1864],
            [3887, 2136],
            [3736, 2136]]), '')], [(array([[3073,    0],
            [3424,    0],
            [3424,  707],
            [3073,  707]]), '')]],
  1),
]


예전에는 이런식의 데이터파싱 작업이 프로그래밍에 익숙하지 않은 분들에게는 조금 어렵게 느껴질수 있었는데요.
요즘은 ChatGPT가 코드를 매우 잘 작성해주시기 때문에 ChatGPT에게 아래와 같이 요청하시면 ChatGPT가 가지고 계신 json 파일에 대한 데이터파싱 코드를 작성해줄 것입니다.

아래와 같은 데이터 포맷의 내용을

{가지고 계신 json 파일 내용의 일부}

아래와 같은 형태로 변경하고 dataset이라는 변수에 저장하는 python 함수를 작성해줘

[('./icdar2013/Challenge2_Training_Task12_Images/229.jpg',
  [[(array([[231,  80],
            [282,  80],
            [282, 141],
            [231, 141]]), 'N'), (array([[302,  82],
            [341,  82],
            [341, 142],
            [302, 142]]), 'E'), (array([[354,  83],
            [423,  83],
            [423, 143],
            [354, 143]]), 'W')], [(array([[146, 164],
            [189, 164],
            [189, 223],
            [146, 223]]), 'T'), (array([[200, 164],
            [242, 164],
            [242, 224],
            [200, 224]]), 'R'), (array([[252, 165],
            [303, 165],
            [303, 225],
            [252, 225]]), 'A'), (array([[317, 167],
            [354, 167],
            [354, 226],
            [317, 226]]), 'F'), (array([[367, 167],
            [404, 167],
            [404, 227],
            [367, 227]]), 'F'), (array([[416, 168],
            [427, 168],
            [427, 227],
            [416, 227]]), 'I'), (array([[442, 167],
            [493, 167],
            [493, 230],
            [442, 230]]), 'C')], [(array([[134, 246],
            [180, 246],
            [180, 308],
            [134, 308]]), 'S'), (array([[196, 248],
            [207, 248],
            [207, 308],
            [196, 308]]), 'I'), (array([[222, 247],
            [274, 247],
            [274, 310],
            [222, 310]]), 'G'), (array([[292, 250],
            [343, 250],
            [343, 309],
            [292, 309]]), 'N'), (array([[355, 251],
            [405, 251],
            [405, 310],
            [355, 310]]), 'A'), (array([[418, 251],
            [451, 251],
            [451, 311],
            [418, 311]]), 'L'), (array([[458, 251],
            [503, 251],
            [503, 312],
            [458, 312]]), 'S')], [(array([[172, 332],
            [223, 332],
            [223, 391],
            [172, 391]]), 'A'), (array([[236, 332],
            [283, 332],
            [283, 391],
            [236, 391]]), 'H'), (array([[302, 333],
            [341, 333],
            [341, 392],
            [302, 392]]), 'E'), (array([[350, 334],
            [401, 334],
            [401, 393],
            [350, 393]]), 'A'), (array([[414, 334],
            [462, 334],
            [462, 393],
            [414, 393]]), 'D')]],
  1),
 ('./icdar2013/Challenge2_Training_Task12_Images/174.jpg',
  [[(array([[1350, 1880],
            [1638, 1880],
            [1638, 2129],
            [1350, 2129]]), 'w'), (array([[1684, 1881],
            [1968, 1881],
            [1968, 2128],
            [1684, 2128]]), 'w'), (array([[2016, 1882],
            [2295, 1882],
            [2295, 2128],
            [2016, 2128]]), 'w'), (array([[2337, 2059],
            [2401, 2059],
            [2401, 2128],
            [2337, 2128]]), '.'), (array([[2437, 1776],
            [2637, 1776],
            [2637, 2134],
            [2437, 2134]]), 'b'), (array([[2680, 1806],
            [2912, 1806],
            [2912, 2128],
            [2680, 2128]]), '4'), (array([[2915, 1886],
            [3111, 1886],
            [3111, 2128],
            [2915, 2128]]), 'v'), (array([[3158, 1880],
            [3340, 1880],
            [3340, 2134],
            [3158, 2134]]), 'a'), (array([[3366, 1777],
            [3462, 1777],
            [3462, 2126],
            [3366, 2126]]), 'l'), (array([[3501, 1880],
            [3711, 1880],
            [3711, 2130],
            [3501, 2130]]), 'u')], [(array([[   0,    0],
            [ 988,    0],
            [ 988, 1328],
            [   0, 1328]]), '')], [(array([[1264,    0],
            [2576,    0],
            [2576, 1376],
            [1264, 1376]]), '')], [(array([[3736, 1864],
            [3887, 1864],
            [3887, 2136],
            [3736, 2136]]), '')], [(array([[3073,    0],
            [3424,    0],
            [3424,  707],
            [3073,  707]]), '')]],
  1),
]


좋은 하루되세요.

감사합니다.

 

 

xindongmin님의 프로필 이미지
xindongmin
질문자

2024. 07. 01. 09:39

해결했습니다 감사합니다

0

인프런 AI 인턴님의 프로필 이미지

2024. 06. 27. 14:41

안녕하세요, 인프런 AI 인턴입니다.

xindongmin님의 질문에 대해 답변드리겠습니다. 커스텀 데이터셋을 생성할 때 labelme를 사용하여 json 파일로 저장된 것을 좌표와 “정답”이 포함된 txt 파일로 변환하는 방법에 대해 관심이 있으신 것 같습니다.

이와 관련하여, 질문자님이 참고할 만한 기존 게시글을 찾았습니다. 이 게시글에서는 CRAFT 모델에 적용된 Custom Dataset을 직접 만들어보는 방법에 대해 설명하고 있으며, labelme 같은 라벨링 도구를 활용해 데이터셋을 구성하는 과정에 대한 일반적인 정보가 포함되어 있습니다.

  • “Custom DataSet은 어떻게 만드나요?”에서는 Labelme 등의 프로그램을 이용해 직접 라벨링 작업을 수행하여 Custom Dataset을 만드는 것에 대한 설명이 있습니다. 또한, 라벨링 작업을 외주화하는 방법에 대해서도 언급되어 있습니다. 이 게시글은 직접 라벨링하고 데이터셋을 구성하는 방법에 대한 일반적인 정보를 제공할 수 있습니다.

json 파일에서 txt 파일로의 변환 방법은 직접적으로 언급되어 있지 않을 수 있으나, labelme로 생성된 json 파일을 처리하여 필요한 데이터 형식으로 변환하는 과정에 대해 일부 지침을 제공할 수 있습니다. 일반적으로 이런 작업은 python 스크립트를 작성하여 json 파일 내의 관련 데이터(예: bounding box 좌표, 분류 라벨 등)를 추출하고, 이를 원하는 txt 파일 형식으로 저장하는 방식으로 진행됩니다.

추가적으로, 이와 유사한 작업을 하는 스크립트나 툴을 찾거나, 예제 코드를 검색하여 참고할 수도 있습니다. Python의 json 라이브러리를 사용하여 json 파일을 읽고, 필요한 데이터를 추출한 후, open 함수를 활용해 txt 파일로 저장하는 방식을 고려해 볼 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.