블로그 이미지
devtang
Instagram : @taebr0 devtaehyeong@gmail.com

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2020. 7. 22. 18:27 AI/YOLO

 

 

저의 그래픽카드는 GTX 1050 Ti 이기 때문에 제 환경에 맞춰 진행하였습니다.

 

*[실행 환경]

Visual studio 2015

CUDA 10.1

cuDNN 7.6.3

OpenCV 4.0.1

기준으로 설치 튜토리얼을 진행하고, Visual Studio 가 설치되있다는 가정하에 진행하겠습니다.

 

목차

1. CUDA, cudnn 설치

2. OpenCV 설치

3. darknet 설치 및 환경 세팅

4. 간단한 예제 실행


1. CUDA 10.1 , cuDNN v7.6.3 설치

****** 주의사항 ******

참고: 저는 그래픽카드가 GTX 1050 Ti 이기 때문에 CUDA 10.1 버전을 사용할 수 있습니다.

CUDA는 버전이 다양한데, Compute capability에 따라 설치할 수 있는 버전이 있습니다. 

꼭 본인에 Compute capability에 맞는 CUDA 버전을 설치해주셔야 합니다.

CUDA 10.1 버전은 Compute capability 3.0~7.5 가 지원됩니다.

  • CUDA SDK 1.0 support for compute capability 1.0 – 1.1 (Tesla)
  • CUDA SDK 1.1 support for compute capability 1.0 – 1.1+x (Tesla)
  • CUDA SDK 2.0 support for compute capability 1.0 – 1.1+x (Tesla)
  • CUDA SDK 2.1 – 2.3.1 support for compute capability 1.0 – 1.3 (Tesla)
  • CUDA SDK 3.0 – 3.1 support for compute capability 1.0 – 2.0 (Tesla, Fermi)
  • CUDA SDK 3.2 support for compute capability 1.0 – 2.1 (Tesla, Fermi)
  • CUDA SDK 4.0 – 4.2 support for compute capability 1.0 – 2.1+x (Tesla, Fermi, more?).
  • CUDA SDK 5.0 – 5.5 support for compute capability 1.0 – 3.5 (Tesla, Fermi, Kepler).
  • CUDA SDK 6.0 support for compute capability 1.0 – 3.5 (Tesla, Fermi, Kepler).
  • CUDA SDK 6.5 support for compute capability 1.1 – 5.x (Tesla, Fermi, Kepler, Maxwell). Last version with support for compute capability 1.x (Tesla)
  • CUDA SDK 7.0 – 7.5 support for compute capability 2.0 – 5.x (Fermi, Kepler, Maxwell)
  • CUDA SDK 8.0 support for compute capability 2.0 – 6.x (Fermi, Kepler, Maxwell, Pascal). Last version with support for compute capability 2.x (Fermi) (Pascal GTX 1070Ti Not Support)
  • CUDA SDK 9.0 – 9.2 support for compute capability 3.0 – 7.2 (Kepler, Maxwell, Pascal, Volta) (Pascal GTX 1070Ti Not Support CUDA SDK 9.0 and support CUDA SDK 9.2)
  • CUDA SDK 10.0 – 10.2 support for compute capability 3.0 – 7.5 (Kepler, Maxwell, Pascal, Volta, Turing). Last version with support for compute capability 3.x (Kepler). 10.2 is the last official release for macOS, as support will not be available for macOS in newer releases. (저는 Compute capability가 6.1 이므로 10.1 버전을 사용할 수 있습니다.)
  • CUDA SDK 11.0 – support for compute capability 5.2 - 8.0 (Maxwell, Pascal, Volta, Turing, Ampere)

저는 GTX 1050 Ti 이므로 Compute capability가 6.1 버전입니다.

자세한 내용은 아래 사이트를 참조하시면 됩니다.

https://en.wikipedia.org/wiki/CUDA

 

CUDA - Wikipedia

CUDA (Compute Unified Device Architecture) is a parallel computing platform and application programming interface (API) model created by Nvidia.[1] It allows software developers and software engineers to use a CUDA-enabled graphics processing unit (GPU) fo

en.wikipedia.org

 


https://developer.nvidia.com/cuda-toolkit-archive

 

CUDA Toolkit Archive

Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production

developer.nvidia.com

위의 페이지에 들어가서 CUDA Toolkit 10.1 [Feb 2019] 버전을 클릭해줍니다.

클릭을 하시고 들어가시면 아래와 같이 local 로 설정하여 다운받아서 실행해줍니다.

exe[network]는 네트워크에서 나눠서 다운받는것이고 exe[local]은 설치파일을 한번에 받아놓는 방식입니다.

저는 local 방식으로 설치했습니다.

 

설치 옵션은 빠른 설치로 진행해줍니다.

설치된 저의 경로는 아래와 같습니다.

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1

 

다운로드가 완료되었으면 cuDNN을 설치합니다.

cuDNN을 다운받으려면 NVIDIA 회원가입 후 로그인 된 상태에서 가능합니다.

https://developer.nvidia.com/rdp/cudnn-archive

 

cuDNN Archive

NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks.

developer.nvidia.com

 

회원가입이 되셨으면 위의 사이트에 들어가서 v7.6.3 버전을 다운받아 줍니다.

위의 사진처럼 Download cuDNN v7.6.3 for CUDA 10.1 이면 10.1 버전용 cuDNN 이라는 뜻입니다. 

v7.6.3 이지만 CUDA 9.0 ,10.0 , 10.1 버전 등 각자 본인에 버전에 맞는 파일이 다르기때문에 주의해서 다운받아줍시다.

 

다운로드가 완료되면 폴더가 하나 있는데 저는 D드라이브에 넣어뒀습니다. 저의 cuDNN 경로는 아래와 같습니다.

D:\cuda

 


2. OpenCV 4.0.1 설치

 

https://opencv.org/releases/page/2/

 

Releases – Page 2

 

opencv.org

