1_Dataset 7/24

Mini·2024년 7월 23일

공모전

목록 보기
2/12
post-thumbnail

CrowdHuman

사람이 밀집된 데이터가 필요했다. 그래서 구글링을 하던 중 약 train,val_data 15000 + 3000개 데이터와 그에 맞는 odgt파일이 있었다. Yolo8을 이용해 데이터셋을 만들어 모델 훈련을 했지만 1번 훈련하는데 약 80분 이라는 시간이 소모되었고 코드를 만지고 다른 데이터를 가져와 다시 학습해야하는 문제가 생겼다.

!pip uninstall ultralytics -y
!pip install ultralytics

import os
import json
import zipfile
from pathlib import Path
from PIL import Image

def extract_images(zip_files, target_image_dir):
    """
    주어진 ZIP 파일 목록에서 이미지를 추출합니다.
    """
    target_path = Path(target_image_dir)
    target_path.mkdir(parents=True, exist_ok=True)

    for zip_file in zip_files:
        zip_path = Path(zip_file)
        if zip_path.exists():
            with zipfile.ZipFile(zip_path, 'r') as zip_ref:
                for file in zip_ref.namelist():
                    if file.startswith('Images/'):
                        zip_ref.extract(file, target_path.parent)
            print(f"Extracted: {zip_file}")
        else:
            print(f"Warning: ZIP file not found: {zip_file}")

    # 'Images' 폴더 내용을 상위 폴더로 이동
    images_folder = target_path / 'Images'
    if images_folder.exists():
        for item in images_folder.iterdir():
            item.rename(target_path / item.name)
        images_folder.rmdir()

def convert_odgt_to_yolo(odgt_file, image_dir, output_dir):
    """
    ODGT 형식의 파일을 YOLO 형식으로 변환합니다.
    """
    output_path = Path(output_dir)
    output_path.mkdir(parents=True, exist_ok=True)

    with open(odgt_file, 'r') as f:
        for line in f:
            data = json.loads(line)
            image_id = data['ID']
            image_file = Path(image_dir) / f"{image_id}.jpg"
            
            if not image_file.exists():
                print(f"Warning: Image file not found: {image_file}")
                continue

            img = Image.open(image_file)
            img_width, img_height = img.size

            txt_file = output_path / f"{image_id}.txt"
            
            with open(txt_file, 'w') as tf:
                for gt_bbox in data['gtboxes']:
                    if 'fbox' in gt_bbox:  # use full body bounding box
                        bbox = gt_bbox['fbox']
                        x_center = (bbox[0] + bbox[2] / 2) / img_width
                        y_center = (bbox[1] + bbox[3] / 2) / img_height
                        width = bbox[2] / img_width
                        height = bbox[3] / img_height
                        
                        tf.write(f"0 {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n")

# 메인 실행 코드
if __name__ == "__main__":
    # 현재 작업 디렉토리를 기준으로 상대 경로 설정
    base_dir = Path('dataset')
    images_train_dir = base_dir / 'train' / 'images'
    images_val_dir = base_dir / 'val' / 'images'
    labels_train_dir = base_dir / 'train' / 'labels'
    labels_val_dir = base_dir / 'val' / 'labels'

    # 학습 이미지 압축 해제
    train_zips = ['CrowdHuman_train01.zip', 'CrowdHuman_train02.zip', 'CrowdHuman_train03.zip']
    extract_images(train_zips, images_train_dir)

    # 검증 이미지 압축 해제
    val_zips = ['CrowdHuman_val.zip']
    extract_images(val_zips, images_val_dir)

    # ODGT 파일을 YOLO 형식으로 변환
    odgt_dir = Path('.')  # ODGT 파일이 있는 현재 디렉토리
    convert_odgt_to_yolo(odgt_dir / 'annotation_train.odgt', images_train_dir, labels_train_dir)
    convert_odgt_to_yolo(odgt_dir / 'annotation_val.odgt', images_val_dir, labels_val_dir)

    print("처리가 완료되었습니다.")
    
    dataset_yaml_content = """
path: D:\\OPENSW\\dataset
train: D:\\OPENSW\\dataset\\train
val: D:\\OPENSW\\dataset\\val
names:
  0: person
"""

yaml_file_path = 'D:\\OPENSW\\dataset.yaml'

with open(yaml_file_path, 'w') as yaml_file:
    yaml_file.write(dataset_yaml_content)

print(f"{yaml_file_path} 파일이 생성되었습니다.")


from ultralytics import YOLO

# YOLOv8 모델 불러오기 (n, s, m, l, x 중 선택)
model = YOLO('yolov8n.yaml')

# 모델 훈련
model.train(data='dataset.yaml', epochs=1, imgsz=640)

# 훈련 완료 후 체크포인트 확인 및 설정
if model.ckpt is None:
    model.ckpt = {'model': model.model.state_dict()}

# 모델 저장
model.save('runs/detect')

