참고 사이트 https://writenkeep.tistory.com/category/Deep%20Learning/Yolo1,2,3의 3개의 문서가 있다.
- YOLO를 알아보자 위 참고 사이트의 1/3 : 이쪽
- 2. YOLO 사용법 참고 사이트 중 2/3 : 이 설치 방법 설명
- 0. 설치할 것 ‘OpenCV’, ‘CUDA’, ‘cuDN’ 설치. OpenCV는 필수 여기를 참고로 CUDA, cuDN 설치
- 여기를 참고하여 opencv설치$sudoaptinstalllibopencv-devpython3-opencv설치확인$python3-c”importcv2;print(cv2._version_)”4.5 설치 디렉토리/usr/share/opencv4/
- 1. Darknet 설치 : Darknet은 Yolo를 실행하기 위한 환경위 참고에 따라도 되지만 아래 참고한다.
- 참고 : 여기 다운로드 : gitclone https://github.com/AlexeyAB/darknet.gitcddarknet 로 이동 Make 파일 수정 $nanoMakefilecuda, cudn, opencv 를 사용하기 위해 GPU = 1, CUDN = 1, OPENCV = 1 로 수정
$ make 실행했더니 make 한다.아래와 같이 darknet 파일이 생성되자 모든 설치가 잘 된 것이다.
지금 참고한 여기에도 YOLO 탐지 예가 설명되어 있다.
2. 가중치 파일(.weights) 다운로드 dartnet 디렉토리에서~/darknet $wget https://pjreddie.com/media/files/yolov3.weights
3. Detecting 실행 dartnet 디렉토리에서 $./darknet detect cfg/yolov 3.cfgyolov 3.weights data/dog.jpg
CUDA-version: 11050 (11070), cuDNN: 8.2.4, GPU count: 1OpenCV version: 4.5.40 : compute_capability = 750, cudnn_half = 0, GPU: NVIDIA GeForce GTX 1660 SUPERnet.optimized_memory = 0mini_batch = 1, batch = 1, time_steps = 1, train = 0layer filters size/strd(dil) input output0 Create CUDA-stream – 0Create cudnn-handle 0conv 32 3 x 3/ 1 416 x 416 x 3 -> 416 x 416 x 32 0.299 BF1 conv 64 3 x 3/ 2 416 x 416 x 32 -> 208 x 208 x 64 1.595 BF2 conv 32 1 x 1/ 1 208 x 208 x 64 -> 208 x 208 x 32 0.177 BF3 conv 64 3 x 3/ 1 208 x 208 x 32 -> 208 x 208 x 64 1.595 BF4 Shortcut Layer: 1, wt = 0, wn = 0, outputs: 208 x 208 x 64 0.003 BF5 conv 128 3 x 3/ 2 208 x 208 x 64 -> 104 x 104 x 128 1.595 BF6 conv 64 1 x 1/ 1 104 x 104 x 128 -> 104 x 104 x 64 0.177 BF7 conv 128 3 x 3/ 1 104 x 104 x 64 -> 104 x 104 x 128 1.595 BF8 Shortcut Layer: 5, wt = 0, wn = 0, outputs: 104 x 104 x 128 0.001 BF9 conv 64 1 x 1/ 1 104 x 104 x 128 -> 104 x 104 x 64 0.177 BF10 conv 128 3 x 3/ 1 104 x 104 x 64 -> 104 x 104 x 128 1.595 BF11 Shortcut Layer: 8, wt = 0, wn = 0, outputs: 104 x 104 x 128 0.001 BF12 conv 256 3 x 3/ 2 104 x 104 x 128 -> 52 x 52 x 256 1.595 BF13 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF14 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF15 Shortcut Layer: 12, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF16 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF17 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF18 Shortcut Layer: 15, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF19 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF20 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF21 Shortcut Layer: 18, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF22 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF23 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF24 Shortcut Layer: 21, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF25 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF26 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF27 Shortcut Layer: 24, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF28 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF29 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF30 Shortcut Layer: 27, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF31 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF32 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF33 Shortcut Layer: 30, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF34 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF35 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF36 Shortcut Layer: 33, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF37 conv 512 3 x 3/ 2 52 x 52 x 256 -> 26 x 26 x 512 1.595 BF38 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF39 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF40 Shortcut Layer: 37, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF41 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF42 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF43 Shortcut Layer: 40, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF44 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF45 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF46 Shortcut Layer: 43, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF47 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF48 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF49 Shortcut Layer: 46, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF50 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF51 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF52 Shortcut Layer: 49, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF53 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF54 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF55 Shortcut Layer: 52, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF56 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF57 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF58 Shortcut Layer: 55, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF59 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF60 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF61 Shortcut Layer: 58, wt = 0, wn = = 0, outputs: 26 x 26 x 512 0.000 BF62 conv 1024 3 x 3/ 2 26 x 26 x 512 -> 13 x 13 x1024 1.595 BF63 conv 512 1 x 1/ 1 13 x 13 x1024 -> 13 x 13 x 512 0.177 BF64 conv 1024 3 x 3/ 1 13 x 13 x 512 -> 13 x 13 x1024 1.595 BF65 Shortcut Layer: 62, wt = 0, wn = 0, outputs: 13 x 13 x1024 0.000 BF66 conv 512 1 x 1/ 1 13 x 13 x1024 -> 13 x 13 x 512 0.177 BF67 conv 1024 3 x 3/ 1 13 x 13 x 512 -> 13 x 13 x1024 1.595 BF68 Shortcut Layer: 65, wt = 0, wn = 0, outputs: 13 x 13 x1024 0.000 BF69 conv 512 1 x 1/ 1 13 x 13 x1024 -> 13 x 13 x 512 0.177 BF70 conv 1024 3 x 3/ 1 13 x 13 x 512
지금 참고한 여기에도 YOLO 탐지 예가 설명되어 있다.
2. 가중치 파일(.weights) 다운로드 dartnet 디렉토리에서~/darknet $wget https://pjreddie.com/media/files/yolov3.weights
3. Detecting 실행 dartnet 디렉토리에서 $./darknet detect cfg/yolov 3.cfgyolov 3.weights data/dog.jpg
CUDA-version: 11050 (11070), cuDNN: 8.2.4, GPU count: 1OpenCV version: 4.5.40 : compute_capability = 750, cudnn_half = 0, GPU: NVIDIA GeForce GTX 1660 SUPERnet.optimized_memory = 0mini_batch = 1, batch = 1, time_steps = 1, train = 0layer filters size/strd(dil) input output0 Create CUDA-stream – 0Create cudnn-handle 0conv 32 3 x 3/ 1 416 x 416 x 3 -> 416 x 416 x 32 0.299 BF1 conv 64 3 x 3/ 2 416 x 416 x 32 -> 208 x 208 x 64 1.595 BF2 conv 32 1 x 1/ 1 208 x 208 x 64 -> 208 x 208 x 32 0.177 BF3 conv 64 3 x 3/ 1 208 x 208 x 32 -> 208 x 208 x 64 1.595 BF4 Shortcut Layer: 1, wt = 0, wn = 0, outputs: 208 x 208 x 64 0.003 BF5 conv 128 3 x 3/ 2 208 x 208 x 64 -> 104 x 104 x 128 1.595 BF6 conv 64 1 x 1/ 1 104 x 104 x 128 -> 104 x 104 x 64 0.177 BF7 conv 128 3 x 3/ 1 104 x 104 x 64 -> 104 x 104 x 128 1.595 BF8 Shortcut Layer: 5, wt = 0, wn = 0, outputs: 104 x 104 x 128 0.001 BF9 conv 64 1 x 1/ 1 104 x 104 x 128 -> 104 x 104 x 64 0.177 BF10 conv 128 3 x 3/ 1 104 x 104 x 64 -> 104 x 104 x 128 1.595 BF11 Shortcut Layer: 8, wt = 0, wn = 0, outputs: 104 x 104 x 128 0.001 BF12 conv 256 3 x 3/ 2 104 x 104 x 128 -> 52 x 52 x 256 1.595 BF13 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF14 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF15 Shortcut Layer: 12, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF16 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF17 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF18 Shortcut Layer: 15, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF19 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF20 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF21 Shortcut Layer: 18, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF22 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF23 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF24 Shortcut Layer: 21, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF25 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF26 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF27 Shortcut Layer: 24, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF28 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF29 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF30 Shortcut Layer: 27, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF31 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF32 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF33 Shortcut Layer: 30, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF34 conv 128 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 128 0.177 BF35 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF36 Shortcut Layer: 33, wt = 0, wn = 0, outputs: 52 x 52 x 256 0.001 BF37 conv 512 3 x 3/ 2 52 x 52 x 256 -> 26 x 26 x 512 1.595 BF38 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF39 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF40 Shortcut Layer: 37, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF41 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF42 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF43 Shortcut Layer: 40, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF44 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF45 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF46 Shortcut Layer: 43, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF47 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF48 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF49 Shortcut Layer: 46, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF50 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF51 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF52 Shortcut Layer: 49, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF53 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF54 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF55 Shortcut Layer: 52, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF56 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF57 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF58 Shortcut Layer: 55, wt = 0, wn = 0, outputs: 26 x 26 x 512 0.000 BF59 conv 256 1 x 1/ 1 26 x 26 x 512 -> 26 x 26 x 256 0.177 BF60 conv 512 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 512 1.595 BF61 Shortcut Layer: 58, wt = 0, wn = = 0, outputs: 26 x 26 x 512 0.000 BF62 conv 1024 3 x 3/ 2 26 x 26 x 512 -> 13 x 13 x1024 1.595 BF63 conv 512 1 x 1/ 1 13 x 13 x1024 -> 13 x 13 x 512 0.177 BF64 conv 1024 3 x 3/ 1 13 x 13 x 512 -> 13 x 13 x1024 1.595 BF65 Shortcut Layer: 62, wt = 0, wn = 0, outputs: 13 x 13 x1024 0.000 BF66 conv 512 1 x 1/ 1 13 x 13 x1024 -> 13 x 13 x 512 0.177 BF67 conv 1024 3 x 3/ 1 13 x 13 x 512 -> 13 x 13 x1024 1.595 BF68 Shortcut Layer: 65, wt = 0, wn = 0, outputs: 13 x 13 x1024 0.000 BF69 conv 512 1 x 1/ 1 13 x 13 x1024 -> 13 x 13 x 512 0.177 BF70 conv 1024 3 x 3/ 1 13 x 13 x 512
데이터 사진 디렉토리 9k.tree dog.jpg go al.txtimagenet.shortnames.list person.jpgcoco.names eagle.jpg horses.jpg labels scream.jpgcoco 9k.map girafe.jpgimagenet.labels.list person.jpgcoco.names.jpglabels.jpgcoco 9k.mapgiraffe.jpgy
다른 이미지 파일을 detect 해보자 $./darknet detect cfg/yolov 3.cfgyolov 3.weights data/eagle.jpg
Detection layer: 82-type=28 Detection layer: 94-type=28 Detection layer: 106-type=28 data/eagle.jpg: Predicted in 287.479000 milli-seconds.bird: 99%
다른 것 detect 해보자
pincet 1.jpg에서 확인 aeroplane: 32% 잘못 분류했다. 자신이 없어.32%…
그럼… 사과해볼까?data/애플 1.jpg: Predicted in 290.778000 milli-seconds. 애플: 98% diningtable: 32%
아이들을 확인해보자 childres 3.jpgdata/childres 3.jpg: Predictedin 297.417000 milli-seconds.person: 100% person: 100% 잘 맞혔다~~
YOLOv3를 인식할 수 있는 물채들 종류 data/coco.names 파일에서 확인할 수 있다.팔십 개가 있다
4. 티니욜로 메모리 사용률이 20%로 낮지만 인식률이 떨어진다.
5. Threshold 설정해 볼 것 YOLO는 어떤 물체와 Detecting 1의 확률이 25% 이상인 경우 그 물체이든 출력한다.Threshold를 명령어를 통해 변경할 수 있는 다음 명령어를 통해 어떤 물체로 판단하는 기준 확률을 ?%로 변경 가능하다. $. / darknet detect cfg / yolov 3.cfg yolov 3. weights data / dog.jpg-thresh 0.01 <= 1%로 변경
3. YOLO 데이터 학습 위 참고 사이트 중 3/3: 여기 내가 detection하고자 하는 오브젝트를 직접 학습하고 detection하는 과정을 YoLov3에서 설명했다.꼭 읽어보고 실행해보자.지금까지는 주어진 가중치 파일(.weights)을 사용해 왔지만, 이제는 직접 가중치 파일을 만들어 Test하는 고몬조 임의의 데이터를 수집하여 class의 수와 종류를 선언하고 학습을 시킨 후 마지막으로 잘학스프되었는지 확인해 볼 것이다.
1). 학습계획을 수립기어 떨린 객체를 학습시킬지 데이터는 무엇인지 구할 것인지 데이터는 3가지를 준비 Learning Data, Addata, Test data 방법 위에 참고예에서는 동그라미, 삼각, 사각을 찾아가는 네트워크를 만드는 Python Imaging Library(PIL)를 이용하여 직접 jpg 파일을 제작학습 Learning Data 준비하고 학습 Test data를 이용하여 결과를 테스트 학습 결과가 만족하면 마지막 학습 결과에 만족하지 못하면 Learning data에 Addata를 추가하여 학습 데이터 수를 다시 늘리고 Test data를 추가하였다.
2)Yolo_mark 다운로드 학습을 위해 ‘Yolo_mark’를 사용 darknet 디렉토리에서 다운로드 $git clone https://github.com/AlexeyAB/Yolo_mark$cd Yolo_mark$cmake.$make 바로 build가 된다.
Yolo_mark 사용법 https://sj-d.tistory.com/11
3. 학습방법 둘러보기 학습을 위해 수정이 필요한 공간의 가상/darknet/Yolo_mark$bash./li눅스_mark.sh 아래와 같은 화면이 나온다. Boxing을 통해 학습 데이터를 만드는 창으로 삼고 있다.ESC에서 종료 가능 c:cancel,space: 다음 그림에서 마우스 드래그: 상자 만들기, 오른쪽 마우스 드래그: 상자 이동
Yolo_mark 사용법 https://sj-d.tistory.com/11
Yolomark는 자신의 데이터 세트에서 학습시키기 위한 Labelling을 지원하는 프로그램.
~/darknet/Yolo_mark/x64/Release/data 디렉토리에 가보자. img 폴더와 3개의 파일이 있다.imgobj.dataobj.names train.txt
obj.data classes=2는 2개의 분류 class가 있는 것으로 obj.names로 정의한다.
obj.namesairbird 위와 같이 2가지가 정의된다.
train은 훈련 데이터 이미지 리스트로 데이터/train.txt에 있다.
train.txt 위와 같이 이전에 사용하던 것이 있으므로 새롭게 학습을 시작하려면 모두 지우고 원하는 내용으로 마킹하면 된다.학습시킬 이미지는 img 디렉토리에 넣고 Yolo_mark/bash./linux_mark.sh를 실행하여 마킹하면 된다.
img 디렉토리에 있는 화상을 yolo-mark 하면 파일명.txt가 생기는 내용은 클래스 번호와 좌표 두 가지이다.air1.jpg/air1.txt0.4621090.5138890.1687190.163889obj.names에 air가 처음이므로 0bird1.jpg/bird1.txt10.6578120.418060.1890630.223611 bird가 두번째이므로1
4. 학습을 위한 파일 수정 darknet / Yolo_mark / x64 / Release / Data 에서
- 클래스 개수 설정 $nanoobj.data classes = 원하는 분류 수정하고, 이 예에서는 classes == 3
- 2. 클래스 이름 설정 $nanoobj.names 각각 이름별로 한 줄씩 넣는다.
- 3. 데이터 추가 준비한 이미지를 darknet/Yolo_mark/x64/Release/data/img에 넣는다(복사 또는 이동). 확장자는 .jpg로 한다.많으면 많을수록 좋은데 언제 자료를 모아서 언제 labelling을 할까…
- 4. 데이터 Boxing $bash. / 리눅스_mark.sh에서 프로그램 실행 이미지가 나오면 마우스로 boxing하고 숫자 키를 눌러 클래스를 지정 취소하려면 c 다음 이미지로 옮기려면 space 상자 이동은 마우스 오른쪽 클릭 이동 종료, Esc
- 이렇게 하면 이미지 파일에 대응하는 txt 파일이 하나씩 생긴다.내용은 Class_number X Y Width Height.
- 5. cfg 파일 수정 darknet/cfg에 있는 많은 사전 정의 파일을 복사하여 사용하는 방법이 있으며, $cpdartknet/cfg/yolov3.cfg~/darknet/Yolo_mark/x64/Release
- 다음과 같이 직접 수정하는 방법이 있다.darknet/Yolo_mark/x64/Release에 있다. $nano yolo-obj.cfg
- 위의 두 경우 모두 마지막 부분의 [convolutional]과 [region] 두 부분으로 수정이 필요하다.
- [region] 부분은 :classes에서 학습할 class의 숫자를 지정한다.(위의 obj.data의 classes = 숫자와 같게 한다.) classes = 클래스 개수의 예에서는 classes = 3
- [convolutional] 부분은 ([region] 바로 위에 있는 convolutional이다.) :filters를 다음 계산값으로 수정한다.filters = (classes + 5) * 5 (Yolo 버전에 따라 값이 다름) yolov2 filter : (classes + 5) * 5 yolov3 filter : (classes + 5) * 3
- 이 예에서는 classes=3이므로 filters=(3+5)*5=40
- 6. convolutionallayer 파일 다운로드 사전에 학습한 가중치를 다운로드한다. 이 파일을 사용하면 기존 CNN 구조를 사용할 수 있으므로 시간 절약 darknet 디렉토리에서 $wget https://pjreddie.com/media/files/darknet53.conv.74
7. 위에서 만든 파일을 앞으로 darknet/data 디렉토리 하부로 이동(또는 복사)한다.darknet/Yolo_mark/x64/Release/data의 ‘obj.data’, ‘obj. ‘names’, ‘train.txt’ 3개 파일 -> darknet/data 디렉토리로 이동(복사)
darknet/Yolo_mark/x64/Release/yolo-obj.cfg 파일을 -> darknet 디렉토리로 이동(복사)
darknet/Yolo_mark/x64 디렉토리를 -> darknet 디렉토리에 복사
마킹한 Yolo_mark/x64/Release/data/img 디렉토리를 -> darknet/data 아래에 복사
이렇게 하면 되나?스스로 인식하고 있을까?
8. 학습 실행 darknet 경로에서 $./darknet detectortraindata/obj.datayolo-obj.cfgdarknet 53.conv.74 (GPU를 사용하는 경우 위에서 설명한 대로 설정 변경하거나 여기를 참조)
실행이 끝나면 backup 폴더에 weight 파일이 생긴다. 참고로 임포트(몇 번 학습을 진행했는지 확인할 수 있으며 default 값으로는 45000번 학습을 진행하도록 되어 있다. 필자의 경우 그림에서 볼 수 있듯이 한 번 학습하는 데 약 3초가 걸리므로 45000번 진행하는데 37.5시간, 즉 1.6일이 필요하다. 현재 학습 중에 블로그 글을 작성하고 있다.
터미널 중간중간 다음과 같은 문장을 찾을 수 있다.24674 : 0.659918, 0.6059avg, 0.001000rate, 2.962139 seconds, 1579136images 24674는 연산횟수이며 0.6059avg는 평균 성실율을 의미한다. 따라서 0.XXXXXavg에 해당하는 수치가 줄어들지 않는다면 학습을 중지해야 한다.
학습을 중단하면 /darknet/backup 경로에 가중치의 파일이 생성된다. 가중치 파일을 test 해 보고 가장 만족스러운 것을 선택하면 된다.)
9. 테스트/darknet/data에 준비한 test data를 넣고, $./darknet detector test data/obj.data yolo-obj.cfg backup/*.weights data/*.jpg: 여러 가중치의 파일을 확인해보고 가장 결과가 좋은 것을 선택하면 된다.
또는 이렇게 $./darknet detect cfg/yolov3-obj.cfg backup/yolov3_6000.weights data/person.jpg
위와 함께 해보니, 아직 데이터가 없어서, 봄….
Q&A(여기) 혹시 웹캠으로 데이터 테스트 해보고 싶으면 어떤 명령어를 실행시켜야 하나요? 구글 잡아서 나온 방법 해봤는데 오류가 뜨네요ㅠ./darknet detector demo cfg/coco.data cfg/yolov 3.cfg yolov 3.weights 명령어로 실행하면 됩니다.https://pjreddie.com/darknet/yolo/에서 Real-Time Detection on a Webcam 부분을 보면 될 것 같습니다./darknet detector train cfg/coco.data cfg/yolov 3.cfg darknet 53.conv.74-gpus 1,2,3 이 부분에서 -gpus 1,2,3은 무슨 위미정? 1도, 2도, 3도 gpu를 의미합니다. 당시에 gpu 3개를 사용했습니다.weight 파일 학습 후 만들어진 10000.weight 파일에 새 반 추가하고 재학습(darknet detector train data/obj.data cfg/crack.cfg yolov3_10000.weights. 구명하면 기존 거 3+2 하고 5개 반 인식하나요?기존 반 3개 학습에 반 5개 학습이 추가로 진행될 경우 5개 반으로 인식될 것 같네요.
Yolomark는 자신의 데이터 세트에서 학습시키기 위한 Labelling을 지원하는 프로그램.
~/darknet/Yolo_mark/x64/Release/data 디렉토리에 가보자. img 폴더와 3개의 파일이 있다.imgobj.dataobj.names train.txt
obj.data classes=2는 2개의 분류 class가 있는 것으로 obj.names로 정의한다.
obj.namesairbird 위와 같이 2가지가 정의된다.
train은 훈련 데이터 이미지 리스트로 데이터/train.txt에 있다.
train.txt 위와 같이 이전에 사용하던 것이 있으므로 새롭게 학습을 시작하려면 모두 지우고 원하는 내용으로 마킹하면 된다.학습시킬 이미지는 img 디렉토리에 넣고 Yolo_mark/bash./linux_mark.sh를 실행하여 마킹하면 된다.
img 디렉토리에 있는 화상을 yolo-mark 하면 파일명.txt가 생기는 내용은 클래스 번호와 좌표 두 가지이다.air1.jpg/air1.txt0.4621090.5138890.1687190.163889obj.names에 air가 처음이므로 0bird1.jpg/bird1.txt10.6578120.418060.1890630.223611 bird가 두번째이므로1
4. 학습을 위한 파일 수정 darknet / Yolo_mark / x64 / Release / Data 에서
- 클래스 개수 설정 $nanoobj.data classes = 원하는 분류 수정하고, 이 예에서는 classes == 3
- 2. 클래스 이름 설정 $nanoobj.names 각각 이름별로 한 줄씩 넣는다.
- 3. 데이터 추가 준비한 이미지를 darknet/Yolo_mark/x64/Release/data/img에 넣는다(복사 또는 이동). 확장자는 .jpg로 한다.많으면 많을수록 좋은데 언제 자료를 모아서 언제 labelling을 할까…
- 4. 데이터 Boxing $bash. / 리눅스_mark.sh에서 프로그램 실행 이미지가 나오면 마우스로 boxing하고 숫자 키를 눌러 클래스를 지정 취소하려면 c 다음 이미지로 옮기려면 space 상자 이동은 마우스 오른쪽 클릭 이동 종료, Esc
- 이렇게 하면 이미지 파일에 대응하는 txt 파일이 하나씩 생긴다.내용은 Class_number X Y Width Height.
- 5. cfg 파일 수정 darknet/cfg에 있는 많은 사전 정의 파일을 복사하여 사용하는 방법이 있으며, $cpdartknet/cfg/yolov3.cfg~/darknet/Yolo_mark/x64/Release
- 다음과 같이 직접 수정하는 방법이 있다.darknet/Yolo_mark/x64/Release에 있다. $nano yolo-obj.cfg
- 위의 두 경우 모두 마지막 부분의 [convolutional]과 [region] 두 부분으로 수정이 필요하다.
- [region] 부분은 :classes에서 학습할 class의 숫자를 지정한다.(위의 obj.data의 classes = 숫자와 같게 한다.) classes = 클래스 개수의 예에서는 classes = 3
- [convolutional] 부분은 ([region] 바로 위에 있는 convolutional이다.) :filters를 다음 계산값으로 수정한다.filters = (classes + 5) * 5 (Yolo 버전에 따라 값이 다름) yolov2 filter : (classes + 5) * 5 yolov3 filter : (classes + 5) * 3
- 이 예에서는 classes=3이므로 filters=(3+5)*5=40
- 6. convolutionallayer 파일 다운로드 사전에 학습한 가중치를 다운로드한다. 이 파일을 사용하면 기존 CNN 구조를 사용할 수 있으므로 시간 절약 darknet 디렉토리에서 $wget https://pjreddie.com/media/files/darknet53.conv.74
7. 위에서 만든 파일을 앞으로 darknet/data 디렉토리 하부로 이동(또는 복사)한다.darknet/Yolo_mark/x64/Release/data의 ‘obj.data’, ‘obj. ‘names’, ‘train.txt’ 3개 파일 -> darknet/data 디렉토리로 이동(복사)
darknet/Yolo_mark/x64/Release/yolo-obj.cfg 파일을 -> darknet 디렉토리로 이동(복사)
darknet/Yolo_mark/x64 디렉토리를 -> darknet 디렉토리에 복사
마킹한 Yolo_mark/x64/Release/data/img 디렉토리를 -> darknet/data 아래에 복사
이렇게 하면 되나?스스로 인식하고 있을까?
8. 학습 실행 darknet 경로에서 $./darknet detectortraindata/obj.datayolo-obj.cfgdarknet 53.conv.74 (GPU를 사용하는 경우 위에서 설명한 대로 설정 변경하거나 여기를 참조)
실행이 끝나면 backup 폴더에 weight 파일이 생긴다. 참고로 임포트(몇 번 학습을 진행했는지 확인할 수 있으며 default 값으로는 45000번 학습을 진행하도록 되어 있다. 필자의 경우 그림에서 볼 수 있듯이 한 번 학습하는 데 약 3초가 걸리므로 45000번 진행하는데 37.5시간, 즉 1.6일이 필요하다. 현재 학습 중에 블로그 글을 작성하고 있다.
터미널 중간중간 다음과 같은 문장을 찾을 수 있다.24674 : 0.659918, 0.6059avg, 0.001000rate, 2.962139 seconds, 1579136images 24674는 연산횟수이며 0.6059avg는 평균 성실율을 의미한다. 따라서 0.XXXXXavg에 해당하는 수치가 줄어들지 않는다면 학습을 중지해야 한다.
학습을 중단하면 /darknet/backup 경로에 가중치의 파일이 생성된다. 가중치 파일을 test 해 보고 가장 만족스러운 것을 선택하면 된다.)
9. 테스트/darknet/data에 준비한 test data를 넣고, $./darknet detector test data/obj.data yolo-obj.cfg backup/*.weights data/*.jpg: 여러 가중치의 파일을 확인해보고 가장 결과가 좋은 것을 선택하면 된다.
또는 이렇게 $./darknet detect cfg/yolov3-obj.cfg backup/yolov3_6000.weights data/person.jpg
위와 함께 해보니, 아직 데이터가 없어서, 봄….
Q&A(여기) 혹시 웹캠으로 데이터 테스트 해보고 싶으면 어떤 명령어를 실행시켜야 하나요? 구글 잡아서 나온 방법 해봤는데 오류가 뜨네요ㅠ./darknet detector demo cfg/coco.data cfg/yolov 3.cfg yolov 3.weights 명령어로 실행하면 됩니다.https://pjreddie.com/darknet/yolo/에서 Real-Time Detection on a Webcam 부분을 보면 될 것 같습니다./darknet detector train cfg/coco.data cfg/yolov 3.cfg darknet 53.conv.74-gpus 1,2,3 이 부분에서 -gpus 1,2,3은 무슨 위미정? 1도, 2도, 3도 gpu를 의미합니다. 당시에 gpu 3개를 사용했습니다.weight 파일 학습 후 만들어진 10000.weight 파일에 새 반 추가하고 재학습(darknet detector train data/obj.data cfg/crack.cfg yolov3_10000.weights. 구명하면 기존 거 3+2 하고 5개 반 인식하나요?기존 반 3개 학습에 반 5개 학습이 추가로 진행될 경우 5개 반으로 인식될 것 같네요.