위의 홈페이지 들어가서 4.0.1 버전을 클릭해줍니다.

 

저는 D드라이브에 설치를 진행하였습니다.


3. Darknet 설치 및 환경 세팅 (중요)

 

 

darknet-master.zip
7.71MB

파일을 받아주고 압축을 풀어줍니다.

darknet-master -> build -> darknet 폴더에 들어가면 darknet.vcxproj 파일이 있습니다.

저는 편집을 편리하게 하기위해 Notepad++ 라는 프로그램을 설치하였습니다.

오른쪽 버튼 클릭을하면 Edit with Notepad++ 로 수정할 수 있습니다.

 

 

2번째 line에 본인의 Visual Studio 버전에 맞게 수정해주시면 됩니다. 저는 2015 버전을 쓰기때문에

ToolsVersion="14.0"으로 지정하였습니다.

 

 

55번째 라인에

$(VCTargetsPath)\BuildCustomizations\CUDA 10.0.props을 

 

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\visual_studio_integration\MSBuildExtensions\CUDA 10.1.props로 바꿔줍니다.

 

마찬가지로 마지막 줄에 있는 

$(VCTargetsPath)\BuildCustomizations\CUDA 10.0.props 부분도

 

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\visual_studio_integration\MSBuildExtensions\CUDA 10.1.targets 으로 바꿔줍니다.

 

이제 darknet.sln 을 실행해서 프로젝트 -> 속성으로 들어가줍니다.

 

구성을 Release 플랫폼을 x64 로 바꿔주고 아래의 세팅을 하셔야합니다.

 

C/C++ -> 일반(general) -> 추가 포함 디렉터리(additional include directories) 을 편집해줘야 합니다.

 

제 기준으로 편집 전

 $(OPENCV_DIR)\include;

 C:\opencv_3.0\opencv\build\include;

 ..\..\include;

 ..\..\3rdparty\stb\include;

 ..\..\3rdparty\pthreads\include;

 %(AdditionalIncludeDirectories);

 $(CudaToolkitIncludeDir);

 $(CUDNN)\include;

 $(cudnn)\include

편집 후

 

D:\opencv\build\include
..\..\include
..\..\3rdparty\stb\include
..\..\3rdparty\pthreads\include
%(AdditionalIncludeDirectories)
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
D:\cuda\include

 

위의 과정은 OpenCV 와 CUDA , cuDNN 의 올바른 include 경로를 설정해주는 과정입니다.

 

다음으로 CUDA C/C++ -> Device -> Code Generation 에서 자신의 Compute capability에 맞게 수정해줍니다.

 

거의다왔습니다!!

링커(Linker) -> 일반(general) -> 추가 라이브러리 디렉터리(Additional Library Directories) 를 편집해줘야 합니다.

 

제 기준으로 편집 전

 C:\opencv_2.4.9\opencv\build\x86\vc14\lib;

 C:\opencv_2.4.9\opencv\build\x86\vc12\lib;

 $(CUDA_PATH)lib\$(PlatformName);

 $(cudnn)\lib\x64;

 ..\..\3rdparty\pthreads\lib;

 %(AdditionalLibraryDirectories)

D:\opencv\build\x64\vc14\lib;

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\$(PlatformName);

D:\cuda\lib\x64; 

..\..\3rdparty\pthreads\lib;

%(AdditionalLibraryDirectories)

 

편집 후입니다.


YOLO에서 CUDA와 OpenCV를 실행을 위한 dll 파일들을 옮겨줘야합니다.

 

 

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin 에서 

cublas64_10.dll

cudart64_101.dll

curand64_10.dll

cusolver64_10.dll

 

D:\opencv\build\x64\vc14\bin 에서

opencv_world401.dll

opencv_world401d.dll

opencv_ffmpeg401_64.dll

 

총 7개의 파일을 darknet-master\build\darknet\x64 폴더 안에 넣어줍니다.

 

 

넣어주시고 다시 darknet.sln 파일을 실행시킨 후에 

Release 에 x64인지 확인해 주시고 빌드(B) -> 솔루션 빌드 를 진행시켜줍니다.

 

휴~~ 드디어 빌드가 완료되었습니다. 성공이 되셨다면 YOLO 세팅이 정상적으로 된것입니다. 

 


4. 간단한 예제 실행

yolov3.weights (236 MB COCO Yolo v3): https://pjreddie.com/media/files/yolov3.weights

 

우선 미리 훈련된 weights 파일을 다운받아서 

darknet-master\build\darknet\x64 폴더안에 넣어줍니다.

 

폴더에 들어가서 빈 곳에 Shift + 오른쪽버튼을 누르면 위의 사진과 같이 여기에 PowerShell 창 열기가 뜹니다.

간단한 예제를 돌려보겠습니다. 

./darknet.exe detector test data/coco.data yolov3.cfg yolov3.weights data/dog.jpg 

 

원본 사진의 object detection 결과입니다.

 

정상적으로 설치가 되어서 위와 같이 object detection 이 성공적으로 되네요~

혹시나 설치과정중에 에러가 발생하면 댓글 남겨주세요. 설치하느라 고생하셨습니다~!!

posted by devtang
2020. 4. 29. 18:06 Raspberry Pi

 

 

 

 

 

 

 

이번 게시물에서는 RaspberryPi 3B+에 Tensorflow 를 이용하여 사전 훈련된 Mobilenet SSDLite_V2를 이용하여 파이카메라로 Object Detection하는 과정을 작성하겠습니다.

 

우선 준비물로는 Picamera와 라즈베리파이만 있으면 됩니다.

 

라즈베리파이 터미널창을 열고 다음과같이 업데이트를 해줍니다.

sudo apt-get update
sudo apt-get upgrade

 

이후 tensorflow 모델을 다운 받을 폴더를 만들어줍니다.

cd Desktop
mkdir tensorflow
cd tensorflow

 저는 Desktop 에 tensorflow1이라고 폴더명을 만들고 터미널로 들어가줬습니다.

wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.8.0/tensorflow-1.8.0-cp35-none-linux_armv7l.whl

 

이제 위와 같은 명령어를 치고 다운받아줍니다. 

 

다운이 완료되면 models라는 폴더가 생성되있습니다.

 

sudo pip3 install tensorflow-1.8.0-cp35-none-linux_armv7l.whl // python3.x버전설치
sudo pip install tensorflow-1.8.0-cp35-none-linux_armv7l.whl

저는 라즈베리파이에 세팅된 기본 파이썬버전이 3.5 라 pip3를 붙혀줄 필요가 없었습니다.

pip3버전으로 까는것을 추천드립니다.

 

텐서플로우가 설치가 완료되고나면, 텐서플로우에 필요한 패키지를 추가로 설치해줘야합니다.

이제부터 pip은 생략하고 pip3로 통일해서 올리겠습니다. 본인 환경에 맞게 설치하시길 바랍니다.

 

sudo apt-get install libatlas-base-dev

sudo pip3 install pillow lxml jupyter matplotlib cython

sudo apt-get install python-tk

추가적으로 OpenCV도 설치해줘야하는데 Jetson nano가 라즈베리와같이 우분투 환경이기에 똑같이 진행해주시면 됩니다.

 

(아래 게시물 참고바랍니다.)

https://ultrakid.tistory.com/10

 

[OpenCV] Jetson nano에 OpenCV 3.4 설치

제 나노 보드에 설치된 Jetson Nano Developer Kit image, CUDA 10.0, Jetpack 4.3 버전 기준으로 작성하였습니다. 우선 OpenCV 설치 전에 필요한 라이브러리 들을 설치해줍니다. (참고) - pkg-config나 unzip 또..

ultrakid.tistory.com

sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

sudo apt-get install libxvidcore-dev libx264-dev

sudo apt-get install qt4-dev-tools

pip3 install opencv-python

OpenCV 설치시에 굉장히 오래걸리기도 하고, 발열이 심하니 설치후에 꼭 라즈베리파이를 쉬게 해주세요..

 

이제 구글의 프로토콜 버퍼를 이용할 준비를 해야합니다.

https://developers.google.com/protocol-buffers

 

Protocol Buffers  |  Google Developers

Protocol buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data.

developers.google.com

이것을 이용하면 데이터를 한 번 구성하는 방법을 정의한 후 특수 생성 된 소스 코드를 사용하여 다양한 데이터 스트림에서 다양한 언어로 다양한 구조의 데이터를 쉽게 읽고 쓸 수 있다고 합니다. .proto파일을 생성하여  응용 프로그램 언어에 대한 프로토콜 버퍼 컴파일러를 실행하여 데이터 액세스 클래스를 생성한다고 하는데, 이것을 이용하면 더 작고 빠르게 읽을 수 있어서 라고 합니다.

 

명령어를 입력해줍니다. 

sudo apt-get install autoconf automake libtool curl

이 다운로드는 참고로 만들어준 tensorflow 폴더에서 진행해주세요.

wget https://github.com/protocolbuffers/protobuf.git // protocol buffer 받아오기

tar -zxvf protobuf-all-3.6.0.tar.gz // 압축풀어주기

cd protobuf-3.6.0 // 폴더로 진입

 

 

./configure

./configure를 해주면 대략 2분정도걸립니다.

 

make

make는 진짜 더더 오래걸립니다.. 저는 한시간정도 걸린 것 같습니다.

make check

이건 리얼 더더더 오래걸렸던거 같습니다. 참고로 하다가 라즈베리파이가 먹통됬는데, 먹통된 사람들은 전원을 끄고 

다시 켜준다음에 다시 make check 진행해주시면 위와같은 화면이 나오면 올바르게 컴파일 된겁니다.

저는 먹통이되서 다시 켜고 컴파일시켜 2시간 넘게 걸렸습니다.

sudo make install

위와같은 명령어를 쳐서 설치합니다.

cd python  // @@@@ python 폴더로 꼭 들어가주세요 @@@@

export LD_LIBRARY_PATH=../src/.libs

python3 setup.py build --cpp_implementation

python3 setup.py test --cpp_implementation

python3 setup.py build --cpp_implementation

 

python3 setup.py test --cpp_implementation

sudo python3 setup.py install --cpp_implementation

계속계속 진행해 줘요.

 

export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp

export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION=3

sudo ldconfig

sudo ldconfig 치면 위와 같이 나옵니다.

이제 설치가 거의 완료됬습니다. 재부팅 전에 실행하면 텐서플로우 오류가 뜨니 반드시 재부팅을 해줍니다.

sudo reboot now

 

재부팅이 완료가 되면 Desktop에다 tensorflow1 이라고 폴더를 만들어주어 그안에 들어가줍니다.

cd Desktop

mkdir tensorflow1

cd tensorflow1

아래 명령어를 입력해주면 위와 같은 이미지처럼 다운로드가 진행됩니다~!!

git clone --recurse-submodules https://github.com/tensorflow/models.git 

설치가 완료되면 

이다음부터 조금 중요한데,

sudo nano ~/.bashrc

위의 명령어를 입력해주면

아래와 같은 GNU 창이 뜹니다. 커서를 맨아래로옮겨 아래 코드를 적고 Ctrl + X -> Y 를 눌러 저장하고 나옵니다.

export PYTHONPATH=$PYTHONPATH:/home/pi/tensorflow1/models/research:/home/pi/tensorflow1/models/research/slim

echo $PYTHONPATH 를치면

위와같이 우리가 입력한 주소가 나옵니다. 위와 같이 나오면 성공적으로 진행된것입니다.

 

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

 

tensorflow/models

Models and examples built with TensorFlow. Contribute to tensorflow/models development by creating an account on GitHub.

github.com

이제 실행을위해 pre-trained 된 모델을 다운 받아옵니다. 저는 Mobilenet ssdlite V2 버전을 이용하겠습니다.