다른COCO데이터를 찾고 다시처음부터..시작을 해야겠다. 내 로컬에서 돌리기 버거워 여러 gpu를 외부에서 끌어와 사용할 수 있는 방법들을 모색했었다. Colab, anaconda 가상환경, 구름IDE 등등 좋은 CPU와 GPU를 사용 할 수 있는곳을 찾았고 좋은 공부를 하게되었다.
구글Colab
Anaconda가상환경
구름IDE

깃허브에 내 로컬폴더(data담긴)를 옮겨 어디서든 웹브라우저에서 편하게 작업 할 수 있는 방법을 알게되었다. 그럼 Github에 파일이 큰 폴더를 옮기기 위해서는 Git에 명령어를 따로 공부할 필요가 있었다. (유용함)

📌 GitHub Repository 생성하기

▶ git init

git init - 현재 디렉토리 기준 git 저장소 생성

깃허브에 연동할 폴더에서 우클릭 후 git bash 실행한다.
git init 입력하면 현재 디렉토리를 기준으로 Git 저장소가 생성된다.

성공적으로 저장소가 되었다면 해당 폴더에 .git 폴더가 생성되었을 것이다.

📌 GitHub 원격저장소에 연결

먼저, Github에 원격저장소를 하나 생성하고, git remote 명령어를 이용해서 로컬 저장소에 연결한다.

▶ git remote

git remote add origin https://github.com/[본인계정명]/[디렉토리명] -원격 저장소 연결

원격저장소에 연결했으니 원격저장소에 로컬에 있는 파일을 하나 업로드해보겠다.

▶ git push

git push -u origin master - 원격 저장소에 commit된 파일들을 모두 업로드

해당 파일을 commit한 후 확정된 사항들을 원격저장소에 git push로 업로드.

(commit 방법)
👉📌 GitHub에 원격저장소에 파일 업로드

git add(변경사항 저장) ▶ git commit(변경사항 확정) ▶ git push(원격저장소에 업로드)

깃허브와 로컬로 연동된 폴더에 <test.txt> 파일을 생성해보았습니다. 해당 파일을 원격저장소에 업로드 해보겠습니다.

▶ git add

git add - 다음 변경(commit)을 기록할 때까지 변경분 모아놓는 작업

