블로그 이미지
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

2021. 1. 5. 20:41 개인 프로젝트

안녕하세요. 요새 코로나도 심해지는 와중에 건강 조심하시기 바랍니다.

집에서 코딩하는 것을 추천드려요~

 

 

 

이번 게시물에서는 딥러닝을 이용하지 않고

OpenCV를 이용하여 자동차 번호판 글꼴의 숫자를 인식하는 프로젝트를 작성합니다.

아직 자동차 번호판을 곧바로 인식하기엔 어려움이 있기 때문에 자동차 번호판의 숫자 글꼴을 인식하는 프로젝트로 진행하였습니다.

 

딥러닝을 이용해보신적이 있으시다면 숫자인식은 어떻게보면 "Hello World"같은 예제일정도로 쉬운 일입니다.

숫자나 어떤 이미지를 인식한다고 하면, 딥러닝에서는 데이터에서 특징을 추출하여 학습을 하여 인식을합니다.

그러나 OpenCV 라이브러리만을 이용하여 인식한다면 꽤나 생각해야할 부분이 많습니다..

본 게시물에서 진행한 숫자인식은 이런방법으로도 접근할 수 있구나라고 생각하고 봐주시면 감사하겠습니다.

 

제가 진행한 프로젝트의 흐름도는 다음과 같습니다.

우선 간단하게 요약하자면 숫자인식을 하기 위해 이미지 전처리, 관심영역 추출, 히스토그램 생성의 과정을 거칩니다.

 

표준 숫자 0~9 까지에 대해 위의 세과정을 거쳐서 표본을 만든후에

테스트할 숫자를 넣어 위와 같은 과정을 거쳐 표본 히스토그램의 픽셀수와 테스트 이미지 히스토그램의 픽셀수를 비교하여 가장 적게 차이나는 히스토그램을 가진 숫자를 인식된 숫자로 판정합니다. 

 

이미지 전처리

 

#define _CRT_SECURE_NO_WARNINGS

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	Mat original_image; //image read(grayscale)
	Mat binary_image; //binary image


	original_image = imread("1.jpg", IMREAD_GRAYSCALE); //grayscale
	threshold(original_image, binary_image, 127, 255, THRESH_BINARY); //threshold

	imshow("grayscale", original_image);
	imshow("binary", binary_image);
	waitKey(0);
}

OpenCV를 이용하면 간단하게 이미지를 불러와서 그레이스케일 변환과 이진화를 진행할 수 있습니다.

 

이진화를 진행할때 threshold 값을 정해주어야 합니다. 그림에서 보이는 것과 같이 0이라는 숫자에

이미지의 quality가 좋지않아 noise가 발생되어있는데 0과 255 두개로만 픽셀을 깔끔하게 표현하기 위해서는

0의 윤곽쪽을 제외하고는 모두 255(흰색)으로 만들어줍니다. 

 

입력된 기본 original image를 그레이스케일 변환과 이진화를 진행한 사진입니다.

컬러 이미지를 흑백으로 전환하여 1채널(0~255)의 값으로 변경후 숫자 이미지의 픽셀을 0255로만 이루어지게 이진화를 거쳐 연산에 효율성과 인식율을 향상할 수 있었습니다.

 

이렇게 전처리를 진행함으로써 이미지의 픽셀에 접근하여 연산하는 과정 및 픽셀을 확인하는 과정을 효율적으로

진행할 수 있습니다. 

 

관심 영역 추출

이제 이진화까지의 과정을 거쳐서 0과 255로만 구성된 이미지를 얻었습니다.

다음 단계는 숫자 이외의 불필요한 배경들을 제거하여 숫자의 해당하는 픽셀의 연산에 조금더 정확하고 효율적으로

진행할 수 있도록 관심 영역의 x축 최소,최대 y축 최소,최대 좌표를 구하여 자르는 과정입니다. 

아래의 그림을 보면 이해가 쉽게 될 것 같습니다.

 

 

그림의 가로축을 X, 세로축 Y으로 놓았을때 좌측 상하단 우측 상하단을 순차적으로 돌면서 0의 라인에 해당하는

최솟값 최대값을 찾아냅니다. X-MIN ,X-MAX, Y-MIN , Y-MAX 값만 찾아내면 그값을 기준으로 자르면 되니까요.

 

