ABOUT ME

Today
Yesterday
Total
  • Tensorflow Object Tracking Windows 10 API
    Tensorflow API 2020. 10. 27. 18:36

    내가 보기 위해 만듦

     

    개발 환경

    - Windows Pro 10.2004 64bit

    - Python 3.6

    - conda 4.8.3

    - Tensorflow-gpu 1.5.0

    - CUDA 9

    - cuDNN 7

    - Windows Ubuntu 18.04 LTS

     

    Anaconda Install Tutorial

     - lnjoy.tistory.com/12

     - gracefulprograming.tistory.com/124

     

    CUDA and cuDNN Install Tutorial

     - lnjoy.tistory.com/13

     - coding-groot.tistory.com/87

     

    Windows Ubuntu 18.04 LTS Install

     - blog.naver.com/6116949/221244246623

     

    저 위 링크에서 Ubuntu 대신 Ubuntu 18.04 LTS 검색 후 설치

     

    Tensorflow Models Download

     

    1. Ubuntu Terminal 실행

     

    2. C 드라이브에 파일 생성

    cd /mnt/c
    mkdir tensorflow
    cd tensorflow

     

     

    3. ubuntu에 git 설치

    sudo apt-get install git | sudo apt-get upgrade git
    
    # 후 Y 를 눌러 업그레이드

     

    4. models 가져오기

    git clone https://github.com/tensorflow/models
    cd models

     

    5. models 다운그레이드 ( 중요 )

    git checkout 772964e --

     

     

    6. Tensorflow Object Tracking Windows 10 API 설치

    github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

    Download ZIP 클릭

    TensorFlow-ObjectTensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10-master.zip

    압축 풀고

    이것들을 C:\tensorflow\models\research\object_detection\ 안에 복붙

    7. API 세팅

    ininference_graph -> placeholder.txt 삭제

    training -> * 삭제

    image -> * 삭제

     

    download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2018_01_28.tar.gz

    설치 후 압축 풀고 object_detection 안에 복붙

    8. 시작

    실행

    - 아나콘다 Python 3.6 설정

    conda create -n tensorflow python=3.6 pip
    conda activate tensorflow

    activate가 완료되면 현재 경로 옆에 (base)->(tensorflow)로 바뀐다
    requirements.txt
    0.00MB

    - 각종 모듈 설치

    cd C:\tensorflow\models\research\
    
    python -m pip install --upgrade pip
    conda install -c anaconda protobuf
    
    pip install tensorflow-gpu==1.5.0
    pip install pillow
    pip install lxml
    pip install Cython
    pip install contextlib2
    pip install jupyter
    pip install matplotlib
    pip install pandas
    pip install opencv-python
    
    # or pip install -r requirements.txt

    - 환경 변수 설정

    # Anaconda Terminal 에서
    
    set PYTHONPATH=C:\tensorflow\models;C:\tensorflow\models\research;C:\tensorflow\models\research\slim

    또는

     

    내 PC 우클릭 후 속성( Win + pause break ) 누르면 시스템이 나오는데 거기서 고급 시스템 설정

    고급 탭에 환경 변수 클릭 후

    새로 만들기 누르고

    아래와 같이 작성 후 확인

    C:\tensorflow\models;C:\tensorflow\models\research;C:\tensorflow\models\research\slim

     

    # 현재 경로가 C\:tensorflow\models\research 인지 확인하고
    
    protoc object_detection/protos/*.proto --python_out=.

    아무런 텍스트가 없으면 성공

    # C:\tensorflow\models\research
    
    python setup.py build
    python setup.py install

     

    8 . 테스트

    cd object_detection
    
    jupyter notebook object_detection_tutorial.ipynb

    주피터 접속 후 

    Cell 탭에서 Run All 후

    제일 아래 강아지 사진이 나오면 성공

     

    9. 데이터 셋 제작

     object_detection\images\ 안에 test와 train 폴더를 만들고 학습시킬 이미지들을 분할해서 넣는다. ( 무조건 jpeg 만!! )

    나는 test 30%, train 70%으로 나눠 넣었다.

    test folder
    train folder

    그 후 자신이 쓰는 파이썬 버전이나 현재 사용하고 있는 아나콘다에 LabelImg를 설치해 라벨링을 진행하면 된다.

     

    (현재 사용하고 있는 아나콘다에서 진행)

    pip install labelimg
    
    labelimg

    labelimg가 켜지면 Open Dir을 눌러 C:\tensorflow\models\research\object_detection\images\test와 train에 들어가서 라벨링을 한다.

    라벨링은 먼저 Create\nRectBox ( 단축키 : w )를 누른 뒤 영역을 드래그해주고 원하는 라벨명을 입력한 뒤에 Ctrl + s 로 세이브해주면 된다.

    현재 사진에 라벨링이 끝났으면 Next Image를 눌러 다음 사진도 반복해준다.

     

    라벨링이 끝났다면 labelimg를 종료 후

    cd C:\tensorflow\models\research\object_detection
    
    python xml_to_csv.py
    
    # Successfully converted xml to csv.
    # Successfully converted xml to csv.

    Successfully converted xml to csv. 라는 문구가 두 번 뜨면 성공이다. ( Images 폴더에 들어가면 csv파일이 있을 것이다. )

     

    object_detection 폴더에 있는 generate_tfrecord.py labelimg에서 설정해준 라벨들로 수정해준다.

    ( 나는 총 2개의 라벨로 bus와 num을 생성했었다. )

    36 ~ 50 번 줄에 있는

    def class_text_to_int(row_label):
        if row_label == 'nine':
            return 1
        elif row_label == 'ten':
            return 2
        elif row_label == 'jack':
            return 3
        elif row_label == 'queen':
            return 4
        elif row_label == 'king':
            return 5
        elif row_label == 'ace':
            return 6
        else:
            None

    이것들을 내 라벨들로

    def class_text_to_int(row_label):
        if row_label == 'bus':
            return 1
        elif row_label == 'num':
            return 2
        else:
            None

    바꿔준다.

     

    그 후 Record를 생성해준다.

    python generate_tfrecord.py --csv_input=images\train_labels.csv --image_dir=images\train --output_path=train.record
    python generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=images\test --output_path=test.record

    Successfully created the TFRecords: C:\tensorflow\models\research\object_detection\train.record

    Successfully created the TFRecords: C:\tensorflow\models\research\object_detection\test.record

    생성 완료 메시지

     

    그 후 object_detection\training 폴더 안에 labelmap.pbtxt를 생성해준다.

    그냥 txt파일 생성하고 이름이랑 확장자만 바꾸면 된다.

    그리고 편집에서

    아까 generate_tfrecord.py 설정할 때와 같이 라벨을 입력해줘야 된다.

    item {
      id: 1
      name: 'bus'
    }
    
    item {
      id: 2
      name: 'num'
    }

    이제 마무리 세팅으로 C:\tensorflow1\models\research\object_detection\samples\configs 에 가서

    faster_rcnn_inception_v2_pets.config 를 object_detection\training에 복붙 해준다.

    그 후 faster_rcnn_inception_v2_pets.config 를 텍스트 편집기로 

    9번 줄에 num_classes: 37을 자신이 생성한 라벨 개수에 맞게 설정해준다.

    106번 줄에 fine_true_checkpoint: 아래와 같게 바꿔준다.

    # 혹시 models의 경로가 다르다면 C:/tensorflow/ 를 바꿔줘야 한다.
    
    fine_tune_checkpoint: "C:/tensorflow/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt"

     

    122와 124번 줄에 input_path: 와 label_map_path: 아래와 같게 바꿔준다.

    # models의 경로가 다르다면 C:/tensorflow 를 바꿔줘야한다.
    
    input_path: "C:/tensorflow/models/research/object_detection/train.record"
    
    label_map_path: "C:/tensorflow/models/research/object_detection/training/labelmap.pbtxt"

    128번 줄에 num_examples: 를 object_detection\images\test 폴더 안에 있는 총 이미지 수로 적어준다.

     

    136번 줄과 138번 줄에 input_path: 와 label_map_path: 를 아래와 같게 바꿔준다.

    # C:/tensorflow
    
    input_path: "C:/tensorflow/models/research/object_detection/test.record"
    
    label_map_path: "C:/tensorflow/models/research/object_detection/training/labelmap.pbtxt"
    

     

    이제 학습만 시키면 된다.

     

    10. 학습

    object_detection 폴더에서

    python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config
    

     

     

    동시에 또 다른 아나콘다를 실행시켜 TensorBoard로 그래프를 볼 수 있다.

    object_detection 폴더 쪽에서

    tensorboard --logdir=training

    을 실행시켜준다.

     

    그러면 웹브라우저에서 YourPCName:6006를 쳐서 그래프를 볼 수 있다.

     

    11. 모델화

    python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_pets.config --trained_checkpoint_prefix training/model.ckpt-XXXX --output_directory inference_graph

    model.ckpt-XXXX 이 부분에 XXXX는 제일 마지막에 저장된 체크포인트 숫자를 적어준다.

    예를 들어 model.ckpt-98460

    2020-10-31 오전 8.53 수정

     

    10-1. 학습 오류

    만약 학습을 하던 도중

    tensorflow.python.framework.errors_impl.InvalidArgumentError: assertion failed: [Unable to decode bytes as JPEG, PNG, GIF, or BMP]

    이러한 에러가 발생할 경우 jpeg 사진이 아닌 다른 종류의 사진도 있다는 것이다. 만약 눈에 보이는 png나 bmp 등 다른 사진이 있다면 삭제 후 다시 xml_to_csv.py와 generate_tfrecord.py를 돌려주면 된다. 하지만 아무리 파일을 봐도 jpg밖에 없다면 jpg 파일 중에 표기만 jpg이지 실제론 다른 사진인 것들이 있다. 그런 사진들이 있는 것 같다면 object_detection에 파이썬 파일을 하나 만들고

    import imghdr
    import cv2
    import os
    import glob
    
    for folder in ['train', 'test']:
        image_path = os.path.join('C:/tensorflow/models/research/object_detection', ('images/' + folder))
        print(image_path)
    
        for file in glob.glob(image_path + '/*.jpg'):
            image = cv2.imread(file)
            file_type = imghdr.what(file)
            if file_type != 'jpeg':
                print(file + " - invalid - " + str(file_type))
                #cv2.imwrite(file, image)
            
    # https://github.com/tensorflow/tensorflow/issues/13044
    # 코드 출처

    이 코드를 돌려보면 어떤 파일이 잘못됐는지 나온다. 그 후 그 파일을 지우든 cv2.imwrite(file, image)의 주석을 풀어서 다시 덮어 씌우고 다시 xml_to_csv.py와 generate_tfrecord.py를 해준 후 학습을 시키면 된다. ( test 폴더에 있는 파일을 삭제하게 된다면 faster_rcnn_inception_v2_pets.config에 128번 줄도 수정해줘야 한다. )

     

    관련 사이트

    github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

    github.com/tzutalin/labelImg

    github.com/tensorflow/models

    github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf1_detection_zoo.md

    ukayzm.github.io/pet-training/#%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0

    developer.nvidia.com/rdp/cudnn-archive

    developer.nvidia.com/cuda-90-download-archive

    www.youtube.com/watch?v=Rgpfk6eYxJA

    'Tensorflow API' 카테고리의 다른 글

    CUDA 9 and cuDNN 7 Install  (0) 2020.10.27
    Anaconda Install  (0) 2020.10.27
Designed by Tistory.