git add 파일명 
git add . // 전체 add (점(.)은 모든 것을 의미)
git add *.txt // 모든 txt 파일 업로드
git add project/app/*/ //디렉토리 업로드
git add --update // 현재 git이 추적하고 있는 파일들만 add

▶ git status

git status - 작업 디렉토리(working directory)와 스테이징 영역(staging area)의 상태를 확인

위에서 add 명령어로 staging area에 들어간 test.txt파일을 확인 할 수 있다.

▶ git rm --cached

만약, add 된 test.txt파일을 unstage(add취소) 하고싶다면 아래 명령어를 실행하면 된다.

git rm --cached 파일명 - add 한 파일 unstage 명령

git status를 통해 확인하면 test.txt파일이 staging area에서 삭제되고 git이 추적하지 않는 untracked file이 된 것을 확인할 수 있다.

▶ git commit

git commit -m "커밋내용" - staging area에 저장되어있는 변경 사항들을 로컬저장소에 등록(변경사항 확정)

다음 과정을 진행하기 위해 test.txt 파일을 다시 add 하겠다.

git commit을 통해 staging area에 저장되어 있던 test.txt파일을 로컬저장소에 확정했다.

▶ git commit --amend -m "수정된 메시지"

커밋 메시지 잘못 작성했을 경우 메시지 수정

▶ git push

git pust -u origin master - 원격 저장소에 commit된 파일들을 모두 업로드

commit된 사항들을 git push 하여 원격저장소에 업로드 해보겠다.

원격 저장소에 commit내용이 성공적으로 업로드 됐다.

깃허브를 자주 사용해보자...제발..

(참고자료) Git명령어

# INDEX

1. 주요 Git 명령어
   1-1. GIT 명령어
   1-2. CLI 명령어

_

  1. git 명령어 모음

**Git 설치 (for ubuntu)

1) 터미널 (ctrl + Alt + T)

2) sudo apt install git 입력 (=> 설치완료)

3) git --version 입력 (=> 설치 확인 및 버전 확인)

1-1. GIT 명령어
분류 명령어 내용 설명
<새로운 저장소 생성> $ git init .git 하위 디렉토리 생성
(폴더를 만든 후, 그 안에서 명령 실행 => 새로운 git저장소 생성)
<저장소 복제/다운로드(clone)> $ git clone <https:.. URL> 기존 소스 코드 다운로드/복제
$ git clone /로컬/저장소/경로 로컬 저장소 복제

$ git clone 사용자명@호스트:/원격/저장소/경로 원격 서버 저장소 복제
<추가 및 확정(commit)> $ git add <파일명>

$ git add * 커밋에 단일 파일의 변경 사항을 포함
(인덱스에 추가된 상태)

$ git add -A 커밋에 파일의 변경 사항을 한번에 모두 포함
$ git commit -m "커밋 메시지" 커밋 생성

(실제 변경사항 확정)
$ git status 파일 상태 확인
<가지(branch)치기 작업> $ git branch 브랜치 목록
$ git branch <브랜치이름> 새 브랜치 생성 (local로 만듦)
$ git checkout -b <브랜치이름> 브랜치 생성 & 이동
$ git checkout master master branch로 되돌아 옴
$ git branch -d <브랜치이름> 브랜치 삭제
$ git push origin <브랜치이름> 만든 브랜치를 원격 서버에 전송
$ git push -u < remote > <브랜치이름> 새 브랜치를 원격 저장소로 push
$ git pull < remote > <브랜치이름> 원격에 저장된 git 프로젝트의 현재 상태를 다운받고 + 현재 위치한 브랜치로 병합
<변경 사항 발행(push)> $ git push origin master 변경사항 원격 서버에 업로드
$ git push < remote > <브랜치이름> 커밋을 원격 서버에 업로드
$ git push -u < remote > <브랜치이름> 커밋을 원격 서버에 업로드
$ git remote add origin <등록된 원격 서버 주소> 클라우드 주소 등록 및 발행
(git에게 새로운 원격 서버 주소 알림)
$ git remote remove <등록된 클라우드 주소> 클라우드 주소 삭제
<갱신 및 병합(merge)> $ git pull 원격 저장소의 변경 내용이 현재 디렉토리에 가져와지고(fetch) 병합(merge)됨
$ git merge <다른 브랜치이름> 현재 브랜치에 다른 브랜치의 수정사항 병합
$ git add <파일명> 각 파일을 병합할 수 있음
$ git diff <브랜치이름><다른 브랜치이름> 변경 내용 merge 전에 바뀐 내용을 비교할 수 있음
<태그tag 작업> $ git log 현재 위치한 브랜치 커밋 내용 확인 및 식별자 부여됨
<로컬 변경사항 return 작업> $ git checkout -- <파일명> 로컬의 변경 사항을 변경 전으로 되돌림
$ git fetch origin 원격에 저장된 git프로젝트의 현 상태를 다운로드

1-2. CLI (Command Line Interface) 명령어

명령어 인터페이스는 (마우스나 각종 UI 컴포넌트 대신) 터미널을 통해 사용자와 컴퓨터가 상호 작용하는 방식

분류 명령어 의미 설명
<관리자 권한으로 실행> $ sudo (super user do) 1. 관리자만 읽을 수 있는 파일 읽기
2. 새로운 프로그램 설치 (Ubuntu Linux)
3. Notes : 새로운 프로그램 설치시 Package Manager를 이용하는 것이 보편적
<기본적인 unix/linux 명령어> $ ls (list) 파일보기
$ al (all) 파일의 세부내용 확인
< $ ls -al의 상세 내용 (권한) >

  1. 접근권한 (읽기/쓰기/실행 가능)여부
  2. 링크된 파일 갯수
  3. 소유자
  4. 소유 그룹
  5. 파일 크기
  6. 만든 날짜
  7. 만든 시간
  8. 파일/디렉토리 이름
    $ cd (change directory) 디렉토리로 이동
    $ pwd (print working directory) full 디렉토리 path 확인 /
    (디렉토리 위치 변경)

<디렉토리로 이동> $ cd ~ 홈 디렉토리 (현재 사용자 개인 파일 디렉토리)
$ cd / 루트 디렉토리 (시스템 최상위 디렉토리 확인) /
(매우 중요한 디렉토리를 의미하며 관리자 권한 요구함)
$ cd . 현재 디렉토리
$ cd .. 부모 디렉토리
$ pwd 현재 full 디렉토리 확인
$ clear 터미널의 입력 내용들을 지워줌

<자주쓰는 명령어> $ touch [file_name] 빈 파일 생성 / (not 디렉토리 / literally 파일을 생성)
$ mkdir [dir_name] (make directory) 디렉토리 생성
$ cat file_name 텍스트 형태의 파일 확인
$ mv [file_name or dic_name][target_dir_name] (move) 파일 또는 디렉토리 옮기기
$ mv [file_name or dir_name][new_file_name] 파일 및 디렉토리 이름 바꾸기
$ cp [file][target_dir_name] (copy) 복사
$ cp -r [folder_name] 복사

<삭제>
(주의! 휴지통을 거치지 않고 즉시 삭제) $ rm file_name 파일 삭제
$ rm -r [dir_name] 폴더 삭제

branch에 기존 작업코드 복사하고 push하기
branch 생성 후 이동 : git checkout -b expressPrac
확인 : git status
push 하기 : git push origin expressPrac


깃허브 공부는 언제 시작해도 좋다고 생각했다. 항상 자료를 찾아보기 위해 아이디를 만들어 방문했었는데 내 깃허브를 꾸미고 파일을 올려 사람들과 공유한다는 사실은 깨닫지 못했었다. 늦었지만 이번 여름방학을 시작으로 깃허브에 내가 했던 프로젝트들을 올리거나 여러가지 깃허브에 기능들을 이용 할 수 있는 시간을 가졌으면 좋겠다. 파이팅해보자

profile
무지(無知)

0개의 댓글