#define _CRT_SECURE_NO_WARNINGS

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	Mat original_image; //image read
	Mat binary_image; //binary image
	Mat roi_image; //roi image

	int x_count[200] = { 0, };
	int y_count[200] = { 0, };
	int x_min = 0, x_max = 0, y_min = 0, y_max = 0;
	int status = 0, pixel_count = 0;

	original_image = imread("0.jpg", IMREAD_GRAYSCALE); //grayscale
	threshold(original_image, binary_image, 127, 255, THRESH_BINARY); //threshold


 /************************** ROI 좌표 찾기 *****************************/
	for (int x = 0; x < binary_image.rows; x++) //x좌표 최솟값
	{
		for (int y = 0; y < binary_image.cols; y++)
		{
			if (binary_image.at<uchar>(y, x) == 0)
			{
				x_min = x;
				status = 1;
				break;
			}
			if (status == 1)
				break;
		}
	}
	status = 0;

	for (int y = binary_image.cols - 1; y >= 0; y--) //x좌표 최댓값
	{
		for (int x = binary_image.rows - 1; x >= 0; x--)
		{
			if (binary_image.at<uchar>(y, x) == 0)
			{
				x_max = x;
				y_max = y;
				status = 1;
				break;
			}
			if (status == 1)
				break;
		}
	}
	status = 0;

	for (int y = 0; y < binary_image.cols; y++) //y좌표 최솟값
	{
		for (int x = 0; x < binary_image.rows; x++)
		{
			if (binary_image.at<uchar>(y, x) == 0)
			{
				y_min = y;
				status = 1;
				break;
			}
			if (status == 1)
				break;
		}
	}
	status = 0;

	for (int x = binary_image.rows - 1; x >= 0; x--) //y좌표 최댓값
	{
		for (int y = binary_image.cols - 1; y >= 0; y--)
		{
			if (binary_image.at<uchar>(y, x) == 0)
			{
				if (y >= y_max)
					y_max = y;
				if (x >= x_max)
					x_max = x;
				status = 1;
				break;
			}
			if (status == 1)
				break;
		}
	}
	status = 0;
/************************** ROI 좌표 찾기 *****************************/

	roi_image = binary_image(Rect(Point(x_min, y_min), Point(x_max, y_max)));
	resize(roi_image, roi_image, Size(200, 200), 0, 0, INTER_LINEAR);

	rectangle(binary_image, Rect(Point(x_min, y_min), Point(x_max, y_max)), Scalar(0, 0, 100), 1, 4, 0);

	imshow("original", original_image);
	imshow("bin", binary_image);
	imshow("roi_image", roi_image);

	waitKey(0);
}

본 코드에는 나와있지 않지만 테스트겸 line을 그려주는 함수를 이용한 사진입니다.

 

위의 코드를 숫자 0을 입력하여 얻은 이미지입니다.

좌표가 올바르게 찾아졌는지 rectangle 함수를 이용하여 관심영역에 사각형을 그려보았습니다.

 

좌상하단 , 우상하단 = 4번의 연산이 필요합니다.

이중 for문을 이용하여 간단하게(?) 구현할 수 있습니다.

좌표를 찾았을때 break문을 걸어 탈출하며 flag를 바꾸는 방식으로 구현해보았습니다.

사실 코딩실력이 좋은편이 아니기 때문에 다소 난잡할 수 있으나,

구현적인 측면도 중요했기 떄문에 코드가 난잡하더라도 귀엽게 주니어 개발자를 봐주시면 감사하겠습니다.

	roi_image = binary_image(Rect(Point(x_min, y_min), Point(x_max, y_max)));
	resize(roi_image, roi_image, Size(200, 200), 0, 0, INTER_LINEAR);

 

주의할 코드부분은 관심영역을 자르고 나서 원본 사진의 해상도와 맞게 resize를 시켜주었습니다.

OpenCV에서는 resize 진행시 보간법(interpolation methods)을 지정해줄 수 있습니다. 
대표적으로 INTER_CUBIC ,INTER_LINEAR 등이 있습니다만, INTER_CUBIC을 사용하면 보다 더 선명한 이미지를 얻을수 있다고 합니다. 그러나 저는 INTER_LINEAR 방식으로 진행하였습니다.

 

 

