이번 프로젝트에서는 팀장을 맡지 않기로 했다. 성격 상 내가 하겠다고 할 뻔했지만 속에서 나 자신을 계속 말렸다.
이번엔 팀원으로서 개발에만 집중해보고 싶었다. 저번 프로젝트 때 개인적인 브랜치에서 다양한 시도를 해보는 팀원들을 봤었다. 팀장인 나까지 기획안을 벗어나서 새로운 시도를 무작정 해볼 순 없었다. 방향성을 유지하기 위해 항상 고지된 일들만 했었다. 이번 프로젝트 때는 하고 싶은걸 다 해볼 생각이다.
하지만 프로젝트가 산으로가는건 두고 못보는 성격이라 팀장을 맡은 분을 계속 도와드리려고도 한다. 지나치게 관여하는건 간섭처럼 여겨질 수도 있을거 같아 조심스럽긴 하다.
오늘부터 미니프로젝트를 시작했다. 우리 팀은 주제를 선정하고 주요 Tasks로 Object Detecting을 이용하기로 했었다.(과거형인 이유는... 결국 프로젝트 주제가 바뀌었기 때문이다.)
여러 모델들을 시험삼아 써봤다. 이 과정에서 모델의 추론코드가 쉽게 넘파이와 충돌이 난다는 것을 깨달았다. 머신러닝을 이용한 개발은, 학습된 모델을 갖다 쓰는것 자체는 매우 간단하지만 제대로 갖다 쓰는게 난관인 것 같다. 제대로 갖다쓴다는건, 문제 상황을 제대로 알고, task에 맞는 모델을 제대로 선정하고, 문제해결 수준에 맞게 모델을 활용(때로는 학습까지...)하고, 그 과정에서 여러 구현과 관련된 문제들을 해결하는게 아닌가 싶다.
다음의 모델들을 이용해봤다.
keremberke/yolov5n-garbage
https://huggingface.co/keremberke/yolov5n-garbage
google/vit-base-patch16-224
https://huggingface.co/google/vit-base-patch16-224
yoloV8
https://huggingface.co/Ultralytics/YOLOv8
https://docs.ultralytics.com/ko
Recongnize-anything - RAM++
https://github.com/xinyu1205/recognize-anything
예시 이미지
결과
이 밖에도 이미지로 테스트하며 어떤 모델을 사용해야 할까 고민했다. 특강에서 멘토님께서 현업에선 특정 기능 구현을 위해 모델을 여러개, 그것도 커스텀해서 사용한다고 하셨는데 이유를 알 것 같다. 모델 하나로는 영 부족한 느낌이다.
프로젝트에 사용할 기술스택을 팀원들과 고민하다가, 미니프로젝트 DB에는 MongoDB를 사용하기로 했다. 기간이 짧고, 정규화까지는 필요하지 않을 것 같기 때문이다. NoSQL은 처음 사용해보기 때문에 미리 알아봤다.
다음의 영상을 참고했다.
MongoDB Schema Design Best Practices
https://youtu.be/QAqK-R9HUhc?si=5g8V614wxbNyaH3N
제목 때문에 클릭하지 않을 수가 없었다. RDBMS만 사용해본 나로써는 NoSQL을 사용할때 스키마는 어떻게 설계해야할까 생각조차 못하고 있었기 때문이다!
그런데 결론부터 말하자면, MongoDB에서는 스키마를 RDBMS때보다 복잡하게 생각할게 없었다. 또한 OneToOne, OneToMany, ManyToOne 등의 관계도 문서 기반에서는 자연스러운 관계였다. 정규화를 해주고 말게 없는 것 같다...!
아직 MongoDB를 사용해보진 않았지만, 이런게 더 객체지향적인 DB가 아닐까 싶기도 하다. ORM과 대응되는 미들웨어로 ODM(Object Document Mapper)란게 있긴 하다. 아마 직접 써봐야 알겠지만... JSON자체가 객체형식을 갖고 있는데 매핑까지 해줘야 하는 이유는 뭘까? 이는 MongoDB의 문서(Document)개념이 무엇인지 알아야 깨닫게 될 질문인듯 싶다.
MongoDB는 다양한 플랫폼의 드라이버를 지원하고 있다. 어떤 플랫폼에서 프로젝트를 하던간에 언젠가는 다시 사용할 것 같다. 파이썬은 드라이버를 두개 지원하고 있었다.
mongoDB with Python docs
https://www.mongodb.com/ko-kr/docs/drivers/python-drivers/
pyMongo는 동기, 멀티 스레드 환경, Motor는 AsyncIO
기반으로 비동기를 지원하는 드라이버이다. Motor를 쓸듯 하다.
MongoDB는 성능을 위해 JSON을 개량해 BSON(Binary JSON)이란 데이터 교환 포맷을 이용한다.
BSON 타입 | 설명 |
---|---|
String | 문자열 (JSON과 동일) |
Int32 | 32비트 정수 |
Int64 | 64비트 정수 |
Double | 64비트 부동소수점 |
Boolean | 참/거짓 값 |
Date | 날짜 및 시간 |
Binary | 이진 데이터 |
ObjectId | MongoDB의 고유 식별자 |
Array | 배열 |
Document | JSON 객체와 동일한 문서 구조 |
Null | Null 값 |
RegularExpression | 정규식 표현 |
내일은 Jinja와 MongoDB를 실제로 사용해봐야겠다.