wget http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz

 

다운로드가 완료되면 아래 명령어를 입력하여 압축을 풀어줍니다.

tar -xzvf ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz

다시 models파일안에 research 폴더안으로 들어와서 명령어를 입력해줘야 합니다.

protoc object_detection/protos/*.proto --python_out=.

이명령어를 입력한후 폴더안에 파일을보시면 파이썬 파일들이 proto파일들로 변환되서 저장되어있습니다. 구글 프로토콜 버퍼를 사용할 준비가 완벽하게 됬습니다!

 

 

이제 object_detection 폴더 안으로 들어와서 테스트할 파이썬 파일을 받아옵니다.

라즈베리카메라를 이용한 객체인식 예제 코드 파일입니다.

wget https://raw.githubusercontent.com/EdjeElectronics/TensorFlow-Object-Detection-on-the-Raspberry-Pi/master/Object_detection_picamera.py

python3 Object_detection_picamera.py

받아와서 python으로 실행을 시키면 tensorflow가 꽤 많이 메모리를 잡아먹기 때문에 시간이 조금 걸립니다.

 

아래는 구현 동영상입니다.

https://youtu.be/rLK-y8ePueQ

 

 

참고사이트

https://youtu.be/npZ-8Nj1YwY

 

=======================================================================

posted by devtang
2020. 4. 14. 17:05 AI/Keras

 

 

 

본 게시물은 전 게시물의 세팅환경에서 진행하였습니다.

 

numpy 1.15
tensorflow 1.4
keras 2.0.3
cuda8.0
cudnn 5.1

 

https://ultrakid.tistory.com/22

 

[Keras] Anaconda를 이용한 Faster R-CNN 세팅 및 예제 실행

본 글은 Windows 10 환경에서 Anaconda에 가상환경을 세팅하여 진행하였습니다. Faster R-CNN Faster R-CNN의 가장 핵심 부분은 Region Proposal Network(RPN) 입니다. R-CNN은 이미지 내에 객체가 존재할 것 같..

ultrakid.tistory.com

공부를 하던중에 사실 Faster R-CNN 기반의 Real-time object detection(실시간 물체 인식)에 관한 예제를 찾고 있었으나, 몇일동안 찾아도 Windows 기반으로 구축된 글은 외국 사이트를 뒤져봐도 저의 능력으론 찾지 못했습니다..

 

Faster R-CNN 추론한 사진 (GTA 5)

 

그나마 다행인건 동영상을 인식하는 예제가 있긴 했는데 살펴보니 동영상 자체를 input시켜 detection 하는 것이 아닌 동영상을 프레임?으로 쪼개어 사진 한장마다 인식을해서 인식이된 모든 사진을 다시 합쳐 동영상형태로 만드는 예제 코드를 찾았습니다. 처리 모델로는 ResNet50 을 사용하였습니다.

 

우선 전 게시물에 예제 코드를 하나 받아야합니다.

https://github.com/riadhayachi/faster-rcnn-keras/blob/master/test_frcnn_count.py

 

riadhayachi/faster-rcnn-keras

object detection in video. Contribute to riadhayachi/faster-rcnn-keras development by creating an account on GitHub.

github.com

 

다운을 받고 폴더안에 넣어줍니다.

마찬가지로 Anaconda Prompt를 실행시켜 만들어준 fasterRCNN 가상환경을 activate 해줍시다.

자이제 위의 폴더로 들어가서 코드를 입력합니다.

python test_frcnn_count.py --input_file 경로/처리할동영상.mp4 --output_file 경로/출력동영상이름.mp4 --frame_rate=25

frame rate는 25로 default값을 설정해줍니다.

 

띠용..

텐서플로우도 backend로 실행 잘되는가 싶더니 코드에 문제가 없지만 TypeError가 떴습니다.

https://github.com/pender/chatbot-rnn/issues/31

 

Pickle TypeError: a bytes-like object is required, not 'str' · Issue #31 · pender/chatbot-rnn

Getting this error: Traceback (most recent call last): File "chatbot.py", line 301, in main() File "chatbot.py", line 35, in main sample_main(args) File "chatbot.py", ...

github.com

 

음영 처리된 부분중 with open(config_output_filename, 'r') as f_in: 부분에서 'r'을 'rb'로 고쳐야합니다.

 

 

 

또 음영처리된 174번째 라인중 저부분이 원래는 var로 되어있으나 str(var)로 고쳐줘야합니다..

 

 

 

도대체 어디서부터 잘못된걸까 이틀동안 찾아본것 같습니다.

아마 이 코드가 python2.x버전대에서 작성한 코드라서 3.6버전에 안맞았던 것 같습니다.

2버전에서 3버전으로 올라가면서 문법이 약간씩 수정되었다고 합니다.

https://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html

 

The key differences between Python 2.7.x and Python 3.x with examples

Many beginning Python users are wondering with which version of Python they should start. My answer to this question is usually something along the lines “ju...

sebastianraschka.com

아래와 같이 변경해줍니다.

cv2.rectangle(img_scaled,(x1, y1),(x2, y2), (int(class_to_color[key][0]),int(class_to_color[key][1]),int(class_to_color[key][2])),2)

이제 다시 코드를 입력하고 실행시켜줍니다.

python test_frcnn_count.py --input_file 경로/처리할동영상.mp4 --output_file 경로/출력동영상이름.mp4 --frame_rate=25

동영상을 프레임으로 쪼개어 한장씩 Object Detection을 수행한후 종합된 result image를 다시 합치는 방식입니다.

 

 

 

아래는 변환된 동영상입니다.

https://youtu.be/CyvN4hZTMxo

 

 

posted by devtang
2020. 4. 1. 18:17 AI/Keras

이번 게시물은 Windows10 에서 Anaconda 가상환경에 Mask R-CNN 을 세팅하여 간단한 사진 예제를 돌려보겠습니다.

 

우선 Mask R-CNN이란 무엇인가?

 

Mask R-CNN : Mask Region-based Convolutional Network

 

COCO dataset 이미지 검출 예제 사진

 Mask R-CNN은 원래 있던 Faster-RCNN에 기반한 모델입니다. 간단하게 말하면 Faster R-CNN으로 Object를 검출한 box 안에 Object에 예측된 부분을 mask 씌워준 것입니다. 기존의 Faster R-CNN을 Object Detection 역할로 하고 각각의 RoI(Region of Interest)에 mask를 입혀주는 작은 FCN(Fully Covolutional Network)를 추가해준 것입니다. 또한 RoI Pooling이아닌 RoIAlign를 사용했다는데 , mask accuracy가 증가하였다고 합니다. 자세한 내용은 추후에 포스팅 할 예정입니다. 

Mask R-CNN framework

 

Mask R-CNN 세팅하기

기본적으로 Anaconda가 세팅이 되어있어야합니다. 이글은 Windows10을 기준으로 작성합니다.

 

GPU를 사용하기 위해 CUDA 와 CUDNN을 설치해야하는데 버전이 맞지 않으면 호환이 되지 않아 오류가 날 가능성이 큽니다. 제가 구동한 버전은 아래와 같습니다.

cuda v9.0

cudnn v7.0.x (저는 7.0.2로 가장 구버전을 선택해서 사용했습니다.)

 

cuda 설치

https://developer.nvidia.com/cuda-toolkit

 

cudnn 설치

https://developer.nvidia.com/cudnn

(NVIDIA 로그인 후 다운로드가 가능합니다.)

 

cudnn을 깔면 이파일들이 나오는데 bin, include, lib폴더안에 내용물을 

자기가 깔아준 CUDA 폴더 경로에 붙여넣기 해줍니다.

제기준으로 경로입니다. C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0

특별한 설정없으면 위의 경로가 맞으실 거에요.

 

이제 윈도우 키 + 시스템 환경 변수 편집 입력 하시면 시스템 속성이 나옵니다.

환경 변수 클릭후 시스템 변수 편집에 cudnn 이라고 새로 만들주고 경로를 붙혀넣어 줍니다.

 

 

 

설정이 완료되었으면 아나콘다 프롬프트를 실행시킵니다.

본격적으로 Mask R-CNN 환경 세팅을 위한 가상환경을 만들어 줍니다. python3.6 과 pip을 추가 설치해주는 명령어에요

(base) C:\Users\@USERNAME@>conda create -n MaskRCNN python=3.6 pip

세팅이 끝난후에 activate MaskRCNN 을 입력하면 아래 사진과 같이 가상환경에 정상적으로 들어간 것을 확인해주세요.

이제 Mask R-CNN을 구성하는데 필요한 파일들을 설치해줘야 합니다.

추가적으로 Visual C++ 2015 Build Tools 설치가 필요합니다.

pip install tensorflow-gpu==1.5 

pip install keras==2.2.0 

pip install cython matplotlib scikit-image h5py Pillow jupyter pandas numpy scipy 

pip install opencv-python ipython

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

저는 바탕화면에 Mask_RCNN폴더를 만들어 설치하였습니다. 



cd Desktop //바탕화면으로 이동 

mkdir Mask_RCNN // Mask_RCNN 이라는 폴더 생성 

cd Mask_RCNN // Mask_RCNN 폴더로 이동

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

conda install -c anaconda git //git을 이용하기위한 설치 

git clone https://github.com/matterport/Mask_RCNN.git  // Mask_RCNN파일 설치 

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

git clone https://github.com/philferriere/cocoapi.git // cocotools 설치 

pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=pythonAPI 

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

git clone https://github.com/aleju/imgaug.git // imgaug 설치 

pip install imgaug

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

https://github.com/matterport/Mask_RCNN/releases 

 

matterport/Mask_RCNN

Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow - matterport/Mask_RCNN

github.com

추가적으로 이사이트에 들어가서 
mask_rcnn_coco.h5.file 을 다운로드하여 Mask_RCNN 폴더에 넣어줍니다.

 

 

이제 주피터 노트북을 이용하여 예제를 실행해 보도록 하겠습니다.

Mask_RCNN 폴더내에 samples 폴더에 들어가서 demo.ipynb 파일을 실행시켜서 데모를 구동해봅니다.

 

 

성공적으로 구동이 되었습니다. 

# Load a random image from the images folder 

 file_names = next(os.walk(IMAGE_DIR))[2]

 image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))

Mask_RCNN폴더내에 images에 자신이 원하는 사진을 넣고 아래와 같이 코드 수정을 하면 다른 사진도 돌려볼 수 있습니다.

# Load a random image from the images folder

 filename = os.path.join(IMAGE_DIR, 'doge.jpg')

 image= skimage.io.imread(filename)

 

글 읽어주셔서 감사합니다.

 

 

추가적으로 오류나는 사항있으면 댓글로 알려주세요!!

 

 

참고사이트

https://www.youtube.com/watch?v=2TikTv6PWDw

 

https://n1094.tistory.com/42

 

https://medium.com/zylapp/review-of-deep-learning-algorithms-for-object-detection-c1f3d437b852

 

https://reyrei.tistory.com/11

 

posted by devtang
2020. 3. 27. 17:40 AI/Keras

앞 게시물에 사용한 Dense는 fully-connected(FC) layer로써 1차원 배열 데이터로 한정됩니다. 

그러나 컬러 사진 1장은 3차원 배열 데이터이기 때문에 FC신경망을 이용하여 사진을 학습시키기 위해서는

3차원 데이터를 1차원 데이터로 평면화 시켜서 학습 시켜줘야합니다.

 

따라서 신경망이 추출 및 학습시에 굉장히 비효율적이고 정확도를 높이는 데 한계가 있을 수 밖에 없습니다.

이미지 공간 정보를 유지한 상태에서 학습을 시킬 수 있는 모델이 바로 CNN(Convolutional Neural Network)입니다.

 

CNN의 구조

Convolution 신경망은 이미지가 가지는 특성이 고려되어 설계된 신경망이므로 영상 처리에 주로 사용됩니다.

CNN의 구조는 위의 그림과 같이 그림에 한 필터가 순회적으로 돌며 합성곱을 계산하여 그 결과로 하나의

피쳐맵을 형성합니다. 

Convolution 과정

합성곱을 함으로써 얻게되는 효과는 아래 사진을 보면 쉽게 이해할 수 있습니다.

왼쪽에 숫자 30으로 이루어진 부분을 따라 그려보면 오른쪽의 그림과 거의 비슷한 모양입니다.

사진이 픽셀 데이터로 구성되어있음을 알 수 있습니다.

 

 

Polling 은 컨볼루션 레이어의 출력 이미지에서 합성곱을 계산하여 주요값을 뽑아 크기가 작게 출력하여 만듭니다.

아래의 그림을 보시면 4X4의 map에서 2X2 네칸으로 나눌수 있는데 각 칸의 최고 크기의 숫자를 뽑아서 2X2로 resize한 모습입니다.

 

본래 신경망은 인간의 신경계를 모사한 것인데 뉴런이 큰 신호에 반응하는 것과 유사합니다.

주요값을 뽑아서 resize시키는 max pooling을 거치면 노이즈 감소, 속도 증가, 영상의 분별력 강화등이 이점이 있습니다.

 

CNN은 overfitting(너무 학습시켜서 오히려 역효과가 발생하는 현상)을  방지할 수 있습니다.

 

keras에서 CNN을 이용하여 손글씨를 학습해보도록 하겠습니다.

from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

컨볼루션 레이어중 Conv2D 레이어를 사용했습니다. 영상인식에 주로 사용되는 레이어입니다.

 

Conv2D(32, (3,3) , activation ='relu', input_shape=(28,28,1))

32 : 컨볼루션 필터의 수 입니다.

(3,3) : 컨볼루션 커널의 행열입니다.

활성화 함수로는 'relu'를 이용하였습니다. 

input_shape=(28,28,1) : 입력값을 28X28 로 주었고, 흑백 사진인 채널1을 사용하였습니다.

 

MaxPooling2D(2,2) : 축소 비율을 2,2로 지정하였습니다.

 

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

Convolution과 MaxPooling 과정을 거쳤으니 주요 특징들만 추출 되었을 것입니다. 

추출된 주요 특징은 전결합층(Fully-connected)에 전달되어 학습됩니다. 위의 컨볼루션과 풀링의 과정은 2차원 자료를 다루지만 전결합층에 전달하기 위해선 1차원 자료로 바꿔줘야 합니다. Flatten의 원리는 아래의 사진과 같은 느낌입니다.

model.summary()

model.summary()를 이용하여 출력타입을 확인할 수있는데

 

conv2d_9 (Conv2D) (None,3,3,64) 에서

flatten_3 (Flatten) (None,576) 으로 바뀌었습니다.

 

즉 flatten 과정을 거쳐 3X3X64 = 576576으로 평탄화 되어 두개의 Dense층으로 들어갔습니다.

 

from keras.datasets import mnist
from keras.utils import to_categorical

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

 

학습할 데이터와 테스트할 데이터 셋을 설정했습니다. 

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, batch_size=64)
test_loss, test_acc = model.evaluate(test_images, test_labels)

모델을 컴파일 설정 후 테스트를 진행하는 과정입니다.

CNN을 이용한 손글씨셋 인식의 정확도는 0.9929정도 나왔습니다.

 

참고사이트

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

https://bskyvision.com/412

 

딥러닝 알고리즘의 대세, 컨볼루션 신경망(convolutional neural network, CNN)

인공지능이 핫하다. 핫한지 벌써 오래다. 인공지능이 발전하게 된 계기는 크게 세가지로 볼 수 있다. 딥러닝 알고리즘의 발전. 데이터량의 폭발적인 증가. GPU의 발전. 딥러닝 알고리즘은 가장 간단한 피드포워드..

bskyvision.com

https://sonofgodcom.wordpress.com/2018/12/31/cnn%EC%9D%84-%EC%9D%B4%ED%95%B4%ED%95%B4%EB%B3%B4%EC%9E%90-fully-connected-layer%EB%8A%94-%EB%AD%94%EA%B0%80/

 

CNN을 이해해보자. fully connected layer는 뭔가

*본 글은 개인 공부를 위해 복사 및 인용한 글들의 출처를 명시하고 적는 글입니다. 무단 도용 및 인용으로 인한 책임은 지지 않습니다. ​ 요즘 귀차니즘에 빠졌어요. 펜으로 적기 귀찮아서 제가 찾아본 내용들은 시간 순으로 쭉 정리해서 블로깅 하려고 합니다. 머리에서 필요하다고 생각하는 거를 바로바로 찾는 과정이라 많이 두서가 없을 수 있습니다 . 존댓…

sonofgodcom.wordpress.com

https://github.com/AhnSungJoo

 

AhnSungJoo - Overview

Machine Learning & Blockchain & Quant . AhnSungJoo has 34 repositories available. Follow their code on GitHub.

github.com

 

posted by devtang
2020. 3. 11. 16:58 개인 프로젝트

*2020년도 10월 교내 캡스톤경진대회 제품제작에 성공하였습니다

youtu.be/OwrC1YFvGH0

 

 

마스크 학습관련내용은 아래 게시물에 있습니다.

https://ultrakid.tistory.com/15

 

[Windows] 마스크 착용 유/무 판단을 위한 YOLO 학습

요즘 코로나 바이러스로 인해 전세계가 혼란입니다. 그래서 마스크를 착용하지 않으면 주변 사람에게 피해가 가니 항상 착용하도록 합시다!! 다름이 아니라 연구실에서 공부겸 간단한 개인 프��

ultrakid.tistory.com

코로나 바이러스로 요즘 전세계적으로 혼란인 가운데,

마스크를 착용하지않으면 상대적으로 타인에게 불안감을 조성할 우려가 있어서

마스크를 착용했을때 문이 열리게 되는 프로젝트를 만들었습니다.

개인적으로 시간이 날때마다 짬짬히 만들어보았습니다.

우선 구현 영상입니다.

https://youtu.be/fcFa_WhXNIo

 

 

라즈베리파이와 컴퓨터간 실시간 소켓 통신을 이용하였으며

컴퓨터에서는 YOLO를 이용한 마스크 착용 인식, 라즈베리에서는 소켓으로 통신받아 GPIO를 제어하였습니다.

 

HC-SR04 초음파센서

우선 사람이 문앞에 있다고 가정하기 위해 초음파센서를 이용하였습니다.

라디오 같이 생긴 이 센서는 송신부인 Trigger와 수신부인 Echo로 나뉘어있는데 송신부에서 초음파를 발사하면 물체에 부딪쳐 나오는 진동을 Echo에서 받은 시간을 이용하여 거리를 측정하는 방식입니다.

이 센서는 최대 4m까지 거리측정이 가능합니다.

 

 

 라즈베리파이와 브레드보드를 이용하여 연결해놓고 잘 작동하는지 테스트해봤습니다.

 LED는 초음파센서와 물체와의 거리가 100cm 이하로 일정 count동안 존재할때 켜지도록 해놨습니다.

 

 서보모터는 SG-90을 이용했으며 서보모터에 나무젓가락 세개를 테이프로 이어붙혀서 만들었습니다.

 출입문 역할로 만들었으며, 마스크를 쓰면 서보모터를 회전시켜 지나갈 수 있도록 만들었습니다.

 이제 남은건 윈도우 환경에서 인식한 결과를 라즈베리에 전송시켜 마스크를 썼을때 서보모터가 움직이게

 두가지를 합쳤습니다.

 

YOLO의 darknet 소스코드찾다 image_opencv.cpp 파일에서 class를 검출하는 소스코드를 찾아냈습니다.

/*********************************************INSERT CODE LINE*******************************************************/
if (strcmp(detectname, names[j]) != 0)
	{
		fp = fopen("***TXT파일위치***", "w");
		fwrite(names[j], strlen(names[j]), 1, fp);
		fclose(fp);
	}