히스토그램 생성

관심영역이 추출된 이미지를 가지고 본격적으로 인식에 가장 필요한 히스토그램을 생성하는 파트입니다.

 

히스토그램이란?

 

히스토그램(Histogram)은 표로 되어 있는 도수 분포를 정보 그림으로 나타낸 것입니다.

그러나 이미지 히스토그램은 이야기가 조금 다릅니다.

 

이미지 히스토그램은 가로축(x축) 에는 이미지의 픽셀 값을 나타내는 좌표값이고, 세로축(y축)으로는 픽셀의 수를 나타내는 좌표값입니다. 히스토그램으로 이미지의 대비(Contrast)나 빛의 강도 등을 나타낼 수도 있기 때문에, 이미지에서 어떤 특징점이 어느정도 분포하고 있는지 알 수 있는 그래프라고 볼 수 있습니다.

 

0과 9에대한 히스토그램... 별 차이가 없다.

저는 본 프로젝트를 진행하면서, 그레이스케일 변환한 숫자에 대해 히스토그램을이용하여 숫자 0~9 까지의 히스토그램을 모두 그려보았으나 뚜렷한 특징을 찾을 수가 없었습니다. 따라서 아래의 그림과 같이 진행하였습니다.

 

 

 

 

x축좌표에 대한 0에 해당하는 픽셀 개수를 표현

 

y축좌표에 대한 0에 해당하는 픽셀 개수를 표현

 

가로, 세로 축 좌표를 기준으로 숫자의 픽셀(검정색)의 개수를 카운팅하여, 빈 검정색 이미지에 line함수로 픽셀의 개수만큼 그려주었습니다. 축의 기준을 나눠서 히스토그램을 생성한 이유는 기존 히스토그램 사용시에, 밝은 픽셀과 어두운 픽셀의 분포를 표시하기 때문에 입력되는 이미지의 숫자의 크기에 따라 오인식 하는 확률이 크기 때문에 위와 같이 진행했었습니다.

 

x축 좌표에 대한 히스토그램 을 보면 가로축은 x가 0부터 image의 rows까지 , 세로축은 픽셀의 개수를 나타내었고

y축 좌표에 대한 히스토그램 역시 보면 가로축은 y가 0부터 image의 cols까지, 세로축은 픽셀의 개수를 나타내었습니다.

 

/************************** ROI 좌표 찾기 *****************************/

	roi_image = binary_image(Rect(Point(x_min, y_min), Point(x_max, y_max)));
	resize(roi_image, roi_image, Size(200, 200), 0, 0, INTER_LINEAR);

	Mat x_hist_image = Mat::zeros(roi_image.rows, roi_image.cols, CV_8U);
	Mat y_hist_image = Mat::zeros(roi_image.rows, roi_image.cols, CV_8U);
	Mat total_hist_image = Mat::zeros(roi_image.cols, roi_image.rows * 2, CV_8U);
	/**************************   histogram    ****************************/
	for (int y = 0; y < roi_image.rows; y++) //y축 히스토그램
	{
		pixel_count = 0;
		for (int x = 0; x < roi_image.cols; x++)
		{
			if (roi_image.at<uchar>(x, y) == 0)
			{
				pixel_count++;
			}
		}
		y_count[y] = pixel_count;

	}



	for (int x = 0; x < roi_image.cols; x++) //x축 히스토그램
	{
		pixel_count = 0;
		for (int y = 0; y < roi_image.rows; y++)
		{
			if (roi_image.at<uchar>(x, y) == 0)
			{
				pixel_count++;
			}
		}
		x_count[x] = pixel_count;
	}
	for (int x = 0; x < roi_image.rows; x++) //x축 히스토그램 그리기
		line(x_hist_image, Point(x, roi_image.rows), Point(x, roi_image.rows - x_count[x]), Scalar(255, 255, 255), 0);

	for (int y = 0; y < roi_image.cols; y++) //y축 히스토그램 그리기
		line(y_hist_image, Point(y, roi_image.cols), Point(y, roi_image.cols - y_count[y]), Scalar(255, 255, 255), 0);

	/* 통합 히스토그램 그리기 */
	for (int x= 0; x < roi_image.rows; x++) 
		line(total_hist_image , Point(x + 200, roi_image.rows), Point(x+200, roi_image.rows - x_count[x]), Scalar(255, 255, 255), 0);
	for (int y = 0; y < roi_image.cols; y++)
		line(total_hist_image, Point(y, roi_image.cols), Point(y, roi_image.cols - y_count[y]), Scalar(255, 255, 255), 0);

	/**************************   histogram    ****************************/

	imshow("x_hist", x_hist_image);
	imshow("y_hist", y_hist_image);
	imshow("original", original_image);
	imshow("bin", binary_image);
	imshow("roi_image", roi_image);
	imshow("total", total_hist_image);
	waitKey(0);
}

