일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Machine Vision
- IOT
- ARM Processor
- TensorFlow
- tf.train.match_filenames_once()
- Data Load
- tf.train.string_input_producer()
- I.MX6Q
- Machine learning
- porting
- Raspberry Pi
- CNN
- VGGnet
- tf.saver()
- Python
- preprocessing
- Facial expression recognition
- Embedded System
- OpenCV
- Homomorphic Filter
- cross compile
- deep-learning
- Today
- Total
Austin's_Lab
[I.MX6Q]얼굴표정 인식을 통한 사용자의 감정케어 시스템 보드편(1) 본문
[I.MX6Q]얼굴표정 인식을 통한 사용자의 감정케어 시스템 보드편(1)
Ausome_(Austin_is_Awesome) 2017. 8. 3. 20:39이제 감정케어 시스템이 I.MX6Q 보드에서 어떻게 동작하는 지 포스팅하려고 한다. 전체 코드는 https://github.com/moon920110/Facial_Expression_Recognition에 올려두었다.
보드에서 구현되는 기능은 이렇다.
1. 웹캠을 이용한 얼굴 영역 검출 및 cropping, 카메라 화면 출력
2. 서버와 통신
3. GUI(터치스크린)
4. 감정에 따른 / 혹은 사용자의 요구에 따른 음악 실행
5. 사용자의 현재 상태와 재생되고 있는 음악의 이름 및 디렉토리를 출력할 CLCD
6. 사용자의 새로운 감정 상태를 표현할 Dot Matrix와 LED
7. 감정검출 on/off, GUI/카메라 화면 전환을 수행할 switch button
전체 연결된 코드는 위의 github에서 보면 되고, 여기서는 각 요소를 어떻게 구현했는 지 살펴본다.
기본적으로 보드에 opencv가 포팅되어 있어야 한다.
2017/05/01 - [Embedded System] - [I.MX6Q] Opencv Porting on I.MX6Q (ARM based board)
1. 웹캠을 이용한 얼굴 영역 검출 및 cropping, 카메라 화면 출력
얼굴영역 검출 및 화면 출력에는 세가지 이슈가 있다.
- TFTLCD의 출력 format에 따른 픽셀값 조절 및 수동 출력
- 스레드
- 얼굴 영역 검출 parameter optimizing
I.MX6Q 보드는 TFTLCD화면 출력이 일반 display와 다르다. 일반 display의 경우 8bit gray scale혹은 24 bit true color(rgb)이지만 I.MX6Q보드의 경우 red 5bit, green 6bit, blue 5bit의 출력 format을 가진다. 각 8bit의 rgb factor들을 5bit, 6bit, 5bit으로 scaling하고 shift연산과 덧셈연산을 사용해 format을 맞추고, 일일이 화면에 찍어주었다. resolution이 높지 않아서 다행이었다.
******* 출처 : 세종대학교 컴퓨터공학과 박기호교수님의 Embedded System 수업 자료에서 가져왔습니다. *******
pixel을 화면에 찍을 때 loop를 거꾸로 돌린 것(down-count)은 조금이라도 성능을 optimize하기 위해서이다. ARM에는 조건부실행이라는 유용한 기능이 있는데, 이것을 활용하면 간단한 logic의 분기문을 하드웨어적으로 간단하고 빠르게 처리할 수 있다.
******* 출처 : 세종대학교 컴퓨터공학과 박기호교수님의 Embedded System 수업 자료에서 가져왔습니다. *******
더불어 본 프로그램에서는 ATCS(ATPCS)를 참조해 몇가지 ARM 환경에서의 최적화를 진행했다.
- 함수의 인자는 무조건 4개 이하
- 전역변수 사용의 최소화
- thread간 공유하는 변수들을 구조체로 묶어 인자(지역변수)로 넘겨 활용
- 4개 이상의 if문 중첩은 switch문으로 대체(이건 ATCS에 관련된건 아니지만)
- loop down counting
등등
보드의 성능이 처음 생각했던 것 보다는 좋았지만 그래서 기대했던 것 만큼은 좋지 않았다.
가장 큰 문제는 PC에서 테스팅했을 때는 무리없이 잘 돌아가던 프로그램들이 보드에 올리면 심각하게 느려진다는 것이었다. 이 문제는 특히 opencv를 이용한 얼굴 영역 검출에서 가장 크게 나타났다. 한 thread에서 카메라 촬영, 얼굴 영역 검출을 동시에 진행했더니 거의 정지화면에 가까운 출력을 보였다. 따라서 얼굴 영역 검출과 화면 출력을 각각 스레드로 나누어 작업을 했다. 스레드를 나누었음에도 여전히 화면 출력과 얼굴 영역 검출 간 1초 정도의 딜레이가 있었고, 화면 출력 역시 얼굴 영역 검출 때문인지 굉장히 끊어지며 출력이 되었다. 결국 얼굴 검출 함수의 parameter를 optimize함으로써 프로그램을 안정화시켰다. Embedded system에서는 최적화가 정말로 중요한 요소임을 뼈저리게 느꼈다.
parameter optimizing을 한 요소는 window size scaling factor(1.5), find biggest object, minimum object size 150x150 설정 등이다.
PC에서 했을 때 default는 잘 기억이 나지 않지만, window scaling factor 1.3, minimum object size 30x30 정도였던 것 같다. minimum size를 30x30에서 150x150으로 늘린게 성능 향상에 가장 유효하게 작용했다.
pthread 사용법은 따로 설명하지 않겠다. google에서 찾으면 정말 많은 분들이 도움을 주실 것이다.
'Embedded System' 카테고리의 다른 글
[Embedded System]얼굴 표정인식을 통해 사용자의 감정을 케어해주는 시스템 (0) | 2017.07.12 |
---|---|
[I.MX6Q] Opencv Porting on I.MX6Q (ARM based board) (3) | 2017.05.01 |
[Capston Design]CNN을 이용한 병충해 검출 자동화 시스템 프로젝트 (0) | 2017.04.25 |