초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

[AI X 자동 손 세정제 키트] 마스크 착용 유무를 확인하여 자동 펌핑하기!

2021-02-04 10:01:32

개요

 

자동 손 세정제는 잘 만들어 보셧나요?

코로나로 인해 단순하게 펌프를 누르는 것도 꺼려질 정도로 위생에 많이 민감해진 것을 느낍니다.

자동 손 세정제도 이러한 이슈로 만든 키트이었는데요..

 

코로나로 인해 손 세정제도 사용량이 많이 늘었지만 더욱 마스크 착용이 필수로 되었습니다.

 

그래서 이번에는 자동 손 세정제에 인공지능 기능을 더해 마스크 착용 유무까지 확인해주는 스마트 자동 손 세정제를 만들어보고자 합니다.

 

그럼 자동 손 세정제 키트를 업그레이드 해볼까요? 

 

 

 

 

[얼굴(마스크)인식 동작 미리보기]

 

 

 

 

 

[Step 1] 개념 알기

▶ Teachable Macine

 

Teachable Machine 은 구글 AI 팀이 개발한 머신 러닝 모델을 빠르고 쉽게 만들 수 있는 웹 도구입니다. 컴퓨터에서 이미지, 사운드 등을 인식하도록 학습한 다음 학습한 모델을 내보내 직접 인공지능 프로젝트를 구현, 활용할 수 있습니다.

 

 

<https://teachablemachine.withgoogle.com>

 

 

 

▶ p5.js

 

p5.js는 크리에이티브 코딩을 위한 자바스크립트 라이브러리로 예술가, 디자이너, 교육자, 입문자, 그리고 모두에게 접근성이 높고 포용적인 무료 오픈 소스 언어입니다.

p5.js는 실험적인 시각적 결과물들을 인터넷 브라우저 전체를 스케치북 삼아 그릴 수 있을 뿐 아니라 텍스트, 입력, 비디오, 웹캠, 그리고 사운드 등을 비롯한 각종 HTML 요소를 사용할 수 있습니다.

 

<https://p5js.org/ko>

 
 
 
 

[Step 2] Teachable Machine 으로 마스크 확인 모델 만들기

 

