Object Detection이 실행되는 예제를 기본적으로 먼저 실행시켜보자.
https://ukayzm.github.io/python-object-detection-tensorflow/ 를 참조해서
실행해보면 좋을 것 같다. 명령어들만 들고와서 짧게 적었으니,
자세한 사항은 위를 방문해서 알아보자!
STEP 1 : Install Necessary Libraries and Packages
***만약 전체 컴퓨터를 사용하는 것이 아니라 local로 하거나 VirtualEnv상에서 진행중이라면 필시 위의 사이트를 참고해야한다.
*본인은 컴퓨터 전체 환경을 텐서플로우에 맞게 맞추는 것을 위주로 한다.
$ sudo apt-get install protobuf-compiler python-pil python-lxml python-tk
$ sudo pip3 install jupyter
$ sudo pip3 install matplotlib
$ sudo pip3 install Pillow
STEP 2 : 텐서플로우 모델 복사
$ mkdir -p ~/work/tensorflow
$ cd ~/work/tensorflow
$ git clone https://github.com/tensorflow/models
STEP 3 : Protobuf 컴파일
$ cd ~/work/tensorflow/models/research
$ wget https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-linux-x86_64.zip
$ unzip protoc-3.3.0-linux-x86_64.zip -d protoc-3.3.0
$
protoc-3.3.0/bin/protoc object_detection/protos/*.proto --python_out=.
STEP 4 : Add Libaries to PYTHONPATH
$ sudo vim ~/.bashrc
파일의 제일 마지막 줄에 다음을 입력한다.
export PYTHONPATH=$PYTHONPATH:~/work/tensorflow/models/research/:~/work/tensorflow/models/research/slim:~/work/tensorflow/models/research/object_detection/
STEP 5 : 설치 테스팅
$ cd ~/work/tensorflow/models/research/object_detection/
$ python3 builders/model_builder_test.py
STEP 6 : 예제 실행
$ cd ~/work/tensorflow/models/research/object_detection/
$ jupyter notebook
***참고로 여기서 오류가 일어나는 경우가 종종 있다.
갑자기 process has died라는 문구를 보게 된다면
당황하지 말고 Tensorflow Install편을 참조하여서 CUDA혹은 CUDNN을 새로 설치해보자.
자, 다음은 이미 만들어진 모델에 내 학습데이터를 추가해서 사용해보자.
(*단, 위 예제를 실행시켰다면, 1은 생략하자.)
1.텐서플로우를 일단 다운받자.
$ mkdir work
$ cd work
$ git clone https://github.com/tensorflow/models.git
2. 우리가 만들어야 될 파일들을 이해해보자
(출처 : https://becominghuman.ai/tensorflow-object-detection-api-tutorial-
training-and-evaluating-custom-object-detector-ed2594afcf73 )
1) images를 입력받는다
2) images들로 부터 각 image의 csv를 뽑는데,
이 부분은 Train을 진행할 때에는 csv가 필요하기 때문에 필요한 부분이다.
3) csv데이터를 TFRecords로 바꿔주는데,
이는 이름에서부터 알 수 있듯이 Tensorflow에서 쓰는 데이터 형식으로 바꿔주겠다는 뜻이다.
4) 그리고 Training Model을 정한다.
나는 여기서 ssd_mobilenet_v1_coco를 사용하는 것으로 진행한다.
다양한 모델이 있고 각 목적에 따라 모델을 다르게 구성해야 한다.
+ 모델은 알고리즘과는 다르지만 이해하기 힘들다면
딥러닝에서 알고리즘부분을 포함하는 학습하는 부분이라고 이해하고 일단 넘어가자.
5) 훈련시킨 모델을 평가한다.(생략가능)
더 진행하기 전에, 다음 폴더들을 만들어야 한다. 어디에? train.py가 있는 곳에!
$ cd ~/work/tensorflow/models/research/object_detection/legacy
$ mkdir data images training eval
- data/ — records and csv files.
- images/ — dataset.
- training/ —save trained model.
- eval/ — save results of evaluation on trained model
step 0 : 만들려고하는 데이터셋의 모음을 만들자.
EX. 나는 엘리베이터 버튼 중에 '3'을 찾으려고 한다.
- 엘리베이터 사진 모음을 모은다, 간편하게 인터넷을 이용해서 데이터셋을 구하자.
- 이미지들의 이름을 통일시켜주자. img1.jpg, img2.jpg...
step 1 : 이미지로부터 .csv파일을 뽑아내자
labelImg를 이용한다. : https://github.com/tzutalin/labelImg
cd ~
mkdir tools
cd tools
git clone https://github.com/tzutalin/labelImg
본인의 환경에 맞게 깃에 설명된 순서를 따라간다.
본인은 [Ubuntu Linux + Python 3 + Qt5]설정을 따른다.
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3
python3 labelImg.py
이제 이같은 화면이 뜨는 걸 볼 수 있다.
createRect Box를 클릭하면 이와 같이 십자 표시가 나온다.

라벨에 맞는 이름을 붙여주자
save 버튼을 누르면 xml을 생성해준다.
자, 이제 xml파일을 만들었으니 이를 기반으로 csv파일을 만들어보자.
cd ~/tools
git clone https://github.com/datitran/raccoon_dataset
cd raccoon_dataset
우리는 깃 저장소에서 xml_to_csv.py 파일을 사용할 것이다. 여기에서 잠깐! 바로 쓰지말고 약간의 수정이 필요하다.
(귀찮다면 여기여기!xml_to_csv.py)
----------------------------------------------------------------------------------------
def main():
for directory in ['train','test']:
image_path = os.path.join(os.getcwd(), 'images/{}'.format(directory))
xml_df = xml_to_csv(image_path)
xml_df.to_csv('data/{}_labels.csv'.format(directory), index=None)
print('Successfully converted xml to csv.')
main()
-------------------------------------------------------------------------------------------
python3 xml_to_csv.py
: 반드시, data, images 폴더들이 존재해야한다.
step 3: 자, 이제 csv파일을 만들었으니 이를 기반으로 tfRecords를 만들어보자.
우리는 깃 저장소에서 generate_tfrecord.py 파일을 사용할 것이다. 여기에서 잠깐! 바로 쓰지말고 약간의 수정이 필요하다.
30lines - 자신의 데이터셋에 맞게 붙인 라벨의 갯수만큼 추가한다.
(귀찮다면 generate_tfrecord.py) 단, 자신의 라벨링에 맞게 반드시 바꿔줘야 한다.
-------------------------------------------------------------------------------------------
def class_text_to_int(row_label):
if row_label == '1_f':
return 1
elif row_label == '2_f':
return 2
elif row_label == '3_f':
return 3
else:
return 0 #instead of None
--------------------------------------------------------------------
# Create train data:
python3 generate_tfrecord.py --csv_input=data/train_labels.csv --output_path=data/train.record
# Create test data:
python3 generate_tfrecord.py --csv_input=data/test_labels.csv --output_path=data/test.record
step 4: Training
예측 속도와 정확성은 반비례한다. 속도가 빠르면 정확성은 떨어지고, 속도가 느리면 정확성은 올라간다.
1) 텐서플로우에서 제공되는 모델 중에 하나를 선택해보자.
(https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md )
본인은 ssd_mobilenet_v1_coco를 pre-trained 모델로 선정했다.
2) 모델을 선택했으면 그와 맞는 Config file을 다운로드한다.
https://github.com/tensorflow/models/tree/master/research/object_detection/samples/configs
본인은 ssd_mobilenet_v1_coco.config를 선정했다.
3)object-detection.pbtxt파일을 만든다.(여러개의 클래스를 가지고 있다면 여러개 적는다.)
예를 들면, 다음과 같이 적을 수 있다.
item {
id: 1
name: '1_f'
}
item {
id: 2
name: '2_f'
}
item {
id: 3
name: '3_f'
}
4) 자, 이제 config파일을 좀 수정해보자.
4-1) 9lines,
#before
num_classes: 90
#After-위의 예시에서는 버튼 1,2,3을 찾고 있으니 3개의 클래스를 만든다.
num_classes: 3
4-2) GPU가 별로 좋지 않다면, batch_size를 줄이자.
(+학습속도도 빨라진다. 대신 정확도는 이전보다 떨어진다.)
batch_size:24
4-3) 위에서 사용하기로 한 모델에 대한 위치를 작성한다. #before fine_tune_checkpoint: "PATH_TO_BE_CONFIGURED/model.ckpt" #after - 문제가 있다면, 전체경로를 적어주자. fine_tune_checkpoint: "ssd_mobilenet_v1_coco/model.ckpt"
4-4) train.record 파일의 위치를 주자. #before
train_input_reader: { tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/mscoco_train.record" } label_map_path: "PATH_TO_BE_CONFIGURED/mscoco_label_map.pbtxt" }
#after- train.py를 기준으로 존재하는 디렉터리/파일 경로 명시
train_input_reader: { tf_record_input_reader { input_path: "data/train.record" } label_map_path: "data/object-detection.pbtxt" }
4-5) test.record 파일의 위치를 주자.
#before
eval_input_reader: { tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/mscoco_val.record" } label_map_path: "PATH_TO_BE_CONFIGURED/mscoco_label_map.pbtxt" shuffle: false num_readers: 1}
#after
eval_input_reader: { tf_record_input_reader { input_path: "data/test.record" } label_map_path: "data/object-detection.pbtxt" shuffle: false num_readers: 1}
4-6) 자, 이제 명령어를 이용해서 훈련시키자.
python3 train.py --logtostderr --train_dir=/training \
--pipeline_config_path=training/ssd_mobilenet_v1_coco.config
4-7) 완료되고나면 ckpt파일(ckpt.data~, ckpt.index~, ckpt.meta~)가 training 폴더에 생긴다.
그 세가지가 그냥 ckpt파일이다.
* 이 부분에서 많이 헷갈렸는데 ckpt파일로 따로 만들필요 없다.
(하지만 만약, 손실했다면? )
5. .ckpt파일을 이용해서 .pb파일을 만들어보자
+ 참고로 그냥 학습을 시키면 frozen_inference_graph.pb,
graph.pbtxt파일이 자동 생성되는게 정상이다!
ckpt파일과 pb파일을 제대로 이해하지 못해서 꽤 많은 시간을 헤맸다.
ckpt(checkpoint)파일은 훈련횟수가 증가될 때마다
생성되는것으로 그 생성 텀은 사용자가 config파일에서 명시한다.
pb파일은 왜 만드는 걸까? 가벼운 상태에서 돌리고 싶다면 사용하는 것이 좋다.
구글에서 만든 ProtocolBuffers라는 것은 "구글"의 설명에 의하면
serializing structured data – think XML, but smaller, faster, and simpler.
뭐, xml같은 건데 xml은 읽어들여서 처리할 때 좀 더 복잡한 과정을 거쳐야하기 때문에
pb라는 프로토콜을 새로 만들어 좀 더 직관적이고 빠르게 처리해보자가 취지다.
사실, 나는 실행해보기 위한 공부를 하는 중이여서 자세한 건 개인공부를 진행하자!
1) 텐서플로우의 /MY_PATH/object_detection/에 가면
export_inference_graph.py라는 파일이 있다.
Q. export_inference_graph.py VS freeze_graph.py 차이점?
2) 다음의 명령어로 실행시킨다.
python3 export_inference_graph.py --input_type image_tensor --pipeline_config_path training/ssd_mobilenet_v1_pets.config --trained_checkpoint_prefix training/model.ckpt-10856 --output_directory mac_n_cheese_inference_graph
6. 이제, 트레이닝을 확인해보자.
cd /MY_PATH/object-detection/
jupyter notebook
object_detection_tutorial.ipynb 혹은
object_detection_tutorial_Webcam_1.ipynb를 실행시켜서 결과를 확인하자.
+ 소스실행중 일어나는 ERROR
1) InternalError: CUDA runtime implicit initialization on GPU:0 failed. Status: out of memory
: 전에 실행시켰던 processor들을 다 죽이고 재실행시켜보자. 예를들어, 쥬피터 노트북을 사용하고 있다면, 아예 종료 후에 다시 시작하거나 재부팅 후 다시 돌려보자.
2) TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
참조 : https://becominghuman.ai/tensorflow-object-detection-api-tutorial-training-and-evaluating-custom-object-detector-ed2594afcf73
4-6단계에서 ModuleNotFoundError: No module named 'nets' 에러 발생하는데 혹시 해결방법 있을까요
답글삭제안녕 하세요! train.py 실행할때
답글삭제UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 97: invalid start byte
이 에러가 뜨는데 해결방법 있을까요?
train.record랑 test.record 둘다 메모장으로 열면 깨져 보입니다!
삭제안녕하세요, 소스 실행 중 일어나는 에러중 2) TypeError의 경우 어떤 방식으로 해결하셨는지 질문드립니다.
삭제