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

Notice

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. 26. 15:38 OpenCV

OpenCV를 이용하여 비주얼 스튜디오 2015 에서 지정된 이미지를 축소 하고 회전시킬 수 있습니다.

 

 

먼저 코드를 실행시킨 모습입니다.

원본 사진의 크기와 축소시킨 사진의 크기를 비교했습니다.

원본 사진의 해상도는 1280 X 1920이며 1/4 크기, 320 X 480로 축소시켰습니다.

	Mat image; // 빈 영상 생성
	image = imread("woman.JPG", IMREAD_COLOR); //이미지 읽기

	if (image.empty()) //이미지를 제대로 읽을 수 없으면 에러 메시지 출력
	{
		printf("Loading Error!");
		return 0;
	}

	/*콘솔창에 띄워주기*/
	printf("Original image is %d x %d\n", image.rows, image.cols);
	namedWindow("Original image"); // 원본 이미지를 전시할 창 만들기 
	imshow("Original image", image); // 원본 이미지 보여주기



	/* 축소 이미지띄우기 */
	Mat resized_image; //축소된 이미지 저장
	resize(image, resized_image, Size(), 0.25, 0.25, INTER_AREA);  //원본 이미지 크기 조정하기. 가로 세로 모두 1/4로 축소. 
	printf("Resized image is %d x %d\n", resized_image.rows, resized_image.cols); // 축소된 이미지 사이즈 출력
	namedWindow("Resized image");
	imshow("Resized image", resized_image); // 축소된 이미지 보여주기

이미지를 imread 함수로 불러온 후 resize 함수를 이용하여 0.25(1/4)로 축소하도록 선언했습니다.

상세 기능은 주석으로 달았습니다.

 

이번에 쓴 기능은 원본사진의 크기만큼 빈 이미지파일을 생성시킨후에 축소된 사진을 복사하여 넣었습니다.

 

/* 축소 이미지->원본사이즈에 대입 */
	Mat cover_image(image.rows, image.cols, CV_8UC3); // 원본사이즈만큼의 빈 이미지 생성
	resized_image.copyTo(cover_image(Rect(100, 100, resized_image.cols, resized_image.rows))); //축소한 이미지를 원본사이즈크기에 결합
	imshow("covered_image", cover_image);

cover_image라 이름을 짓고, copyTo를 이용하여 복사하여 넣습니다.

 

마지막으로 사진을 원하는 각도만큼 회전시킬 수 있습니다.

 

/*회전 이미지 띄우기 */
	Mat rotation; // 회전할 이미지
	Point2f pt(resized_image.cols / 2., resized_image.rows / 2.); //Point2f 로 회전시킬 이미지의 중심 설정 (정중앙)
	Mat r = getRotationMatrix2D(pt, 45, 0.7); // 사진 회전시키기 (사진 중앙값, 회전값, 사진 비율) 
	warpAffine(resized_image, rotation, r, Size(resized_image.cols, resized_image.rows)); //설정해준 값을 회전시켜줌
	imshow("rotate_image", rotation);

Point2f로 이미지를 회전시킬 때 중심을 설정해줍니다.

축소한 사진의 가로,세로에 2로 나누면 정중앙을 기준으로 회전합니다.

getRotationMatrix2D()함수를 이용해 각도, 사진의 크기 비율을 조절하여 회전시킬 준비를합니다.

warpAffine()함수는 설정해준 값을 기준으로 회전 시켜줍니다.

 

아래는 전체 소스입니다.

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

using namespace cv;

int main()

{

	Mat image; // 빈 영상 생성
	image = imread("woman.JPG", IMREAD_COLOR); //이미지 읽기

	if (image.empty()) //이미지를 제대로 읽을 수 없으면 에러 메시지 출력
	{
		printf("Loading Error!");
		return 0;
	}

	/*콘솔창에 띄워주기*/
	printf("Original image is %d x %d\n", image.rows, image.cols);
	namedWindow("Original image"); // 원본 이미지를 전시할 창 만들기 
	imshow("Original image", image); // 원본 이미지 보여주기



	/* 축소 이미지띄우기 */
	Mat resized_image; //축소된 이미지 저장
	resize(image, resized_image, Size(), 0.25, 0.25, INTER_AREA);  //원본 이미지 크기 조정하기. 가로 세로 모두 1/4로 축소. 
	printf("Resized image is %d x %d\n", resized_image.rows, resized_image.cols); // 축소된 이미지 사이즈 출력
	namedWindow("Resized image");
	imshow("Resized image", resized_image); // 축소된 이미지 보여주기

	/* 축소 이미지->원본사이즈에 대입 */
	Mat cover_image(image.rows, image.cols, CV_8UC3); // 원본사이즈만큼의 빈 이미지 생성
	resized_image.copyTo(cover_image(Rect(100, 100, resized_image.cols, resized_image.rows))); //축소한 이미지를 원본사이즈크기에 결합
	imshow("covered_image", cover_image);

	/*회전 이미지 띄우기 */
	Mat rotation; // 회전할 이미지
	Point2f pt(resized_image.cols / 2., resized_image.rows / 2.); //Point2f 로 회전시킬 이미지의 중심 설정 (정중앙)
	Mat r = getRotationMatrix2D(pt, 45, 0.7); // 사진 회전시키기 (사진 중앙값, 회전값, 사진 비율) 
	warpAffine(resized_image, rotation, r, Size(resized_image.cols, resized_image.rows)); //설정해준 값을 회전시켜줌
	imshow("rotate_image", rotation);

	waitKey(0);

	return 0;

}

감사합니다.

'OpenCV' 카테고리의 다른 글

[Python] OpenCV 비디오 출력하기  (0) 2020.07.29
[Python] OpenCV 이미지 출력하기  (0) 2020.07.29
posted by devtang
prev 1 next