삼성전자 오픈소스 프로젝트 후기

Hyeona·2023년 1월 30일
1
post-thumbnail

📖 개요

👥 팀 빌딩

삼성청년SW아카데미(이하, SSAFY)에서 우수교육생을 대상으로 진행하는 프로젝트였습니다.
홀/짝 기수마다 진행하는 방식이 조금 다르고, 코로나19전엔 해외연수였다고 합니다 😮
이 프로젝트에서의 특전은 바로,,, 2021 SSDC(Samsung Software Developer Conference)에 발표할 기회를 얻을 수 있다는 것이였습니다.

이전까지는 소스콘(SOS CON)으로 진행했지만, 규모가 더 커지면서 2021년 1회를 개최하는 그런 컨퍼런스입니다. 무려 1회에 발표라니…ㅠ
1학기를 포함한 모든 제 활동을 보고 우수교육생으로 선정되었으며, 전국(4개 캠퍼스)의 30명의 인원이 함께 했습니다.
모두 엄청난 능력을 가진 인원들만 뽑힌거라 능력이 좋은 사람보다는, 잘 맞는 사람을 찾고자 했습니다.

무엇보다 삼성전자의 SR과 무선사업부와 연계해 멘토링 받는거니 원하는 부서를 고르는 것도 괜찮을 것같더라구요.
그래서 함께하기로 한 인원은 서울캠퍼스 3명, 대전캠퍼스 1명, 구미캠퍼스 1명으로 팀을 구성해, 무선사업부의 과제를 수행하기로 했습니다!

무선사업부의 과제는, GUI로 구성되어있는 동작(Node)을 배치함으로써 하나의 흐름(Flow)를 만들수 있는 개발자 툴(SASM)을 활용합니다.
따라서 이 과제를 선택한 팀들은 동작이나 흐름을 만드는 것이 목표로 했으며,
무선사업부인만큼 삼성의 Smart Things나 Bixby와 호환할 수 있는 것이 가장 큰 장점이였습니다.


📝 목표 설계

  1. 최소 4개 이상의 Node를 개발해보자.
  2. 최소 2개의 Flow를 구상해, 우리가 만든 Node를 활용해보자.
  3. 현직 멘토님께 최소 5회 이상의 코드리뷰를 받자.

놀랍게도 1등이라는 목표가 없습니다 ㅎㅎ
사실 우수교육생으로 선정되는거 자체가 너무 감사했기에, 수상보다는 멘토님과의 소통으로 좋은 인연 이어가자가 목표였습니다.

📋 서비스 요약

🔧 기술 스택

  1. 형상관리 : Github
  2. 이슈관리 : Jira
  3. 커뮤니케이션 : Mattermost, Notion, Slack
  4. ML Model : Tensorflow Mediapipe Hands, BlazePose
  5. Algorithm : vector normalization, compute-cosine-similarity, weighted distance matching
  6. 개발 환경
    • OS : Windows 10
    • Language : HTML5, CSS3, Javascript
    • FrameWork : Node.js 14.17.3, Node-RED 2.0.6
    • Editor : Visual Studio Code 1.58

💬 서비스 요약

스마트홈 환경에서 동작 인식 기능 활용하기

손을 사용할 수 없거나, 주변 소음으로 목소리를 활용할 수 없는 경우 없으셨나요?
예를 들어 설거지 중 에어컨을 켠다던지, 빨래방에서 기계를 다루는 등 말이죠.
그럼, 의료현장과 발표환경 등의 다양한 공간에서는 이 필요성이 더 느껴질겁니다.


터치와 음성의 조작을 넘어 동작으로 제어하는 스마트홈.
여러분의 더 고차원적인 환경을 제공해드리겠습니다.

🏃🏻‍♀️ 진행

프로젝트 기간 : 2021-08-23 ~ 2021-10-08 (총 7주)

기획

목표로 전달받은 내용은 SASM(Samsung Automation Studio for Mashup)의 컨트리뷰션하기 였습니다.

