tensorflow 패키지를 활용할 작업이 있어서 m1 실리콘 맥에 설치한 과정입니다.

불과 m1 맥이 출시했던 2~3년 전만 하더라도, m1 프로세서의 맥으로 작업하는 동료들 중 tensorflow 설치로 애먹은 동료들이 떠올랐습니다.

하지만 지금은 매우 쉽게 설치가 되네요.

 

python 3.8버전의 anaconda가 설치된 환경에서 진행하였으며 아래 pip 명령어만 입력해주면 어렵지 않게 설치가 가능합니다.

python3 -m pip install tensorflow
python3 -m pip install tensorflow-metal

 

설치 후 터미널 상에서 테스트한 결과입니다.

% python3
Python 3.8.19 (default, Mar 20 2024, 15:27:52) 
[Clang 14.0.6 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf

>>> 
>>> tf.__version__
'2.13.0'
>>> tf.config.list_physical_devices('GPU')
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
>>>

 

앞으로 더 많은 작업을 쉽게 할 수 있겠네요 .

 

DONE!

Ubuntu 환경에서 pytorch 프로젝트 실행을 위해 설정하던 중 발생한 에러입니다.

 

'ModuleNotFoundError: No module named 'torch_geometric'

단순히 아래처럼 실행하면 되지 않을까 했는데, 여전히 같은 에러가 계속 발생했습니다.

pip install torch-geometric

설치전에..

우선 점검해볼것은 Nvidia 드라이버와 CuDA 설치 유무입니다.

아래 명령어로 각각의 요소들이 설치되었는지 확인을 하고, 설치가 안되었다면 반드시 설치를 해주어야합니다.

nvidia-smi
nvcc --version

Anaconda 환경에서 설치

저는 Anaconda 환경에서 진행하였습니다.

conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch
pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.9.0+cu111.html
pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.9.0+cu111.html
pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-1.9.0+cu111.html
pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-1.9.0+cu111.html
pip install torch-geometric

 

위 명령어들을 순차적으로 진행하면 정상적으로 설치가 되면서 에러가 해결됩니다.

(tf) admin@gpu-server:/usr/local/cuda$ python
Python 3.9.16 (main, Mar  8 2023, 14:00:05) 
[GCC 11.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch_geometric

 

GOOD!

에러화면

 

 

AI 학습데이터에 활용할 데이터셋을 불러오는 중에 아래와 같은 에러가 발생했습니다.

 

Error opening file

Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)

Make sure /Users/kaflix_wanya/Desktop/current/카스캐닝 데이터셋/parts_labeling/0831_1996개_jpg+json/100210979526_576120.json is a valid label file.'

 

문제는 annotating, labeling 데이터를 저장하고 있는 json 파일을 불러오면서 발생한 에러인데요.

이 많은 json파일의 인코딩을 어떻게 바꿀까 고민하다가 파이썬 코드로 해결하였습니다.

 

데이터셋 경로를 불러와서 -> 데이터셋 경로 내의 모든 json 파일을 읽어온 후 -> UTF-8로 다시 인코딩 -> 변경된 인코딩형식으로 json파일 저장

 

위 순서대로 작업한 후 다시 labelme에서 'open dir'을 통해 학습데이터 경로를 불러오니 오류없이 잘 작동합니다.

아래는 코드입니다.

import os
import json

def convert_json_encoding(folder_path):
    # 주어진 폴더 내의 모든 파일에 대해 반복
    for filename in os.listdir(folder_path):
        filepath = os.path.join(folder_path, filename)
        
        # 파일이 JSON 파일인지 확인
        if filename.endswith('.json'):
            # JSON 파일을 UTF-8 인코딩으로 읽어들임
            with open(filepath, 'r', encoding='utf-8-sig') as file:
                data = json.load(file)
            
            # 같은 파일을 UTF-8 인코딩으로 다시 저장
            with open(filepath, 'w', encoding='utf-8') as file:
                json.dump(data, file, ensure_ascii=False, indent=4)

# 변경할 폴더 경로를 지정
folder_path = '/User/Dataset'

# 함수 호출
convert_json_encoding(folder_path)

 

이미지 전처리를 위해서 이미지 파일 내에 불필요한 부분을 제거하기 위해서 특정 객체가 포함된 부분(ROI와 비슷)만 남기는 작업을 해야했습니다.

cv2로 bitmap 처리를 해보니 시간도 많이 소요되고 효율성이 좋지 않아 ai model을 사용하기로 하였고 결과는 성공적이었습니다.


 정지 영상(image)에 어떤 객체들이 있는지 python으로 yolo 모델을 활용하여 이미지 내의 객체들을 찾는(detection) 코드를 구현하였습니다.

추가로 이미지 내에서 인식(Detection)된 객체의 좌표를 불러와서 특정 객체만 남기고 이미지를 crop하는 기능까지 구현한 내용입니다.


설치

1. pythorch

pip install torch torchvision torchaudio

 

2. yolo v5 repository

pip install yolov5

git clone https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -U -r requirements.txt

 * clone할 공간은 작업중인 폴더 안에서 실행해도 무관합니다


Image Detection 사용하기 (1) 터미널 명령어 (단 한 줄)

terminal 명령어로 이미지 경로를 지정해주기만해도 간단하게 사용할 수 있습니다.

yolov5 폴더로 이동한 후 아래 명령어를 입력하면 웹캠 영상, 정지된 영상을 바로 실습할 수 있습니다.

python detect.py --source /path/image/free-video-854671.jpg

테스트에 사용한 이미지 :  https://www.pexels.com/video/cars-on-highway-854671/

 

 

명령어 실행 결과 ...

user@mypc % python detect.py --source /path/image/free-video-854671.jpg
detect: weights=yolov5s.pt, source=/path/project/free-video-854671.jpg, data=data/coco128.yaml, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_csv=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, vid_stride=1
YOLOv5 🚀 v7.0-267-gc42aba5 Python-3.8.18 torch-2.1.2 CPU

Fusing layers... 
YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients, 16.4 GFLOPs
image 1/1 /path/project/free-video-854671.jpg: 352x640 9 persons, 7 cars, 1 bus, 2 trucks, 80.7ms
Speed: 0.7ms pre-process, 80.7ms inference, 7.3ms NMS per image at shape (1, 3, 640, 640)
Results saved to runs/detect/exp5

 

맨 아래줄에 detection이 끝난 결과에 대한 경로가 있습니다.

Results saved to runs/detect/exp5

결과이미지 경로 이동

 

결과 이미지

분석이 끝난 이미지를 간단하게 확인할 수 있습니다.

truck, bus같은 경우 인식 오류가 발생한듯 싶으나 대체로 잘 인식한 걸 확인할 수 있습니다.


 

Image Detection 사용하기 (2) 터미널 명령어를 파이썬 코드로 실행

import subprocess

# 이미지 파일의 경로
image_path = 'path/to/your/image.jpg'

# detect.py 스크립트를 파이썬으로 호출
result = subprocess.run(['python', 'yolov5/detect.py', '--source', image_path])

terminal 에서 실행한 명령어를 파이썬의 subprocess 패키지를 이용해 코드로 실행한 코드입니다.


 

Image Detection 사용하기 (3) 파이썬 코드로 실행

모델을 불러오고, 분석할 이미지 파일을 모델에 넣어준 뒤에 결과를 받는 코드입니다.

파이썬 코드로 실행하게 되면 결과에 대한 다양한 값들을 확인하고 응용할 수 있습니다.

import torch
from pathlib import Path
from yolov5 import detect
import os
from PIL import Image, ImageDraw

def vehicle_detection_yolov5(image_path):
    model = torch.hub.load('ultralytics/yolov5:master', 'yolov5s')
    # Inference
    results = model(image_path)
    # Results, change the flowing to: results.show()
    results.show()
    # results.save()
    print(results.s)
    
    return results
    

data_path = 'car_image'
image_files = [f for f in os.listdir(data_path) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif'))]

for image_file in image_files:
    print(image_file)
    results = vehicle_detection_yolov5(f'{data_path}/{image_file}')
    print(results.s)

 

'car_image'라는 폴더 안에 있는 이미지파일들을 일괄적으로 분석할 수 있게 코드를 구현하였습니다.

 

+ Recent posts