딥러닝

딥러닝- 로보플로우 , 코렙, 주피터( 개와 고양이 분류)

인생진리 2023. 3. 22. 17:46

# roboflow 에서 라벨링/전처리한 데이터 가져오기
# 이미지 크기 640으로 수정
# 이미지 돌리기, 뒤집기, 확대/축소 > train에만 반영
!curl -L " https://app.roboflow.com/ds/klDqsfJp9m?key=aBItBGfEgr " > roboflow.zip; unzip roboflow.zip; rm roboflow.zip

주어진 코드에서는 "train_img_list"와 "valid_img_list"에 저장된 이미지 파일 경로를 각각 "train.txt"와 "valid.txt" 파일에 저장하는 코드입니다.

 

그러나 코드에 오류는 없어 보입니다. 만약 코드 실행 중에 문제가 발생한다면, "train_img_list"와 "valid_img_list" 변수가 정상적으로 생성되지 않았거나, 파일 경로에 문제가 있을 수 있습니다.

 

따라서, 코드 실행 중에 문제가 발생한다면, "train_img_list"와 "valid_img_list" 변수가 정확하게 생성되었는지, 그리고 파일 경로에 문제가 없는지 다시 한 번 확인해보는 것이 좋습니다.

또한, 파일 경로를 저장할 때 텍스트 파일에 대한 인코딩 방식을 지정하는 것이 좋습니다.

# 데이터를 하나의 변수에 모으기
# 데이터의 경로값을 모은다 >txt파일
# train, val만 모을예정
# make directory : 폴더 만들기
%mkdir dataset

해당 질문에서 제시된 코드는 "dataset"이라는 디렉토리를 생성하는 코드입니다.

 

보통 Makefile을 사용하여 소프트웨어 빌드를 자동화할 때, 빌드에 필요한 파일이나

디렉토리를 생성하는 경우가 있습니다.

 

이때, Makefile에서 디렉토리를 생성하는 방법에 대해서는 여러 가지가 있지만,

 

가장 간단하고 일반적인 방법은 "mkdir" 명령어를 사용하는 것입니다.

 

따라서, 주어진 코드에서는 "mkdir" 명령어를 사용하여 "dataset"이라는 디렉토리를 생성하고 있습니다.

 

그러나, 위 코드에는 디렉토리가 이미 존재하는 경우에 대한 처리가 없습니다.

 

이를 방지하기 위해서는 "mkdir -p" 옵션을 사용하면 됩니다.

# move
%mv ./README.dataset.txt ./README.roboflow.txt ./data.yaml train test valid /content/dataset

파일과 디렉토리를 이동하는 명령어인 "mv"를 사용하여 "./README.dataset.txt", "./README.roboflow.txt", "data.yaml", "train", "test", "valid" 이라는 파일 및 디렉토리를 "/content/dataset"으로

이동하는 코드입니다.

 

그러나, 위 코드에서는 파일과 디렉토리가 모두 한 디렉토리 내에 있어서,

파일과 디렉토리를 이동시키는 것은 필요하지 않습니다.

 

따라서, 이 코드는 불필요한 코드이며, 삭제해도 상관없습니다.

 

만약 위 코드가 실제로 필요한 경우, 해당 파일과 디렉토리가 위치한 디렉토리에서 실행해야 합니다.

이때, 절대경로를 사용하는 것이 좋습니다.

 

절대경로는 루트 디렉토리부터 시작하여 해당 파일이나 디렉토리까지의 전체 경로를 나타내므로,

현재 작업 중인 디렉토리와 상관없이 항상 정확한 경로를 지정할 수 있습니다.

 

따라서, 위 코드는 파일과 디렉토리를 이동하는 것이 필요하지 않으며, 이동이 필요한 경우에는

절대경로를 사용하여 해당 파일과 디렉토리를 이동시켜야 합니다.

# 학습 파일 경로 가져오기
from glob import glob

train_img_list = glob('/content/dataset/train/images/*.jpg')
train_img_list

valid_img_list = glob('/content/dataset/valid/images/*.jpg')
valid_img_list

