다크넷 개체 탐지 프레임워크 및 YOLO
Darknet은 주로 C 및 C++로 개발되었으며 CUDA 가속을 지원하는 오픈 소스 신경망 프레임워크입니다.
최첨단 실시간 객체 감지 시스템인 YOLO(You Only Look Once)는 Darknet 프레임워크 내에서 눈에 띄는 구현입니다.
Hank.ai가 Darknet/YOLO 커뮤니티에 어떻게 기여하고 있는지 자세히 알아보세요.
Darknet V3 "Jazz" 발표: https://darknetcv.ai/blog/announce-darknet-v3-jazz
다크넷/YOLO 웹사이트: https://darknetcv.ai/
다크넷/YOLO FAQ: https://darknetcv.ai/faq/
다크넷/YOLO 디스코드 서버: https://discord.gg/zSq8rtW
서류
1. YOLOv7: https://arxiv.org/abs/2207.02696
2. 스케일드-YOLOv4: https://arxiv.org/abs/2102.12725
3. YOLOv4: https://arxiv.org/abs/2004.10934
4. YOLOv3: https://pjreddie.com/media/files/papers/YOLOv3.pdf
일반 정보
Darknet/YOLO 프레임워크는 가장 빠르고 정확한 객체 감지 시스템 중 하나로 자리매김하고 있습니다.
다크넷/YOLO의 주요 장점:
무료 및 오픈 소스: Darknet/YOLO는 완전한 오픈 소스이므로 상업용 프로젝트를 포함한 기존 프로젝트에 무료로 통합할 수 있습니다.
고성능: 2024년 10월에 출시된 Darknet V3("Jazz")는 NVIDIA RTX 3090 GPU를 사용하여 LEGO 데이터 세트에서 최대 1000FPS를 달성하는 놀라운 성능을 보여줍니다.
다양성: Darknet/YOLO의 CPU 버전은 Raspberry Pi, 클라우드 서버, 데스크톱, 노트북 및 강력한 훈련 장비를 포함한 다양한 플랫폼에 배포할 수 있습니다. GPU 버전에는 CUDA 지원 NVIDIA GPU가 필요합니다.
플랫폼 간 호환성: Darknet/YOLO는 Linux, Windows 및 Mac에서 원활하게 작동하는 것으로 알려져 있습니다.
다크넷 버전 관리
Darknet 0.x: Joseph Redmon이 2013년에서 2017년 사이에 개발한 원래 Darknet 도구를 나타냅니다. 정식 버전 번호가 없습니다.
Darknet 1.x: 이 버전은 Alexey Bochkovskiy가 2017년부터 2021년까지 유지 관리했습니다. 또한 공식 버전 번호도 부족했습니다.
Darknet 2.x "OAK": 이 버전은 Hank.ai의 후원을 받았으며 2023년부터 Stéphane Charette가 유지관리했습니다. 버전 명령을 도입한 첫 번째 릴리스였습니다. 2024년 말까지 버전 2.x를 반환했습니다.
Darknet 3.x "JAZZ": 2024년 10월에 출시된 이 버전은 새로운 C 및 C++ API, 향상된 성능 및 수많은 버그 수정을 도입하여 중요한 개발 단계를 표시했습니다.
MSCOCO 사전 훈련된 가중치
다양한 인기 YOLO 버전이 MSCOCO 데이터세트에 대해 사전 훈련되었습니다. 이 데이터 세트는 cfg/coco.names 파일에서 찾을 수 있는 80개의 클래스로 구성됩니다.
다운로드 가능한 사전 훈련된 가중치:
1. YOLOv2(2016년 11월)
* YOLOv2-작은
* YOLOv2-전체
2. YOLOv3(2018년 5월)
* YOLOv3-작은
* YOLOv3-전체
3. YOLOv4(2020년 5월)
* YOLOv4-작은
* YOLOv4-전체
4. YOLOv7(2022년 8월)
* YOLOv7-작은
* YOLOv7-전체
사용 예:
`
wget --no-clobber https://github.com/hank-ai/darknet/releases/download/v2.0/yolov4-tiny.weights
darknet02displayannotatedimages coco.names yolov4-tiny.cfg yolov4-tiny.weights image1.jpg
darknet03display_videos coco.names yolov4-tiny.cfg yolov4-tiny.weights video1.avi
DarkHelp coco.names yolov4-tiny.cfg yolov4-tiny.weights image1.jpg
DarkHelp coco.names yolov4-tiny.cfg yolov4-tiny.weights video1.avi
`
참고: MSCOCO 사전 훈련된 가중치는 주로 데모 목적으로 제공됩니다. MSCOCO는 일반적으로 시스템 기능을 확인하는 데 사용되므로 사용자 지정 네트워크를 교육하는 것이 좋습니다.
다크넷 구축
Darknet은 C++17 이상, OpenCV를 사용하고 CMake를 활용하여 프로젝트 파일을 생성합니다.
구축 과정:
1. Google Colab: Google Colab 지침은 Linux 지침과 동일합니다. 특정 작업을 보여주는 Jupyter 노트북은 colab 하위 디렉터리를 참조하세요.
2. 리눅스 CMake 방법:
* 전제조건:
* 빌드 필수 도구: sudo apt-get install build-essential
* 힘내: sudo apt-get install git
* OpenCV: sudo apt-get install libopencv-dev
* CMake: sudo apt-get install cmake
* 설치:
* 작업 디렉토리 생성: mkdir ~/srccd ~/src
* 저장소 복제: git clone https://github.com/hank-ai/darknet
* 다크넷 디렉토리로 이동하세요: cd darknet
* 빌드 디렉터리 생성: mkdir build
* 다크넷 구축:
* CD 빌드
* cmake -DCMAKEBUILDTYPE=릴리스 ..
* -j4를 만든다
* 패키지
* 패키지 설치: sudo dpkg -i darknet-VERSION.deb
* 선택사항: CUDA/cuDNN 설치
* https://developer.nvidia.com/cuda-downloads에서 CUDA를 다운로드하여 설치하세요.
* https://developer.nvidia.com/rdp/cudnn-download 또는 https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#cudnn-package-manager-에서 cuDNN을 다운로드하여 설치하세요. 설치 개요
* nvcc 및 nvidia-smi를 실행할 수 있는지 확인하세요. PATH 변수를 수정해야 할 수도 있습니다.
* 나중에 CUDA 또는 cuDNN을 설치하거나 최신 버전으로 업그레이드하는 경우 환경을 수정한 후 다크넷을 다시 구축해야 합니다.
3. 윈도우 CMake 방법:
* 전제조건:
* Git: Winget 설치 Git.Git
* CMake: Winget 설치 Kitware.CMake
* NSIS: Winget 설치 nsis.nsis
* Visual Studio 2022 Community Edition: Winget 설치 Microsoft.VisualStudio.2022.Community
* C++ 지원을 포함하도록 Visual Studio 설치를 수정합니다.
* Visual Studio 설치 프로그램 열기
* "수정"을 클릭하세요
* "C++를 사용한 데스크톱 개발"을 선택하세요.
* "수정"을 클릭한 후 "예"를 클릭하세요.
* 설치:
* VS 2022용 개발자 명령 프롬프트를 엽니다(PowerShell 아님).
* Microsoft VCPKG를 설치합니다.
* 질병통제예방센터:
* mkdir c:srccd c:src
* 자식 클론 https://github.com/microsoft/vcpkg
* CD vcpkg
* bootstrap-vcpkg.bat .vcpkg.exe 통합
* .vcpkg.exe 설치 powershell.vcpkg.exe 통합 opencv[contrib,dnn,freetype,jpeg,openmp,png,webp,world]:x64-windows 설치
* 다크넷을 복제하고 구축하세요:
* CD C:src
* 자식 클론 https://github.com/hank-ai/darknet.git
* CD 다크넷
* mkdir 빌드
* CD 빌드
* cmake -DCMAKEBUILDTYPE=릴리스 -DCMAKETOOLCHAINFILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake ..
* msbuild.exe /property:Platform=x64;Configuration=Release /target:Build -maxCpuCount -verbosity:normal -detailedSummary darknet.sln
* msbuild.exe /property:Platform=x64;Configuration=PACKAGE.vcxproj 릴리스
* 선택사항: CUDA/cuDNN 설치
* https://developer.nvidia.com/cuda-downloads에서 CUDA를 다운로드하여 설치하세요.
* https://developer.nvidia.com/rdp/cudnn-download 또는 https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#download-windows에서 cuDNN을 다운로드하여 설치하세요.
* cuDNN의 압축을 풀고 bin, include 및 lib 디렉터리를 C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/[version]에 복사합니다(필요한 경우 기존 파일 덮어쓰기).
* nvcc.exe를 실행할 수 있는지 확인하세요. PATH 변수를 수정해야 할 수도 있습니다.
다크넷 사용
CLI(명령줄 인터페이스)
일반적인 사용법: Darknet은 기능과 상호 작용하기 위한 명령줄 인터페이스(CLI)를 제공합니다. 완전하지는 않습니다. 추가 기능은 DarkHelp 프로젝트 CLI를 참조하세요.
사전 훈련된 모델: 대부분의 명령에는 해당 .names 및 .cfg 파일과 함께 .weights 파일이 필요합니다. 자체 네트워크를 훈련하거나(권장) 온라인에서 제공되는 사전 훈련된 모델을 활용할 수 있습니다. 예는 다음과 같습니다:
* LEGO Gears(이미지 내 물체 감지)
* Rolodex(이미지 내 텍스트 감지)
* MSCOCO(표준 80등급 객체 감지)
일반적인 명령:
도움말: 다크넷 도움말
버전: 다크넷 버전
이미지를 이용한 예측:
* V2: 다크넷 탐지기 테스트 cars.data cars.cfg cars_best.weights image1.jpg
* V3: darknet02displayannotatedimages cars.cfg image1.jpg
* DarkHelp: DarkHelp cars.cfg cars_best.weights image1.jpg
출력 좌표:
* V2: 다크넷 검출기 테스트 Animals.data Animals.cfg Animalsbest.weights -extoutput dog.jpg
* V3: darknet01inference_images 동물 개.jpg
* DarkHelp: DarkHelp --json Animals.cfg Animals.names Animals_best.weights dog.jpg
비디오 처리:
* V2:
* 다크넷 탐지기 데모 Animals.data Animals.cfg Animalsbest.weights -extoutput test.mp4(비디오 예측)
* 다크넷 탐지기 데모 Animals.data Animals.cfg Animals_best.weights -c 0(웹캠 입력)
* 다크넷 탐지기 데모 Animals.data Animals.cfg Animalsbest.weights test.mp4 -outfilename res.avi(결과를 비디오에 저장)
* V3:
* darknet03display_videos Animals.cfg test.mp4 (비디오 예측)
* darknet08display_webcam 동물 (웹캠 입력)
* darknet05processvideosmultithreaded Animals.cfg Animals.names Animals_best.weights test.mp4 (결과를 비디오에 저장)
* 다크도움말:
* DarkHelp Animals.cfg Animals.names Animals_best.weights test.mp4(비디오 예측)
* DarkHelp Animals.cfg Animals.names Animals_best.weights test.mp4(결과를 비디오에 저장)
JSON 출력:
* V2: 다크넷 탐지기 데모 Animals.data Animals.cfg Animalsbest.weights test50.mp4 -jsonport 8070 -mjpegport 8090 -extoutput
* V3: darknet06imagestojson 동물 image1.jpg
* DarkHelp: DarkHelp --json Animals.names Animals.cfg Animals_best.weights image1.jpg
GPU 선택: 다크넷 감지기 데모 Animals.data Animals.cfg Animals_best.weights -i 1 test.mp4
정확성 평가:
* 다크넷 탐지기 맵 Driving.data Driving.cfg Driving_best.weights ... (mAP@IoU=50)
* 다크넷 탐지기 맵 Animals.data Animals.cfg Animalsbest.weights -iouthresh 0.75 (mAP@IoU=75)
앵커 계산: (최적의 앵커 재계산을 위해 DarkMark 사용)
* 다크넷 탐지기 calcanchors Animals.data -numof_clusters 6 -width 320 -height 256
네트워크 교육:
* 다크넷 탐지기 -map -dont_show 기차 동물.데이터 동물.cfg
새로운 네트워크 훈련
DarkMark: 주석 및 교육에 권장되는 접근 방식은 필요한 Darknet 파일 생성 프로세스를 자동화하는 DarkMark를 활용하는 것입니다.
수동 설정:
1. 프로젝트 디렉터리를 만듭니다. 예를 들어 ~/nn/animals/는 동물 감지를 위한 네트워크를 훈련합니다.
2. 구성 파일 복사: cfg/(예: cfg/yolov4-tiny.cfg)에서 템플릿 구성 파일을 선택하고 프로젝트 디렉터리에 배치합니다.
3. .names 파일 생성: 동일한 디렉터리에 Animals.names라는 텍스트 파일을 생성합니다. 빈 줄이나 주석 없이 감지하려는 클래스를 한 줄에 하나씩 나열하십시오. 예:
`
개
고양이
새
말
`
4. .data 파일 생성: 동일한 디렉터리에 Animals.data라는 텍스트 파일을 생성합니다. 이 파일에는 훈련 데이터에 대한 정보가 포함되어 있습니다. 예:
`
수업=4
기차=/home/username/nn/animals/animals_train.txt
유효한=/home/username/nn/animals/animals_valid.txt
이름=/home/username/nn/animals/animals.names
백업=/홈/사용자 이름/nn/동물
`
5. 데이터 세트 디렉터리: 이미지와 해당 주석을 저장할 디렉터리를 만듭니다(예: ~/nn/animals/dataset). 각 이미지에는 주석을 설명하는 관련 .txt 파일이 필요합니다. 이러한 .txt 파일은 특정 형식을 따라야 하며 DarkMark 또는 유사한 소프트웨어를 사용하여 생성하는 것이 가장 좋습니다.
6. 훈련 및 검증 파일: .data 파일에 지정된 대로 "훈련" 및 "유효한" 텍스트 파일을 생성합니다. 이러한 파일에는 각각 학습 및 검증에 사용할 이미지가 나열되어 있습니다.
7. 구성 파일을 수정합니다.
* 배치 크기: 배치=64로 설정합니다.
* 세분화: 하위 구분=1로 시작합니다. GPU의 메모리 용량에 따라 필요에 따라 늘리세요.
최대 배치: maxbatches=2000개의 클래스 수를 사용합니다. 이 경우 maxbatches=8000입니다.
* 단계: 단계를 max_batches의 80% 및 90%로 설정합니다. 예: 단계=6400,7200.
* 너비 및 높이: 네트워크 크기(너비 및 높이)를 조정합니다. 최적의 크기를 결정하는 방법에 대한 지침은 Darknet/YOLO FAQ를 참조하세요.
* 클래스: .names 파일의 클래스 수와 일치하도록 클래스=...를 업데이트합니다(이 경우 클래스=4).
필터: 각 [yolo] 섹션 앞의 [convolutional] 섹션에서 필터=...를 조정합니다. 필터를 사용하여 계산 = (클래스 수 + 5) 3. 이 경우 필터=27입니다.
8. 훈련 시작: 프로젝트 디렉터리로 이동하여 다음 명령을 실행합니다.
`
다크넷 탐지기 -map -dont_show 기차 동물.데이터 동물.cfg
`
* Verbose 출력: 더 자세한 교육 정보를 보려면 --verbose를 사용하세요.
* 진행 상황: 가장 좋은 가중치는 Animals_best.weights로 저장되며, 훈련 진행 상황은 Chart.png 파일을 통해 모니터링할 수 있습니다.
기타 도구 및 링크
DarkMark: Darknet/YOLO 프로젝트 관리, 이미지 주석, 주석 확인 및 교육 파일 생성용.
DarkHelp: 이미지 타일링, 객체 추적 및 상용 애플리케이션을 위한 C++ API와 같은 기능을 갖춘 Darknet의 강력한 대안 CLI입니다.
다크넷/YOLO FAQ: https://darknetcv.ai/faq/
Stéphane Charette의 YouTube 채널: 튜토리얼 및 예제 비디오 찾기: https://www.youtube.com/channel/UCOQ-nJ8l6kG3153g09XwY8g
다크넷/YOLO 디스코드 서버: https://discord.gg/zSq8rtW
로드맵
최종 업데이트 날짜: 2024-10-30
완전한:
1. 교육 중에 적용 가능한 경우 qsort()를 std::sort()로 대체했습니다(나머지 일부 사례).
2. check_mistakes, getchar() 및 system()을 제거했습니다.
3. C++ 컴파일러(Linux의 경우 g++, Windows의 경우 VisualStudio)를 사용하도록 Darknet을 변환했습니다.
4. Windows 빌드를 수정했습니다.
5. Python 지원이 수정되었습니다.
6. 다크넷 라이브러리를 구축했습니다.
7. 예측에 대한 레이블("알파벳" 코드)을 다시 활성화합니다.
8. CUDA/GPU 코드를 다시 활성화했습니다.
9. CUDNN을 다시 활성화합니다.
10. CUDNN 절반을 다시 활성화했습니다.
11. 하드코딩된 CUDA 아키텍처를 제거했습니다.
12. CUDA 버전 정보가 개선되었습니다.
13. AVX를 다시 활성화했습니다.
14. 이전 솔루션과 Makefile을 제거했습니다.
15. OpenCV를 선택 사항이 아닌 것으로 만들었습니다.
16. 이전 pthread 라이브러리에 대한 종속성을 제거했습니다.
17. STB를 제거했습니다.
18. 새로운 CUDA 감지를 사용하기 위해 CMakeLists.txt를 다시 작성했습니다.
19. 오래된 "알파벳" 코드를 제거하고 데이터/라벨에서 700개 이상의 이미지를 삭제했습니다.
20. 소스 외부 빌드를 구현했습니다.
21. 향상된 버전 번호 출력.
22. 훈련과 관련된 성능 최적화(진행 중).
23. 추론과 관련된 성능 최적화(진행 중).
24. 가능한 경우 참조에 의한 전달을 사용합니다.
25. .hpp 파일을 정리했습니다.
26. darknet.h를 다시 작성했습니다.
27. void*로 캐스팅하는 대신 cv::Mat를 적절한 C++ 객체로 사용했습니다.
28. 내부 이미지 구조가 사용되는 방식을 수정하거나 표준화했습니다.
29. ARM 기반 Jetson 장치에 대한 빌드가 수정되었습니다(새로운 Jetson Orin 장치가 작동함).
30. V3에서 Python API가 개선되었습니다.
단기 목표:
1. printf()를 std::cout(진행 중)으로 바꾸십시오.
2. 기존 ZED 카메라 지원을 조사합니다.
3. 명령줄 구문 분석을 개선하고 표준화합니다(진행 중).
중기 목표:
1. 모든 char* 코드를 제거하고 std::string으로 대체합니다.
2. 컴파일러 경고를 제거하고 일관된 경고 처리를 보장합니다(진행 중).
3. C의 사용자 정의 이미지 구조 대신 cv::Mat를 더 효과적으로 활용합니다(진행 중).
4. 이전 목록 기능을 std::벡터 또는 std::list로 대체합니다.
5. 1채널 회색조 이미지 지원을 수정했습니다.
6. N > 3인 N 채널 이미지에 대한 지원을 추가합니다(예: 추가 깊이 또는 열 채널이 있는 이미지).
7. 지속적인 코드 정리(진행 중).
장기 목표:
1. 모든 GPU의 CUDA/CUDNN 문제를 해결합니다.
2. CUDA+cuDNN 코드를 다시 작성하세요.
3. NVIDIA GPU가 아닌 GPU에 대한 지원 추가를 살펴보세요.
4. 회전된 경계 상자 또는 "각도" 속성에 대한 지원을 구현합니다.
5. 키포인트/스켈레톤에 대한 지원을 추가합니다.
6. 히트맵 구현(진행 중)
7. 세분화를 구현하십시오.