티처블머신 홈페이지에 (https://teachablemachine.withgoogle.com)접속 후 [Get Started] 버튼을 클릭합니다. 

 

 

 

 

새로운 프로젝트 생성 창이 나오면 Image Project를 선택합니다.

 

 

 

 

모델 생성 페이지에서 클래스를 1개 더 추가한 후 클래스 이름을 각각 1, 2, 3으로 바꿔 줍니다.

 

 

 

 

 클래스에서 웹캠 버튼을 선택하여 마스크 썼을 때, 안썼을 때, 사람이 없을 때 3가지 상황으로 각각 데이터를 입력 시켜줍니다.

 

 

 

 

각 상황별로 데이터를 입력하셨으면 [Train Model] 버튼을 클릭해 모델을 학습시킵니다.

모델 학습이 완료되면 우측 Preview 창에서 성능을 확인할 수 있습니다.

* 인식이 잘 되지 않으면 좀 더 정확하고 많은 양의 데이터를 학습시켜 봅시다!!

 

 

학습이 잘 되었으면 Preview 창 상단에 [Export Model] 버튼을 누른 후 [Upload my model] 을 클릭합니다.

그럼 하단의 링크가 생성되는데 링크 주소 중 마지막 부분을 복사합니다. (하단 이미지 참고)

 

 

 

 

[Step 3] 소프트웨어 코딩 다운로드하기

 

 

 

 

[Step 4] 학습 모델을 p5를 통해 자동 손 세정제에 넣어보기

Teachable Machine에서 만든 모델을 사용하기 전에 먼저 p5와 자동 손 세정제를 연결하기 위한 프로그램을 설치해야 합니다.

 

https://github.com/p5-serial/p5.serialcontrol/releases/tag/0.1.2 링크로 접속하여 컴퓨터 운영체제에 맞는 프로그램을 다운로드 한 후 압축을 풀어줍니다.

 


 

 

 

프로그램 다운 후 실행한 후 오렌지보드가 연결된 USB port 를 선택하여 연결해줍니다.

 

 

 

 

연결이 되었으면 이제 Teachable Machine 에서 만든 모델을 사용하러 가봅시다.

만든 모델의 종류에 따라 링크를 들어가면 p5 예제가 실행 됩니다.

 

- 이미지 모델 예제 : https://editor.p5js.org/krantas/sketches/IKUf43rB

- 소리 모델 예제 : https://editor.p5js.org/krantas/sketches/3wZ9hAwG

 

예제에서 아래 이미지와 같이 포트 번호와 Teachable Machine에서 만든 모델 URL 뒷자리를 넣어 준 뒤 상단에 있는 실행 버튼을 눌러줍니다.

 

 

 

 

 

실행 후 자동 손세정제 키트에 손을 대보시면 마스크 착용 유무에 따라 동작이 달라지는 것을 확인 할 수 있습니다.

(* 측정 시 p5.js 는 동작중이어야 합니다.)

 

 

[Step 5] 다양한 인공지능 모델을 생성하여 활용하기

다양한 상황을 가정하여 인공지능 모델을 생성 후 상황에 맞게 동작하는 나만의 자동 손 세정제를 만들어 봅시다.

 

 

 

 

kocoafab

안녕하세요. 코코아팹 운영자입니다.

자동손세정제키트

tpals8824 2022-04-14 19:24:57

저 혹시 질문 하나 드려도 될까요? 티처블 머신에서 3가지 이상의 경우를 학습시켜 보았을 때 잘 구별하는 모습을 볼 수 있었는데, 아두이노로 가지고 오니까 3가지 이상의 경우에 대해서는 동작을 안하더라구요.. 혹시 더 다양한 경우에 대해서도 동작이 가능한가요?

urobot2011 2022-07-19 21:03:36

#include

Servo servo;
char data;

// 핀 설정
int piezoPin = 11;
int echoPin = 3;
int trigPin = 2;
int servoPin = 9;

unsigned long currentTime = 0;
boolean flag = 0;


// 초음파 센서의 손 측정 시간 설정 변수
int checkTime = 2000;

// 손소독제 크기에 따른 모터의 각도 조절 변수
int pushAngle = 40;
int currentAngle = 90;

void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
servo.attach(servoPin);
servo.write(currentAngle);

pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(piezoPin, OUTPUT);
}

void loop() {
if (Serial.available()) {
data = Serial.read();
digitalWrite(trigPin, LOW);
digitalWrite(echoPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

unsigned long duration = pulseIn(echoPin, HIGH);
float distance = duration / 29.0 / 2.0;

if (distance <= 10) {
digitalWrite(13, HIGH);
if (flag == 0) {
currentTime = millis();
flag = 1;
}

if (millis() >= currentTime + checkTime) {
if (data == '1') {
tone(piezoPin, 1046, 200);
delay(200);
tone(piezoPin, 1175, 200);
delay(200);
tone(piezoPin, 1319, 200);
delay(800);

servo.write(pushAngle);
delay(1000);
servo.write(currentAngle);
delay(1000);
}
if (data == '2') {
tone(piezoPin, 1319, 150);
delay(200);
tone(piezoPin, 1319, 150);
delay(200);
tone(piezoPin, 1319, 150);
delay(200);
}
//추가{
if (data == '3') {
tone(piezoPin, 1319, 150);
delay(200);
tone(piezoPin, 1319, 150);
delay(200);
tone(piezoPin, 1319, 150);
delay(200);
}
//}추가
/*
if (data == '몇번째인지') {
할일

}
*/
flag = 0;
}
}

else {
digitalWrite(13, LOW);
flag = 0;
noTone(piezoPin);
}
}
}







/*
아두이노 기초 공부 추천드려요.
*/