파일과 디렉토리를 이동하는 명령어인 "mv"를 사용하여 "./README.dataset.txt", "./README.roboflow.txt", "data.yaml", "train", "test", "valid" 이라는 파일 및 디렉토리를 "/content/dataset"으로

이동하는 코드입니다.

 

그러나, 위 코드에서는 파일과 디렉토리가 모두 한 디렉토리 내에 있어서

, 파일과 디렉토리를 이동시키는 것은 필요하지 않습니다.

따라서, 이 코드는 불필요한 코드이며, 삭제해도 상관없습니다.

 

만약 위 코드가 실제로 필요한 경우, 해당 파일과 디렉토리가 위치한 디렉토리에서 실행해야 합니다.

 

이때, 절대경로를 사용하는 것이 좋습니다. 절대경로는 루트 디렉토리부터 시작하여 해당 파일이나

디렉토리까지의 전체 경로를 나타내므로,

현재 작업 중인 디렉토리와 상관없이 항상 정확한 경로를 지정할 수 있습니다.

 

따라서, 위 코드는 파일과 디렉토리를 이동하는 것이 필요하지 않으며, 이동이 필요한 경우에는 절대경로를 사용하여 해당

파일과 디렉토리를 이동시켜야 합니다.

#이미지 경로들을 하나의 파일에 담아줌
with open('/content/dataset/train.txt', 'w') as f:
  f.write('\n'.join(train_img_list)+'\n')

with open('/content/dataset/valid.txt', 'w') as f:
  f.write('\n'.join(valid_img_list)+'\n')

주어진 코드는 "train_img_list"와 "valid_img_list"에 저장된 이미지 파일 경로를 각각 "train.txt"와 "valid.txt" 파일에 저장하는 코드입니다.

 

"with open"을 사용하여 파일을 열고, "f.write('\n'.join(train_img_list)+'\n')"를

사용하여 "train_img_list"에 저장된 이미지 파일 경로를

개행 문자('\n')를 구분자로 하여 "train.txt" 파일에 저장하고 있습니다.

 

마찬가지로, "f.write('\n'.join(valid_img_list)+'\n')"를 사용하여

"valid_img_list"에 저장된 이미지 파일 경로를 개행 문자('\n')를 구분자로 하여 "valid.txt" 파일에 저장하고 있습니다.

 

이러한 작업은 머신러닝 모델을 학습할 때 데이터셋을 읽어들이는데 필요합니다.

 

"train.txt"와 "valid.txt" 파일에는 각각 학습 데이터와 검증 데이터의 이미지 파일 경로가

저장되어 있으며, 모델 학습 시 이러한 파일을 사용하여 이미지 데이터를 읽어들이게 됩니다.

 

따라서, 위 코드는 머신러닝 모델을 학습하기 위한 데이터셋을 준비하는데 필요한 코드입니다.

# data.yaml에서 train과 val경로 수정

data.yaml 아래코드로 바꿔야됨

train: /content/dataset/train.txt
val: /content/dataset/valid.txt

nc: 2
names: ['cats', 'dogs']

roboflow:
  workspace: project
  project: 230320_catdog-37t3f
  version: 1
  license: CC BY 4.0
  url: https://universe.roboflow.com/project/230320_catdog-37t3f/dataset/1

주어진 코드는 YOLOv5 물체 감지 모델의 학습에 대한 설정 파일

 

train.txt와 valid.txt에는 각각 학습 데이터와 검증 데이터셋의 경로가 포함되어 있으며,

nc와 names는 모델이 감지할 클래스 수와 클래스 이름을 나타냅니다.

 

roboflow는 이미지 처리 및 라벨링 플랫폼인 것으로 보이며, 해당 프로젝트와 버전에 대한 정보를 제공합니다.

!git clone https://github.com/ultralytics/yolov5

주어진 코드는 GitHub에서 YOLOv5 라이브러리를 클론(clone)하는 코드입니다.

 

"!git clone"을 사용하여 "https://github.com/ultralytics/yolov5" 주소에 있는

YOLOv5 라이브러리를 로컬 환경에 클론(clone)하고 있습니다.

 

