Category: Python

  • 엑셀(XLSX)을 CSV로 변환하기

    이건 정말 수 많은 방법이 있을 것이다. CLI로 작업하기 위해서 내가 알고 있는 소소한 것들을 조합하였다.

    우선 데이터 첫 전처리 과정으로 한 번만 변환하면 된다. 파일 이름이 다양할 것이니까 이를 고려한다.

    다음과 같은 Python 파일을 만든다. ‘python convert.py 파일이름’ 이런 식으로 명령어를 넣으면 CSV 파일로 변환하는 간단한 코드이다. Pandas를 이용하면 편하게 된다고 한다.

    import pandas
    import sys
    
    input_name=sys.argv[1]
    output_name=input_name.split('.xlsx')[0]+'.csv'
    xlsx = pandas.read_excel(input_name)
    xlsx.to_csv(output_name)
    

    다음은 모든 XLSX 파일에 대하여 이 코드를 실행하여 주면 된다. 쉘스크립트를 이용하였다.

    xlsx_lists=`ls -R *.xlsx`
    
    for xlsx_file in $xlsx_lists; do
            echo $xlsx_file
            python convert.py $xlsx_file
    done
    

  • 오래된(?) PC에 PyTorch, Torchvision 설치하기

    항상 최신의 PC를 이용할 수는 없는 법. 오래된 PC에 PyTorch를 PIP를 이용해서 설치하고 나서, 실행을 하면 오류가 발생한다. 

    [W NNPACK.cpp:80] Could not initialize NNPACK! Reason: Unsupported
    hardware.

    AVX2 명령어를 지원하지 않는 CPU에서 해당 오류가 발생한다고 한다. 구글 검색을 해보면 PyTorch를 소스로 설치하면서 USE_NNPACK=0으로 설치하면 된다고 한다.

    USE_NNPACK=0 python3 setup.py install

    그런데 문제는 지금부터다. Tesla K40c 은 매우 오래된 아키텍쳐 기반이다. 그래서 추가 옵션이 필요하다. Tesla K40c는 3.5라고 한다.

    TORCH_CUDA_ARCH_LIST="3.5" USE_NNPACK=0 python setup.py install

    그 다음에 딥러닝 학습에 필요한 여러 패키지를 설치한다. 대부분 torchvision을 이용할 텐데, torchvision도 소스로 설치해야 한다. 혹시나 싶어서 pytorch와 같은 방법으로 설치했다.

    git clone --recursive https://github.com/pytorch/vision
    cd vision
    TORCH_CUDA_ARCH_LIST="3.5" USE_NNPACK=0 python setup.py install

    재현이 될지는 모르겠다.

    NNPACK은 경고 메세지는 뜨지만, 일단 지나간다.

    YOLOv5가 실행되기 시작했다.

  • YOLO annotation

    YOLO에서 annotation은 다음과 같이 한다. 가장 먼저 명심해두어야 하는 것은 좌상단을 (0,0), 우하단이 (1,1)인 사각형 형태이며, 비율로 해야한다는 것이다.

    • 좌상단을 (0,0), 우하단이 (1,1)인 사각형 형태이다.
    • 입력되는 값은 비율에 해당하는 값이다.
    • txt 포맷(TSV)로 입력할 수 있다.
    • 첫 번째는 클래스
    • 두 번째는 형태 중심의 X
    • 세 번째는 형태 중심의 Y
    • 네 번째는 가로 폭
    • 다섯 번째는 세로 폭

    OpenCV에서 boundingRect 를 이용할 경우 출력 값은 Contour의 좌상단 X좌표, Y좌표, 폭, 높이이다. 보통 x y, w, h로 결과를 받는다.

    x, y, w, h = cv2.boundingRect(contour)

    간단한 식으로 결과를 변환하여 입력해주면 된다.

  • OpenCV 에서 zero-padding

    YOLOv5에서 100×100 pixel 이미지로 학습시키면 128로 변환된다. 오류 메세지를 보면 32배수를 이어야 한다고 한다. OpenCV에서 zero-padding은 다음과 같이 해결한다. 순서는, 위-아래-왼쪽-오른쪽이다.

    cv2.copyMakeBorder(img, 14, 14, 14, 14, cv2.BORDER_CONSTANT, value=[0,0,0])