<AI>라즈베리파이4 Yolov5 환경 세팅(with docker)

노설·2022년 8월 26일
1

Artificial Intelligence

목록 보기
1/1

1. 라즈베리파이4 OS 64bit 설치

중요사항 반드시 32bit가 아닌 "64bit"로 설치한다.
yolo의 경우 64bit를 권장하고 있으며, 실제로 내가 32bit환경에서 엄청난 삽질을 했다. 결국 os를 64bit로 설치를 하니 너무나 원활하게 되었다.

하단의 사진은 os 설치 과정

2. apt-get update/upgrade 하기

root@raspberrypi:~ $sudo apt-get update
Hit:1 http://deb.debian.org/debian bullseye InRelease
Hit:2 http://deb.debian.org/debian bullseye-updates InRelease   
Hit:3 http://security.debian.org/debian-security bullseye-security InRelease
Hit:4 http://archive.raspberrypi.org/debian bullseye InRelease 
root@raspberrypi:~ $sudo apt-get upgrade

3. docker 설치

root@raspberrypi:~ $ curl -fsSL https://get.docker.com -o get-docker.sh

# docker 쉘 파일이 설치됨
root@raspberrypi:~ $ ls
Bookshelf  Desktop  Documents  Downloads  get-docker.sh  Music  Pictures  Public  Templates  Videos

root@raspberrypi:~ $ curl -fsSL https://get.docker.com -o get-docker.sh


# docker 쉘 파일로 설치
root@raspberrypi:~ $ sudo sh get-docker.sh

# docker 정상적으로 설치되었는지 확인
root@raspberrypi:~ $ docker --version
Docker version 20.10.17, build 100c701

만일 docker를 설치하다가
Sub-process /usr/bin/dpkg returned an error code (1) 과 같은 에러를 만난다면 하기의 블로그를 통해 해결하면 된다.
블로그 링크

# docker 시스템이 재부팅 시에도 자동으로 실행될수 있도록 systemctl명령어를 사용한다.
root@raspberrypi:~ $ sudo systemctl enable docker
Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable docker

4. yolov5-arm64 도커 이미지 pull

root@raspberrypi:~ $ docker pull ultralytics/yolov5:latest-arm64
latest-arm64: Pulling from ultralytics/yolov5
a749a280e3e9: Pull complete 
44aff7d99d74: Pull complete 
b30c33bcaa45: Pull complete 
ab452fa8f97e: Pull complete 
580d22f9dc88: Pull complete 
a4a3ce02c935: Pull complete 
5dd236f87f6f: Pull complete 
7011122866f7: Pull complete 
a689429b48e7: Pull complete 
4f4fb700ef54: Pull complete 
f05f124ddfba: Pull complete 
Digest: sha256:d1e24f2d490b07b4abd8712c0958efa8682ad13351d680f2fb3a37ea5fd59e73
Status: Downloaded newer image for ultralytics/yolov5:latest-arm64
docker.io/ultralytics/yolov5:latest-arm64

해당 Yolov5는 Git 에서 확인 가능하다.

4. Docker 컨테이너 실행

# docker run
root@raspberrypi:~ $ sudo docker container run -it -d --name yolov5_2 ultralytics/yolov5:latest-arm64
a28db7390c265fe37212c8ba5f0740f2c0101a362dc191f4e9db0561591ed0d3

# 생성된 container 확인
root@raspberrypi:~ $ sudo docker ps
CONTAINER ID   IMAGE                             COMMAND   CREATED          STATUS         PORTS     NAMES
a28db7390c26   ultralytics/yolov5:latest-arm64   "bash"    10 seconds ago   Up 9 seconds             yolov5_2

# container 접속
root@raspberrypi:~ $ sudo docker exec -it a28 /bin/bash

5. yolo4 파일 확인

# 자동으로 yolo4 파일들이 포함 되어있음을 확인 가능하다.
root@a28db7390c26:/usr/src/app# ls
CONTRIBUTING.md  README.md  data       export.py   models            setup.cfg  tutorial.ipynb  val.py
LICENSE          classify   detect.py  hubconf.py  requirements.txt  train.py   utils