이를 통해 YOLOv5 라이브러리의 코드를 로컬 환경에서 사용하거나 수정할 수 있습니다.

따라서, 위 코드는 YOLOv5 라이브러리를 사용하기 위한 코드입니다.

# change directory
%cd yolov5

위 코드는 현재 디렉토리를 "yolov5" 디렉토리로 변경하는 코드입니다.

 

"%cd"는 셸 명령어 중 하나로, 디렉토리를 변경하는 명령어입니다.

 

이를 이용해 "yolov5" 디렉토리로 이동하여 해당 디렉토리 안에서 YOLOv5 라이브러리를 사용할 수 있게 됩니다.

 

따라서, 위 코드는 YOLOv5 라이브러리를 사용하기 위해 작업 디렉토리를 "yolov5" 디렉토리로 변경하는 코드입니다.

!pip install -r requirements.txt

해당 코드는 현재 디렉토리에 있는 requirements.txt 파일에 기록된 모든 패키지를 설치하는 명령어입니다.

!pip install 명령어를 사용하여 해당 패키지들을 설치할 수 있습니다.

 

이때 !pip install -r 옵션을 사용하면 requirements 파일에 나열된 패키지들을 한 번에 설치할 수 있습니다.

 

이 명령어를 실행하면, requirements 파일에 나열된 모든 패키지들을 설치합니다. 이 명령어가 실행되기

전에는, 해당 패키지들이 설치되어 있지 않을 수 있으므로, 우선 해당 명령어로 필요한 패키지들을 모두 설치해야 합니다. 

!python train.py --img 640 --batch 16 --epochs 50 --data /content/dataset/data.yaml --cfg ./models/yolov5s.yaml --name cat_dog_yolov5s_results

이 코드는 YOLOv5를 훈련하는 데 사용되는 명령어입니다. train.py 파일을 실행하며,

이미지 크기, 배치 크기, epoch 수 등의 인자들이 지정됩니다.

 

이 명령어는 /content/dataset/data.yaml에 지정된 데이터셋을 사용하여 ./models/yolov5s.yaml

지정된 모델 구조를 사용하여 YOLOv5를 훈련합니다.

 

결과는 cat_dog_yolov5s_results에 저장됩니다. 


# 예측시킬 이미지
test_img='/content/dataset/test/images/cat-49_jpg.rf.361156bf8351699e6a12ea3642021466.jpg'

이 코드는 이미지 분할을 수행하는 U-Net 모델을 사용합니다.

 

U-Net 모델은 이미지 분할 문제에서 효과적인 결과를 보여주는 CNN 기반 모델입니다.

 

분할된 이미지의 각 픽셀에 라벨을 할당하는 semantic segmentation과,

물체의 인스턴스를 분리하고 각 객체의 모양과 위치를 식별하는 instance segmentation이 있습니다

 

 이 코드에서는 semantic segmentation을 사용합니다. 분할된 이미지를 시각화하고 저장하는 코드도 제공됩니다.

#예측
!python detect.py --weights /content/yolov5/runs/train/cat_dog_yolov5s_results5/weights/best.pt --img 640 --conf 0.1 --source "{test_img}"

해당 코드는 YOLOv5 모델을 이용하여 이미지를 예측하는 코드입니다.

 

detect.py 파일을 이용하여 이미지를 예측하는데, --weights 옵션으로 모델의 가중치 경로,

--img 옵션으로 이미지의 크기, --conf 옵션으로 예측할 객체의 신뢰도(confidence) 임계값,

--source 옵션으로 예측할 이미지의 경로를 지정해주고 있습니다.

 

이 코드에서는 test_img 변수에 저장된 이미지를 예측하고 있습니다.

 

 

 

아나콘다 환경설정

아래 코드로 입력해야함 conda create -n py38_yolov5 python==3.8

proceed 나오면 엔터

 

 

그후 아래에서 다운 받은거 C:\Users\SMHRD\ 에 p38_yolov5 폴더 만들어서 옯기기

best.pt
13.77MB

conda env list입력해서 연결 후 activate py38_yolov5 입력해서 사용

