본문 바로가기
etc/활동

[AIOT]AI기반 IoT디바이스 설계 및 응용 - 수료프로젝트

by 하람 Haram 2022. 9. 22.
728x90

주관 : 단국대학교 공학교육혁신 센터

 

 

AIOT Project

아이디어 소개


 

저희 학교에서 진행하는 도서관 데이터 분석을 통한 서비스 구현 대회와

이 AIOT디바이스 프로젝트를 연관 시키고자 하였습니다

저희 도서관의 문제점은 콘센트가 있는 자리가 부족하다는 것입니다.

하지만 생각보다 좌석은 많지만 사용하지 않지만 자리만 맡아 놓고 가는 사람들 때문에 문제점가 야기됩니다.

이를 해결하고자 Face detection을 통해 자리에 있는 사람들만 선별을 하고 자리를 2시간 비울 시에 빨간 LED를 켜는 등의 신호를 주어서 자리를 치우고 앉을 수 있게끔 서비스를 구현하고자 하였습니다

또한 외부에 있을때 도서관 내부에 사람이 몇명이 있는지 알려주므로써

즉, 도서관의 혼잡도를 실시간으로 제공하여

도서관 이용률을 높이는 효과를 기대할 수 있습니다

AIOT Project

실행 영상


구현 영상

AIOT Project

사용한 장치 및 기술


AI적 요소 : Face detection

IoT적 요소 : maixduino 내 Camera connector & K210

사용한 Maixduino

AIOT Project

Youtube


Youtube 링크 :https://youtu.be/DPy5HrJepqo

 

문제점 : 마스크를 쓴 상태 혹은 카메라를 응시하지 않은 상태는 선별하지 못함

AIOT Project

소스코드


AIOT Project

코드 설명


단순히 설명을 위한 부분이므로 들여쓰기가 맞지 않는다는 점 유의해 주시기 바랍니다

#라이브러리를 가져옵니다

import sensor, image, lcd, time

import KPU as kpu

import gc, sys

def lcd_show_except(e):

import uio

err_str = uio.StringIO()

sys.print_exception(e, err_str)

err_str = err_str.getvalue()

img = image.Image(size=(224,224))

img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))

lcd.display(img)

#k210 의 저장시스템을 보면 k _model을 0x300000 부터 할당을 하므로 주소를 다음과 같이 지정을 해줍니다

def main(model_addr=0x300000, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):

try:

sensor.reset()

except Exception as e:

raise Exception("please check hardware connection, or hardware damaged! err: {}".format(e))

sensor.set_pixformat(sensor.RGB565)

sensor.set_framesize(sensor.QVGA)

sensor.set_hmirror(False)

sensor.set_vflip(sensor_vflip)

sensor.run(1)

lcd.init(type=1)

lcd.rotation(lcd_rotation)

lcd.clear(lcd.WHITE)

#수업자료로 제공된 parameter를 사용하였습니다

anchors = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)

try:

task = None

task = kpu.load(model_addr)

kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:[0,1], nms_value: [0, 1]

while(True):

img = sensor.snapshot()

t = time.ticks_ms()

objects = kpu.run_yolo2(task, img)

t = time.ticks_ms() - t

if objects:

for obj in objects:

img.draw_rectangle(obj.rect())

#탐지한 오브젝트의 개수를 출력을 합니다

print(len(objects))

#print(obj) #obj dictionary is not class rect()[0] : x [1] : y

img.draw_string(0, 200, "t:%dms" %(t), scale=2)

lcd.display(img)

except Exception as e:

raise e

finally:

if not task is None:

kpu.deinit(task)

#위에서 작성한 main 문을 가져와 줍니다

if __name__ == "__main__":

try:

main( model_addr=0x300000, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False)

# main(model_addr="/sd/m.kmodel")

except Exception as e:

sys.print_exception(e)

lcd_show_except(e)

finally:

gc.collect()

728x90

'etc > 활동' 카테고리의 다른 글

네이버 부스트캠프 AI Tech 4기 합격후기  (0) 2022.09.23