에러화면

 

 

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'라는 폴더 안에 있는 이미지파일들을 일괄적으로 분석할 수 있게 코드를 구현하였습니다.

 

python으로 postgres를 다룰 수 있습니다.

 

 

1. 파이썬 패키지 설치

postgres를 다루기 위한 파이썬 패키지(psycopg2)을 설치해줍니다.

pip install psycopg2-binary

 

2. postgres DB 연결

# PostgreSQL 연결 정보 설정
db_params = {
    "dbname": "postgres",
    "user": "postgres",
    "password": "1234",
    "host": "localhost",
    "port": "5432"
}

# PostgreSQL 연결
conn = psycopg2.connect(**db_params)

위 코드로 간단하게 연결할 수 있습니다.

db접근을 위한 연결정보인 db_params 변수에 오타나 잘못된 값이 입력되면 psycopg2.connect() 함수가 실행될 때 에러가 발생합니다.

오류가 발생했다면 DB가 제대로 설치되었는지, 오타가 없는지 확인이 필요합니다.

 

3. 간단한 테이블을 생성하고 INSERT 쿼리를 실행해보기

# 테이블 생성 쿼리
create_table_query = """
CREATE TABLE IF NOT EXISTS logging (
    log_id SERIAL PRIMARY KEY,
    log_datetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    car_number VARCHAR(20),
    image_file_name VARCHAR(255),
    json_file_name VARCHAR(255),
    saved_location VARCHAR(255)
);
"""

cursor = conn.cursor()
cursor.execute(create_table_query)



# 로그 정보
log_data = {
    "car_number": "ABC123",
    "image_file_name": "example_image.jpg",
    "json_file_name": "example_json.json",
    "saved_location": "/path/to/save/location"
}

# 로그 정보 삽입
insert_query = """
INSERT INTO logging (car_number, image_file_name, json_file_name, saved_location)
VALUES (%s, %s, %s, %s);
"""
cursor.execute(insert_query, (
    log_data["car_number"],
    log_data["image_file_name"],
    log_data["json_file_name"],
    log_data["saved_location"]
))

# 변경사항 커밋
conn.commit()

# 연결 및 커서 닫기
cursor.close()
conn.close()

 

위 예제는 주차장이나 건물 차량 입구의 입출차에 대한 cctv 기록을 저장하는 테이블입니다.

'logging'이라는 테이블을 만들고  자동차 번호, 차량 촬영 이미지, 차량 정보 json 파일, cctv 위치 등의 데이터를 insert 해봤습니다.

 

 

DBeaver로 도 확인해보니 데이터가 잘 삽입되었네요 :)

oracle, bigquery만 주로 활용하다가 postgres를 사용할 일이 생겼습니다.

매우 반갑죠.

설치부터 시작하고 postgres에 대해 알아가야겠습니다.


설치

macOS환경에서 Docker로 설치합니다.

(Docker가 설치되어있다는 가정하에) 매우 간단해요.

docker pull postgress
docker run --name my-postgres-container -e POSTGRES_PASSWORD=1234 -p 5432:5432 -d postgres
docker exec -it my-postgres-container psql -U postgres

 

* POSTGRES_PASSWORD와 포트는 사용환경에 맞게 설정하시면 됩니다.

저는 테스트용이기에 1234로 작성했습니다

 

DB 접속

DBeaver를 실행하여 설치한 postgress DB에 접속이 잘 되는지 확인해보겠습니다.

 

 

 

접속이 잘 됩니다.

 

 

macOS로 작업하다보니 어느 순간부터 텍스트나 이미지를 복사하여도 붙여넣기가 안 되거나, 이전에 복사한 데이터를 붙여넣는 현상이 발생하였습니다.

 재부팅도 해보고 키보드 문제인가 의심도 해봤지만 해결이 안되었는데 말끔하게 해결할 수 있는 방법이 있네요.

바로 'pboard' 프로세스를 재시작해주면 됩니다

 

pboard란?

macOS에서 pboard는 Pasteboard, 즉 클립보드와 관련된 명령줄 유틸리티입니다. pboard는 텍스트와 이미지와 같은 데이터를 클립보드에 복사하거나 클립보드에서 데이터를 가져오는 데 사용됩니다.

일반적으로, pboard는 텍스트나 이미지와 같은 데이터를 파일이나 명령줄을 통해 전달하고자 할 때 유용하게 사용될 수 있습니다. macOS에서는 pbcopy 명령어로 클립보드에 복사하고, pbpaste 명령어로 클립보드에서 데이터를 가져올 수 있습니다. 이러한 명령어들은 주로 스크립트나 명령줄 작업에서 활용됩니다


1. '활성 상태 보기' app으로 진입하여 'pboard' 프로세스를 종료시켜 준 후,

2. 터미널을 실행하여 'killall pboard' 명령어를 입력하면 정상적으로 복사 붙여넣기가 작동합니다

+ Recent posts