/*********************************************INSERT CODE LINE*******************************************************/

제가 추가한 소스코드입니다. names[j]에 인식된 class의 이름이 저장되있습니다.

TXT파일을 fopen 함수를 이용하여 열어서 fwrite 함수로 TXT파일에 검출된 class를 적게 구현했습니다.

이제 소켓으로 class name을 보내기만 하면 됩니다.

 

윈도우 소켓 코드중 일부입니다.

while (1) 
	{
		fp = fopen("***TXT파일 위치***", "r"); //YOLO에서 검출된name을 적은 TXT파일 열기
		fscanf(fp, "%s", message); // 문장을 복사
		fclose(fp); // 파일닫기
		if (strcmp(message, pre_message) == 0)
			continue;
		else {
			strcpy(pre_message, message);
			printf("SEND : %s\n", pre_message); 
			send(hSocket, message, sizeof(message) - 1, 0); //send를이용하여 라즈베리로 전송
			
		}

	}

 

YOLO와 소켓을 둘다 실행시켜놓고 소켓은 계속 텍스트를 읽어서 보내주기만 합니다.

 

라즈베리파이에서 GPIO를 다루는 코드 중 일부입니다.

if distance <= 100: # *초음파센서와 물체간 거리가 100cm 이하일때
			f = open("라즈베리파이 TXT파일 위치",'r') #윈도우에서 받은 name을 읽기
			read_yolo = f.readline() # read_yolo 변수에 문장을 복사
			f.close()
			right = 'MASK'	
			count += 1 # count가 증가함 
			if count >= 4 and read_yolo == right: # count가 4이상 and 'MASK'라는 name을 받게되면
				# print(2)
				p.ChangeDutyCycle(12) # 서보모터를 올림
				time.sleep(1)
				GPIO.output(LED, GPIO.HIGH) # LED를 켬
				time.sleep(2)	
				p.ChangeDutyCycle(7.5) # 2초후 서보모터를 내림
				time.sleep(1)
				count = 0 # count를 0으로 초기화
				GPIO.output(LED,GPIO.LOW) # LED를 끔
			
			else: # 마스크를 쓰지 않으면 서보모터를 제어하지 않는다.
				continue

