2018년 12월 18일 화요일

ROS Errors, Simple Basic C++

image_converter.cpp:1:21: fatal error: ros/ros.h: No such file or directory
compilation terminated.

: rosrun으로 실행 안하고 c++로 실행해서 일어나는 오류!
$ g++ image_converter.cpp 와 같이 실행시 오류발생

[rosrun] Couldn't find executable named image_converter below /home/haei3/catkin_ws/src/image_test

----------------------------------------------------------------------------------------------------------

cvTest.cpp:(.text+0x74): undefined reference to `cv::namedWindow(cv::String const&, int)'
cvTest.cpp:(.text+0x92): undefined reference to `cv::VideoCapture::VideoCapture()'
cvTest.cpp:(.text+0xa6): undefined reference to `cv::VideoCapture::open(int)'
cvTest.cpp:(.text+0xb5): undefined reference to `cv::VideoCapture::isOpened() const'
cvTest.cpp:(.text+0xc2): undefined reference to `cv::VideoCapture::operator>>(cv::Mat&)'
cvTest.cpp:(.text+0x118): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
cvTest.cpp:(.text+0x140): undefined reference to `cv::waitKey(int)'
cvTest.cpp:(.text+0x173): undefined reference to `cv::destroyWindow(cv::String const&)'
cvTest.cpp:(.text+0x196): undefined reference to `cv::VideoCapture::~VideoCapture()'
cvTest.cpp:(.text+0x21b): undefined reference to `cv::VideoCapture::~VideoCapture()'
/tmp/ccJJWQT2.o: In function `cv::String::String(char const*)':
cvTest.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x54): undefined reference to `cv::String::allocate(unsigned long)'
/tmp/ccJJWQT2.o: In function `cv::String::~String()':
cvTest.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): undefined reference to `cv::String::deallocate()'
/tmp/ccJJWQT2.o: In function `cv::String::operator=(cv::String const&)':
cvTest.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28): undefined reference to `cv::String::deallocate()'
/tmp/ccJJWQT2.o: In function `cv::Mat::~Mat()':
cvTest.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39): undefined reference to `cv::fastFree(void*)'
/tmp/ccJJWQT2.o: In function `cv::Mat::release()':
cvTest.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x4b): undefined reference to `cv::Mat::deallocate()'
collect2: error: ld returned 1 exit status

와 같은 오류가 일어나는 이유는, ROS문제가 아니라 OPENCV문제다.

따라서 먼저, 간단한 C++예제가 돌아가는지 확인하자.
<source>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;

int main() {
VideoCapture cap(0);

if (!cap.isOpened())
{
cout << "cannot open camera";
}

//unconditional loop
while (true) {
Mat cameraFrame;
cap.read(cameraFrame);
imshow("cam", cameraFrame);
if (waitKey(30) >= 0) break;
}
return 0;
}
</source>

$  g++ a.cpp -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_videoio -o openCVtest
: g++라는 프로그램으로/ a.cpp를 실행한다/opencv_core/opencv_highgui/opencv_imgproc/opencv_imgcodecs/opencv_videoio라이브러리를 추가해서/실행파일은 openCVtest라고 이름짓는다.

그래서 Makefile을 쓰는 경우는, LIBRARIES += opencv_core opencv_highgui opencv_imgproc opencv_videoio라고 수정해주란다
(출처 : https://github.com/facebook/C3D/issues/253)

2018년 12월 4일 화요일

텐서플로우 SSD모델을 이용하여 내 학습데이터 학습시키기[Customizing with my Dataset AND Training with SSD Model]

우선, 아래에서 내 학습데이터를 가지고 모델을 학습시키기 전에!

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
      

[YOLO V3] 개인 데이터기반 학습(가중치 파일 만들기)[COMMAND INCLUDED]

<내 데이터로 학습시키기 = 내 데이터로 학습시켜서 가중치 파일 만들어보자>

<jpg형식의 img파일을 txt파일로 자동변환!>

$ git clone https://github.com/AlexeyAB/Yolo_mark
$ cd Yolo_mark

$ cmake .
$ make


1) 학습시킬 이미지들을 /home/[USER_NAME]/Yolo_mark/x64/Release/data/img폴더 안에 넣어줍니다.

2) /home/[USER_NAME]/Yolo_mark/x64/Release/data폴더 아래에 있는 obj.names, obj.data, train.txt 파일들을 내 학습데이터들에 맞게 수정해줍니다.
EX. 저같은 경우는 엘리베이터 버튼들을 인식하기 위해서 one~nine + up/down버튼을 object_id로 잡았습니다. 이런경우의 파일 구성은 다음과 같습니다.

classes는 내가 찾으려는 객체의 갯수를 의미합니다.
저는 지금 one-nine까지, up/down를 찾으려고 하는 경우입니다.
수정해야 할 부분은 저 부분입니다. 나머지 부분은 임의로 수정한거니 classes만 바꿔주세요.

 이부분은 정말 중요합니다. 나중에 img.txt 파일이 만들어지면
다음과 같이 만들어집니다.
이 의미는object_id=1 시작점인 (0.53, 0.48)을 의미합니다.
(뒤의 두 숫자는 잘 모르겠네요.)
어쨋든, 제가 말씀 드리고 싶은 부분은 
여기서 1이 의미하는 부분은 obj.names파일에서의 object_id의 위치입니다.
위에서부터 0-one, 1-two, 2-three, 3-four, 4-five ...입니다.
나중에 사진을 각자 작업하고 합쳐야 할 때, 이 순서를 지켜야 합니다.
새로운 obj.names 순서를 만든다면, 다른 이름으로 학습하게 됩니다.

 이미지파일의 위치를 저장하는 파일입니다. 
자동으로 생성되는 파일이니, 따로 작성하시지 않으셔도 됩니다.
(참고로, Yolo_mark에서 작업을 하고 darknet으로 작업장을 옮겨야 되는데, 이 부분에선
앞에 있는 "x64/Release/ "폴더 부분을 지워 아래와 같이 구성해야한다.
이 부분에 대해선 2가지 방법이 있습니다.
1) /home/[USER_NAME]/work/darknet/아래에
x64/Release를 구성한다(darknet아래에 x64폴더, Release폴더 생성)
/home/[USER_NAME]/work/darknet/x64/Release/data/img폴더 안에
img파일 들을 넣어줍니다.
-> 직접 실행하는 건 빨라도, 확실히 프로그래머가 할 일은 아닌거 같네요. 하하
2)  파일의 내부의 x64/Release부분을 일일이 삭제시켜줍니다.
-> 프로그램적으로 삭제할 수 있도록 차후 제거 프로그램을 작성해보도록 합시다.


...

$ ./linux_mark.sh


(tip. image_num은 Space 바를 누르면 마우스 없이 다음 그림으로 넘어갑니다.(화살표 키로 그림선택 이동가능) + 그리고 Object id는 숫자판으로 이동가능합니다.(단, 0-9번 까지의 object만 가능))


---------------------------------------------------------------------------------------------------------
자,이제 다 구성했으면! darknet폴더로 이동해봅시다.

우리가 준비해야 될 것은? 실행명령어를 보면 힌트를 얻을 수 있습니다.
./darknet detector train data/obj.data yolo-obj.cfg darknet19_448.conv.23

1. obj.data파일
(Yolo_mark과정으로 통해서 만듦OK
2.yolo-obj.cfg파일 -> yolov3.cfg
(참조 사이트의 예제는 yolo v1을 사용하고 있으니 그 모델을 참조하고 싶으면 참조사이트를 참조합시다.)
(어떤 yolo모델을 쓸거냐에 따라 다릅니다. 여기서 나는 yolov3모델을씁니다.
darknet/cfg파일을 들어가면 yolov3.cfg 파일을 발견할 수 있습니다.)

3.darknet19_448.conv.23파일
(이 파일은 다운로드 받읍시다! : http://pjreddie.com/media/files/darknet19_448.conv.23 )

자, 중요한 yolov3.cfg 파일을 열어봅시다.
여기서 수정해야 할 부분? 3가지
0)batch - 1)classes갯수 (=object_id갯수)- 2) filters갯수

0)batch
   6line에 있는 batch를 수정합니다.
batch_size란 한 번에 몇개를 가지고 가서 처리를 할거냐는 질문이기 때문에 
개인의 GPU사정에 따라 다릅니다. 
저 같은 경우는 16까지가 MAX로 그 이상을 실행하게 되면 오류가 발생합니다.
만약, 내 컴퓨터가 정----------말 사양이 안 좋다? 
그렇다면 Testing버전처럼 1로 처리하는게 답입니다. 
저걸 바꿨는데도 안된다? 답도 없습니다ㅠㅠ

1)classes갯수 + 2) filters갯수


다음으론, classes랑 filters를 수정해줍니다.
classes는 찾으려는 물체의 갯수(object_id)만큼 적어줍니다. 
(위의 예제는 기본 예제를 기반으로 작성된 것이여서 80개의 물체를 찾고하 하는 프로그램입니다.)

yolo v1/v2는
/home/[USER_NAME]/Yolo_mark/x64/Release/yolo-obj.cfg 파일을
/home/[USER_NAME]/darknet/yolo-obj.cfg로 이동시켜줍니다.
파일의 가장 아래로 내려가면, [region]의 classes를 수정해줍니다.


 yolo v1/v2는 파일 가장 아래[region]의 classes를 수정

그리고 그 바로 위[convolutional]의 filters를 수정해줍니다.
num = number of anchors
classes = number of classes
filters=(classes + coords + 1)*num으로, 
만약 coords를 수정없이 default값을 쓴다면 
filters=(classes + 5)*5 입니다.
 
*** 여기에서 filters의 갯수는 모델에 따라 조금 차이가 존재합니다. ***
 
yolo v3의 filters는 매 [convolutional] 마다 있기 때문에 yolo를 기준으로 찾는 것이 편합니다. 
(yolo는 총 3개입니다.)
 yolo를 기준으로 바로 위에 있는 [convolutional]의 filters를 변경해주면 됩니다.
filters=(classes+5)*3 입니다.
즉, classes=1일 때, filters=18, classes=2일 때,filters=21입니다.
따라서 기본으로 255=(80+5)*3 이 설정되어 있습니다.

* 만약, 이 규칙을 지키지 않고 제멋대로 설정하거나 
잘못된 숫자를 적으면 다음과 같은 오류를 만나보실 수 있습니다^^하하

다, 이제 다 준비가 된 것 같습니다.
아, 참! 실행하시기 전에 
1) darknet 디렉터리에 yolov3.cfg파일, darknet19_448.conv.23파일이 있는지
2) darknet/data/img폴더 아래에 이미지들이 들어있는지,
3) darknet/data/아래에 obj.data, obj.names, train.txt가 있는지
확인해주시구요. 준비다 되었으면.. 갑시다!
./darknet detector train data/obj.data yolov3.cfg darknet19_448.conv.23

 


사진에서 4번째 줄쯤 보시면,
학습이 진행되면 매번 실행될 때마다 숫자가 갱신되게 되고, 
현재 125977번 학습했다는 의미가 됩니다.
avg는 loss, 즉 손실율의 평균을 의미합니다. 손실률은 낮을수록 좋습니다.
CPU로 실행시 학습도 테스팅도 굉장히 느립니다. 
GPU는 사양따라 다르지만, GTX1060(6GB)기준 1초에 1회 이상 진행이 됩니다.


 backup폴더에 가면 매 횟수마다 저장되는 것이 아니라 100회 단위로 저장됩니다. 
여기에서 100회마다, 900회까지 저장되고 그 이후론 10000회부터 저장됩니다. 
(당황하지마세요ㅋㅋ 저도 이 부분에서 뭔가 잘못된줄 알았거든요!)
만약, 이 부분을 수정하고 싶으면 참조사이트 2번을 참고하시면 됩니다.
그리고 참고로 중간에 중단했다가 재 학습이 가능합니다. 
만약에 내가 9000회까지 실행시켰는데 10000회를 못 찍고 프로그램이 종료되었다 / 종료시켰다. 경우엔 기본 backup파일에 정보가 저장됩니다. yolov3.backup파일로요! 그러니 연결해서 학습시킬 수 있답니다! 그런경우엔,다음 명령어로 실행시키시면 됩니다.
$ ./darknet detector train data/obj.data yolov3.cfg backup/yolov3.backup
(아, 물론 weights로 불러들여서 테스트하고 싶다면, 그건 안되지만요!)


참조 : http://pgmrlsh.tistory.com/6?category=766787
https://medium.com/@ribomo42/how-to-train-yolo-v2-with-your-own-data-object-and-labels-on-darknet-2b90dbfecb02

[YOLO V3] 설치 및 실행(Install & Execution) [ONLY COMMAND]

$ git clone https://github.com/pjreddie/darknet
$ vi Makefile
설정에 맞게 GPU, CUDNN, OPENCV를 수정! 사용한다=1, 사용 안한다=0
(여기서 에러가 난다면, GPU, CUDNN, OPENCV의 설치여부 및 관련 부분을 체크해보자
작동하지 않는다면 사용 안한다=0으로 바꿔서 make로 만들자!)
단, 여기서 조금 주의해야 할 점이 $nvcc -V 명령어를 통해서 cuda가 제대로 설치되어 있는지 확인하고 수정해 줄 것, 나 같은 경우는 $/usr/local/cuda/bin/nvcc 아래에 존재했다. 따라서 이 부분을 수정해줘야 함)

$ cd darknet
$ make
----------------------------------------------------------------------------------yolo 설치 끝
<이미 학습된 가중치 파일 받기>
$ cd darknet
$ wget https://pjreddie.com/media/files/yolov3.weights

<이미지파일 예제 실행>
$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

<동영상파일 예제 실행> (개, 자전거, 차가 나오는 아무 동영상을 video file부분에 넣자.)
$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

<Webcam으로 예제 실행>
 $ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
---------------------------------------------------------------------------------------------------yolov3기본 예제 실행 끝

출처 :  http://pgmrlsh.tistory.com/4
(참고로 출처에는 왜 저렇게 실행되는지에 대한 정보가 잘 정리되어 있습니다.)

2018년 10월 30일 화요일

텐서플로우 설치 튜토리얼 : Tensorflow Install Tutorial [ONLY COMMANDS]

*** 중요한 사실을 하나 알고가자, 내 컴퓨터가 AVX(Advanced Vector Extensions)를 지원하지 않는다.
= Tensorflow Version 1.6.0이상을 설치할 수 없다.
(설치가 완료는 되나, import tensorflow를 하는 순간, llegal core dumped가 일어난다.
bazel을 이용하여 package로 build를 해도 에러가 일어난다!)
= Tensorflow를 설치하는데 GPU도 중요하지만, CPU역시 중요하다.
--- 2018.11/15기준

설치 환경 : 64bit Ubuntu16.04, GeForce GT710,
                Intel(R) core(TM) i5-7500 CPU@3.40GHz + Memory 8G*2
설치 환경 : 64bit Ubuntu16.04, GeForce GT1060,
                Intel(R) core(TM) i5-7600 CPU@3.5GHz + Memory 8G*1




step 1 :
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential cmake g++ gfortran
sudo apt-get install git pkg-config python-dev
sudo apt-get install software-properties-common wget
sudo apt-get autoremove
sudo rm -rf /var/lib/apt/lists/*
 
step2 : NVIDIA DRIVERS
$ lspci | grep -i nvidia
위 명령어 쳤을 때 아래와 같이뜨면, 아래 명령어로 설치 해줄것
 
+ 만약 명령어를 쳐도 아무것도 뜨지 않는다면 우선, 지금 GPU를 쓰고 있는지부터 확인하자!
 
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
 
내 컴퓨터가 어떤 종류의 nvidia를 설치해야 하는지 궁금하면 아래 주소로 들어가서 확인하자! 
what kind of nvidia Driver should i Download?
https://www.nvidia.co.kr/Download/index.aspx?lang=kr
 
 1)내가 GTX 710다!
 $ sudo apt-get install nvidia-375
 
2)내가 GTX 1060다!
 $ sudo apt-get install nvidia-410 

재부팅 후,명령어로 확인하기(이전과 같은 붉은 글씨가 안 떠야됨)
$ cat /proc/driver/nvidia/version
정상적인 화면
 

step3 : CUDA9.0 for Ubuntu16.04
tip) CUDA를 잘못 설치해서 삭제하고 새로 설치시 참조사이트 3번 참조 
https://developer.nvidia.com/cuda-toolkit-archive
Linux16.04 x86_64.deb 버전을 다운로드
***참고로 GPU에 맞는 CUDA version이 있으니, 
상위 버전이 맞지 않으면 CUDA삭제(아래 tip을 이용해서 지우고), 버전을 낮춰서 재설치해보자!
 

$ cd ~/Downloads
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb

출처: http://kyubot.tistory.com/93 [Kyubot's All Things Considered]
$ sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb
$ sudo apt-get update 
$ sudo apt-get install cuda
 
$ echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
$ echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
$ source ~/.bashrc 
$ cd /usr/local/cuda-9.0/samples/5_Simulations/fluidsGL
$ sudo make
$ ./fluidsGL
초록창이 뜨고 그 위에서 마우스 움직이면 그림이 변함
(만약 에러 발생시 재부팅을 추천한다.) 
 



tip. CUDA를 삭제시키고 다시 설치해야 할 일이 있다면, 다음을 실행시켜준다.
$ sudo apt-get --purge remove 'cuda*'
$ sudo apt-get autoremove --purge 'cuda*'

$ sudo rm -rf /usr/local/cuda-9.0
$ sudo rm -rf /usr/local/cuda
 
 
 
step4 : CuDNN 7.1.4v for CUDA9.0 
https://developer.nvidia.com/rdp/cudnn-archive에서 3개 다운로드
**참고로 nvidia에 가입해야 다운로드 이용가능! 
 ###순서를 지켜서 설치하자. Runtime 먼저 설치하고 Developer를 설치해야 함
(설치순으로 위에서 부터 차례대로 dpkg 할 것)
$ sudo dpkg -i libcudnn7_7.1.4.18-1+cuda9.0_amd64.deb 
$ sudo dpkg -i libcudnn7-dev_7.1.4.18-1+cuda9.0_amd64.deb 
$ sudo dpkg -i libcudnn7-doc_7.1.4.18-1+cuda9.0_amd64.deb 
$ sudo apt-get update

$ cp -r /usr/src/cudnn_samples_v7/ ~/
$ cd ~/cudnn_samples_v7/mnistCUDNN/
$ sudo make clean
$ sudo make
$ ./mnistCUDNN
 아래와 같은 그림이 뜨면 정상작동!

+ 만약, 설치했는데 버전을 변경해야 하는 경우가 발생한다면,
$ sudo apt-get autoremove
$ sudo rm -rf /var/lib/apt/lists/*
해주고, 버전을 바꿔 패키지를 설치하고 순서를 지켜서 설치하면 된다.
 이 사실은 dpkg하면서 알 수 있게 로그를 남겨주고 있다.
 첫번째 로그에서 warning이 명시되면서
 7.1.4버전에서 7.0.5버전으로 downgrading을 하고 있다.라고 알려준다.
 
밑에서 두번째 줄을 보면, (설치버전) over (설치되었었던 버전).
그리고 마지막 줄을 보면, 현재 셋팅된 버전임을 알려주고 있다.


 
+ [ERROR]만약,CUDNN_STATUS_ARCH_MISMATCH 에러가 난다면, 본인의 GPU를 확인해보자.
출처에 의하면 CUDA wiki(https://en.wikipedia.org/wiki/CUDA)에서 
명시되어 있는 GPU성능에 따라 3.0보다 낮은 계산 기능을 가지고 있다면, 
본 컴퓨터에서 사용하지 말라고 말하고 있다.
X :  GeForce GTX 590, GeForce GTX 580, GeForce GTX 570, GeForce GTX 480, GeForce GTX 470, GeForce GTX 465, GeForce GTX 480M
(출처 :https://code.i-harness.com/ko-kr/q/1ef0e70) 
 

 
 
 
 

Step5 : python stuff
$ sudo apt-get update && sudo apt-get install -y python-numpy \
 python-scipy python-nose python-h5py python-skimage \
 python-matplotlib python-pandas python-sklearn python-sympy
 
$ sudo apt-get clean && sudo apt-get autoremove
$ sudo rm -rf /var/lib/apt/lists/*
 ----------------------------------------------------------------
$ sudo apt-get update
$ sudo apt-get install git python-dev python3-dev python-numpy
python3-numpy build-essential python-pip python3-pip \
python-virtualenv swig python-wheel libcurl3-dev
$ sudo apt-get install -y libfreetype6-dev libpng12-dev
$ sudo pip3 install -U matplotlib ipython[all] jupyter pandas scikit-image

step6 : OpenBLAS (생략가능)
$ cd
$ git clone https://github.com/xianyi/OpenBLAS.git
$ cd OpenBLAS
$ make FC=gfortran -j16
$ sudo make PREFIX=/usr/local install
 
 
step7 : Tensorflow for Python3
 sudo pip3 install --upgrade tensorflow-gpu
 
만약 특정 버전을 지정해서 설치하고 싶다면? 예를 들어 v1.10.1일 경우,
 sudo pip3 install --upgrade tensorflow-gpu==1.10.1
 
만약 버전을 잘못 설치해서 재설치하고 싶다면?
 sudo pip3 uninstall --upgrade tensorflow-gpu 
 혹은
 sudo pip3 uninstall --upgrade tensorflow-gpu==1.10.1
과 같은 형식으로 진행해주면 된다. 

 위의 설치가 완료되면,
$ python3
>>> import tensorflow 를 실행해보자.
+) tensorflow버전 확인 
$ python3>>> import tensorflow as tf
>>> tf.__version__ 
 
만약, 다음과 같은 에러가 발생한다면, 
 
 
 

 
다음과 같은 방법으로 해결가능하다. 
  

 
 
 
 
 
 
  


step8 : OpenCV 3.3.1 for Python3
$ sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
$ sudo apt install qtbase5-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libgtk2.0-dev
$ sudo apt-get install libatlas-base-dev gfortran
$ sudo apt-get install libhdf5-serial-dev
=================================================================
cd ~ $ git clone https://github.com/Itseez/opencv.git

출처: http://kyubot.tistory.com/93 [Kyubot's All Things Considered]
$ cd
$ git clone https://github.com/Itseez/opencv.git
$ cd opencv/
$ git checkout 3.3.1
 
$ cd 
$ git clone https://github.com/Itseez/opencv_contrib.git
$ cd opencv_contrib/
$ git checkout 3.3.1
tip. checkout을 다른 버전으로해서 문제가 생긴다면,
     디렉터리를 전체를 삭제하고, 다시 git clone해서 checkout다시 해줄 것!
================================================================= 
$ cd ~/opencv
$ mkdir build
$ cd build/
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_OPENGL=ON \ -D WITH_V4L=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules -D BUILD_EXAMPLES=ON ..
$ sudo make
$ sudo make install
$ sudo ldconfig
----------------------------------------------------------------
+) opencv버전 확인 ->checkout3.3.1했으니 버전도 3.3.1뜨면 정상
$ pkg-config --modversion opencv

참조 사이트 :
1) http://kyubot.tistory.com/93
2) https://medium.com/@vivek.yadav/deep-learning-setup-for-ubuntu-16-04-tensorflow-1-2-keras-opencv3-python3-cuda8-and-cudnn5-1-324438dd46f0
3) https://park-ju-hyeong.github.io/2018/04/05/CUDA-8.0-to-9.0/
L
녀애
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc 
inux Ubuntu 16.04 x86_64 .deb 버전을 다운로드

출처: http://kyubot.tistory.com/93 [Kyubot's All Things Considered]
Linux Ubuntu 16.04 x86_64 .deb 버전을 다운로드

출처: http://kyubot.tistory.com/93 [Kyubot's All Things Considered]
Linux Ubuntu 16.04 x86_64 .deb 버전을 다운로드

출처: http://kyubot.tistory.com/93 [Kyubot's All Things Considered]