그후 cd p38_yolov5 경로 변경

그후 pip install git-python 깃 클론을 위해 설치

그후 conda install git 깃 적용

그런다음 git clone https://github.com/ultralytics/yolov5 깃 클론하기

 

하다가 오류나서
https://github.com/ultralytics/yolov5 사이트에서 파일 다운받아서 수동으로

여기에다가 옮김

 

그후에 다시 

이렇게 다시 쳐서 괜찮아짐

 

그런다음 pip install jupyter 주피터 노트북 설치

그후에 jupyter notebook 하면 실행 되면서  켜짐

import torch

이 코드는 torch 라이브러리를 import하는 코드입니다.

torch 라이브러리는 파이썬에서 딥러닝을 구현하는 데에 가장 많이 사용되는 라이브러리 중 하나입니다.

 

import torch를 실행하면, torch 라이브러리가 설치되어 있어야 합니다.

 

만약 설치되어 있지 않다면, ModuleNotFoundError 에러가 발생합니다.

 

따라서, 이 코드는 torch 라이브러리를 사용하는 코드에서는 필수적으로 실행되어야 하는 코드입니다.

 

model = torch.hub.load('ultralytics/yolov5', 'custom', path='../best.pt' , force_reload=True)

이 코드는 ultralytics/yolov5 라이브러리에서 custom 모델 아키텍처를 불러와서 best.pt 가중치 파일을 로드하는 코드입니다.

 

torch.hub.load() 함수는 Torch Hub API를 사용하여 모델 아키텍처와 가중치를 로드합니다.

 

이 함수는 인수로 모델 저장소의 이름(예: "pytorch/vision")과 모델의 이름(예: "resnet50")을 받습니다.

 

custom은 YOLOv5 라이브러리에 이미 정의된 모델 아키텍처 이름입니다.

 

path 인수는 로드할 가중치 파일 경로를 나타냅니다. 이 경우 best.pt 가중치 파일을 로드합니다.

 

force_reload=True는 캐시된 모델이나 가중치를 무시하고 새로운 모델과 가중치를 로드하도록 지시합니다.

 

이 코드는 YOLOv5 라이브러리에서 제공하는 모델 아키텍처와

가중치 파일을 로드하는 코드입니다.

 

해당 코드는 torch.hub.load() 함수를 사용하여, YOLOv5 모델을 불러오는 코드입니다.

 

torch.hub.load() 함수는 PyTorch Hub에서 모델을 다운로드하거나 로드하여 불러올 수 있는 함수입니다.

 

여기서 ultralytics/yolov5는 PyTorch Hub에서 제공하는 YOLOv5 모델의 저장소(repository) 경로입니다.

 

'custom'은 PyTorch Hub에서 제공하는 YOLOv5 모델 중 custom 모델을 불러온다는 의미입니다.

 

custom 모델은 자체 데이터셋을 사용하여 학습시킨 YOLOv5 모델을 의미합니다.

 

path='../best.pt'는 로드하려는 모델의 경로를 나타냅니다.

 

'../best.pt'는 상위 디렉토리에 있는 'best.pt' 파일을 의미합니다.

 

force_reload=True는 이전에 캐시된 모델이 있다면 그 모델 대신 새로운 모델을 다운로드하거나

로드하도록 하는 옵션입니다.

 

따라서, 해당 코드는 ultralytics/yolov5 저장소에서 custom 모델을 로드하고,

상위 디렉토리에 있는 'best.pt' 파일을 불러옵니다.

result = model('https://blog.kakaocdn.net/dn/tEMUl/btrDc6957nj/NwJoDw0EOapJNDSNRNZK8K/img.jpg')

이 코드는 ultralytics/yolov5 모델을 사용하여 이미지를 추론하는 코드입니다.

 

model 객체를 이용하여 입력 이미지 URL을 제공하면, 해당 이미지에 대한 객체 검출 결과를 반환합니다.

 

검출 결과는 result 변수에 할당됩니다. 이 변수는 detect 메서드를 사용하여 반환되며,

객체 검출 결과를 담고 있는 파이썬 딕셔너리입니다.

 

