Windows에서 Tensorflow gpu를 설치하고, Tensorflow api (slim, object detection) 을 이용해, 나만의 이미지를 학습, 인식하기
-
date_range 31/07/2020 11:30 infosortMLlabelMLTensorflowSlimObjectDetectionCUDA
들어가기전에
삽질의 확률이 매우 높고, 알아도 나중에 까먹을 가능성이 높다.
- 순, 서, 대, 로 꼼꼼하게 차근차근 진행해나가야 함!
- Tensorflow 명령 이나 설정파일 내의 경로설정 시, 백슬래시 사용를 사용하게 되면 오류가 발생함. 슬래시를 통해 표현하도록 해야함
사전 환경 세팅
PC 사양 확인
그래픽 카드 확인 : 장치 관리자 > 디스플레이 어댑터
CUDA & cuDNN 설치
- GPU Compute capability 확인
- nvidia 페이지 접속
- 모델명에 맞는 capability 확인
- CUDA SDK 버전 확인
- CUDA 위키 접속
- GPUs supported에서 내 capability가 사용가능한 SDK버전 확인
- CUDA Toolkit download 및 설치
- CUDA archive 접속
- 2의 사양에 맞는 Toolkit 다운
- CUDA 설치
- 에러나는 경우, 사용자 정의 > Visual Studio Integration 제외하고 설치
- 설치파일 압축 해제
- Visual Studio Integration 수동 설치 (경로 : CUDAVisualStudioIntegraion)
- cuDNN 설치
- nvidia 멤버쉽 가입
- 다운로드 페이지 접속
- CUDA 버전에 맞는 cuDNN 다운로드
- 압축 해제
- 해제된 파일 내에 bin, include, lib파일을 복사하여, CUDA 설치 경로에 붙여넣기 (덮어쓰기)
- 설치 확인
$nvcc --version
Tensorflow gpu 설치
- Tensorflow gpu 버전 확인
- Tensorflow build config 페이지 접속 (Linux는 여기)
- GPU 탭에서 CUDA, cuDNN 버전에 맞는 tensorflow-gpu, python 버전 확인
- tensorflow-gpu 설치
$conda create -n tf-gpu-sample python={1에서 확인한 버전내의 버전}
$conda activate tf-gpu-sample
$conda install tensorflow-gpu={1에서 확인한 버전}
- 설치 확인
$python
- 샘플 코드 실행
import tensorflow as tf sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
- Property 정보 출력 확인
... name: GeForce GTX 1060 major: 6 minor: 1 memoryClockRate(GHz): 1.6705 ...
Tensorflow model 설치
Git Hub 페이지를 참조하여 작성
- Tensorflow model 다운로드
- model 페이지에 접속
- 설치한 tensorflow-gpu 버전과 매칭되는 revision을 선택 (ex. r1.13.0)
- zip파일 다운로드
- 압축 해제
- 환경 변수 설정
- PYTHONPATH 환경 변수에 \models, \models\research, \models\research\slim 폴더를 설정
set PYTHONPATH=C:\sample\models;C:\sample\models\research;C:\sample\models\research\slim
- 필수 라이브러리 설치
$pip install pillow lxml Cython jupyter matplotlib pandas opencv-python
- protobuf 설치
- protobuf github 접속
- protoc-win64.zip 다운로드
- 압축헤제
- Compile
$cd \models\research
- protobuf 컴피일
${4의 protobuf 해제경로}\protoc object_detection/protos/*.proto --python_out=.
- 컴파일 확인 : object_detection\protos로 이동하여 {파일명}_pb2.py 파일이 생성됬는 지 확인
- Install
$cd \models\research
$python setup.py build
$python setup.py install
- 정상 설치 확인
- jupyter에 현재 사용중인 가상환경 kernel 추가
$python -m ipykernel install --user --name tf-gpu-sample --display-name "tf-gpu-sample"
- tutorial.ipynb 실행
$cd models\research\object_detection $jupyter-notebook object_detection_tutorial.ipynb
- Run All
- object detection 박스가 그려진 이미지가 출력되면 정상 동작
- jupyter에 현재 사용중인 가상환경 kernel 추가
Object Detection 학습
샘플 Github & model 다운로드
- Github 파일 다운로드
- 샘플 git hub에서 소스를 zip으로 다운로드
- 압축 해제
- 해체한 폴더내의 파일들을 복사하여 object_detection 폴더 내에 붙여넣기
- Model 다운로드
- Faster-RCNN-Inception-V2 model 다운로드
- object_detection 폴더 내에 압축 해제
샘플 이미지 생성
- [labelImg 다운로드] https://github.com/tzutalin/labelImg
- 이미지를 수집한다
- 수집된 이미지와 xml을 8:2로 나누어 images/train, images/test에 각각 저장
- 수집한 이미지는 xml파일로 저장되는 데, 이것을 csv형태로 변환한다
$python xml_to_csv.py
- images 폴더 내에 train_labels.csv, test_labels.csv 생성 확인
Training 데이터 생성
- generate_tfrecord.py 열기
- 31행의 if-else 조건을 수집한 라벨에 맞게 변경
# Example def class_text_to_int(row_label): if row_label == 'basketball': return 1 elif row_label == 'shirt': return 2 elif row_label == 'shoe': return 3 else: None
- TFRecord 데이터로 변환
$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
- train.record, test.record 파일 생성 확인
학습 Config 설정
- labelmap 수정
- object_detection\training 폴더 내 labelmap.pbtxt 파일 열기
- 해당 파일의 id, name의 값을 수집한 데이터의 라벨에 맞춰 변경
- JSON 형식이 아님! 습관적으로 json처럼 작성하지 않도록 주의
- Traininig config 수정
- object_detection\samples\config 폴더로 이동
- faster_rcnn_inception_v2_pets.config 파일을 \object_detection\training폴더로 복사
- faster_rcnn_inception_v2_pets.config을 열어 config 설정을 변경 (중요! Backslash 사용을 해선 안됨)
- line 9, num_classes : 앞서 정의한 label 개수로 변경하기
- line 123, 125 in train_input_reader : train record 경로와 label map 경로로 변경하기
- line 106, fine_tune_checkpoint 변경하기 : ex) “C:/sample/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt
- line 130 num_examples : \images\test 폴더 내에 있는 이미지 개수로 변경하기
- line 135 and 137 in eval_input_reader : train/test record 경로와 label map 경로로 변경하기
학습
$python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config
Inference graph 저장
$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-{최종숫자} --output_directory inference_graph
Slim 학습
아주 설명이 차근차근 잘 되어있는 출처 페이지가 있다. 이 포스트를 따라가면서 설정했다.
model 다운로드
- inception_v1 다운로드
- models/research/slim 폴더에 압축 해제
이미지 다운로드
Kaggle에 업로드되어 있는 icon 데이터를 학습 시켜보도록 하자
- Kaggle icons 데이터 다운로드
- 압축 해제 (ex. C:\sample\icons\icons_photos)
- 불필요 파일 제거
- _negative 폴더 제거
- svg, html 등의 불필요 파일 제거
TFRecord 변환
- icon 데이터용 dataset 코드 생성
- slim\dataset으로 이동
- download_and_convert_flowers.py를 복사해 붙여넣고, 해당 파일의 이름을 download_and_convert_icons.py로 변경
- flowers.py를 복사-붙여넣기하고, 이름을 icons.py로 변경
- download_and_convert_icons.py 수정
- line 46, _NUM_VALIDATION : icons의 이미지 중 validation할 이미지 갯수 (icons 이미지의 총 개수는 142014임. 약 20%를 validation하면 47639)
- line 53, _NUM_SHARD : 데이터 분할 갯수 (용량 1.1GB일 때, 이 값이 20이면 1파일당 1.1/20 = 40MB)
- line 87, ‘flowser_photos’를 ‘icons_photos’로 변경
- line 106, ‘flowers’ 수정
- line 190, 다운로드 코드 주석처리
- icons.py 수정
- line 32, _FILE_PATTERN : ‘flowers’ 수정
- line 34, SPLITS_TO_SIZES : train, validation 값을 데이터 갯수에 맞춰 수정 (train: 94375, validation: 47639)
- line 36, _NUM_CLASSES : class 갯수에 맞춰 수정 (105)
- download_and_convert_data.py 수정
- slim\download_and_convert_data.py 열기
- download_and_convert_icons 임포트
from datasets import download_and_convert_icons
- line 69, if-else condition 추가
... elif FLAGS.dataset_name == 'icons': download_and_convert_icons(FLAGS.dataset_dir) ...
- dataset_factory.py 수정
- icons 임포트
from datasets import icons
- datasets_map 값 추가
... 'icons': icons ...
- icons 임포트
- 변환 수행 :
$python download_and_convert_data.py --dataset_name=icons --dataset_dir=C:\sample\icons
- dataset_dir에 tfrecord 파일들이 생성됬는 지 확인
학습
- 1차 수행 : 10000번 수행, learning_rate는 0.01
$python train_image_classifier.py --train_dir=training --dataset_name=icons --dataset_split_name=train --dataset_dir=../../../dataset/icons --model_name=inception_v1 --checkpoint_path=inception_v1_2016_08_28/inception_v1.ckpt --checkpoint_exclude_scopes=InceptionV1/Logits --trainable_scopes=InceptionV1/Logits --max_number_of_steps=10000 --batch_size=16 --learning_rate=0.01 --learning_rate_decay_type=fixed --save_interval_secs=60 --save_summaries_secs=60 --log_every_n_steps=100 --optimizer=rmsprop --weight_decay=0.00004
- 2차 수행 : 5000번 수행, learning_rate는 0.0001, checkpoint_path는 1차의 train_dir, train_dir은 training/all
$python train_image_classifier.py --train_dir=training/all --dataset_name=icons --dataset_split_name=train --dataset_dir=../../../dataset/icons --model_name=inception_v1 --checkpoint_path=training --max_number_of_steps=5000 --batch_size=16 --learning_rate=0.0001 --learning_rate_decay_type=fixed --save_interval_secs=60 --save_summaries_secs=60 --log_every_n_steps=100 --optimizer=rmsprop --weight_decay=0.00004
- 학습 결과 확인
$python eval_image_classifier.py --alsologtostderr --checkpoint_path=training/all --dataset_dir=../../../dataset/icons --dataset_name=icons --dataset_split_name=validation --model_name=inception_v1
학습 모델 사용하기
image_classification_icons.py 파일을 생성하고, 아래 코드를 작성. 상세 설정은 코드 내 주석 참조
from matplotlib import pyplot as plte
import numpy as np
import os
import tensorflow as tf
from nets import inception
from preprocessing import inception_preprocessing
checkpoints_dir = 'training/all'
slim = tf.contrib.slim
image_size = inception.inception_v1.default_image_size
with tf.Graph().as_default():
image_input = tf.read_file('../../../dataset/test_data/split21.PNG') # 테스트할 이미지 경로
image = tf.image.decode_jpeg(image_input, channels=3)
processed_image = inception_preprocessing.preprocess_image(image, image_size, image_size, is_training=False)
processed_images = tf.expand_dims(processed_image, 0)
with slim.arg_scope(inception.inception_v1_arg_scope()):
logits, _ = inception.inception_v1(processed_images, num_classes=105, is_training=False) # num_classes는 테스트 데이터의 class수
probabilities = tf.nn.softmax(logits)
init_fn = slim.assign_from_checkpoint_fn(os.path.join(checkpoints_dir, 'model.ckpt-50000'),
slim.get_model_variables('InceptionV1')) # model checkpoint 값 설정
with tf.Session() as sess:
init_fn(sess)
np_image, probabilities = sess.run([image, probabilities])
probabilities = probabilities[0, 0:]
sorted_inds = [i[0] for i in sorted(enumerate(-probabilities), key=lambda x: x[1])]
plte.figure()
plte.imshow(np_image.astype(np.uint8))
plte.axis('off')
plte.show()
names = os.listdir('..\\..\\..\\dataset\\icons\\icons_photos')
for i in range(105):
index = sorted_inds[i]
print('Probability %0.2f%% => [%s]' % (probabilities[index], names[index]))
코드 수행 시, 이미지 창이 출력되고, 터미널에 측정 결과가 표시되면 정상 동작한 것임
출처
- https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10
- https://euhyeji.blogspot.com/2018/08/tf19-slim-1-install-tensorflow-gpu.html