하지만, 컨트리뷰션의 영역을 정말 넓습니다. 번역, 이미 있는 Node의 새로운 Flow 제안하기, 테스팅, 오류 찾기, dependency 업데이트하기 등 말이죠.
오픈소스 생태계에 처음 들어가기에 이왕하는거 현직 멘토님도 있으니 개발 코드를 기여하자! 가 목표였습니다.
그렇다면 새로운 기능을 만들어야하는데 어떤 기능이 필요할까? 로 출발했습니다.

  1. 아이디어 선정
    팀원들과 함께 직접 서비스를 사용해보면서 확인했는데, 필요한 기능은 왠만한 Flow로 쉽게 만들 수 있었습니다.
    아이디어에는 선정자체가 정말 힘들었죠… 😂

    그러던 와중 팀원이 제시해준 동작인식이 화두에 올랐습니다.
    사실 비슷한 공부를 해보았을때 인식 자체는 어렵지 않지만,
    이걸 독립적인 동작이 되도록 Node로 구성해야하면서 IoT의 CAM을 받아와야하니 회의적이였습니다.
    하지만, 내부 회의와 멘토님의 추천에 따라 이 주제를 선정하게 되었으며 이때부터 더욱 상세한 기획을 진행했습니다.

  2. 상세 기획
    동작인식은 범위가 넓어, 너무 많은 것보다는 확실하고 정확도를 높인 부분만 선택하자로 진행되었습니다.
    그렇게 설정된 목표가, 손동작몸동작이였습니다. 실제로 이 둘은 정말 많은 라이브러리들이 있으며, 라이선스도 꽤 자유롭죠.
    이렇게 선정된 기획에 동작 단위의 기능들이 선정되었습니다.

  3. 추가 기획
    SASM은 개발자가 사용하는 툴로 현재 인식이 잘 되고 있는지, 또 잘 활용되고 있는지를 모니터링해주는 노드도 필요하다고 생각했습니다.
    따라서 동작을 인식/분류하는 기능 외에도 확인하는 기능도 추가하고자했습니다.

그리고 항상 계획서 작성하기! 처음보는 사람도 우리의 프로젝트를 이해할 수 있도록 열심히 작성했었습니다 ㅎㅎ

설계

설계라고 할 것은 크게 없었습니다. 이미 SASM의 기반이 되는 Node-red에 Node 만들 수 있는 Template도 많고, Github도 많으니까요.

따라서 필요한 것은 어떤 단위로 노드를 만들 것이며, 노드를 만들 수 있도록 학습하자 였습니다.
노드의 단위를 만드는 건 생각보다 간단했습니다. 직접 Flow를 만들어보면, 빈 공간들이 생기는데 거길 채워주면 되겠다라고 생각했습니다.
실제로 아래처럼 간략히 그렸습니다.

저희가 생각한 흐름은 위와 같았는데, 회색은 기존에 있는 것으로도 해결이 가능한 기능이였죠.

따라서 필요한 기능은 푸른색의 내용들로,

  • 캠에 따른 동작 인식 기능
  • 유사한 동작이 없는 경우 등록할 수 있도록하는 기능
  • 저장된 동작들 중 가장 유사도가 높은 동작명을 반환하는 기능

이 필요했습니다.
이를 IoT와 Web CAM 버전으로 2개씩, 그리고 모니터링 기능까지해서 총 7가지의 기능을 만들고자 했습니다.

학습은 팀원 누구하나 게으르지 않고 진행했었어요.

저희 팀이 작성한 학습 페이지들을 (들쭉날쭉) 캡쳐해온건데 정말 모든 인원이 본인이 공부한걸 팀원 누구든지 학습하고 참고할 수 있도록 기재했습니다.

이게 정말 자극도 많이 되고, 도움도 많이 되었어요 ㅎㅎ

개발

기능을 구현하는 것에는 엄청난 어려움은 없었습니다. 막혀도 공식 문서를 참조해서 생각보다 무난했습니다.
자료로 보여드릴 순 없지만, 매주 멘토링을 통해 기술적으로 막히거나 문서에서 확인할 수 없는 내용은 현직개발자인 멘토님께 요청했었죠.

그럼에도 가장 힘들었던 것은, IoT 장비의 데이터를 받아오는 부분이였습니다.
영상을 불러와 거기에 ML Model을 입히는 작업을 하다보니,
영상을 가져오는 부분에 있어서 ffmpeg로 해결하는 등의 어려움이 있었습니다.

일부 환경에 따라 끊기거나 깨지는 현상이 있어 이를 수습하기 위해 노력했었던 것같습니다.

  1. Hands Detect
  2. Body Detect

좀 징그럽기도 하고 웃기기도 하지만, 몸 구석구석에 있는 Point 정보들 입니다.
공식문서에서 제공하는 자료로 이러한 포인트 점들의 구성과 배치 등을 고려하기 위해 알고리즘을 고려하고 확인했습니다 ㅎㅎ