일정시간동안 출입문 앞에서 마스크를 끼고 있지 않은 상태로 서있으면 야속하게 문이 열리지 않습니다.

간단하게 GPIO를 제어하여 마스크 착용시에만 문이 열리는 시스템을 만들어 봤습니다.

나중에 추가적으로 소스 코드 수정 및 기능을 개선,추가하여 더 좋은 퀄리티로 만들어 보고 싶습니다.

 

 

posted by devtang
2020. 3. 10. 15:48 AI/YOLO

=========수정 ==========

마스크 착용 여부를 이용하여 교내 경진대회의 출전한 UCC영상입니다. 

youtu.be/OwrC1YFvGH0

========================

요즘 코로나 바이러스로 인해 전세계가 혼란입니다.

그래서 마스크를 착용하지 않으면 주변 사람에게 피해가 가니 항상 착용하도록 합시다!!

다름이 아니라

연구실에서 공부겸 간단한 개인 프로젝트를 진행해보고 있습니다. 시국이 시국인지라 마스크를 착용해야 문이 열리는 그런 시스템을 만들어보고자 하는데 착용 유무를 판단하기 위하여 YOLO를 이용하기로 했습니다.

 

class는 2가지로, 마스크를 쓴사람, 안쓴사람으로 나눠 학습했습니다. YOLO_MARK를 이용하여 라벨링 작업하였습니다.