만일 해당 이미지를 빌드하지않고 개인적으로 사용하는 리눅스 기반의 이미지가 있다면 컨테이너 내에서 git clone https://github.com/ultralytics/yolov5 명령어를 사용해 가져온다.

//yolov5를 사용하기 위한 tool들을 다운받는다.
root@a28db7390c26:/usr/src/app# pip install -r requirements.txt 

// 정상적으로 설치 됨을 확인 ** 반드시 torch가 설치 됨을 확인하자 **
root@a28db7390c26:/usr/src/app# pip list
Package                      Version
---------------------------- --------------------
absl-py                      1.2.0
aiohttp                      3.8.1
aiosignal                    1.2.0
argcomplete                  2.0.0
argon2-cffi                  21.3.0
argon2-cffi-bindings         21.2.0
asttokens                    2.0.8
astunparse                   1.6.3
async-timeout                4.0.2
attrs                        22.1.0
backcall                     0.2.0
beautifulsoup4               4.11.1
bleach                       5.0.1
boto                         2.49.0
cachetools                   5.2.0
certifi                      2022.6.15
cffi                         1.15.1
charset-normalizer           2.1.1
crcmod                       1.7
cryptography                 37.0.4
cycler                       0.11.0
debugpy                      1.6.3
decorator                    5.1.1
defusedxml                   0.7.1
entrypoints                  0.4
executing                    0.10.0
fasteners                    0.17.3
fastjsonschema               2.16.1
flatbuffers                  1.12
fonttools                    4.37.1
frozenlist                   1.3.1
gast                         0.4.0
gcs-oauth2-boto-plugin       3.0
google-apitools              0.5.32
google-auth                  2.11.0
google-auth-oauthlib         0.4.6
google-pasta                 0.2.0
google-reauth                0.1.1
grpcio                       1.47.0
gsutil                       5.12
h5py                         3.7.0
httplib2                     0.20.4
idna                         3.3
importlib-metadata           4.12.0
importlib-resources          5.9.0
ipykernel                    6.15.1
ipython                      8.4.0
ipython-genutils             0.2.0
jedi                         0.18.1
Jinja2                       3.1.2
jsonschema                   4.14.0
jupyter_client               7.3.5
jupyter-core                 4.11.1
jupyterlab-pygments          0.2.2
keras                        2.9.0
Keras-Preprocessing          1.1.2
kiwisolver                   1.4.4
libclang                     14.0.6
lxml                         4.9.1
Markdown                     3.4.1
MarkupSafe                   2.1.1
matplotlib                   3.5.3
matplotlib-inline            0.1.6
mistune                      2.0.4
monotonic                    1.6
multidict                    6.0.2
nbclient                     0.6.7
nbconvert                    7.0.0
nbformat                     5.4.0
nest-asyncio                 1.5.5
notebook                     6.4.12
numpy                        1.23.2
oauth2client                 4.1.3
oauthlib                     3.2.0
opencv-python                4.6.0.66
opt-einsum                   3.3.0
packaging                    21.3
pandas                       1.4.3
pandocfilters                1.5.0
parso                        0.8.3
pexpect                      4.8.0
pickleshare                  0.7.5
Pillow                       9.2.0
pip                          22.2.2
pkgutil_resolve_name         1.3.10
prometheus-client            0.14.1
prompt-toolkit               3.0.30
protobuf                     3.19.4
psutil                       5.9.1
ptyprocess                   0.7.0
pure-eval                    0.2.2
pyasn1                       0.4.8
pyasn1-modules               0.2.8
pycparser                    2.21
Pygments                     2.13.0
pyOpenSSL                    22.0.0
pyparsing                    3.0.9
pyrsistent                   0.18.1
python-dateutil              2.8.2
pytz                         2022.2.1
pyu2f                        0.1.5
PyYAML                       6.0
pyzmq                        23.2.1
requests                     2.28.1
requests-oauthlib            1.3.1
retry-decorator              1.1.1
rsa                          4.7.2
scipy                        1.9.0
seaborn                      0.11.2
Send2Trash                   1.8.0
setuptools                   45.2.0
six                          1.16.0
soupsieve                    2.3.2.post1
stack-data                   0.4.0
tensorboard                  2.9.1
tensorboard-data-server      0.6.1
tensorboard-plugin-wit       1.8.1
tensorflow-aarch64           2.9.1
tensorflow-estimator         2.9.0
tensorflow-io-gcs-filesystem 0.26.0
termcolor                    1.1.0
terminado                    0.15.0
thop                         0.1.1.post2207130030
tinycss2                     1.1.1
torch                        1.12.1
torchvision                  0.13.1
tornado                      6.2
tqdm                         4.64.0
traitlets                    5.3.0
typing_extensions            4.3.0
urllib3                      1.26.12
wcwidth                      0.2.5
webencodings                 0.5.1
Werkzeug                     2.2.2
wheel                        0.37.1
wrapt                        1.14.1
yarl                         1.8.1
zipp                         3.8.1

