본문 바로가기

Python

(9)
[Python] opencv로 카메라에서 이미지 프레임을 가져올 때 주의할 점 간혹 opencv로 카메라 스트림에서 1 프레임씩 이미지를 가져오려는 경우가 있을 수 있다. 하지만 실시간으로 비디오를 스트리밍하는 게 아니라 원할 때 1 프레임씩 가져올 때 요청 순간의 프레임이 아닌 이전 시점의 프레임을 가져온다. 이는 opencv에서 카메라를 열 때 이전 프레임을 얼마나 담아둘지 버퍼 사이즈를 지정하기 때문인데 이를 조절하도록 해야 한다. 버퍼의 크기는 아래와 같이 조절할 수 있다.cap = cv2.VideoCapture(0)cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) 그리고 이 상황에서 요청 순간의 프레임을 받아오려면 read()로 버퍼를 비운 뒤에 다시 read()를 호출해 주면 된다.cap.read() # 버퍼 비우기ret, frame = cap.read()
[Python] rembg로 배경을 지워보기 이 포스트에서는 딥러닝 모델로 물체 주변의 배경을 지워주는 라이브러리인 rembg를 소개한다.rembg 소개rembg는 2020년 어워드를 받은 U²-net이라는 모델의 pretrained 모델을 사용할 수 있게 만들어진 라이브러리로, 배경을 지우는데 탁월한 성능을 보여준다.  깃허브 공식 리포에서 보여주는 배경 지우기 예시. 단색 배경을 마스킹하여 지우는 기존의 크로마키 기법보다 유연하게 사용할 수 있는 강점이 있다.사용해 보기rembg 공식 리포에서는 cpu 또는 gpu 사용에 따라 필요한 설치를 구분했다. pip install rembg[cpu] orpip install rembg[gpu] gpu 사용을 하려면 onnxruntime-gpu 지원 여부를 확인해야 한다고 한다. https://onnxr..
pyinstaller로 빌드된 파이썬 프로그램에서 리소스 경로 가져오기 파이썬으로 개발을 하는 사람 중 개발한 서비스나 앱을 pyinstaller로 배포하는 경우가 있을 수 있다. 다만 pyinstaller로 빌드한 제품은 스크립트로 실행하는 것과 달리 리소스나 에셋 파일을 가져올 때 경로가 달라지므로 이에 대응하는 함수가 필요하다. pyinstaller로 빌드된 앱에서 리소스를 가져오는 방법은 다음과 같이 작성할 수 있다. from typing import Unionimport sysfrom pathlib import Pathdef get_asset_path(relative_path: Union[str, Path]): if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): bundle_dir = P..
간단한 웹소켓 부하 테스트 비교 FastAPI vs Golang 서론현재 근무 중인 회사에서 수행하는 프로젝트로 LAN을 구축한 후 셀러론 N4505 CPU로 구동되는 서버로부터 클라이언트와 웹소켓 통신을 하는 서비스가 있다. 이 서비스의 가장 중요한 목표는 서버에서 브로드캐스트를 진행할 때 모든 클라이언트가 싱크를 맞춰 "동시에" 반응해야 한다는 것이다. 이를 위해 FastAPI를 사용해 웹소켓 연결을 관리했었는데 문제는 필드 테스트에서 싱크가 깨지는 것으로 체감이 되었기 때문이다. 환경이 제한적이라 현장에서는 모니터링을 제대로 할 수 없었는데, 혹시 파이썬 자체의 한계일까 싶어서 go와 비교를 하기로 했다.스크립트 준비웹서버 부하를 위해선 많은 도구들이 제공되고 있지만 이 포스트에서는 도구 없이 스크립팅으로 측정을 해볼 것이다.FastAPI 코드먼저 이 포스트의 ..
[FastAPI] 웹소켓을 다룰 때 주의점 - 공식 예제 개선하기 이 포스트에서는 FastAPI 공식 문서에서 보여주는 웹소켓 연결 예제를 보고 이를 개선하도록 한다. 이 세상 어딘가에서는 분명 FastAPI로 여러 클라이언트로부터 웹소켓 연결을 하려는 경우가 있을 것이다. FastAPI 공식 문서에서는 웹소켓 연결 방법에 대해 이런 예제가 우릴 반겨준다.  그리고 여러 웹소켓 연결을 관리하기 위해서 아래와 같이 웹소켓 연결을 모아두는 ConnectionManager를 정의하고 있다.  하지만 이 코드에는 여러 문제가 있다. 문제가 있는 코드를 공식 문서에 걸어놓다니 참 야속할 따름이다. 어떤 문제가 있는지 보고 개선해 보도록 하자.Race Condition이 발생함내가 생각하는 ConnectionManager의 가장 큰 문제점이다. 클래스에서는 active_conne..