YOLOv7
- 강아지 객체 감지를 위해 사용
git clone https://github.com/WongKinYiu/yolov7.git
cd yolov7
pip install -r requirements.txt
가상환경 정리
가상환경이 복잡하거나 충돌이 심한 경우, 새로운 가상환경을 생성하여 문제를 해결
새 가상환경 생성
python -m venv yolov7_env
가상환경 활성화
yolov7_env\Scripts\activate
YOLOv7과 numpy 버전 충돌 해결
YOLOv7을 실행하려는 환경에서 numpy 버전 충돌이 발생
YOLOv7은 numpy<1.24.0 버전을 요구하지만, 현재 설치된 버전이 numpy-2.1.3으로 호환되지 않아서 문제를 일으킴
설치된 numpy 버전이 YOLOv7과 호환되지 않으므로 pip uninstall numpy 제거
YOLOv7은 numpy<1.24.0을 요구하므로, 안정적인 numpy==1.23.5 버전을 설치
pip install numpy==1.23.5 --only-binary :all:
모델이 잘못된 클래스를 감지하고 있음
출력 결과:
잘못된 클래스 값 무시: 39
잘못된 클래스 값 무시: 73
잘못된 클래스 값 무시: 39
잘못된 클래스 값 무시: 41
잘못된 클래스 값 무시: 60
잘못된 클래스 값 무시: 68
잘못된 클래스 값 무시라는 디버깅 메시지로, YOLO 모델이 감지한 객체의 클래스가 dog 클래스와 일치하지 않아서 해당 객체를 무시한 경우 출력됨
- YOLO 모델은 COCO 데이터셋(80개 클래스)을 기반으로 훈련되었음
- 감지된 클래스가 16번(강아지 클래스)가 아닌 다른 클래스(고양이, 의자, 자동차..)인 경우 무시되는데, 대부분의 탐지된 클래스가 dog 클래스와 관련이 없기 때문에 무시된 것이라고 한다.
객체가 감지되지 않는 이유가 데이터의 문제라면... confidence threshold (conf_thres) 값을 낮추어 더 많은 객체를 감지하도록 해보자..
COCO 클래스 정의에서 강아지(dog) 클래스가 cls == 16 인 경우에만 처리하도록 설계, 강아지로 탐지된 결과만 필터링하고 처리하는데 초점이 맞춰지도록!
1. COCO 클래스
COCO 클래스 목록에서 강아지는 cls == 16
이를 기준으로 탐지된 객체 중 강아지를 선별
2. 클래스 이름 출력
print(f"탐지된 클래스: {class_name} (클래스 번호: {cls}), 신뢰도: {conf:.2f}") 이 코드는 디버깅용으로 모델이 탐지한 클래스 이름, 번호, 신뢰도를 출력
3. 강아지 클래스만 처리
if cls == 16: 조건문으로 강아지 탐지 결과만 처리하고, 다른 클래스는 무시
강아지로 탐지된 경우, 이미지를 크롭하고 경계 상자를 시각화하며 파일로 저장
def detect_and_crop(image_path, model, output_folder, conf_thres=0.25, iou_thres=0.2):
탐지된 클래스: bench (클래스 번호: 13)
탐지된 클래스: refrigerator (클래스 번호: 72)
탐지된 클래스: chair (클래스 번호: 56)
탐지된 클래스: couch (클래스 번호: 57)
탐지된 클래스: person (클래스 번호: 0)
탐지된 클래스: chair (클래스 번호: 56)
너무 낮추었나.. 너무 다르게 나오네..
탐지된 클래스: dog (클래스 번호: 16), 신뢰도: 0.68
탐지된 클래스: cat (클래스 번호: 15), 신뢰도: 0.42
잘못된 클래스 탐지: cat (클래스 번호: 15)
탐지된 클래스: dog (클래스 번호: 16), 신뢰도: 0.80
탐지된 클래스: cat (클래스 번호: 15), 신뢰도: 0.77
잘못된 클래스 탐지: cat (클래스 번호: 15)
탐지된 클래스: potted plant (클래스 번호: 58), 신뢰도: 0.38
잘못된 클래스 탐지: potted plant (클래스 번호: 58)
탐지된 클래스: dog (클래스 번호: 16), 신뢰도: 0.81
탐지된 클래스: dog (클래스 번호: 16), 신뢰도: 0.46
탐지된 클래스: cat (클래스 번호: 15), 신뢰도: 0.35
잘못된 클래스 탐지: cat (클래스 번호: 15)
탐지된 클래스: dog (클래스 번호: 16), 신뢰도: 0.70
탐지된 클래스: dog (클래스 번호: 16), 신뢰도: 0.91
탐지된 클래스: bed (클래스 번호: 59), 신뢰도: 0.47
def detect_and_crop(image_path, model, output_folder, conf_thres=0.3, iou_thres=0.25):
이거 맞추기 참..
conf_thres는 탐지된 객체의 신뢰도를 나타낸 conf 값이 conf_thres 보다 작으면 해당탐지를 무시
- conf_thres를 낮추면 더 많은 객체를 탐지하지만, 오탐지가 증가할 수 있다.
- conf_thres를 높이면 더 높은 신뢰도로 탐지된 객체만 남는다.
iou_thres
- iou_thres를 낮추면 더 많은 탐지를 허용하며, 강아지 클래스의 추가적인 탐지가 가능해질 수 있다 .
- iou_thres를 높이면 중복된 탐지를 더 강하게 제거한다.
결론적으로 def detect_and_crop(image_path, model, output_folder, conf_thres=0.25, iou_thres=0.2): 로 진행
탐지 결과가 없거나 다른 클래스만 탐지될 경우, 해당 클래스는 무시하도록 함.
여기서 탐지 정확도를 높이기 위해서는 conf_thres를 낮추거나 모델 가중치를 변경해서 시도해보자...
이미지의 해상도, 밝기, 대조 등을 조정하여 강아지 탐지 가능성을 높이고,
OpenCV의 cv2.equalizeHist 또는 cv2.resize 등을 활용해 데이터 품질을 개선
==> 다시 생각 아니 클래스를 무시하면 안되지!!!!!!! 영상 프레임 별 감지를 하는건데 무시하면 오차가 생기고 그만큼 모델 행동 분류하는데 오차가 생길거 아니냐고... 객체 감지를 하면 크롭하여 저장한 뒤 넣어두고, 객체감지 오류가 발생한경우 크롭되지 않은 원본의 데이터를 가지고 데이터 처리를 하자
크롭 완료!✨
.
.
.
오차는 존재....;;;
코드 흐름
- labeling_dir에서 JSON 파일을 읽고, JSON 파일의 annotations에서 frame_number를 추출
- frame_dir 에서 해당 frame_number에 해당하는 이미지를 읽어오고, detect_and_crop 함수를 호출하여 강아지 객체를 탐지하고 크롭된 이미지를 저장한다.
- 탐지된 강아지 객체의 정보를 annotations.csv 파일에 기록
csv 파일안에는 frame_number 탐지된 강아지가 포함된 프레임 번호, cropped_frame_path 크록된 강아지 이미지 경로가 들어간다. 크롭된 이미지에는 강아지 객체가 탐지된 후, 해당 영역을 크롭하여 cropped_output 디렉터리에 저장한다.
'팀프로젝트 - TailsRoute' 카테고리의 다른 글
TEAM Project - SAMURAI 사용 흐름 및 오류 해결, 한계 (0) | 2024.12.04 |
---|---|
TEAM Project (12.02) - 데이터 전처리 (SAMURAI 적용, 데이터 양 조절) (0) | 2024.12.03 |
TEAM Project (12.01) - SAMURAI, SAM 2 설치 (0) | 2024.12.02 |
TEAM Project (11.30) (0) | 2024.12.01 |
TEAM Project (11.29) - SAMURAI 적용 (0) | 2024.11.30 |