1. Yolo 사용 시 데이터셋 구성을 형식에 맞게 진행해야 함
사용한 데이터 - cityscape
https://www.cityscapes-dataset.com/
- 데이터 구조
dataset
├── images # 이미지 파일 저장 폴더
│ ├── train # 학습 데이터 이미지
│ │ ├── image1.jpg
│ │ ├── image2.jpg
│ │ ├── ...
│ ├── val # 검증 데이터 이미지
│ │ ├── image1.jpg
│ │ ├── image2.jpg
│ │ ├── ...
│
├── labels # label 파일 저장 폴더
│ ├── train # 학습 데이터 labels
│ │ ├── image1.txt
│ │ ├── image2.txt
│ │ ├── ...
│ ├── val # 검증 데이터 labels
│ │ ├── image1.txt
│ │ ├── image2.txt
│ │ ├── ...
│
└── data.yaml # 데이터셋 구성 설정 파일 (클래스 수, 경로 등 정의)
-> cityscape 데이터셋은 .json 파일로 저장되어 있어 yolo 형식에 맞게 .txt 파일로 변환해야 함
-> 클래스 || 폴리곤 좌표 (내용)
https://github.com/mcordts/cityscapesScripts
+ labels와 image 이름이 다르므로 각 사진의 label과 image의 이름이 같게 변경해야 함
2. yaml 파일 작성
ultrayltics의 coco.yaml에서 cityscape 클래스에 맞게 작성해야 함
path, train, val -> 경로
names -> class 번호와 이름
3. 훈련 코드 작성
yolo11n-seg.pt 사용
https://docs.ultralytics.com/ko/tasks/segment/
- backbone을 freezing하면 약 1시간 정도 소요됨
- 안 한 경우
- 1시간 30분 소요
4. 훈련된 모델로 테스트
- class는 인식한다고 터미널에 나오는데 다른 클래스로 마스크를 씌운 모습을 볼 수 있음
출력 내용
- "0: 480x480": 첫 번째 이미지(또는 프레임)가 480x480 크기임을 나타냄.
- "1 ego_vehicle, 1 out_of_roi, 1 road, 2 sidewalks, ...": 이미지에서 탐지된 객체의 종류와 수 (각각의 객체에 대해 감지된 개수).
- "208.1ms": 해당 이미지에 대한 추론 시간 (모델이 이미지를 처리하는 데 걸린 시간).
- "Speed: 0.1ms preprocess, 208.1ms inference, 142.4ms postprocess per image at shape (1, 3, 480, 480)": 각 과정에 걸린 시간.
ultralytics 라이브러리에서 제공하는 YOLO 모델의 model() 메서드를 호출할 때 자동으로 출력된다고 함
result 출력하면 나오는 메시지
1. boxes
- 객체 탐지 결과로, 이미지 내 감지된 물체들의 바운딩 박스 좌표 정보임. 좌표(x, y, width, height)를 제공함.
2. keypoints
- 사람의 관절 같은 포인트를 탐지하는 값인데, 여기선 None임. 즉, 이 모델은 keypoints 정보를 제공하지 않음.
3. masks
- 각 물체의 세그멘테이션 마스크임. 이미지에서 물체가 차지하는 정확한 영역을 나타냄. Masks 객체로 마스크 데이터를 제공함.
4. names
- 클래스 ID와 이름을 매핑한 딕셔너리임. 예를 들어, 0은 'unlabeled', 1은 'ego_vehicle' 등으로 각 클래스 이름을 알 수 있음.
5. obb
- 기울어진 바운딩 박스를 나타냄. 여기선 None이라서 이 정보는 제공되지 않음.
6. orig_img
- 원본 이미지의 픽셀 값임. NumPy 배열로 저장됨.
7. orig_shape
- 원본 이미지 크기. 여기서는 (480, 480) 크기임.
8. path
- 이미지 파일 경로임. image0.jpg 같은 이미지 파일 경로가 표시됨.
어떤 형식인지?
-> 딕셔너리 구조는 아님 -> ultralytics.engine.results.Results 클래스의 인스턴스로 확인함
따라서 객체에서 필요한 데이터에 접근하려면 해당 속성에 직접 접근해야 함
- results[0].boxes : 첫 번째 이미지에 대한 바운딩 박스를 반환.
- results[0].masks : 첫 번째 이미지에 대한 마스크를 반환.
- results[0].names : 클래스 이름을 반환.
- results[0].probs : 클래스 확률을 반환.
out = results[0].masks.data << 이런 식으로
왜 [0]만 사용하는지?
-> 하나의 입력 이미지에 대해 모델이 여러 출력을 만들 수 있음 > 첫 번째 결과를 참조해서 가져오는 거임
-> 그 안에서 masks나 boxes와 같은 속성들을 추출함
5. video test
> 감지한 객체 하나하나를 모두 분할해서 같은 클래스여도 마스크를 잘못씌우는? 이상한 결과값이 나옴
> 같은 클래스는 같은 마스크로 모두 묶는 역할이 필요함
6. yolo11x-seg 사용
- 크게 달라지지 않은 것을 확인함
7. deeplabv3으로 citydataset 훈련
json 형식이 달라서 변환하는 과정이 필요함
https://github.com/TillBeemelmanns/cityscapes-to-coco-conversion
https://tillbeemelmanns.github.io/2020/10/10/convert-cityscapes-to-coco-dataset-format.html
위 링크 사용해서 변환할 예정 >> 안됨... warning 오류가 많이 뜸
https://github.com/fregu856/deeplabv3
위 git에서 진행 > deeplabv3.utils.preprocess_data.py 에서 데이터 처리함
deeplabv3 폴더 내에서 model 폴더에 deeplabv3의 구조를 정의해둔 py 확인
utils.preprocess_data.py를 실행하면 cityscape에 대해 meta라는 폴더를 만들어서 label_imgs 폴더에 1채널(8비트)의 마스크 사진들과 class_weight.pkl 을 생성하는 것을 확인함...
> 아직 잘 모르겠음 어떤 역할인지??
utils.preprocess_data.py 내부를 보면 num_classes를 기존에 20개만 사용한 것을 확인함
추후 전부 사용하는 34개로 바꿔서 다시 진행해볼 예정
또한 현재 기존 세팅으로 훈련 돌릴 때는 resnet18을 백본으로 사용하는데 model.resnet.py 내부를 보면 18, 50, 101 존재함
따로 세팅을 바꿔주면 다른 백본으로도 돌릴 수 있을 듯
training_logs를 생성해서 모델의 checkpoints와 train loss, val loss 등 그래프들을 저장함
학습이 끝난 후 검증 확인
deeplabv3.evaluation 내에 eval_on_val_for_metrics.py와 eval_on_val.py 존재함
eval_on_val.py 실행 시 이미지 위에 예측한 결과를 오버레이하여 저장해줌 > cityscape 이미지
자세한 평가지표 확인을 위해 cityscape 공식 깃허브에서 평가지표 가지고 옴
https://github.com/mcordts/cityscapesScripts.git
git clone 진행하면 됨
이후 평가지표 폴더 내에서 cityscapesScript.cityscapesscripts.evaluation.evalPixelLevelSegmanticLabeling.py 실행
- 50 에폭에서 평가지표
카페 게시글
과제게시판
[딥러닝] 12. 영상 분할 - cityscape
신민서
추천 0
조회 85
25.03.19 16:09
댓글 1
다음검색
첫댓글 테스트 영상에서 5장골라서 오버레이와 마스크영상 모두 출력해줄것
원본, 정답, 추론 마스크, 추론 오버레이