[49호]고성능의 Arduino Yun Rev 2 & Arduino MKR WAN 1300 출시
Arduino
고성능의 Arduino Yun Rev 2 &
Arduino MKR WAN 1300 출시
Arduino.cc에서는 IoT에 최적화된 ‘Arduino Yun Rev 2’와 ‘Arduino MKR WAN 1300’를 출시하였다.
Arduino Yun Rev 2는 고급 네트워크 연결 및 응용 프로그램을 지원하는 Linux 기반 시스템의 강력한 기능을 제공한다. Yun Web Panel과 전용 YunFirstConfig 스케치 덕분에 Wi-Fi 또는 유선 네트워크 연결이 간단하다. 웹 패널을 사용하면 Shield 환경 설정을 관리하고 스케치를 업로드할 뿐만 아니라 Linux 프로세서를 사용해 보드의 기능을 확장시킬 수 있도록 Bridge library를 사용한다. 이전 모델과 비교해서 크게 바뀐 점들은 하드웨어 측면에서 우발적인 단락 위험을 피할 수 있는 새로운 이더넷 커넥터, 수직 공간을 절약할 수 있는 수평 커넥터, 개선된 USB 허브이다. 소프트웨어 측면에서는 Arduino / Linux에서 최신 버전의 OpenWRT (임베디드 장치에서 네트워크 트래픽 라우팅 방법) 및 Arduino / SSL (Secure Sockets Layer) 지원을 사용하도록 업데이트되어 네트워크를 통해 통신을 보호한다는 점이다.
Arduino MKR WAN 1300은 기존의 MKR Zero 보드에 LoRa 기능을 하나로 결합한 강력한 보드로서 저전력 디바이스를 사용하는 네트워킹 경험이 거의 없는 IoT 프로젝트를 설계하고자 하는 제조업체에게 이상적인 솔루션이다. MKR WAN 1300은 Atmel SAMD21와 Murata의 CMWX1ZZABZ LoRa 모듈을 통해 LoRa 연결을 추가할 수 있어 실용적이고 효율적이다. 1.5V AA 또는 AAA 배터리 2개를 사용하거나 외부 5V 전원을 사용하여 전원을 공급할 수 있으며 3.3V의 작동 전압, 8 개의 디지털 I / O, 12 개의 PWM 출력, UART, SPI 및 I2C 인터페이스가 있다.
현재 Arduino Yun Rev 2 & Arduino MKR WAN 1300은 디바이스마트에서 판매하고 있으며 자세한 정보를 확인해볼 수 있다.
Arduino Yun Rev 2 |
Arduino MKR WAN 1300 |
[49호]라즈베리파이 7인치 터치스크린 출시
ELECROW
라즈베리파이 7인치 터치스크린 출시
아이들에게 프로그래밍을 가르치기 위해 출시했던 저렴하고 작은 크기의 PC인 라즈베리파이가 4차 산업 혁명을 이끄는 대표적인 성장 동력으로 꾸준한 인기를 누리고 있다.
ELECROW는 라즈베리파이를 좀 더 편리하게 사용하기 위해 라즈베리파이 7인치 터치스크린 디스플레이를 출시했다.
이 제품은 1024 x 600픽셀의 높은 해상도를 가진 7인치 HDMI 모니터로 정전식 터치스크린을 채용해 사용자가 손쉽게 모든 장치를 완벽하게 제어할 수 있다. 특히 라즈베리파이와 비글본블랙, 윈도우 10, 맥북프로와 호환이 가능하며, 기존에 출시된 제품들과는 다르게 윈도우10 기준으로 사용자가 자신만의 메뉴 환경에서 다양한 콘텐츠를 이용할 수 있도록 멀티 터치 기능을 구현했으며, 별도의 드라이버 설치가 필요 없다. 또, 720P 카메라 모듈이 장착되어있어 사진촬영도 가능하다. 시야각은 70도이며, 크기는 177.06mm x 113.09mm x 15.2mm이다.
라즈베리파이 7인치 터치스크린 [RPD375105T] 제품 구매하러 가기
[49호]영상인식을 통한 졸음 운전 추돌 사고 방지 소프트웨어
2018 ICT 융합 프로젝트 공모전 우수상
영상인식을 통한 졸음 운전 추돌 사고 방지 소프트웨어
글 | 단국대학교 정의동
1. 심사평
칩센 아쉽게도 동일한 목표를 더 훌륭하게 구현한 팀이 있었습니다. open cv를 활용한 안면인식만으로 구현한 부분이 아쉽습니다. 보고서의 완성도 부분에서도 먼저 제출한 팀과 비교되는 점이 아쉽습니다.
뉴티씨 눈감음이나 얼굴인식 등을 통하여, 졸음운전시 경보음을 줘서, 졸음운전을 예방하는 것은 요즘 매우 중요한 이슈입니다. 인식도 잘 되고, 매우 실용적으로 잘 제작하신 것으로 보입니다. 다만, 운전하는 상황이 매우 위험하므로, 인식 후 경보까지 시간을 조금 더 줄여서 빠르게 경보를 해주면 좀 더 좋을 것 같습니다. 조금만 더 다듬으면, 실제 판매 가능한 제품으로도 만들 수 있을 것으로 생각되어 매우 좋은 점수를 드립니다.
위드로봇 전체적인 완성도가 높은 작품입니다. 다만 기존 제품과의 차별성이 없는 부분이 아쉽습니다.
2. 작품 개요
2012~2014년 3년간의 통계에 따르면, 졸음운전으로 인한 교통 사고는 7560건이 있었고, 하루에 약 7건이 발생하며 14명의 사상자가 발생하였다. 또한 전체 교통사고에 비하면 졸음운전으로 인한 사고는 1% 남짓에 불과하지만, 교통사고 치사율을 살펴보았을 때 전체 교통사고에 비하여 약 10배의 치사율을 보였다.
위와 같이 위험한 졸음운전으로 인한 사고를 방지하기 위해서 아이디어를 구상하였는데, 영상 처리 및 이미지 내 대상 인식을 통해 졸음운전을 미연에 인지하고 대처하자는 요지로 프로젝트를 추진하게 되었다.
3. 작품 설명
3.1. 주요 동작 및 특징
졸음 인식을 위해 얼굴 인식을 사용한 후 (p 입력 시 인식 시작) 눈의 특징 점을 추출하여 눈꺼풀 사이의 간격 비율을 이용해 졸고 있는지를 판단한다. 그 후 졸음이 인식될 경우 2.5초 후 알람음을 발생시키고 이용자가 알람을 해제할 때까지 지속시킨다. (s 입력 시 알람 해제) 정면을 응시하지 않아 얼굴이 인식되지 않을 경우 위험을 감지, 4.5초 후 알람을 출력한다. 정면을 다시 응시할 경우 알람은 자동으로 종료된다. 얼굴 인식을 다시 시작하고 싶은 경우 p를 눌러 재시작을 할 수 있다.
시중에 많이 사용되는 얼굴인식 라이브러리 OpenCV는 눈 부위를 인식하는 기능이 있으나 인식률이 현저히 떨어진다. 이 부분을 보완하기 위해 dlib 이라는 라이브러리에 포함된 Face Landmark Detection 이라는 Trained Data Set 라이브러리를 사용했다. 데이터 셋 적용 후, 인식률도 크게 상향되었고 인식 속도 또한 딜레이가 거의 없을 정도로 발전하였다.
그러나 Face Landmark Detection에 한계가 있다. 얼굴의 각도가 변할 경우 얼굴의 특징점을 추출하는 데 정확성이 크게 떨어진다. 때문에 이 프로젝트에선 이중 얼굴 인식 시스템을 이용하였다. 한번 인식한 얼굴에서 얼굴의 위치와 각도를 계산하고 얼굴 부분만 회전하여 정면으로 바꿔준 뒤 다시 인식하는 방식이다. 이 시스템을 이용하여 기존 라이브러리의 단점을 크게 보완하였다.
눈이 감기는 것을 인식하는 부분에서 눈 사이의 거리만 계산한 것이 아니라 가로와 세로의 비율로 계산을 하였기 때문에 카메라에서 멀어진다 해도 눈이 감겨진 정도를 거리에 따른 오차 없이 계산할 수 있었다.
3.2. 전체 시스템 구성
3.3. 개발 환경
Operation System : Windows 10
Programming Language : Python
Used IDE Tool : Anaconda3 Python 3.6
Used Libraries :OpenCV, Dlib, numpy, scipy, winsound, time
3.4. 단계별 제작 과정
3.4.1. 눈 감김 비율 계산
video_capture = cv2.VideoCapture(0)
face_detector = dlib.get_frontal_face_detector()
shape_predictor = dlib.shape_predictor(“shape_predictor_68_face_landmarks.dat”)
#비디오를 불러옴, dlib에서 frontal face detector, shape predictor를 불러옴
def eye_ratio(eyepoint):
A = dist.euclidean(eyepoint[1],eyepoint[5])
B = dist.euclidean(eyepoint[2],eyepoint[4])
C = dist.euclidean(eyepoint[0],eyepoint[3])
ER = (A+B) / (2.0*C)
return ER
#눈 비율 값 계산 define
3.4.2. 얼굴 재정렬 -점 회전 함수 선언
def rotate (brx,bry):
crx = brx – midx
cry = bry – midy
arx = np.cos(-angle)*crx – np.sin(-angle)*cry
ary = np.sin(-angle)*crx + np.cos(-angle)*cry
rx = int (arx + midx)
ry = int (ary + midy)
return(rx,ry)
#점 회전 define
3.4.3. 동영상 좌우반전 후 gray화 및 clahe 후 face detector
while True:
ret, frame = video_capture.read()
flip_frame = cv2.flip(frame,1)
gray = cv2.cvtColor(flip_frame, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
clahe_image = clahe.apply(gray)
detection = face_detector(clahe_image)
3.4.4. 화면 내 인터페이스 작성 (메시지 팝업)
key = cv2.waitKey(10) & 0xFF
# 키 입력
if message_popup == True:
if print_counter == 0:
cv2.putText(flip_frame, “”, (230, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
if print_counter == 1:
cv2.putText(flip_frame, “Try again”, (260, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
if print_counter == 2:
cv2.putText(flip_frame, “Gaze the camera”, (230, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
if print_counter == 3:
cv2.putText(flip_frame, “Program starts in : 3″, (200, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
if print_counter == 4:
cv2.putText(flip_frame, “Program starts in : 2″, (200, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
if print_counter == 5:
cv2.putText(flip_frame, “Program starts in : 1″, (200, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
if print_counter == 6:
cv2.putText(flip_frame, “CALCULATING”, (240, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
3.4.5. 프로그램 시작 분기문
if key == ord(“p”):
if not eye_cap == True:
eye_open_done = False
#p 눌렸을 때 인식 측정 시작
else :
eye_open_done = True
eye_cap = False
cv2.destroyWindow(“image2″)
program_switch = False
eye_ratio_limit = 0.00
left_ar = [0,]
right_ar = [0,]
count_ar = 0
winsound.PlaySound(None, winsound.SND_ASYNC)
txt_switch = False
alarm = False
#다시 누르면 이미지창 제거 메세지창 제거
if eye_open_done == False:
# 측정 시작
for fd in detection:
eye_open_shape = shape_predictor(clahe_image, fd)
eye_open_landmarks = np.matrix([[p.x, p.y] for p in eye_open_shape.parts()])
eye_open_left_eye = eye_open_landmarks[left_eye_points] eye_open_right_eye = eye_open_landmarks[right_eye_points]
eye_open_ER_left = eye_ratio(eye_open_left_eye)
eye_open_ER_right = eye_ratio(eye_open_right_eye)
# ER값 측정 시작
if(count_ar < 100):
count_ar += 1
for i in range(36,41):
cv2.line(flip_frame,(eye_open_shape.part(i).x, eye_open_shape.part(i).y),(eye_open_shape.part(i+1).x, eye_open_shape.part(i+1).y),(255,0,0),1)
cv2.line(flip_frame,(eye_open_shape.part(41).x, eye_open_shape.part(41).y),(eye_open_shape.part(36).x, eye_open_shape.part(36).y),(255,0,0),1)
for i in range(42,47):
cv2.line(flip_frame,(eye_open_shape.part(i).x, eye_open_shape.part(i).y),(eye_open_shape.part(i+1).x, eye_open_shape.part(i+1).y),(255,0,0),1)
cv2.line(flip_frame,(eye_open_shape.part(47).x, eye_open_shape.part(47).y),(eye_open_shape.part(42).x, eye_open_shape.part(42).y),(255,0,0),1)
print_counter = 2
message_popup = True
if(30<count_ar<=60):
left_ar.append(eye_open_ER_left)
right_ar.append(eye_open_ER_right)
print_counter = 6
if(60<count_ar<=70):
print_counter = 0
Max_ER_left = max(left_ar)
Max_ER_right = max(right_ar)
eye_ratio_limit = (Max_ER_left + Max_ER_right)/2*0.65
if(70<count_ar<=80):
print_counter = 3
if(80<count_ar<=90):
print_counter = 4
if(90<count_ar<100):
print_counter = 5
#얼굴이 인식되는 동안 count_ar이 올라가면서 어레이에 저장후 최대값으로 설정, 메시지 팝업
if(count_ar == 100):
eye_open_done = True
eye_cap = True
program_switch = True
print_counter = 0
count_ar = 0
count_time = time.time()
#count_ar이 최대일떄 측정 중단, 프로그램 시작
3.4.6. 얼굴 인식 범위 지정 및 얼굴 재정렬
if program_switch == True:
#프로그램 시작
face_reco = False
face_reco_n = True
for d in detection:
face_reco = True
fnd_count = 0
count_time2 = time.time()
if txt_switch2 == True:
winsound.PlaySound(None, winsound.SND_ASYNC)
face_alarm = False
txt_switch2 = False
#얼굴 인식 불가 알람이 ON일때 알람을 끔
x = d.left()
y = d.top()
x1 = d.right()
y1 = d.bottom()
#d 값 저장
bdx = x-(x1-x)/2
bdy = y-(y1-y)/2
bdx1 = x1+(x1-x)/2
bdy1 = y1+(y1-y)/2
# 큰 d값 저장
midx = (x+x1)/2
midy = (y+y1)/2
# d의 가운데 포인트 저장
shape = shape_predictor(clahe_image, d)
rex = shape.part(45).x
rey = shape.part(45).y
lex = shape.part(36).x
ley = shape.part(36).y
mex = int (lex + (rex-lex)/2)
mey = int (ley + (rey-ley)/2)
#눈의 양끝점 좌표 설정 및 눈 사이 가운데 점 설정
tanx = mex – lex
tany = ley – mey
tan = tany/tanx
#tan 값 계산
angle = np.arctan(tan)
degree = np.degrees(angle)
#각도 계산
rsd_1 = rotate(x,y)
rsd_2 = rotate(x1,y)
rsd_3 = rotate(x,y1)
rsd_4 = rotate(x1,y1)
d2_1 = rotate(bdx,bdy)
d2_2 = rotate(bdx1,bdy)
d2_3 = rotate(bdx,bdy1)
d2_4 = rotate(bdx1,bdy1)
#좌표 회전
pts1 = np.float32([[d2_1[0],d2_1[1]],[d2_2[0],d2_2[1]],[d2_3[0],d2_3[1]],[d2_4[0],d2_4[1]]])
pts2 = np.float32([[0,0],[400,0],[0,400],[400,400]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(flip_frame,M,(400,400))
#회전된 좌표를 이용하여 새로운 창으로 프린트
3.4.7. 회전된 d2에서 얼굴 인식 실행
d2gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
d2clahe_image = clahe.apply(d2gray)
d2detections = face_detector(d2clahe_image)
for d2 in d2detections:
xx = d2.left()
yy = d2.top()
xx1 = d2.right()
yy1 = d2.bottom()
d2shape = shape_predictor(d2clahe_image, d2)
cv2.rectangle(dst, (xx, yy), (xx1, yy1), (0, 255, 255), 1)
for i in range(1,68):
cv2.circle(dst, (d2shape.part(i).x, d2shape.part(i).y), 1, (255,0,255), thickness=1)
for i in range(36,41):
cv2.line(dst,(d2shape.part(i).x, d2shape.part(i).y),(d2shape.part(i+1).x, d2shape.part(i+1).y),(255,0,0),1)
cv2.line(dst,(d2shape.part(41).x, d2shape.part(41).y),(d2shape.part(36).x, d2shape.part(36).y),(255,0,0),1)
for i in range(42,47):
cv2.line(dst,(d2shape.part(i).x, d2shape.part(i).y),(d2shape.part(i+1).x, d2shape.part(i+1).y),(255,0,0),1)
cv2.line(dst,(d2shape.part(47).x, d2shape.part(47).y),(d2shape.part(42).x, d2shape.part(42).y),(255,0,0),1)
landmarks = np.matrix([[p.x, p.y] for p in d2shape.parts()])
right_eye = landmarks[left_eye_points]
left_eye = landmarks[right_eye_points]
ER_right = eye_ratio(right_eye)
ER_left = eye_ratio(left_eye)
if ER_left <= eye_ratio_limit and ER_right <= eye_ratio_limit:
open_eye = False
if ER_left > eye_ratio_limit and ER_right > eye_ratio_limit:
open_eye = True
# 눈 감았을때 open eye가 꺼짐, 눈 뜨면 다시 켜짐
if open_eye == True:
count_time = time.time()
#눈이 감겨있으면 그 순간 count_time 측정 기록, 떠있으면 계속 갱신
cv2.line(flip_frame,rsd_1,rsd_2,(100,255,100),1)
cv2.line(flip_frame,rsd_1,rsd_3,(100,255,100),1)
cv2.line(flip_frame,rsd_4,rsd_2,(100,255,100),1)
cv2.line(flip_frame,rsd_4,rsd_3,(100,255,100),1)
#회전된 작은 d 프린트
for i in range(0,67):
cv2.circle(flip_frame, (shape.part(i).x, shape.part(i).y), 1, (0,0,255), thickness=1)
for i in range(36,41):
cv2.line(flip_frame,(shape.part(i).x, shape.part(i).y),(shape.part(i+1).x, shape.part(i+1).y),(255,0,0),1)
cv2.line(flip_frame,(shape.part(41).x, shape.part(41).y),(shape.part(36).x, shape.part(36).y),(255,0,0),1)
for i in range(42,47):
cv2.line(flip_frame,(shape.part(i).x, shape.part(i).y),(shape.part(i+1).x, shape.part(i+1).y),(255,0,0),1)
cv2.line(flip_frame,(shape.part(47).x, shape.part(47).y),(shape.part(42).x, shape.part(42).y),(255,0,0),1)
cv2.putText(flip_frame, “Left : {:.2f}”.format(ER_left), (450, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 200, 200), 2)
cv2.putText(flip_frame, “Right : {:.2f}”.format(ER_right), (450, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 200, 200), 2)
cv2.putText(flip_frame, “Degree : {:.2f}”.format(degree), (450, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 200, 200), 2)
cv2.putText(flip_frame, “Eye ratio limit: {:.2f}”.format(eye_ratio_limit), (10, 430), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
#라인 그리기 및 값 표현
3.4.8. 알람 기준 지정 및 알람 재생 및 종료
if time.time()-count_time > 2.5:
txt_switch = True
if alarm == False:
winsound.PlaySound(“school_alarm.wav”, winsound.SND_LOOP + winsound.SND_ASYNC)
print(“alarm on”)
alarm = True
#2.5초 후 알람 한번 출력, 메시지 스위치 온
if face_reco == False:
face_reco_n = False
fnd_count += 1
if fnd_count >= 10:
cv2.putText(dst, “FACE NOT DETECTED”, (100, 200), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.putText(flip_frame, “FACE NOT DETECTED”, (10, 460), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
count_time = time.time()
if txt_switch == False and time.time()-count_time2 > 4.5:
txt_switch2 = True
if txt_switch2 == True:
cv2.putText(flip_frame, “NO FACE ALARM!!!”, (10, 60),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
if face_alarm == False:
winsound.PlaySound(“school_alarm.wav”, winsound.SND_LOOP + winsound.SND_ASYNC)
print(“face alarm on”)
face_alarm = True
#얼굴 인식이 안될 경우 눈 감는 카운트 초기화, 4.5 초 후 알람 및 메시지 출력
if face_reco == True and face_reco_n == True:
face = 2
#얼굴 인식이 되는 도중
if face_reco == False and face_reco_n == False:
face = 1
#얼굴 인식이 안되는 중
if face_reco == False and face_reco_n == True:
face = 0
#프로그램 시작 값
if txt_switch == True:
cv2.putText(flip_frame, “ALARM!!!”, (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
#눈 감으면 알람
if face == 2 and key == ord(“s”):
txt_switch = False
alarm = False
winsound.PlaySound(None, winsound.SND_ASYNC)
#알람 울릴 때 (얼굴 인식이 되는 경우에만 알람 종료)
3.5. 소스코드
import cv2
import dlib
import numpy as np
from scipy.spatial import distance as dist
import winsound
import time
video_capture = cv2.VideoCapture(0)
face_detector = dlib.get_frontal_face_detector()
shape_predictor = dlib.shape_predictor(“shape_predictor_68_face_landmarks.dat”)
right_eye_points = list(range(36, 42))
left_eye_points = list(range(42, 48))
count_ar = 0
left_ar = 30*[]
right_ar = 30*[]
eye_ratio_limit = 0.00
count_time = 0
count_time2 = 0
eye_cap = False
eye_open_done = True
program_switch = False
message_popup = False
print_counter = 0
txt_switch = False
txt_switch2 = False
alarm = False
face_alarm = False
face_reco = False
face_reco = False
face_reco_n = True
face = 0
fnd_count = 0
open_eye = True
def eye_ratio(eyepoint):
A = dist.euclidean(eyepoint[1],eyepoint[5])
B = dist.euclidean(eyepoint[2],eyepoint[4])
C = dist.euclidean(eyepoint[0],eyepoint[3])
ER = (A+B) / (2.0*C)
return ER
def rotate (brx,bry):
crx = brx – midx
cry = bry – midy
arx = np.cos(-angle)*crx – np.sin(-angle)*cry
ary = np.sin(-angle)*crx + np.cos(-angle)*cry
rx = int (arx + midx)
ry = int (ary + midy)
return(rx,ry)
while True:
ret, frame = video_capture.read()
flip_frame = cv2.flip(frame,1)
gray = cv2.cvtColor(flip_frame, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
clahe_image = clahe.apply(gray)
detection = face_detector(clahe_image)
key = cv2.waitKey(10) & 0xFF
if message_popup == True:
if print_counter == 0:
cv2.putText(flip_frame, “”, (230, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
if print_counter == 1:
cv2.putText(flip_frame, “Try again”, (260, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
if print_counter == 2:
cv2.putText(flip_frame, “Gaze the camera”, (230, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
if print_counter == 3:
cv2.putText(flip_frame, “Program starts in : 3″, (200, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
if print_counter == 4:
cv2.putText(flip_frame, “Program starts in : 2″, (200, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
if print_counter == 5:
cv2.putText(flip_frame, “Program starts in : 1″, (200, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
if print_counter == 6:
cv2.putText(flip_frame, “CALCULATING”, (240, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
if key == ord(“p”):
if not eye_cap == True:
eye_open_done = False
else :
eye_open_done = True
eye_cap = False
cv2.destroyWindow(“image2″)
program_switch = False
eye_ratio_limit = 0.00
left_ar = [0,]
right_ar = [0,]
count_ar = 0
winsound.PlaySound(None, winsound.SND_ASYNC)
txt_switch = False
alarm = False
if eye_open_done == False:
for fd in detection:
eye_open_shape = shape_predictor(clahe_image, fd)
eye_open_landmarks = np.matrix([[p.x, p.y] for p in eye_open_shape.parts()])
eye_open_left_eye = eye_open_landmarks[left_eye_points]
eye_open_right_eye = eye_open_landmarks[right_eye_points]
eye_open_ER_left = eye_ratio(eye_open_left_eye)
eye_open_ER_right = eye_ratio(eye_open_right_eye)
if(count_ar < 100):
count_ar += 1
for i in range(36,41):
cv2.line(flip_frame,(eye_open_shape.part(i).x, eye_open_shape.part(i).y),(eye_open_shape.part(i+1).x, eye_open_shape.part(i+1).y),(255,0,0),1)
cv2.line(flip_frame,(eye_open_shape.part(41).x, eye_open_shape.part(41).y),(eye_open_shape.part(36).x, eye_open_shape.part(36).y),(255,0,0),1)
for i in range(42,47):
cv2.line(flip_frame,(eye_open_shape.part(i).x, eye_open_shape.part(i).y),(eye_open_shape.part(i+1).x, eye_open_shape.part(i+1).y),(255,0,0),1)
cv2.line(flip_frame,(eye_open_shape.part(47).x, eye_open_shape.part(47).y),(eye_open_shape.part(42).x, eye_open_shape.part(42).y),(255,0,0),1)
print_counter = 2
message_popup = True
if(30<count_ar<=60):
left_ar.append(eye_open_ER_left)
right_ar.append(eye_open_ER_right)
print_counter = 6
if(60<count_ar<=70):
print_counter = 0
Max_ER_left = max(left_ar)
Max_ER_right = max(right_ar)
eye_ratio_limit = (Max_ER_left + Max_ER_right)/2*0.65
if(70<count_ar<=80):
print_counter = 3
if(80<count_ar<=90):
print_counter = 4
if(90<count_ar<100):
print_counter = 5
if(count_ar == 100):
eye_open_done = True
eye_cap = True
program_switch = True
print_counter = 0
count_ar = 0
count_time = time.time()
if program_switch == True:
face_reco = False
face_reco_n = True
for d in detection:
face_reco = True
fnd_count = 0
count_time2 = time.time()
if txt_switch2 == True:
winsound.PlaySound(None, winsound.SND_ASYNC)
face_alarm = False
txt_switch2 = False
x = d.left()
y = d.top()
x1 = d.right()
y1 = d.bottom()
bdx = x-(x1-x)/2
bdy = y-(y1-y)/2
bdx1 = x1+(x1-x)/2
bdy1 = y1+(y1-y)/2
midx = (x+x1)/2
midy = (y+y1)/2
shape = shape_predictor(clahe_image, d)
rex = shape.part(45).x
rey = shape.part(45).y
lex = shape.part(36).x
ley = shape.part(36).y
mex = int (lex + (rex-lex)/2)
mey = int (ley + (rey-ley)/2)
tanx = mex – lex
tany = ley – mey
tan = tany/tanx
angle = np.arctan(tan)
degree = np.degrees(angle)
rsd_1 = rotate(x,y)
rsd_2 = rotate(x1,y)
rsd_3 = rotate(x,y1)
rsd_4 = rotate(x1,y1)
d2_1 = rotate(bdx,bdy)
d2_2 = rotate(bdx1,bdy)
d2_3 = rotate(bdx,bdy1)
d2_4 = rotate(bdx1,bdy1)
pts1 = np.float32([[d2_1[0],d2_1[1]],[d2_2[0],d2_2[1]],[d2_3[0],d2_3[1]],[d2_4[0],d2_4[1]]])
pts2 = np.float32([[0,0],[400,0],[0,400],[400,400]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(flip_frame,M,(400,400))
d2gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
d2clahe_image = clahe.apply(d2gray)
d2detections = face_detector(d2clahe_image)
for d2 in d2detections:
xx = d2.left()
yy = d2.top()
xx1 = d2.right()
yy1 = d2.bottom()
d2shape = shape_predictor(d2clahe_image, d2)
cv2.rectangle(dst, (xx, yy), (xx1, yy1), (0, 255, 255), 1)
for i in range(1,68):
cv2.circle(dst, (d2shape.part(i).x, d2shape.part(i).y), 1, (255,0,255), thickness=1)
for i in range(36,41):
cv2.line(dst,(d2shape.part(i).x, d2shape.part(i).y),(d2shape.part(i+1).x, d2shape.part(i+1).y),(255,0,0),1)
cv2.line(dst,(d2shape.part(41).x, d2shape.part(41).y),(d2shape.part(36).x, d2shape.part(36).y),(255,0,0),1)
for i in range(42,47):
cv2.line(dst,(d2shape.part(i).x, d2shape.part(i).y),(d2shape.part(i+1).x, d2shape.part(i+1).y),(255,0,0),1)
cv2.line(dst,(d2shape.part(47).x, d2shape.part(47).y),(d2shape.part(42).x, d2shape.part(42).y),(255,0,0),1)
landmarks = np.matrix([[p.x, p.y] for p in d2shape.parts()])
right_eye = landmarks[left_eye_points]
left_eye = landmarks[right_eye_points]
ER_right = eye_ratio(right_eye)
ER_left = eye_ratio(left_eye)
if ER_left <= eye_ratio_limit and ER_right <= eye_ratio_limit:
open_eye = False
if ER_left > eye_ratio_limit and ER_right > eye_ratio_limit:
open_eye = True
if open_eye == True:
count_time = time.time()
cv2.line(flip_frame,rsd_1,rsd_2,(100,255,100),1)
cv2.line(flip_frame,rsd_1,rsd_3,(100,255,100),1)
cv2.line(flip_frame,rsd_4,rsd_2,(100,255,100),1)
cv2.line(flip_frame,rsd_4,rsd_3,(100,255,100),1)
for i in range(0,67):
cv2.circle(flip_frame, (shape.part(i).x, shape.part(i).y), 1, (0,0,255), thickness=1)
for i in range(36,41):
cv2.line(flip_frame,(shape.part(i).x, shape.part(i).y),(shape.part(i+1).x, shape.part(i+1).y),(255,0,0),1)
cv2.line(flip_frame,(shape.part(41).x, shape.part(41).y),(shape.part(36).x, shape.part(36).y),(255,0,0),1)
for i in range(42,47):
cv2.line(flip_frame,(shape.part(i).x, shape.part(i).y),(shape.part(i+1).x, shape.part(i+1).y),(255,0,0),1)
cv2.line(flip_frame,(shape.part(47).x, shape.part(47).y),(shape.part(42).x, shape.part(42).y),(255,0,0),1)
cv2.putText(flip_frame, “Left : {:.2f}”.format(ER_left), (450, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 200, 200), 2)
cv2.putText(flip_frame, “Right : {:.2f}”.format(ER_right), (450, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 200, 200), 2)
cv2.putText(flip_frame, “Degree : {:.2f}”.format(degree), (450, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 200, 200), 2)
cv2.putText(flip_frame, “Eye ratio limit: {:.2f}”.format(eye_ratio_limit), (10, 430), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
if time.time()-count_time > 2.5:
txt_switch = True
if alarm == False:
winsound.PlaySound(“school_alarm.wav”, winsound.SND_LOOP + winsound.SND_ASYNC)
print(“alarm on”)
alarm = True
if face_reco == False:
face_reco_n = False
fnd_count += 1
if fnd_count >= 10:
cv2.putText(dst, “FACE NOT DETECTED”, (100, 200), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.putText(flip_frame, “FACE NOT DETECTED”, (10, 460), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
count_time = time.time()
if txt_switch == False and time.time()-count_time2 > 4.5:
txt_switch2 = True
if txt_switch2 == True:
cv2.putText(flip_frame, “NO FACE ALARM!!!”, (10, 60),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
if face_alarm == False:
winsound.PlaySound(“school_alarm.wav”, winsound.SND_LOOP + winsound.SND_ASYNC)
print(“face alarm on”)
face_alarm = True
if face_reco == True and face_reco_n == True:
face = 2
if face_reco == False and face_reco_n == False:
face = 1
if face_reco == False and face_reco_n == True:
face = 0
if txt_switch == True:
cv2.putText(flip_frame, “ALARM!!!”, (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.imshow(“image2″, dst)
if face == 2 and key == ord(“s”):
txt_switch = False
alarm = False
winsound.PlaySound(None, winsound.SND_ASYNC)
cv2.imshow(“Frame”, flip_frame)
print(“time = “,time.time()-count_time)
print(“time2 = “,time.time()-count_time2)
print(“face = “,face)
if key == ord(“q”):
eye_ratio_limit = 0.00
winsound.PlaySound(None, winsound.SND_ASYNC)
break
cv2.destroyAllWindows()
video_capture.release()
4. 실행영상
[49호]Jrk G2 USB Motor Controller with Feedback 업그레이드 버전 출시
Pololu
Jrk G2 USB Motor Controller
with Feedback 업그레이드 버전 출시
Pololu에서는 최근 Jrk G2 USB Motor Controller with Feedback 제품 시리즈를 출시했다. 이 제품의 큰 장점은 크기를 기존 제품(JrK 21v3, JrK 12×12)에 비해 3분의 1이상이 작아졌다는 점이다.
USB를 통해 Windows, macOS 및 Linux에서 사용할 수 있는 소프트웨어 유틸리티를 사용하여 편리하게 구성할 수 있으며, 뛰어난 기능과 인터페이스를 자랑한다. 5V 작동으로 마이크로컨트롤러와 함께 사용할 수 있는 TTL 직렬, I2C 인터페이스, RC 시스템에서도 활용이 가능하며 포텐쇼미터나 아날로그 조이스틱과 함께 사용할 수 있도록 아날로그 전압을 갖추고 있다.
게다가 소프트웨어를 통해서 간단하게 매개 변수(PID주기 및 PID 계수, 최대 전류, 최대 듀티 사이클, 최대 가속 및 감속, 오류 응답, 아날로그 및 RC 제어를 위한 입력 보정)를 구성할 수 있다.
다음 표에서 기존 JrK 21v3, Jrk 12v12와 비교했을 때 성능이 향상되었다는 것을 한눈에 확인할 수 있으며, 새롭게 업그레이드된 JrK G2 제품군은 디바이스마트(http://www.devicemart.co.kr)에서 구입 가능하다.
[49호]세상을 바꾸는 4차 산업혁명의 중심, World IT Show 2018
세상을 바꾸는 4차 산업혁명의 중심
World IT Show 2018
글 | 심혜린 기자 linda@ntrex.co.kr
과학기술정보통신부가 주최하고 산업통상자원부가 후원하는 월드IT쇼는 국내에서 손꼽히는 대형 전시회이다. 예년과 같이 코엑스 A, B, C홀에서 2018년 5월 23일(수)부터 5월 26일(토)까지 개최되었다. 올해로 11회째를 맞이한 ‘2018 월드IT쇼’는 IT 분야 B2B 전문 전시회로 매년 혁신적인 신기술과 제품을 선보이고 있다. 4차 산업혁명의 미래와 인공지능(AI), 사물인터넷(IoT), 빅데이터, 5세대(5G) 이동통신 등 핵심 신기술을 한눈에 확인할 수 있었다. 이번 전시회는 ‘IT’ SMART!’ 라는 주제로 해외기업 57개사와 삼성전자, LG전자, SK텔레콤 등의 대기업과 중소기업들이 참가해 이슈가 되는 인공지능, IOT, 5G, SW, 자율주행, 블록체인 등 다양한 미래 산업 관련 제품을 선보였다.
먼저 (주)페이리더스에서 출시한 ‘테이블오더’는 테이블에서 주문하고 결제까지 할 수 있는 앱 서비스이다. 테이블마다 부착된 QR코드를 입력하면 매장과 테이블을 인식하고 메뉴선택화면으로 이동하며 주문을 할 수 있다. 더치페이가 가능해 전체 결제, N분의 1, 각자 결제를 선택하여 결제금액을 계산하고 스마트폰에 설치된 결제 모듈을 이용하여 결제할 수 있다.
매장에는 실시간으로 주문이 접수되며 주문서가 출력되고 메뉴가 준비되면 스마트폰으로 호출 알람도 전송이 가능하다. 내방 고객을 선별하여 메시지 전송 대상을 선정할 수 있으며 가격 할인, 쿠폰 제공 메시지 전송 기능도 탑재되어 있어 고객 밀착 마케팅에도 효율적이다.
아이오틴(Ioteen)에서 개발해 출시한 메디알람S는 국내 최초 스마트 약통이다. 세계적으로도 미국의 스마트약통은 가격이 수십만원대라서 메디알람S는 더욱 경제력이 있다. 스마트폰 전용 앱이 있으며 블루투스로 연결할 수 있다. 사용자는 앱을 통해 미리 복용이 필요한 요일과 시간을 설정할 수 있어 지정된 요일과 시간마다 핸드폰과 스마트 약통에서 알림이 함께 발생해 잊어버리지 않는다. 앱에서는 의약품 DB를 갖추고 있어서 약 처방전과 약품도 간편하게 검색을 통해 확인이 가능하다. 정확한 약의 이름과 용량까지 구분할 수 있어, 정확하게 약을 먹을 수 있다는 점이 큰 장점이다. 처방전도 QR코드로 스캔할 수 있는 기능이 있으며 보호자를 따로 설정할 수 있는 메뉴도 있다. 햇빛 차단으로 약을 보호해 충격방지, 생활방수로부터 최소화되도록 설계된 점이 돋보인다.
(주)로보디바인에서는 코딩 프로그램 로봇 ‘뮤보’를 선보여 관람객들의 관심을 받았다. (주)로보디바인은 코딩 로봇, 반려 로봇, 소셜 로봇 등 다양한 분야의 소형 스마트 로봇을 개발, 제조, 유통하는 기업이다. ‘모듈 결합형 로봇 추종 제어장치’와 ‘코딩 교육 장치 및 시스템’ 등 주요기술의 특허를 가지고 있어 기술력을 인정받고 있기도 하다. 로보디바인은 어린이들이 재미있게 배우는 것이 중요하다고 생각해 음악 코딩 로봇 ‘뮤보’ 를 내놓았다. 뮤보는 4관절, 2족 보행을 하는 외형의 로봇이다. 대부분 바퀴가 달린 자동차 형태로 이루어진 교육로봇들 사이에서 관절로 움직이는 로봇 ‘뮤보’는 많은 관심을 받았다. 뮤보 애플리케이션으로 쉽게 목소리 톤과 속도 선택을 직접 할 수 있어 나만의 ‘뮤보’를 만들 수 있으며 음악 코딩 기능과 로봇을 제어하는 모션 코딩 기능을 탑재하고 있다. 대화 모드가 있으며 3개 국어 (한국어, 영어, 프랑스어)를 구사한다는 점이 장점이다. 또한 반려동물 기능과 IoT 기술을 접목한 가전제품 제어기능까지 포함되어 있다.
비앤피이노베이션 (BNP Inovation) 에서는 실시간으로 HD 영상을 전송할 수 있는 웨어러블 카메라를 선보였다. 이 기업은 VoIP 기술 및 영상 커뮤니케이션 전문 기업으로 영상 및 음성 코어를 자체 기술로 개발해 다수의 영상 회의실을 구축했다. 스마트 기기의 영상, 음성 솔루션을 통한 관제, 워크, 러닝, 헬스케어 스마트 솔루션 등 다양한 영상 어플리케이션을 공급하고 있다. 이번 전시회에서 선보인 ‘SMARTSEE Glasses 웨어러블 카메라’ 는 HD 카메라와 스피커 및 마이크가 내장된 다용도 일체형 웨어러블 카메라로 고화질 영상을 실시간으로 원격전송과 양방향 통화가 가능하다. 500만 화소 고화질 카메라를 내장하며 HD 720p 30fps의 동영상과 사진 촬영이 가능하다. 일반 안경테에 장착해도 전혀 불편함이 없을 정도로 작은 사이즈와 가벼운 무게를 자랑한다. 카메라가 착용자의 시선과 일치되도록 착용 상태에서 상/하, 좌/우 조절이 가능하다. 스마트폰에도 연결하면 즉시 사용이 가능해 별도의 충전이나 페어링 또한 필요 없어 간편하다. 이 웨어러블 카메라는 스마트 디바이스를 활용하여 응급 현장 원격 의료지원, 재난현장 원격지원 및 지휘 등 다양한 분야에 활용 가치가 있다.
이번 전시회에서 SKT는 5G 시대 자율주행차, 커넥티드가, 차랑 공유 서비스, IoT 등의 대중화를 위한 필수 기술인 ‘HD 맵’을 선보였다. SKT와 KT는 ‘5G’를 강조하는 슬로건을 내걸어 자사의 5G 서비스 어필을 하고 있었다. HD 맵(고화질 지도 기술)은 기존에 도로 단위로 구축되어 있고 오차 범위가 큰 내비게이션 지도와는 달리 달리 센티미터 단위의 정밀한 측위 정보를 제공하며 주변 사물과 신호 등 관련 정보를 모두 포함해 운전자에게 제공한다. 자율주행차가 이 같은 정보를 축적해 실시간 주행 경로를 판단하기 때문에 HD 맵은 자율주행차의 핵심 기술로 손꼽힌다. HD 맵은 특히 자율 자동차에서 활용된다. 자율주행차는 HD 맵이 제공하는 각종 정보를 기반으로 주행 판단을 내릴 수 있으며 카메라와 센서 성능이 저하되는 악천후·야간 등 특수한 환경에서도 HD 맵이 자율주행차의 사고 확률을 줄일 수 있다고 한다. HD 맵은 SKT가 시도할 수 있는 통신을 전문적으로 살리는 사업이며 4차 산업혁명의 핵심 기술로 기대가 된다.
또한 다른 구역에서는 브이모지(Vmoji)와 아이 트래킹 소프트웨어(Eye Tracking Software)를 시연하고 있었다. 브이모지(Vmoji)는 사용자의 표정을 그대로 따라하는 이모지 활용 영상채팅 애플리케이션으로 ‘페이셜 다이나믹스’ 기술로 정확한 얼굴 인식률을 보여준다. 아이 트래킹 소프트웨어(Eye Tracking Software)는 사용자의 시선을 추적해 사용자의 눈이 멈추면 화면이 멈춰 있고, 사용자가 시선을 아래로 내리면 화면이 자동으로 위로 드래그 된다.
SKT는 i’m Here(트래커) 제품을 선보이며 제품에 대한 자세한 설명을 했다. 이 제품은 블루투스(BLE) 통신을 이용해서 약 35mm 거리 이내에서 상호 호출이 가능해 휴대폰이나 귀중품을 찾을 수 있다. 공항에서 수하물을 찾을 때 더욱 잘 활용할 수 있다. 예를 들어 여행용 캐리어에 트래커를 부착하고 삽입한 후 ‘트래커 접근 알림 받기’ 기능을 활용하면, 기다리지 않고 수하물을 찾을 수 있다는 장점이 있다. 트래커와 휴대폰이 멀어져 상호 연결 상태가 끊기면, 연결이 끊긴 장소를 지도로 표시해줘 마지막으로 분실된 위치를 지도로 확인해서 찾을 수도 있다.
KT는 이번에 공항 콘셉트의 대형 부스를 마련해 SKT와 경쟁하듯 전반적으로 5G 서비스를 크게 어필하고 있었다. 5G 시대가 왔을 때 경험할 수 있는 ‘미래 사회’를 보여주려고 노력한 면이 돋보였다. KT는 5G의 속도·출발·전 세계 연결·새로운 경험의 시작 등의 키워드로 6개 구역의 전시관을 운영했다. 관람객이 직접 4G와 5G에서의 변화를 체감할 수 있도록 하고 5G 기반 VR 게임 스페셜포스와 MR 기반의 스포츠 게임 관람 부스 등의 게임 화면을 통해서 4G와 5G의 속도 차이를 느낄 수 있도록 해 주제인 ‘5G’ 를 잘 표현했다. 어렵게 느낄 수 있는 기술을 쉽고 재미있게 풀어 관람객의 인기가 가장 높았다.
다른 SKT, 삼성전자, LG 등과 차별화 되는 점은 키즈 교육 콘텐츠를 전시했다는 점이다. 올레티비에서 사용할 수 있는 ‘AR Book’ 과 ‘TV쏙 잉글리쉬’를 선보였다. AR Book은 올레티비에서 AR Book 콘텐츠를 실행시킨 후 모바일과 페어링 하면 AR Book 서비스를 이용할 수 있다. 읽기만하고 끝나는 독서가 아니라 실제 읽은 책과 연계되는 AR 서비스를 체험하며 책으로 공부한 내용을 재미있게 다시 한번 복습할 수 있다.
TV쏙 잉글리쉬는 어린이가 직접 TV에 출연해 주인공이 되어 참여하며 진행되는 콘텐츠로 집중하면서 흥미롭게 영어를 배울 수 있는 콘텐츠이다. 또 NB-IoT 기술 기반으로 어린이가 어디에 있는지 위치 또한 정확하게 파악한다.
비즈니스를 위한 기술을 소개하는 부스도 마련되어 있어 다양한 기술을 볼 수 있었다. FLINK(Franchise Link)는 프링크 홈페이지를 통해 업종별로 가맹본사 정보, 가맹점 위치 및 상권분석 등 창업에 필요한 정보를 검색할 수 있는 사이트이다. 빅데이터를 기반으로 한 건물 추천 서비스와 건물 상세정보 및 상가 매물정보를 검색할 수 있다. 머신 러닝 챗봇 AIBOT은 국내 최초 인공지능 대화 처리 전용 기술 AML 상용화가 되었다. 이 챗봇은 금융, 통신 등의 다양한 분야의 질문과 답변으로 이루어진 비즈니스 데이터를 기계학습해 채팅하는 서비스이다. 관리자 사이트를 통해서 챗봇의 답변 정확도를 검출하고, 챗봇 대화 시뮬레이터를 통해 챗봇과 채팅할 수 있다. Giga IoT Smart Building은 빌딩 운영의 효율성을 높여주는 IoT 기반의 기술이다. 건물의 에너지 사용량과 경보 상황판, 엘리베이터 관리, 온도, 습도 조절까지 가능하다.
LG전자는 자사의 전략 스마트폰 ‘G7 ThinQ’ 와 인공지능(AI) 기능을 탑재한 가전제품을 집중적으로 보여주었다. 카메라를 체험해볼 수 있도록 준비해 관람객이 직접 고화질 촬영을 해볼 수 있었다. AI 카메라는 그동안 스마트폰 카메라는 사용자가 버튼을 눌러 촬영했지만, G7에 탑재된 AI 카메라는 피사체와 주변 환경을 분석해서 최적의 촬영 모드를 추천해주는 카메라이다. 이 카메라는 일반 촬영보다는 훨씬 더 선명한 사진을 담아낼 수 있다. 탑재된 ‘슈퍼 브라이트 디스플레이’는 1000니트의 휘도로 밝은 햇볕 아래서도 선명하게 볼 수 있으며 풍성한 색상이 구현된다. 이미 해외 언론으로부터 호평을 받은 G7의 ‘붐박스 스피커’를 따로 부스를 마련해 기자도 들어가 체험을 해보았다. 관계자는 스마트폰이 스피커의 울림통 역할을 하기 때문에 별도의 블루투스 스피커가 없어도 풍부한 음질을 느낄 수 있다고 설명했다.
LG전자는 인공지능 스피커 LG 씽큐허브를 선보였다. 씽큐 허브는 LG 생활 가전제품에 탑재되어 있는데, 이용자가 이용하는 제품에 말을 하면 씽큐 허브에 연결된 제품이 자동으로 작동한다. ‘씽큐 허브’는 로봇청소기 충전해달라고 하면 충전을 하고 오븐의 남은 시간을 확인해달라고 하면 확인도 해주는 등 말 한마디로 가전을 쉽게 제어할 수 있다.
삼성전자는 최신 전략 제품을 주로 전시하였다. 갤럭시 S9, 삼성 QLED TV, 삼성 노트북 오디세이 Z, 삼성 노트북 Pen을 관람객들이 직접 체험할 수 있도록 하였다. AR 이모지, 아모레퍼시픽과 합작해 가상 메이크업을 해볼 수 있는 AR 메이크업 등과 같이 체험하도록 구성했다. AR 메이크업의 경우는 기자가 직접 체험을 해보았는데, 가상 메이크업을 한 후 해당 메이크업에 해당하는 화장품을 구매까지 연동되는 기술이다.
국내 최대 IT 전문 전시회로 꼽히는 ‘2018 월드 IT쇼’는 4일간의 전시를 끝으로 막을 내렸다. IT 분야 B2B 전문 전시회로, 혁신적인 신기술과 제품을 선보이며 중소, 벤처 기업의 해외 진출을 돕기 위해 해외 빅바이어를 초청하고 다양한 행사를 진행했다. 작년보다는 규모가 조금 줄어든 느낌이었지만, 다양한 미래 산업 관련 제품을 볼 수 있었고 곳곳에 해외 바이어의 관심을 보인 제품들도 있었다. 전시회 뿐만 아니라 국내외 ICT 분야 저명인사들이 ICT 기술 트렌드를 공유하는 ‘글로벌 ICT 트렌드 인사이트’, 해외 액설러레이트(AC), 벤처투자사(VC)들을 초청해 국내의 유망한 스타트업 투자유치 기회를 제공하는 ‘글로벌 액셀러레이터 컨퍼런스 & 데모데이’ 행사도 개최되었다. 또한 ‘글로벌 ICT 빅바이어 초청 일대일 수출상담회’ 에서 국내 스타트업과 중소기업들이 해외 기업과의 1:1 상담을 통해 수출 계약을 맺는 성과를 올렸다고 전해 월드 IT쇼가 해외 진출의 발판이 되는데 큰 역할을 한 것으로 평가된다.