시작 전에
환경설정
Windows 11 PC 에서 파이썬 가상환경을 만들고 OpenCV, NumPy, Matplotlib, pandas 를 설치합니다. 코드는 VS Code 에서 쓰고 실행합니다. 이 쪽의 출력은 교안을 만든 PC(Windows 11 Pro, Python 3.14.6)에서 실제로 실행해 얻은 것입니다.
설치하기
- 파이썬 3.12 이상이 깔려 있는지 확인합니다. 없으면 python.org 에서 Windows 설치 파일을 받아 설치하고, 첫 화면의 "Add python.exe to PATH" 를 체크합니다.
- VS Code 를 설치하고, 확장(Extensions)에서 마이크로소프트가 만든 "Python" 확장을 설치합니다.
- 과목 폴더를 영어 이름의 폴더에 둡니다(예:
C:\workspace\opencv-class). Windows 에서 OpenCV 의cv2.imread,cv2.imwrite는 경로에 한글이 있으면 실패합니다(1장 "설치 확인과 첫 코드" 참고).
python --version # 파이썬 버전을 찍는다Python 3.14.6가상환경 만들고 패키지 설치하기
과목 폴더의 requirements.txt 에 이 과정에서 쓰는 패키지가 교안 PC 와 같은 판으로 적혀 있습니다. PowerShell 에서 과목 폴더로 옮긴 뒤 한 줄씩 실행합니다.
cd C:\workspace\opencv-class # cd = change directory, 과목 폴더로 옮긴다
python -m venv .venv # -m = module, .venv 폴더에 가상환경을 만든다
.\.venv\Scripts\Activate.ps1 # 가상환경을 켠다. 줄 앞에 (.venv) 가 붙는다
python -m pip install --upgrade pip # --upgrade = 최신판으로 올린다. pip 자신을 먼저 올린다
python -m pip install -r requirements.txt # -r = requirement file, 파일에 적힌 패키지를 적힌 판 그대로 설치한다
python -m pip check # check = 설치된 패키지끼리 판이 맞물리는지 검사한다
yolo settings sync=False # ultralytics 의 익명 사용 통계 보내기를 끈다(선택)| 명령과 옵션 | 원래 말 | 뜻 |
|---|---|---|
-r requirements.txt | requirement file | 파일에 적힌 목록을 읽어 한꺼번에 설치한다 |
pip check | check(검사하다) | 서로 필요한 판이 맞지 않는 패키지가 있으면 알린다 |
--extra-index-url(파일 안) | 덧붙일 저장소 주소 | PyTorch 의 CPU 판을 PyTorch 저장소에서도 찾게 한다 |
requirements.txt 의 내용입니다.
--extra-index-url https://download.pytorch.org/whl/cpu
# 1차시부터: 영상 읽기와 처리, 숫자 배열, 그래프
opencv-python==5.0.0.93
numpy==2.5.4
matplotlib==3.11.2
# 1차시 프로젝트부터: 점검표 같은 표 찍기
pandas==3.1.0
# 18차시부터 20차시까지: YOLO 학습과 추론(CPU 판 PyTorch)
ultralytics==8.4.198
torch==2.15.0+cpu
torchvision==0.29.2+cpu교안 PC 에서 새 가상환경을 만들어 이대로 설치하면 마지막 줄이 Successfully installed …(설치된 패키지 이름이 길게 이어져 줄였습니다)로 끝나고, pip check 는 아래처럼 나옵니다.
No broken requirements found.| 패키지 | 판 | 쓰는 곳 |
|---|---|---|
| opencv-python | 5.0.0.93 | 모든 장의 영상 읽기, 처리, 저장 |
| numpy | 2.5.4 | 이미지(숫자 배열) 계산 |
| matplotlib | 3.11.2 | 이미지와 결과를 화면에 띄우기 |
| pandas | 3.1.0 | 점검표 같은 표 찍기(1장 프로젝트부터) |
| ultralytics | 8.4.198 | YOLO 학습과 추론(18장부터 20장까지) |
| torch | 2.15.0+cpu | ultralytics 가 쓰는 딥러닝 바탕(GPU 가 없어도 되는 CPU 판) |
| torchvision | 0.29.2+cpu | torch 와 함께 쓰인다 |
ultralytics 는 PyTorch 를 함께 설치하므로 가상환경이 수백 MB 커집니다(교안 PC 에서 700MB 남짓). 17장까지만 공부한다면 requirements.txt 의 마지막 세 줄을 지우고 설치해도 됩니다.
- 가장 작은 YOLO 가중치
yolo11n.pt(5.4MB)는 교안의data폴더에 들어 있습니다. 없으면 18장 실습 1을 처음 실행할 때 ultralytics 가 인터넷에서 받습니다. - ultralytics 와 YOLO 가중치의 라이선스는 AGPL-3.0 입니다. 수업과 개인 공부에는 문제가 없고, 이 코드를 넣은 서비스를 남에게 제공하려면 소스 공개 의무나 회사의 상업 라이선스를 따로 확인해야 합니다.
- ultralytics 를 불러오면(
import ultralytics)cv2.imread가 한글 경로도 읽도록 바뀝니다. 1장에서 본 한글 경로 문제와 결과가 달라 보일 수 있습니다.
OpenCV 패키지는 opencv-python, opencv-contrib-python, opencv-python-headless, opencv-contrib-python-headless 가운데 하나만 설치합니다. 둘 이상을 깔면 같은 cv2 를 서로 덮어써서 오류가 납니다. 이미 여러 개를 깔았으면 모두 지우고(python -m pip uninstall 패키지이름) 하나만 다시 설치합니다.
VS Code 에서는 Ctrl+Shift+P → "Python: Select Interpreter" 에서 과목 폴더의 .venv 파이썬을 고릅니다.
실행 확인하기
가상환경을 켠 상태에서 아래 코드를 실행합니다.
import sys
import cv2
import numpy as np
import matplotlib
print("파이썬:", sys.version.split()[0])
print("가상환경 안인가:", sys.prefix != sys.base_prefix)
print("OpenCV:", cv2.__version__)
print("NumPy:", np.__version__)
print("Matplotlib:", matplotlib.__version__)파이썬: 3.14.6
가상환경 안인가: True
OpenCV: 5.0.0
NumPy: 2.5.4
Matplotlib: 3.11.2실습 코드는 교안의 data 폴더를 작업 폴더로 두고 실행합니다. VS Code 에서는 data 폴더에서 터미널을 열거나, 코드 맨 위에서 os.chdir("data 폴더의 경로") 로 옮깁니다.
자주 나는 오류
| 오류 글 | 까닭 | 해결 |
|---|---|---|
Activate.ps1 ... 이 시스템에서 스크립트를 실행할 수 없으므로 | Windows 의 실행 정책이 스크립트를 막는다 | Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 를 한 번 실행한 뒤 다시 켠다(현재 사용자에게만 적용) |
ModuleNotFoundError: No module named 'cv2' | 가상환경을 켜지 않았거나 VS Code 가 다른 파이썬을 쓴다 | 줄 앞의 (.venv) 확인, VS Code 에서 .venv 파이썬 고르기 |
[ WARN:0@...] ... imread_(...): can't open/read file 과 함께 결과가 None | 파일 이름 오타, 작업 폴더가 다름, 경로에 한글 | os.getcwd() 로 작업 폴더 확인, 영어 경로로 옮기기, np.fromfile + cv2.imdecode 로 읽기 |
'NoneType' object has no attribute 'shape' | 읽기에 실패한 None 을 그대로 썼다 | 읽은 직후 if img is None: 으로 확인 |
| 그림의 빨강과 파랑이 바뀌어 보인다 | OpenCV 의 BGR 그림을 Matplotlib 에 그대로 넣었다 | cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 로 바꿔 넣기 |
패키지를 더 설치했더니 opencv-python-headless 가 함께 깔려 cv2 가 이상해졌다 | 함께 설치한 다른 패키지가 headless 판을 요구했다 | python -m pip uninstall opencv-python-headless 뒤 python -m pip install --force-reinstall opencv-python (교안 PC 에서는 함께 깔리지 않았다) |
ERROR: Could not open requirements file | 과목 폴더가 아닌 곳에서 실행했다 | requirements.txt 가 있는 과목 폴더로 가서 다시 실행한다 |
| 그래프의 한글이 네모로 나온다 | Matplotlib 의 기본 글꼴에 한글이 없다 | Windows 는 plt.rcParams["font.family"] = "Malgun Gothic". 코랩은 아래 "구글 코랩에서 실습하기" 의 준비 셀을 먼저 실행 |
cv2.imshow 창이 안 뜨거나 멈춘다 | 노트북·원격 환경, waitKey 를 부르지 않음 | 이 과정처럼 Matplotlib 으로 띄우기 |
구글 코랩에서 실습하기
구글 코랩(Google Colaboratory)은 웹 브라우저에서 파이썬을 돌리는 구글의 무료 서비스입니다. colaboratory 는 "함께 일하는 연구실"이라는 뜻입니다. 실습실 PC 에 설치 권한이 없거나 집의 PC 에 설치가 어려울 때 씁니다. 구글 계정만 있으면 되고, 파이썬과 OpenCV, NumPy, Matplotlib, pandas 는 이미 깔려 있습니다.
이 쪽의 코랩 명령은 교안을 만든 PC 에서 실행하지 않은 안내 코드입니다. 코랩은 구글 계정으로 로그인해야 해서 직접 돌려 보지 못했습니다. 그 대신 코랩과 비슷하게 OpenCV 를 4.x 판으로 바꾼 환경에서 20장의 실습을 모두 돌려 확인했습니다(아래 "교안 PC 와 다른 점").
준비물
- 교안과 함께 받은
colab_data.zip(과목 폴더 맨 위, 6.4MB). 실습 그림, 동영상, 정답표, YOLO 가중치yolo11n.pt가 들어 있습니다. 실습이 만든out_파일은 들어 있지 않습니다. - 코랩에서 새 노트북을 엽니다(colab.research.google.com → 새 노트북).
준비 셀
새 노트북의 첫 셀에 아래를 붙여 넣고 실행합니다. 파일 고르기 창이 뜨면 colab_data.zip 을 고릅니다. 줄 앞의 ! 는 파이썬이 아니라 리눅스 명령을 실행하라는 코랩의 표시입니다.
!apt-get -qq install fonts-nanum # 나눔 글꼴을 설치한다(-qq = 진행 글을 거의 찍지 않는다)
!pip -q install ultralytics # 18차시부터 쓰는 YOLO 를 설치한다(-q = quiet, 조용히)
from google.colab import files
files.upload() # 파일 고르기 창에서 colab_data.zip 을 올린다
!unzip -q -o colab_data.zip -d /content/opencv-class # -o = overwrite(덮어쓰기), -d = directory(풀 곳)
import os
import matplotlib.font_manager as fm
# 실습 코드는 그래프 글꼴로 "Malgun Gothic"(Windows 의 맑은 고딕)을 부른다.
# 코랩에는 이 글꼴이 없으므로, 나눔고딕 파일을 "Malgun Gothic" 이라는 이름으로 등록해 대신 쓰게 한다
fm.fontManager.ttflist.append(
fm.FontEntry(fname="/usr/share/fonts/truetype/nanum/NanumGothic.ttf", name="Malgun Gothic"))
os.chdir("/content/opencv-class/data") # 실습의 작업 폴더로 옮긴다
import sys, cv2
print("파이썬:", sys.version.split()[0], "· OpenCV:", cv2.__version__, "· 작업 폴더:", os.getcwd())그다음부터는 교안의 실습 코드를 그대로 셀에 붙여 넣어 실행합니다. 마지막 줄이 찍는 파이썬과 OpenCV 의 판을 확인해 두세요. 코랩의 판은 때때로 바뀝니다. 준비 셀은 그래프를 그리기 전에 실행합니다. 이미 그래프를 그린 뒤라 한글이 네모로 나오면 "런타임 → 세션 다시 시작" 뒤 준비 셀부터 다시 돌립니다(Matplotlib 이 한 번 찾은 글꼴을 기억해 두기 때문입니다).
| 명령 | 원래 말 | 뜻 |
|---|---|---|
apt-get install | Advanced Package Tool | 리눅스에 프로그램(여기서는 글꼴)을 설치한다 |
files.upload() | upload(올리기) | 내 PC 의 파일을 코랩의 작업 공간(/content)에 올린다 |
unzip | 압축 풀기 | zip 파일을 정한 폴더에 푼다 |
fm.FontEntry(..., name=...) | font entry(글꼴 항목) | 글꼴 파일을 정한 이름으로 Matplotlib 에 알려 준다 |
os.chdir | change directory | 작업 폴더를 옮긴다 |
런타임이 끝나면 지워진다
코랩의 작업 공간은 런타임(runtime, 코랩이 빌려주는 컴퓨터)이 끝나면 통째로 지워집니다. 창을 오래 두거나 "런타임 연결 해제"를 누르면, 올린 데이터와 실습이 만든 out_ 파일이 모두 사라집니다. 다시 열면 준비 셀부터 다시 실행합니다.
- 장을 건너 파일을 쓰는 곳은 같은 런타임에서 차례로 돌립니다. 특히 17장 실습 5(
out_ch17_yolo/) → 18장 실습 2(학습,out_ch18_runs/parts/weights/best.pt) → 18장의 나머지, 19장, 20장 순서입니다. - 학습한 모델을 남겨 두려면
files.download("out_ch18_runs/parts/weights/best.pt")로 내려받아 두었다가, 다음에 같은 자리(out_ch18_runs/parts/weights/)에 올립니다.
교안 PC 와 다른 점
| 항목 | 교안 PC(Windows) | 코랩 |
|---|---|---|
| 가상환경 | 과목의 .venv 를 만들어 쓴다 | 만들지 않는다. 1장 실습 1의 "가상환경 안인가" 는 False 가 정상이다 |
| 패키지 | requirements.txt 로 판을 맞춘다 | 미리 깔린 OpenCV·NumPy 를 그대로 쓰고 ultralytics 만 설치한다. requirements.txt 로 판을 바꾸면 코랩의 다른 패키지와 부딪칠 수 있어 권하지 않는다 |
| OpenCV 판 | 5.0.0 | 4.x(코랩에 깔린 판). 교안 PC 에서 OpenCV 만 4.14.0 으로 바꿔 20장을 모두 돌려 보니 오류·경고 없이 돌았고, 2~6·8~10·12·13·16장은 출력이 교안과 똑같았다. 다른 곳은 판 숫자, 시간 측정, 4장의 calcHist 결과 모양((256,) 대신 (256, 1), 4장 본문이 설명한 대로 ravel() 로 펴면 같다), 그리고 18~20차시의 YOLO 결과다. OpenCV 판이 달라 학습한 모델이 조금 달라지므로 점수의 끝자리나 헛것 수가 다를 수 있다(예: 18장 실습 5의 잡음 조건 F1 0.815 대신 0.762) |
| 한글 글꼴 | 맑은 고딕 | 준비 셀로 나눔고딕을 "Malgun Gothic" 이름으로 등록 |
| 한글 경로 문제 | 1장에서 본 대로 cv2.imread 가 실패한다 | 작업 폴더가 영문 경로라 생기지 않는다 |
cv2.imshow | 창이 뜬다(이 과정은 쓰지 않음) | 코랩이 막아 둔다. 이 과정처럼 Matplotlib 으로 보거나 from google.colab.patches import cv2_imshow 를 쓴다 |
| 웹캠(15장 "웹캠 다루기") | cv2.VideoCapture(0) | 쓸 수 없다. 코랩의 카메라는 브라우저를 거쳐야 해서 이 과정의 코드로는 열리지 않는다. 동영상 파일 실습은 그대로 된다 |
| 18장 학습 시간 | CPU 로 약 6분 | 코랩의 CPU 에 따라 다르다. "런타임 → 런타임 유형 변경" 에서 GPU 를 골라도 코드의 device="cpu" 때문에 CPU 로 돈다. GPU 로 돌리려면 device=0 으로 바꾸고, 결과의 끝자리가 교안과 달라질 수 있다 |
| 시간을 재는 실습 | 교안의 ms 숫자 | 컴퓨터가 달라 숫자가 다르다. "몇 배 차이" 로 견준다 |