코드 중 가로 세로축 히스토그램을 그리는 코드의 일부입니다.

위의 코드 역시 이중 for문을 이용하여 이미지의 행 ,열을 훑어 연산하면서 픽셀의 카운트를 진행하였습니다.

테스트할 이미지의 데이터와 비교할 표준 숫자 데이터 0~9까지의 히스토그램을 모두 생성하여 저장하였습니다.

 

그림과 같이 각 숫자마다 모두 다른 히스토그램을 확인할 수 있습니다.

이제 표준 데이터의 히스토그램을 모두 저장하였으니,

테스트할 숫자 이미지 역시 지금까지 진행했던 방식으로 히스토그램을 생성합니다.

 

테스트할 숫자 데이터는 인터넷에서 자동차 번호판의 숫자를 찾아서 아래 그림과 같이 크기와 위치가 다르게 저장하여 진행하였습니다.

 

/* compare */
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			for (int y = 0; y < total_hist_image[i].cols; y++) //y축 히스토그램
			{
				for (int x = 0; x < total_hist_image[i].rows; x++)
				{
					if (total_hist_image[i].at<uchar>(x, y) != test_total_hist_image[j].at<uchar>(x, y))
						test_check_sum[i]++;
				}
			}
			if (check_sum[i] <= min)
				min = test_check_sum[i];
		}
		if (test_check_sum[i] == min)
			min = i;
		detect_num[i] = min;
	}
    
    /* compare */

표준 히스토그램 데이터와의 픽셀차이를 계산하는 코드중 일부입니다.

 

본 코드가 관심영역 추출이 올바르게 되는지, 글자의 크기에 영향을 미치지 않는지 테스트를 진행해보았습니다.

 

youtu.be/1li7GSmIwqk

 

 

테스트할 숫자 이미지가 입력이 되면 표준 숫자 데이터 0~9 를 각각 비교하면서 픽셀차이가 가장 적은 숫자를

인식하는 숫자로 판정하였습니다. 위의 사진과 같이 똑같은 글꼴이지만 위치와 숫자의 크기를 달리 하여도 표준 히스토그램의 특징과 뚜렷하게 다른점이 거의 없습니다.

 

테스트 숫자의 픽셀이 관심영역을 추출하면서 resize되어

글꼴이 깨져도 숫자의 본 모습은 크게 바뀌지 않아서 그런것 같습니다.

한계점..

 

본 프로젝트에서 진행한 숫자인식 방법은 가로 세로축을 기준으로 픽셀의 개수를 측정하였기 때문에 숫자가 조금만 회전이 되어도 오인식 하는 경우가 많았습니다..

 

회전이나 글꼴 차이에 해당하는 경우의 수는 고려하지 않고 반영하였기 때문에 본프로젝트는 추후에 더욱 좋은 구상을 통해 보완해야할 것 같습니다. 추후에 더욱 좋은 구상을 통해 보완하게 된다면 비교적 무거운 딥러닝을 사용하지 않고도 자동차 번호판을 인식할 수 있는 프로그램을 만들 수 있기 때문에 제한된 하드웨어 성능내에서 효율적인 시스템을 만들수 있을 것 같습니다.

 

본 프로젝트는 자동차 번호판 숫자 인식을 위한 프로젝트의 일부로 진행하였습니다.

막상 딥러닝을 이용할때는 몰랐는데 딥러닝의 필요성을 알게되는 프로젝트 중 하나였습니다. 영상처리에 대한 공부를 진행하면서 숫자 인식을 위해 진행했던 부분들이 흥미로운점이 많았던 것 같습니다.

 

긴 게시물 읽어주셔서 감사합니다.

 