Windows에서 학습을 진행하였으며, 컴퓨터환경은 인텔 CPU i5-6600 3.30Ghz ,NVIDIA GeForce GTX 1050 Ti 입니다.

 

 마스크를 쓴얼굴 500장, 안쓴얼굴 500장 정도 모아서 수동으로 라벨링 작업을 진행했습니다.

사실 딥러닝 학습시에 class당 500장의 사진은 굉장히 소량입니다. 추후에 더 괜찮은 아이디어가 생기면 

더 기능을 추가할 예정입니다. 연구실에서 간단한 프로젝트로 학습겸 진행해보았습니다.

 

이미지를 라벨링 하게되면 txt파일이 생기는데 파일 안에는 class num와 각 사진의 라벨을 딴 좌표값이 들어있습니다.

참고로 이미지는 크롤링을 이용하여 구글에서 사진을 뽑아서 학습에 이용가능한 사진 500장씩만 분류했습니다.

 

정상적으로 확인이 되고있습니다.

 

123: 0.814543, 1.045863 avg loss, 0.001000 rate, 5.422000 seconds, 7872 images

 

123: 현재 훈련/Batch 를 몇번 반복했는지 나타냅니다.

0.814543 : 총 손실을 나타냅니다.

1.045863 avg : 평균 손실 오차로써 최대한 낮을때까지 학습을 시켜줘야합니다. 보통 저는 0.020000정도 아래로 내려가면 학습을 중지 시킵니다.