6. detect할 모델을 컨테이너 안에 넣기

우선 미리 yolov5로 traing된 모델이 있어야한다. 나는 best.pt를 사용했다.

# best.pt 모델 위치 확인
root@raspberrypi:~ $ ls
best.pt  Bookshelf  Desktop  Documents  Downloads  get-docker.sh  Music  Pictures  Public  Templates  Videos

# 실행중인 컨테이너 확인
root@raspberrypi:~ $ sudo docker ps
CONTAINER ID   IMAGE                             COMMAND   CREATED          STATUS          PORTS     NAMES
a28db7390c26   ultralytics/yolov5:latest-arm64   "bash"    14 minutes ago   Up 14 minutes             yolov5_2

# 로컬의 파일을 컨테이너 안으로 복사
# 예시 sudo docker cp 해당 파일 위치를 포함한 파일명  (CONTAINER ID):파일이 이동할 컨테이너 내부 위치
root@raspberrypi:~ $ sudo docker cp best.pt  a28db7390c26:/usr/src/app
// best.pt가 잘 들어왔다! 확인!
root@a28db7390c26:/usr/src/app# ls
CONTRIBUTING.md  README.md  classify  detect.py  hubconf.py  requirements.txt  train.py        utils
LICENSE          best.pt    data      export.py  models      setup.cfg         tutorial.ipynb  val.py

7. detect

# 예시 python3 detect.py --weights (테스트할 pt이름) --img 640 --conf 0.5 --source "테스트할 파일명"
python detect.py --weights best.pt --img 640 --conf 0.5 --source "21_X017_C320_0118_2.jpg"
/usr/local/lib/python3.8/dist-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 
  warn(f"Failed to load image Python extension: {e}")
detect: weights=['best.pt'], source=21_X017_C320_0118_2.jpg, data=data/coco128.yaml, imgsz=[640, 640], conf_thres=0.5, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs/detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False
YOLOv5  v6.2-57-gf2b8f3f Python-3.8.10 torch-1.12.1 CPU

Fusing layers... 
YOLOv5s summary: 213 layers, 7020913 parameters, 0 gradients
image 1/1 /usr/src/app/21_X017_C320_0118_2.jpg: 640x480 1 플라스틱류, 901.1ms
Speed: 6.5ms pre-process, 901.1ms inference, 3.1ms NMS per image at shape (1, 3, 640, 640)
Results saved to runs/detect/exp

사실 엉터리로 인식한것도 있지만 하기 사진은 잘나왔다~

요건 잘안나온것, 종이류라니!

profile
IT업계에서 노설 이라는 이름이 보이면 그건 무조건 나.

3개의 댓글

comment-user-thumbnail
2022년 11월 27일

안녕하세요 라즈봇에서 yolo사용해보려고 으쌰으쌰하다 들어왔습니다.
yolov4-arm64 도커 이미지 pull 에서 got permission denied 뜨면 어떻게 해야할까요?

답글 달기
comment-user-thumbnail
2022년 11월 27일

자답합니다.
도커 그룹추가로 해결하였습니다.(https://seulcode.tistory.com/557)
좋은 정보 주셔서 감사합니다.

1개의 답글