딕셔너리 키는 검출된 객체의 클래스, 좌표 등을 나타내며,

값은 해당 객체에 대한 정보가 담긴 리스트 형태입니다.

 

해당 코드에서는 ultralytics/yolov5 모델을 사용하기 때문에, 우선 해당 모델이 설치되어 있어야 합니다.

 

모델이 설치되어 있지 않은 경우, torch.hub.load 함수를 사용하여 자동으로 다운로드하고 설치할 수 있습니다.

 

입력 이미지는 URL을 통해 제공됩니다. 이 URL에 접근하여 이미지를 가져오고,

이를 model 객체의 detect 메서드에 전달하여 객체 검출을 수행합니다.

result.pandas().xyxy[0]

result.pandas().xyxy()는 YOLOv5 모델에서 반환된 결과를 Pandas 데이터프레임 형태로 반환합니다.

 

xyxy() 메서드는 데이터프레임 내에 있는 모든 bounding box 좌표를 좌측 상단과 우측 하단

좌표 형태(x_min, y_min, x_max, y_max)로 변환하여 반환합니다.

 

반환된 데이터프레임은 행렬 형태이므로, 특정 행에 접근하려면 인덱싱을 사용해야 합니다.

 

예를 들어, result.pandas().xyxy().iloc[0]은 첫 번째 bounding box에 대한 좌표 정보를 시리즈 형태로 반환합니다.


수업요약


- 주피터 노트북에서 플라스크를 통해서 웹이나 앱에 연결을 하려면 파일이 하나 필요함
- 다운로드하는 동안 주피터 노트북을 열어보기로 함
- 환경을 새롭게 만들기 위해 아나콘다 프롬프트를 열고 새로운 환경을 만들고 있음

- 코랩은 학습에만 쓸 때 gpu 사용이 가능해서 학습이 빠름
- 코랩은 서버 자체가 구글한테 있는 거라 웹에 연결해서 쓰기가 복잡함
- 주피터노토북이나 비주얼 스튜디오 코드도 많이 씀


- 학습이 되어 있다는 가정 하에 학습 관련된 코드는 코랩에 남아 있음

- 욜로를 돌릴 거면 기타 구에 있는 것들을 다 받아와야 함

- 깃허브를 설치해야 함- 딥 클론을 설치하면 딥 클론을 쓸 수 있음
- 욜로 v5를 사용하려면 리콰이어먼트스점 텍스트에서 라이브러리를 다 설치해야 함

- 환경을 새롭게 만들었기 때문에 pip 인스토어에서 주피터 노트북을 다운로드 받아야 함


- 개 고양이 검출함으로 바꾸고 디팩트라는 파일 하나 만들어줌

- 욜로 브이 파이브에 하이코치라는 형식으로 딥러닝이 만들어져 있음
- 파이토치라는 것을 사용을 해서도 딥러닝을 구현할 수 있음
- 커스텀한 모델의 가중치 필요함
- 이미지에 대한 경로를 적어주면 됨

- 고양이를 검색해서 아무거나 가지고 오고 이미지 주소 복사하면 됨
- 주소 복사를 하다 보면 웹 페이지 주소가 나오는 경우가 있는데 그건 이미지가 아님
- 이미지 주소 복사했을 때 파일명 확장자가 제대로 잘 들어가 지는지 확인해보고 실행시키면 시간이  0.3초 걸림


- 이미지 주소를 복사해서 붙여 넣었을 때 끝에 있는 확장자가 jpg, tng, gif 이어야 함
- 이미지에 대한 위치를 알고 싶으면 판다스에서 실행을 시켜보면 됨
- 동영상에서 검출을 하려면 디펙트점 파이파이를 사용하는 방법과 확장하는 방법이 있음

- 욜로에서 지정한 형식으로만 보여지게 됨
- 욜로에서 지정한 형식으로 보여지게 하는 방식을 사용하면 원하는 대로 튜닝을 할 수 있음
- 웹캠에서 사진을 확인하는 방법은 tv 2 비디오 캡처라는 함수로 썼을 것임