참고 사이트 https://writenkeep.tistory.com/category/Deep%20Learning/Yolo1,2,3의 3개 문서가 있다.
- YOLO를 조사하도록 상기 참고 사이트 중 1/3 : 이쪽
- 2. YOLO 사용법위 참고 사이트 중 2/3 : 여기 설치 방법 설명
- 0. 설치하는 것 「OpenCV」, 「CUDA」, 「cuDNN」을 설치. OpenCV는 필수 여기를 참고하여 CUDA, cuDN 설치
- 여기를 참고하여 opencv설치 $sudoaptinstalllibopencv-devpython3-opencv설치확인 $python3-c”importcv2;print(cv2._version_)” 4.5.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 디렉토리에서 $. / darknetdetectcfg / yolov 3. cfgyolov 3. weightsdata/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 디렉토리에서 $. / darknetdetectcfg / yolov 3. cfgyolov 3. weightsdata/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 goal.txtimagenet.shortnames.list person.jpgcoco.names eagle.jpg horses.jpg labels scream.jpgcoco 9k.map giraffe.jpgimagenet.labels.list person.jpgcoco.names.jpg labels.names
다른 이미지 파일을 detect 해보자 $. / darknetdetectcfg / yolov 3. cfgyolov 3. weightsdata/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 해보자
pincet1.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. Tiny Yolo 메모리 사용률이 20%로 낮지만 인식률이 떨어진다.
5. Threshold 설정해 볼 것 YOLO는 어떤 물체와 Detecting 하나의 확률이 25% 이상일 경우 그 물체일지라도 출력한다.Threshold를 명령어를 통해 변경할 수 있는 다음 명령어를 통해 어떤 물체라고 판단하는 기준 확률을 ?%로 변경 가능하다. $. / darknet detect cfg / yolov3.cfg yolov3. weights data/dog.jpg-thresh 0.01 <=1%로 변경
3. YOLO 데이터 학습상 참고 사이트 중 3/3: 여기 내가 detection 하고자 하는 오브젝트를 직접 학습하고 detection 하는 과정을 Yo Lov3에서 설명했다.꼭 읽어보고 실행해보자.지금까지는 주어진 가중치 파일(.weights)을 사용해 왔지만, 이제는 직접 가중치 파일을 만들어 Test할 고몬조 임의의 데이터를 수집해 class의 수와 종류를 선언하고 학습을 시킨 후 마지막으로 잘학스프됐는지를 확인해 볼 것이다.
1). 학습계획을 수립 기어 떨린 객체를 학습시킬지 데이터는 무엇인지 구할 것인지 데이터는 3가지를 준비 Learning Data, Addata, Test data 방법 위에 참고 예로는 동그라미, 삼각, 사각을 찾아가는 네트워크를 만드는 Python Imaging Library(PIL)를 이용하여 직접 jpg 파일을 제작 학습 Learning Data 준비하고 학습 Test data를 이용하여 결과를 테스트 학습 결과가 만족하면 마지막 학습 결과에 만족하지 못하면 Learning data에 Addata를 추가하여 학습 데이터 수를 늘렸다.
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./linux_mark.sh 아래와 같은 화면이 나온다. Boxing을 통해 학습 데이터를 만드는 창으로 하고 있다.ESC에서 종료 가능 c:cancel, space: 다음 그림으로 마우스 드래그: 상자 만들기, 오른쪽 마우스 드래그: 상자 이동
Yolo_mark 사용법 http://sj-d.tistory.com/11
율마크는 자신의 데이터 세트로 학습시키기 위한 Labelling을 지원하는 프로그램
~/darknet/Yolo_mark/x64/Release/data 디렉토리에 가보자. img 폴더와 3개의 파일이 있다.imgobj. dataobj.names train.txt
obj.data classes=2는 두 가지 분류 class가 있는 것으로 obj.names에서 정의한다
obj.namesairbird 위와 같이 두 가지가 정의된다.
train은 훈련 데이터 이미지 리스트로서 데이터/train.txt에 있다.
train.txt 위와 같이 이전에 사용하던 것이 있으므로 새로 학습을 시작하려면 모두 지우고 원하는 내용으로 마킹하면 된다.학습시킬 이미지는 img 디렉토리에 넣고 Yolo_mark/bash./linux_mark.sh를 실행하여 마킹하면 된다.
img 디렉토리에 있는 화상을 yolo-mark 하면 파일명.txt를 할 수 있다.내용은 반 번호와 좌표 두 가지다.air 1.jpg/air 1.txt 0.4621090.5138890.1867190.163889obj.names에 air가 처음이므로 0 bird1.jpg/bird1.txt10.6578120.4118060.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. / linux_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.cfgdarknet53.conv.74 (GPU 사용시 위에서 설명한 대로 설정 변경하거나 여기를 참조함)
실행이 끝나면 backup 폴더에 weight 파일이 생긴다. 참고로 가져오기(몇 번 학습을 진행했는지 확인할 수 있으며 default 값으로는 45000번 학습을 하게 되어 있다. 필자의 경우 그림에서 볼 수 있듯이 한 번 학습하는 데 약 3초가 걸리기 때문에 45000회 진행하는데 37.5시간, 즉 1.6일이 필요하다. 현재 학습 중에 블로그 글을 작성하고 있다.
터미널 중간중간에 다음과 같은 문장을 찾을 수 있다.24674: 0.659918, 0.6059avg, 0.001000rate, 2.962139 seconds, 1579136 images 24674는 연산 횟수이며 0.6059avg는 평균 성실율을 의미한다. 따라서 0. X X X X avg에 해당하는 수치가 줄어들지 않는다면 학습을 중지해야 한다.
학습을 중단하면 /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 democfg/coco.datacfg/yolov3.cfg yolov3.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를 의미합니다. 당시에 gpu3개를 사용하였습니다.weight 파일 학습 후 만들어진 10000.weight 파일에 새로운 클래스 추가해서 재학습 (darknet detector train data/obj.datacfg/crack.cfgyolov3_10000.weights. 구명하면 기존의 것 3+2 하고 5개 클래스 인식하나요?기존 반 3개 학습에 반 5개 학습이 추가로 진행될 경우 5개 반으로 인식되는 것 같네요.
율마크는 자신의 데이터 세트로 학습시키기 위한 Labelling을 지원하는 프로그램
~/darknet/Yolo_mark/x64/Release/data 디렉토리에 가보자. img 폴더와 3개의 파일이 있다.imgobj. dataobj.names train.txt
obj.data classes=2는 두 가지 분류 class가 있는 것으로 obj.names에서 정의한다
obj.namesairbird 위와 같이 두 가지가 정의된다.
train은 훈련 데이터 이미지 리스트로서 데이터/train.txt에 있다.
train.txt 위와 같이 이전에 사용하던 것이 있으므로 새로 학습을 시작하려면 모두 지우고 원하는 내용으로 마킹하면 된다.학습시킬 이미지는 img 디렉토리에 넣고 Yolo_mark/bash./linux_mark.sh를 실행하여 마킹하면 된다.
img 디렉토리에 있는 화상을 yolo-mark 하면 파일명.txt를 할 수 있다.내용은 반 번호와 좌표 두 가지다.air 1.jpg/air 1.txt 0.4621090.5138890.1867190.163889obj.names에 air가 처음이므로 0 bird1.jpg/bird1.txt10.6578120.4118060.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. / linux_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.cfgdarknet53.conv.74 (GPU 사용시 위에서 설명한 대로 설정 변경하거나 여기를 참조함)
실행이 끝나면 backup 폴더에 weight 파일이 생긴다. 참고로 가져오기(몇 번 학습을 진행했는지 확인할 수 있으며 default 값으로는 45000번 학습을 하게 되어 있다. 필자의 경우 그림에서 볼 수 있듯이 한 번 학습하는 데 약 3초가 걸리기 때문에 45000회 진행하는데 37.5시간, 즉 1.6일이 필요하다. 현재 학습 중에 블로그 글을 작성하고 있다.
터미널 중간중간에 다음과 같은 문장을 찾을 수 있다.24674: 0.659918, 0.6059avg, 0.001000rate, 2.962139 seconds, 1579136 images 24674는 연산 횟수이며 0.6059avg는 평균 성실율을 의미한다. 따라서 0. X X X X avg에 해당하는 수치가 줄어들지 않는다면 학습을 중지해야 한다.
학습을 중단하면 /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 democfg/coco.datacfg/yolov3.cfg yolov3.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를 의미합니다. 당시에 gpu3개를 사용하였습니다.weight 파일 학습 후 만들어진 10000.weight 파일에 새로운 클래스 추가해서 재학습 (darknet detector train data/obj.datacfg/crack.cfgyolov3_10000.weights. 구명하면 기존의 것 3+2 하고 5개 클래스 인식하나요?기존 반 3개 학습에 반 5개 학습이 추가로 진행될 경우 5개 반으로 인식되는 것 같네요.