그리고 Hand와 Body의 노드수가 상이하고, 이 신체 부위가 아닌 더 많은 모델에서 더욱 다양하기에 Mongo DB를 선정해서 진행했습니다.
새롭게 다른 Node를 추가해서 함께 Flow를 구상해보았습니다.

삼성 멘토님과의 리뷰

우수교육생으로 받을 수 있는 가장 큰 혜택이죠.
무선사업부의 현직 개발자 멘토님과 함께 정말 다양한 과제리뷰를 진행했습니다.

처음엔 단순히 문제상황을 공유하는 것도 어려움이 컸는데, 뒤로 갈 수록 문제상황, 시도한 방법, 원하는 방향 등도 요청드리면서 원활한 시간을 할애했습니다.

심지어 리뷰시간이 아니여도 소통을 많이해주셔서 SASM과 더불어 다양한 진행에 큰 어려움이 없이 진행되었습니다.


상세 알고리즘 고민

새로운 고민으로는 노드들이 배치가 같아도, 회전이 다르면 전혀 다른 동작으로 인식하기 때문에 어떻게 인식할 것인가가 중요했습니다.
그래서 유사성 판단을 하면서 벡터와 가중치 등의 내용을 함께 접목하는 수식을 고려했습니다.

팀원분이 맡아서 진행해주셨지만, 저 역시 발표를 맡으며 알아야하기에 꼼꼼히 다시 공부하면서 이해했던 기억이 있네요 🤣


오픈소스 생태계 활용하기

오픈소스의 개념을 잘 살리기 위해 오픈소스 개발 뿐만이 아닌 소통도 적극적으로 활용해보았습니다.
Smart Things의 Commnity나 Mediapipe의 Slack을 많이 참조하며, 저희가 마주한 문제를 찾아보고 직접 질문하며,
많은 개발자분들과 소통할 수 있는 시간도 가졌습니다.


사용자 친화적 UI 추가

더 편리하게 등록하기 위해서 등록 화면을 html로 간단히 구상했었습니다.
정상적으로 데이터값이 들어오고 확인했는지 편의성을 위해 캡쳐된 화면과 데이터 등을 확인하는 영역도 추가했었습니다.
사실 이는 제가 직접 테스팅하고 등록해보면서 추가했던 기능이였는데, 너무 만족스러웠고 꼭 필요했다고 생각이 들어 뿌듯합니다.


실제 삼성 서비스와 연계

삼성의 SmartThins와 연계하는 과정은 큰 어려움이 없었습니다.
이미 SASM에 다양한 IoT와 사용할 수 있도록 독자적인 노드들이 잘 있었으니까요.

마지막에 가장 애를 먹었던건 빅스비 캡슐을 만드는 단계였는데,
이는 멘토님을 통해 내부 문서를 공유받아 진행할 수 있었습니다 (지만 필자는 아이폰 유저라 팀원들이 없으면 사용할 수 없었습니다 ㅠ)


현직 삼성 개발 멘토님께 코드리뷰

SSDC 프로젝트를 참여하기 전에는 큰 코드리뷰 없이 항상 급하게만 진행을 했던 것같은데,
Pull Request를 보내고 self-merge도 서슴치 않고 했었습니다..ㅋㅋ

하지만 멘토님과 함께하니 각 변수가 왜 필요한지 네이밍은 왜 필요한지 등의 리뷰 해주셨습니다.
그냥 작성된 코드는 없고, 불필요한 코드 역시 남기지 않는다라는 꼼꼼하면서도 전문적인 인상을 참 많이 받았습니다.

이 과정이 있어서 Github를 단순 프로그래밍 코드 관리가 아닌 정말 유의미한 방법을 활용할 수 있었다고 생각합니다.



테스트

테스트를 하려면 많은 사용자가 있어야하는데,
IoT 장비를 사용하거나 빅스비 캡슐을 사용하는 등의 종속적인 문제가 많아 사실상 짧은 기한 내에 불가했습니다.

그렇기에 npm과 node-red 상에 clean 상태에서 정상적인 설치가 되는지 정도만 확인하며,
동작인식의 정확도를 높이는 작성을 반복하는 식으로 한 해결했습니다.

가장 아쉬운 점이 이 부분인 것같으면서도, 마이크로 홈페이지를 만들어 더 디테일한 설명이 들어한 진행을 했다면 더 좋지 않았을까 생각이 들더라구요.