0.001000 rate : cfg 파일안에 정의된 학습 속도 비율을 나타냅니다.

5.422000 seconds : 1batch를 학습시키는데 소요된 시간을 나타냅니다.

7872 images : 지금까지 학습에 사용된 이미지의 총갯수를 나타냅니다.

 

위의 사진은 학습한지 얼마 안됬을때 캡쳐한 사진입니다. 20000번 넘게 학습시켜본결과 제 컴퓨터로는 하루좀 넘게 켜뒀던 것 같습니다.

 

위의 사진은 약 2만 2천번 학습시켰을때 나타난 학습곡선으로 이정도로 학습된 weights 파일로 구동시켜봤습니다.

 

아래는 구현 사진과 동영상 입니다.

 

30fps정도 나오며 인식률도 500장의 데이터 치고는 양호합니다.

마스크를 꼈을때, Mask 93% 정도로 인식합니다.

 

마스크를 벗게되면, 마스크를 착용하지 않은 class이름을 NO_MASK로 정의했습니다.

역시 90%이상으로 인식합니다.

 

 

 

추가적으로 라즈베리파이GPIO와 소켓통신을 이용하여 마스크를 끼지 않았을때 출입을 하지 못하도록 막는 시스템을 구현할 예정입니다.

감사합니당. 

'AI > YOLO' 카테고리의 다른 글

[YOLO] 윈도우 버전 YOLOv3 설치 Guideline  (35) 2020.07.22
YOLO 학습시 cfg 파일 설정(anchors)  (3) 2020.03.20
posted by devtang
2020. 2. 28. 14:43 Jetson Nano

NVIDIA에서 수백만개의 지능형 시스템 구축을 할수 있는 초소형 컴퓨터 Jetson nano를 출시했습니다.

Jetson nano

 

Bringing the Power of AI to Millions of Devices

NVIDIA Jetson Nano enables the development of millions of new small, low-cost, low-power AI devices.

www.nvidia.com

가격은 99달러로 우리나라에서 약 12~13만원에 구매가 가능합니다.

학생들이나, 개발자, 발명가들이 합리적인 가격으로 최신 AI를 구동할 수 있게 됬습니다.

 

라즈베리파이와 마찬가지로 SD카드에 이미지를 구워 구동시킬 수 있으며,

기본적인 사양은 라즈베리파이보단 성능이 조금 뛰어납니다.

사양은 1.4GHz 쿼드 코어 ARM A57 CPU, 128 코어 NVIDIA Maxwell GPU 및 4GB RAM를 갖추고 있습니다.

 

 

또한 Jetson nano에는 40개의 GPIO핀이 있어서 LED,모터,센서 등과 연결할 수 있습니다.

단점으로는 와이파이가 지원이 안되서 동글을 사용하거나 랜카드를 사용해야합니다.

라즈베리파이와 마찬가지로 sd카드에 os를 갖추어 꽂아서 사용하게 되어있습니다.

OS를 설치하기 위해서는, 아래 사이트에서 Jetson Nano Developer Kit SD Card Image 를 설치해야합니다.

https://developer.nvidia.com/embedded/downloads

 

Jetson Download Center

Get downloadable documentation, software, and other resources for the NVIDIA Jetson ecosystem.

developer.nvidia.com

이미지 파일을 다운받아서 압축을 풀고 난후, Win32DiskImager를 이용하여 os 세팅을 해줍니다.

sd-blob-b01.img 

sd 카드리더기를 이용하여 Write 버튼을 눌러줍니다.

100%될때까지 기다려줍니다.

끝나고 완료되고 나면 왼쪽하단에 Done. 표시와 함께 디스크를 사용하기 전에 포맷해야 한다는 문구가 열개이상 뜨는데

이때 모두 취소버튼을 눌러줍니다.

 

이렇게 하면 SD카드에 우분투가 세팅이 완료됩니다. 이제 SD카드를 Jetson nano에 부착시켜줍시다.

 

마이크로 USB로도 전원 연결을 할 수 있지만, 전력이 낮아 꺼지게 될 가능성이 높습니다.

저는 무선 마우스,키보드, 와이파이 동글을 이용하고 있으므로 전력소모가 커 5V DC어댑터를 전원으로 연결시켰습니다.

 

초록색 NVIDIA 문구와 함께 부팅이 시작됩니다.

우분투 기본 환경 설정중입니다.

자 모든설정이 완료가되고 정상적으로 Jetson nano에 OS를 깔았습니다.

다음엔 OpenCV를 설치하는 포스팅을 게시하겠습니다.  

posted by devtang
prev 1 2 next