posted by devtang
2020. 7. 29. 16:57 OpenCV

 

오늘은 OpenCV를 이용하여 비디오를 읽어오는 예제를 진행해보겠습니다.

 

 

import cv2

def readVideo():
    try:
        cap = cv2.VideoCapture('1.mp4')
    except:
        print('ERROR')
        return

    while True:
        ret, frame = cap.read()

        if not ret:
            print('Error')
        

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        #cv2.imshow('frame',frame)
        cv2.imshow('frame',gray)

        k = cv2.waitKey(1) & 0xFF
        if k == 27:
            break
    cap.release()
    cv2.destroyAllWindows()

readVideo()

 

 

우선 전체 코드입니다.

readVideo()라는 함수를 생성하여 진행하였습니다.

 

cv2.VideoCapture() : 비디오를 읽어오기위한 함수입니다. 인자에 동영상을 지정하면 동영상을 읽어오고

0 이나 1을 넣으면 웹캠도 실시간으로 읽어올 수 있습니다. 일반적으로 웹캠은 0이면 연결이됩니다.

이번 예제는 영상을 Grayscale로 변환하여 출력해보겠습니다.

BGR->Grayscale로 변환하기 위해서는 cv2.COLOR_BGR2GRAY 를 사용합니다.

BGR->HSV로 변환하기 위해서는 cv2.COLOR_BGR2HSV 를 사용합니다.

 

 

                       

 

 

 

 

'OpenCV' 카테고리의 다른 글

[Python] OpenCV 이미지 출력하기  (0) 2020.07.29
[Windows] OpenCV를 이용한 이미지 축소 , 회전  (0) 2020.02.26
posted by devtang
2020. 7. 29. 16:25 OpenCV

오늘은 OpenCV를 이용하여 이미지를 출력하는 예제에 대해 알아보도록 하겠습니다.

 

 

예제 코드 입니다.

우선 OpenCV를 import 해주시고 예제 사진으로는 강아지 사진을 사용했습니다.

import cv2

image = 'doge.jpg'

img_color = cv2.imread(image, cv2.IMREAD_COLOR)
img_gray = cv2.imread(image,cv2.IMREAD_GRAYSCALE)
img_alpha = cv2.imread(image,cv2.IMREAD_UNCHANGED)

cv2.imread 는 opencv에서 이미지를 read하기 위한 함수입니다.

 

여기서 이미지를 읽어올때 플래그중 세가지만 예제로 돌려보았는데

IMREAD_COLOR : 이미지 원본 그대로를 컬러로 출력합니다.

IMREAD_GRAYSCALE : 이미지를 흑백 사진으로 출력합니다.

IMREAD_UNCHANGED : 이미지를 Alpha-channel 을 포함하여 출력합니다. 이것은

우리가 아는 RGB 채널에 Alpha 채널을 추가한것인데, Alpha 는 이미지의 투명도(Transparent)를 나타낸 것인데, 

RGB 처럼 색을 표현하는 값이 아니라 컴퓨터에서 렌더링할 때 쓰이는 보조적인 값입니다.

 

cv2.imshow('frame',img_color)
cv2.imshow('frame2',img_gray)
cv2.imshow('frame3',img_alpha)
cv2.waitKey(0)
cv2.destroyAllWindows()

이제 opencv의 imshow 함수를 이용하여 이미지를 화면에 띄웁니다.

 

cv2.waitKey() : 지정된 시간동안 키보드 입력을 기다리는 함수로써, 기본단위는 1/1000초 = ms 입니다.

예를들어서 cv2.waitKey(1)를 입력하였으면 1ms 동안 대기한다는 뜻이고, 0을 넣었으므로 키보드 입력이 발생하기 전까지 기다리는 뜻입니다.

cv2.destroyAllWindows() : 생성했던 윈도우 창을 모두 지웁니다. 

 

강아지가 정상적으로 로드되는데 성공했습니다.

 

'OpenCV' 카테고리의 다른 글

[Python] OpenCV 비디오 출력하기  (0) 2020.07.29
[Windows] OpenCV를 이용한 이미지 축소 , 회전  (0) 2020.02.26
posted by devtang
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. 3. 13:19 AI/Keras

본 글은 Windows 10 환경에서 Anaconda에 가상환경을 세팅하여 진행하였습니다.

 