실제 장비 세팅과 환경 설정이 다 되어있는 저의 집에 지인들이 올때마다 테스팅하는 식으로 진행했습니다 😆



배포 및 운영

이번 배포는 도메인을 기준으로 서비스를 배포하는 것이 아닌, npm와 node-red에 배포를 하는 것이였습니다.
npm과 node-red는 정말 다양한 패키지들이 올라와 있고, 전세계의 사람들이 보는 것이니 가독성면에서도 신경쓰려고 했어요.

왼쪽처럼 각 내용에 대한 걸 팀 Notion에 작성하면, 팀원 중 영어능력자가 이렇게 정리해 README와 Wiki에 등록하는 방식으로 진행했어요.
또, 난생처음으로 npm에 등록을 해보았습니다.

개발을 시작하고 package.json을 이렇게 꼼꼼하고도 열심히 작성해본적이 없는 것같아요 ㅋㅋ

이러한 내용들은 아래와 같은 링크를 많이 참고했었습니다.



📚 결과

🖥 구동화면

모두 공개된 gif지만,,, 팀원의 사진을 그냥 공개할 수 없어 손 동작 인식 과정은 여기서 확인해주세요!

  1. 동작 등록 과정 : 현재 캠, 실시간 동작인식, 동작 캡쳐 타이머, 인식 결과 및 데이터 값
  1. 동작 인식 과정 : 생활 중 등록된 동작으로 기계를 조작하는 과정
  1. 한 주간 600건 이상의 download 수 기록



👩🏻‍💻 회고

목표를 달성했는지 한번 봐야겠죠?

  1. 최소 4개 이상의 Node를 개발해보자. → 최종 배포 기준으로 총 9개를 만들게 되었습니다. 인식하는 과정, 등록하는 과정, 찾는 과정의 3가지이지만, 인식하는 과정에 CAM에 종류에 따라 socket도 다르고 세팅도 다르기에 별도로 만들었죠. 또한 개발자 툴인 만큼 모니터링할 수 있도록 하는 Node도 완성했습니다!
  2. 최소 2개의 Flow를 구상해, 우리가 만든 Node를 활용해보자. → 누구든 사용하기 쉽도록 저희가 테스팅했던 Flow를 그대로 배포했습니다. 단, Webcam 버전은 따로 두지 않고, IoT CAM 버전의 노드만 교체하면 되었어 IoTCAM 버전만 제공했습니다. 따라서 Hand 버전Body 버전을 제공하면서, 이 Flow로 확장된 홈서비스인 Home Training으로까지 확장했었습니다. 이는 이 회고록보다는 발표에서 보는게 더 정확하실 것같네요 ㅎㅎ
  3. 현직 멘토님께 최소 5회 이상의 코드리뷰를 받자. → 공개된 공간에서 전문가인 현직 삼성의 멘토님들께 큰 응원도 위로도, 조언도 받으면서 엄청 뿌듯한 시간을 보냈었습니다. 더 긴 시간 빠르게 Pull Request나 Issue 등으로 소통을 할 걸이라는 아쉬움도 남았지만, 돌아간다고 해도 이보다 더 열심히 할 수는 없을 것이라고 생각합니다 ㅎㅎ 계획한 5회 이상은 아니지만, 10개 이상의 코드 코멘트를 받으며 만족스러운 계획이라고 생각합니다.

이런 과정을 통해 실제 Samsung Github Repo에 저의 코드가 Merge되는 귀중한 경험을 했습니다.

이제 목표를 넘어 제 스스로를 돌아볼까 생각합니다.

능력좋고 멋진 팀원들 덕에 배운 점도 느낀 점도 참 많았던 기간이였습니다. 그렇기에 팀장부터 발표까지 맡은 것에 큰 부담도 있었지만, 다시는 없을 기회라 생각하고 최선을 다해 집중했습니다!

개발자로서 정말 많이 성장했고, 또 그 무엇보다 소중한 경험과 인연을 많이 만났다고 생각합니다.
그래서 결과는 어땠냐구요?

ㅎㅎ 무선사업부 과제 파트에서 1위를 수상해 SSDC 발표를 나가게 되었습니다.
이 이야기는 다른 회고에서 더 자세히 이야기해볼께요!

🌐 관련링크

profile
✍🏻 뭐든 배우면 다 자산이 되겠죠!

0개의 댓글