과정 안내
실습 코드 사용 안내
실습 코드를 직접 돌리기 전에 장마다 무엇이 필요한지 한곳에 모았습니다. API 키가 필요한지, 무엇을 설치하고 받아 두어야 하는지, 앞의 어떤 실습을 먼저 돌려야 하는지를 표로 봅니다. 설치 방법은 환경설정에, 데이터 파일의 설명은 실습 데이터에 있습니다.
먼저 알아 둘 것
- 작업 폴더는 data 폴더입니다. 모든 실습 코드는
data폴더에서 실행한다고 보고 썼습니다. 파일을 읽고 쓰는 경로가 모두 이 폴더 기준의 상대 경로입니다. - 한글 경로를 피합니다. Windows 의 OpenCV 5.0 에서
cv2.imread·cv2.imwrite·cv2.VideoWriter는 한글이 든 절대 경로에서 실패합니다(읽기는None, 저장은False).data폴더로 옮겨 상대 경로로 돌리면 됩니다. 18장부터 ultralytics 를 불러온 프로그램에서는cv2.imread가 한글 경로도 읽도록 바뀌므로 결과가 달라 보일 수 있습니다. - 실습 코드 파일: 원고의 실습과 프로젝트 코드는 장마다
code/chNN/에lab1.py~lab5.py,project1_solution.py로도 있습니다. 프로젝트 풀이는solutions/에01_1장_프로젝트풀이.md처럼 장마다 모여 있습니다. - 실습 절 하나는 위에서부터 이어서 돌립니다. 단계(
#### 1단계)마다 앞 단계의 변수를 씁니다. 주피터에서는 셀을 차례로, 파일로는lab1.py를 통째로 돌립니다. - out_ 로 시작하는 파일은 실습이 만듭니다. 없다는 오류가 나면 그 파일을 만드는 앞 실습을 먼저 돌립니다(아래 "장을 건너는 의존과 순서").
- 구글 코랩에서도 돌릴 수 있습니다. 과목 폴더의
colab_data.zip(6.4MB, 실습 데이터와 YOLO 가중치)을 코랩에 올리고 준비 셀 하나를 돌리면 실습 코드를 그대로 씁니다. 순서와 달라지는 점은 환경설정의 "구글 코랩에서 실습하기" 에 있습니다. 코랩은 런타임이 끝나면 올린 파일과out_파일이 지워집니다. - 데이터는 다시 만들 수 있습니다. 실습 데이터는 모두 OpenCV 로 도형을 그린 작은 가상 그림이고,
tools/make_data.py가 씨앗을 고정해 만듭니다. 지우거나 고쳤다면 과정 폴더에서 다시 만듭니다.out_파일과yolo11n.pt는 이 스크립트가 만들지 않습니다.
cd data # cd = change directory, 작업 폴더로 옮긴다
..\.venv\Scripts\python ..\code\ch05\lab1.py # 5장 실습 1의 코드 파일을 돌린다.venv\Scripts\python tools\make_data.py # 과정 폴더에서 실습 데이터를 다시 만든다위는 data 폴더에서 5장 실습 1의 파일을 돌리는 예이고, 아래는 과정 폴더에서 데이터를 다시 만드는 명령입니다. 가상환경을 켜 두었다면 python 만 써도 됩니다.
API 키와 비밀 값
실행되는 실습 코드 가운데 API 키가 필요한 곳은 없습니다. 외부 서비스에 접속하거나 돈을 내는 키 없이 과정 전체를 돌릴 수 있습니다.
| 장 | 나오는 값 | 진짜 키가 필요한가 | 어떻게 다루나 |
|---|---|---|---|
| 1장~17차시 | 없음 | 아니요 | OpenCV, NumPy, Matplotlib, pandas 로 내 PC 에서만 돕니다 |
| 18장 | yolo11n.pt | 아니요 | 키가 아니라 사전학습 가중치 파일입니다. data/yolo11n.pt 에 들어 있고, 없으면 실습 1을 처음 돌릴 때 ultralytics 가 인터넷에서 받습니다 |
| 18장~20차시 | YOLO_VERBOSE 환경 변수 | 아니요 | 비밀 값이 아니라 긴 진행 글을 줄이는 설정입니다. 코드에서 os.environ["YOLO_VERBOSE"] = "False" 로 넣습니다 |
| 19장~20차시 | out_ch18_runs/parts/weights/best.pt | 아니요 | 18장 실습 2가 학습해 남긴 가중치 파일입니다 |
공개 이미지 자료(AI Hub 등)를 내려받을 때는 회원 가입과 신청이 필요할 수 있습니다. 그때 받은 인증키는 코드에 적지 않고 환경 변수에서 읽습니다. 교안의 코드는 그런 키를 쓰지 않습니다.
장별 실습 준비표
1장부터 17장까지는 opencv-python, numpy, matplotlib, pandas 네 패키지만 있으면 됩니다(os, pathlib, hashlib, shutil, json, time 은 파이썬에 들어 있습니다). 18장부터 ultralytics 와 CPU 판 PyTorch 를 더합니다. 그래픽 카드(GPU)는 어느 장에서도 쓰지 않습니다.
| 장 | 새 패키지 | 받아 둘 것 | 장비 | 먼저 할 실습 |
|---|---|---|---|---|
| 1장 | opencv-python, numpy, matplotlib, pandas | 없음 | 안 씀 | 없음 |
| 2장 | 없음 | 없음 | 안 씀(창 띄우기는 안내 코드만) | 없음 |
| 3장 | 없음 | 없음 | 안 씀 | 없음 |
| 4장 | 없음 | 없음 | 안 씀 | 없음 |
| 5장 | 없음 | 없음 | 안 씀 | 없음(4장의 ch04_exposure/ 데이터를 읽는다) |
| 6장 | 없음 | 없음 | 안 씀 | 없음 |
| 7장 | 없음 | 없음 | 안 씀 | 없음 |
| 8장 | 없음 | 없음 | 안 씀 | 없음 |
| 9장 | 없음 | 없음 | 안 씀 | 없음 |
| 10장 | 없음 | 없음 | 안 씀 | 없음 |
| 11장 | 없음 | 없음 | 안 씀 | 없음 |
| 12장 | 없음 | 없음 | 안 씀 | 없음(11장의 ch11_set/ 데이터를 읽는다) |
| 13장 | 없음 | 없음 | 안 씀(selectROI 는 안내 코드만) | 없음 |
| 14장 | 없음 | 없음 | 안 씀 | 없음 |
| 15장 | 없음 | 없음 | 웹캠은 "웹캠 다루기" 절의 안내 코드에만 | 없음 |
| 16장 | 없음 | 없음 | 안 씀 | 없음 |
| 17장 | 없음 | 없음 | 안 씀 | 실습 5(out_ch17_yolo/) → 프로젝트 |
| 18장 | ultralytics, torch·torchvision(CPU 판) | data/yolo11n.pt(5.4MB, 교안에 들어 있음) | GPU 안 씀(device="cpu") | 17차시 실습 5 → 실습 2(out_ch18_runs/) → 실습 3~5, 프로젝트. 실습 1은 따로 |
| 19장 | 없음(18장에서 설치한 것) | 없음 | GPU 안 씀 | 실습 1 → 2 → 3 → 4. 실습 3·5와 프로젝트는 18차시 실습 2 먼저 |
| 20장 | 없음(18장에서 설치한 것) | 없음 | GPU 안 씀 | 실습 2(out_ch20_exercise/) → 실습 3, 5. 프로젝트는 18차시 실습 2 먼저. 실습 1~5는 YOLO 없이 돈다 |
18장부터의 설치는 환경설정의 "YOLO 패키지 설치하기"를 따릅니다. 교안의 결과는 ultralytics 8.4.198, torch 2.15.0+cpu, torchvision 0.29.2+cpu 에서 얻었습니다. ultralytics 는 PyTorch 를 함께 설치해 가상환경이 수백 MB 커지므로 수업 전에 미리 설치해 둡니다. ultralytics 와 YOLO 가중치의 라이선스는 AGPL-3.0 입니다.
실행하지 않은 안내 코드
화면 창, 웹캠, 마우스가 있어야 하는 코드는 교안의 자동 실행에 넣지 않고 text 블록에 안내 코드로 실었습니다. 출력도 싣지 않았습니다. 내 PC 의 VS Code 에서 파이썬 파일로 실행하면 됩니다.
| 장 | 안내 코드 | 돌리려면 |
|---|---|---|
| 2장 | "화면에 띄우는 두 길" 절의 cv2.imshow, cv2.waitKey, cv2.destroyAllWindows | 화면 창을 띄울 수 있는 PC(주피터가 아닌 파이썬 파일로) |
| 13장 | cv2.selectROI 로 마우스로 네모 고르기 | 화면 창과 마우스 |
| 15장 | "웹캠 다루기" 절의 cv2.VideoCapture(0) 반복과 q 로 끝내기, cv2.CAP_DSHOW 로 열기 | 웹캠과 화면 창. 사람이 찍히면 미리 알리고 필요한 만큼만 찍습니다 |
| 18장 | "ultralytics 와 사전학습 모델" 절의 YOLO 불러오기 뼈대 | 실습 1에서 같은 코드를 실제로 돌립니다 |
설치 명령(1장의 가상환경 만들기, 18장의 pip install -r requirements.txt·pip show ultralytics, 환경설정의 코랩 준비 셀)은 교안이 자동으로 돌리지 않았고, 환경설정의 순서대로 PowerShell 에서 한 번 실행합니다. 프로젝트의 "실제 데이터로 해 보려면"은 글로만 안내하고 코드는 싣지 않았습니다.
장을 건너는 의존과 순서
대부분의 장은 그 장 안에서 끝나지만, 몇 곳은 앞 장의 데이터나 out_ 파일을 씁니다.
| 뒤 장 | 앞 장에서 가져오는 것 | 없으면 |
|---|---|---|
| 18장 실습 2~5, 프로젝트 | 17장 실습 5의 out_ch17_yolo/(학습 45장, 검증 11장, data.yaml) | 17장 실습 5를 먼저 돌립니다 |
| 18장 실습 3~5, 프로젝트 | 18장 실습 2의 out_ch18_runs/parts/weights/best.pt | 18장 실습 2(학습)를 먼저 돌립니다 |
| 19장 실습 3, 5, 프로젝트 | 18장 실습 2의 out_ch18_runs/parts/weights/best.pt | 17장 실습 5 → 18장 실습 2를 먼저 돌립니다 |
| 20장 프로젝트 | 18장 실습 2의 out_ch18_runs/parts/weights/best.pt | 17장 실습 5 → 18장 실습 2를 먼저 돌립니다 |
| 5장 실습 1~3 | 4장의 ch04_exposure/ | 데이터 폴더에 있으면 됩니다 |
| 11장 실습 1, 18장 실습 1 | 1장의 fruit_stand.png | 데이터 폴더에 있으면 됩니다 |
| 12장 실습 1 | 11장의 ch11_set/ | 데이터 폴더에 있으면 됩니다 |
| 20장 실습 4 | 6장의 ch06_parking.png | 데이터 폴더에 있으면 됩니다 |
장 안의 순서도 지킵니다. 19장에서는 실습 1(out_ch19_passed.csv) → 실습 2(out_ch19_prepped/) → 실습 3(out_ch19_detections.csv) → 실습 4 차례로 앞 실습의 결과를 이어 씁니다. 20장 실습 3과 5는 실습 2의 out_ch20_exercise/ 를 씁니다. 17장의 out_ch17_yolo/ 폴더 짜임을 바꾸면 18장부터의 실습이 깨집니다.
코랩에서는 런타임이 끝나면 out_ 파일이 모두 지워집니다. 17장 실습 5 → 18장 실습 2 → 18장의 나머지, 19장, 20장의 실습을 같은 런타임에서 차례로 돌리거나, 18장 실습 2가 만든 best.pt 를 files.download("out_ch18_runs/parts/weights/best.pt") 로 내려받아 두었다가 다음에 같은 자리에 올립니다.
오래 걸리는 곳
이 과정의 실습은 대부분 그림이 작아 몇 초 안에 끝납니다. 시간이 눈에 띄게 드는 곳은 아래와 같습니다. 시간은 교안을 만든 PC(그래픽 카드 없음)에서 잰 것이고 PC 마다 다릅니다.
| 곳 | 교안을 만든 PC 에서 걸린 시간 |
|---|---|
| 18장 실습 2(전이 학습, 30 에포크) | 6분 남짓(5.7분), 에포크 한 번에 11초쯤 |
| 18장 설치(ultralytics 와 PyTorch) | 원고에는 "몇 분"으로만 적었습니다. 내려받는 양이 커서 수업 전에 미리 설치합니다 |
| 19장 프로젝트(파이프라인 전체) | 단계 가운데 추론이 가장 오래 걸립니다(거르기보다 수십 배). 모델을 처음 불러오는 시간이 섞이면 크게 달라집니다 |
| 15장 실습 5(프레임 처리 시간) | 오래 걸리는 곳은 아니고 시간을 재는 실습입니다. 원래 크기 한 장 평균 35.4ms, 절반 크기 9.0ms(3.9배 빠름) |
18장 실습 2를 한 번 돌려 out_ch18_runs/ 가 생기면, 18장 실습 3부터 20장까지는 학습을 다시 하지 않고 그 가중치를 불러 씁니다.