Faster R-CNN

Faster R-CNN 구조

Faster R-CNN의 가장 핵심 부분은 Region Proposal Network(RPN) 입니다.

R-CNN은 이미지 내에 객체가 존재할 것 같은 위치를 제안 하면, 제한된 위치의 이미지를 잘라냅니다.

잘라낸 이미지의 feature map을 추출하여 그것에 대해 CNN(Convolutional Neural Network)을 사용했습니다.

 

하지만 Faster R-CNN은 잘라낸 영역마다 CNN을 사용하는것이 아니라 이미지 전체를 CNN에 통과시킨 후,

큰 feature map을 추출해내어  제안된 영역을 feature map에 투영하는 방식입니다.

즉 여러번 처리할일을 한번에 하게되어 처리속도가 전 모델보다 훨씬 빨라졌으며, 전작 대비 정확도가 상승했습니다.

 

우선 Anaconda 과Visual C++ 2015 Build Tools 가 설치되있는 가정하에 진행하겠습니다.

 

아나콘다 프롬프트창을 열어줍니다. 저는 가상환경이름을 fasterRCNN으로 지었습니다.

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

가상환경이 설정된 후 가상환경으로 진입합니다.

activate fasterRCNN

진입하면 다음과 같습니다.

pip install tensorflow-gpu==1.4

pip install keras==2.0.3

pip install numpy==1.15
pip install sklearn h5py

pip install opencv-python ipython

필요한 요소들을 설치해줍니다. (cudatoolkit==8.0 cudnn==5.1 버전사용, 혹시나 cuda 관련 에러뜰시 따로 설치필요!)

 

그리고 faster R-CNN을 git에 들어가서 다운로드해줍니다.

https://github.com/you359/Keras-FasterRCNN

 

you359/Keras-FasterRCNN

keras implementation of Faster R-CNN. Contribute to you359/Keras-FasterRCNN development by creating an account on GitHub.

github.com

저는 이폴더를 바탕화면에 두었습니다.

 

그리고 예제에 필요한 웨이트파일을 다운받아서 git에서 받은 faster rcnn폴더에 넣어줍니다.

 

이제 예측할 input image를 넣을 폴더를 생성해줍니다.

(fasterRCNN) C:\Users\@USERNAME@\Desktop\keras-frcnn-master>mkdir images

images 폴더안에 자신이 예측하고싶은 사진을 넣습니다.

저는 YOLO 예제돌릴때 쓰는 개사진과 바다에 배가 떠있는 사진을 예제로 테스트해봤습니다.

(fasterRCNN) C:\Users\@USERNAME@\Desktop\keras-frcnn-master>python test_frcnn.py -p images

 

제 컴퓨터의 그래픽카드는 GTX1050TI이며 한사진당 detection 시 2초정도 걸린것 같습니다.

 

참고사이트

https://github.com/you359/Keras-FasterRCNN

 

you359/Keras-FasterRCNN

keras implementation of Faster R-CNN. Contribute to you359/Keras-FasterRCNN development by creating an account on GitHub.

github.com

https://inspace4u.github.io/dllab/lecture/2017/09/09/Keras_FRCNN_Testing.html

 

Keras 기반 F-RCNN 실습

본 포스트에서는 Keras 기반으로 구현한 Faster RCNN 코드를 직접 실행 및 실습해 보겠습니다. 실행 환경 이 예제에서는 기본적인 Tensorflow와 Keras 이외에 이미지 처리를 위한 OpenCV 라이브러리와 대용량 데이터를 다루는 포맷인 hdf5를 지원하기 위한 h5py 패키지가 추가로 필요합니다. 만약 Windows 10에서 텐서플로우, 케라스 오프라인 설치 또는 Windows 7 포스트의 설명을 따라 환경을 구축하셨다면 이 두 패키지가

inspace4u.github.io

2020-08-12 수정 내용

weights 파일이 본글에서 만료되어서 아래 링크를 클릭하시면 다운받으실 수 있습니다!!

https://drive.google.com/file/d/1oQbhyRJFLRmbd9d2msAZCL77_nXbJvLR/view?usp=sharing

 

model_frcnn.hdf5

 

drive.google.com

config.pickle
0.00MB

 

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
prev 1 2 3 4 next