네, YOLOv5를 사용하여 볼트를 감지하고 개수를 세는 프로그램을 만들 수 있습니다. YOLOv5는 실시간 객체 감지에 매우 효과적인 딥러닝 모델입니다. 다음은 YOLOv5와 웹캠을 이용한 실시간 볼트 감지 프로그램의 예시 코드입니다:
import cv2
import torch
from models.experimental import attempt_load
from utils.general import non_max_suppression, scale_coords
from utils.torch_utils import select_device
from utils.augmentations import letterbox
import numpy as np
def load_model():
device = select_device('')
model = attempt_load('yolov5s.pt', map_location=device)
return model, device
def detect_bolts(frame, model, device):
img = letterbox(frame, 640, stride=32)[0]
img = img.transpose((2, 0, 1))[::-1] # HWC to CHW, BGR to RGB
img = np.ascontiguousarray(img)
img = torch.from_numpy(img).to(device)
img = img.float()
img /= 255.0
if img.ndimension() == 3:
img = img.unsqueeze(0)
pred = model(img, augment=False)[0]
pred = non_max_suppression(pred, 0.25, 0.45, classes=[0], agnostic=False) # 클래스 0은 볼트로 가정
bolts = []
for i, det in enumerate(pred):
if len(det):
det[:, :4] = scale_coords(img.shape[2:], det[:, :4], frame.shape).round()
for *xyxy, conf, cls in reversed(det):
bolts.append((int(xyxy[0]), int(xyxy[1]), int(xyxy[2]), int(xyxy[3])))
return bolts
def count_bolts_realtime():
model, device = load_model()
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
bolts = detect_bolts(frame, model, device)
for (x1, y1, x2, y2) in bolts:
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(frame, f"Bolts: {len(bolts)}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow('Bolt Counter', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
count_bolts_realtime()
이 코드를 사용하기 위해서는 다음 사항들을 준비해야 합니다:
- YOLOv5 설치: pip install yolov5
- YOLOv5 모델 파일: 'yolov5s.pt' 또는 볼트 감지에 특화된 사용자 정의 모델
- 필요한 라이브러리: PyTorch, OpenCV, NumPy
주의사항:
- 이 코드는 YOLOv5의 기본 모델을 사용합니다. 볼트 감지에 특화된 모델을 훈련시키면 더 좋은 결과를 얻을 수 있습니다.
- classes=[0]는 YOLOv5의 기본 클래스 중 첫 번째 클래스(보통 'person')를 감지합니다. 볼트 감지를 위해서는 이 부분을 적절히 수정해야 합니다.
- 성능은 사용하는 하드웨어에 따라 다를 수 있습니다. GPU 사용을 권장합니다.
YOLOv5를 사용한 볼트 감지의 장점:
- 높은 정확도: 딥러닝 기반 모델로 더 정확한 감지가 가능합니다.
- 빠른 처리 속도: 실시간 처리에 적합합니다.
- 다양한 조건에서의 robust한 성능: 조명, 각도 등 다양한 조건에서도 잘 작동합니다.
이 코드를 실행하기 전에 볼트 데이터셋으로 YOLOv5 모델을 fine-tuning하는 것이 좋습니다.
YOLO는 지속적으로 발전해왔으며, 각 버전마다 성능과 특징이 다릅니다. 주요 버전들을 소개해드리겠습니다:
- YOLOv3:
- 더 빠르고 정확한 버전으로, 다양한 크기의 객체 감지에 효과적입니다.
- Darknet-53 백본 네트워크를 사용합니다.
- YOLOv4:
- YOLOv3보다 더 빠르고 정확합니다.
- CSPDarknet53 백본을 사용하며, 다양한 데이터 증강 기법을 적용했습니다.
- YOLOv5:
- PyTorch로 구현되어 사용이 편리합니다.
- 다양한 모델 크기(s, m, l, x)를 제공합니다.
- YOLOv6:
- 매우 빠른 추론 속도를 자랑합니다.
- 모바일 디바이스에서도 효율적으로 동작합니다.
- YOLOv7:
- 고성능 객체 감지 모델로, 정확도와 속도 면에서 우수합니다.
- 다양한 작업(객체 감지, 인스턴스 분할 등)에 적용 가능합니다.
- YOLOv8:
- Ultralytics에서 개발한 최신 버전입니다.
- 객체 감지뿐만 아니라 분할, 포즈 추정 등 다양한 작업을 수행할 수 있습니다.
각 버전은 고유한 특징과 장단점이 있습니다. 예를 들어, YOLOv8을 사용한 볼트 감지 코드는 다음과 같습니다:
from ultralytics import YOLO
import cv2
def count_bolts_realtime():
# YOLOv8 모델 로드
model = YOLO('yolov8n.pt') # 또는 볼트 감지용으로 fine-tuning된 모델
# 웹캠 설정
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 객체 감지 수행
results = model(frame)
# 감지된 객체 표시 및 개수 세기
bolt_count = 0
for r in results:
boxes = r.boxes
for box in boxes:
# 클래스 ID가 볼트에 해당하는 경우에만 처리
if box.cls == 0: # 0은 볼트 클래스 ID로 가정
bolt_count += 1
x1, y1, x2, y2 = box.xyxy[0]
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
# 볼트 개수 표시
cv2.putText(frame, f"Bolts: {bolt_count}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# 결과 프레임 표시
cv2.imshow('Bolt Counter', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
count_bolts_realtime()
이 코드를 사용하려면 pip install ultralytics 명령으로 YOLOv8을 설치해야 합니다.
어떤 버전을 선택할지는 프로젝트의 요구사항(정확도, 속도, 리소스 제약 등)에 따라 다릅니다. 볼트 감지 작업에 가장 적합한 버전을 선택하려면, 각 버전으로 테스트를 해보고 성능을 비교해보는 것이 좋습니다.
[ WARN:0@10.173] global cap_msmf.cpp:471 anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -2147023170
[ WARN:0@10.219] global cap_msmf.cpp:483 anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -2147023170
[ WARN:1@10.234] global cap_msmf.cpp:1759 CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147023170
이 오류 메시지들은 Microsoft Media Foundation (MSMF)를 사용하는 OpenCV의 비디오 캡처 기능에서 발생한 것입니다. 이는 주로 웹캠이나 카메라 장치와의 통신 문제로 인해 발생합니다. 이 문제를 해결하기 위해 다음 방법들을 시도해 볼 수 있습니다:
- 카메라 연결 확인:
- 웹캠이 제대로 연결되어 있는지 확인하세요.
- 다른 USB 포트에 연결해 보세요.
- 카메라 드라이버 업데이트:
- 최신 카메라 드라이버를 설치하세요.
- 다른 카메라 인덱스 시도:
- cv2.VideoCapture(0) 대신 cv2.VideoCapture(1) 또는 다른 인덱스를 사용해 보세요.
- DirectShow 백엔드 사용:
- MSMF 대신 DirectShow를 사용해 보세요. 코드를 다음과 같이 수정하세요:
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
- MSMF 대신 DirectShow를 사용해 보세요. 코드를 다음과 같이 수정하세요:
- 카메라 해상도 설정:
- 특정 해상도를 명시적으로 설정해 보세요:
cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
- 특정 해상도를 명시적으로 설정해 보세요:
- 다른 카메라 사용:
- 가능하다면 다른 웹캠으로 테스트해 보세요.
- OpenCV 재설치:
- OpenCV를 재설치하거나 다른 버전을 시도해 보세요.
- 시스템 재부팅:
- 간단하지만 때때로 효과적인 방법입니다.
- 에러 처리 추가:
- 코드에 에러 처리를 추가하여 문제를 더 자세히 파악할 수 있습니다:
pythonCopycap = cv2.VideoCapture(0) if not cap.isOpened(): print("카메라를 열 수 없습니다.") exit()
- 코드에 에러 처리를 추가하여 문제를 더 자세히 파악할 수 있습니다:
- 다른 비디오 캡처 라이브러리 사용:
- 예를 들어, pyv4l2나 libuvc 같은 라이브러리를 시도해 볼 수 있습니다.
* 해결방안: 아래 내용 수정
# 웹캠 설정
cap = cv2.VideoCapture(0) ======> cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
from ultralytics import YOLO
import cv2
def count_bolts_realtime():
# YOLOv8 모델 로드
model = YOLO('yolov8n.pt') # 또는 볼트 감지용으로 fine-tuning된 모델
# 웹캠 설정
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
while True:
ret, frame = cap.read()
if not ret:
break
# 객체 감지 수행
results = model(frame)
# 감지된 객체 표시 및 개수 세기
bolt_count = 0
for r in results:
boxes = r.boxes
for box in boxes:
# 클래스 ID가 볼트에 해당하는 경우에만 처리
if box.cls == 0: # 0은 볼트 클래스 ID로 가정
bolt_count += 1
x1, y1, x2, y2 = box.xyxy[0]
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
# 볼트 개수 표시
cv2.putText(frame, f"Bolts: {bolt_count}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# 결과 프레임 표시
cv2.imshow('Bolt Counter', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
count_bolts_realtime()
VSCODE Terminal
20240722_yolov8.py
Traceback (most recent call last):
File "e:\vscode_workspace\20240722_yolov8.py", line 1, in <module>
from ultralytics import YOLO
ModuleNotFoundError: No module named 'ultralytics'
(base) E:\vscode_workspace>pip install ultralytics
Collecting ultralytics
Downloading ultralytics-8.2.62-py3-none-any.whl.metadata (41 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.2/41.2 kB 197.3 kB/s eta 0:00:00
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 825.2/825.2 kB 5.2 MB/s eta 0:00:00
Downloading ultralytics_thop-2.0.0-py3-none-any.whl (25 kB)
Downloading py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
Installing collected packages: py-cpuinfo, ultralytics-thop, ultralytics
Successfully installed py-cpuinfo-9.0.0 ultralytics-8.2.62 ultralytics-thop-2.0.0
[notice] A new release of pip is available: 24.0 -> 24.1.2
[notice] To update, run: python.exe -m pip install --upgrade pip
python.exe e:/vscode_workspace/20240722_yolov8.py
Downloading https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt to 'yolov8n.pt'...
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 6.25M/6.25M [00:00<00:00, 12.1MB/s]
[ERROR:0@44.436] global obsensor_uvc_stream_channel.cpp:156 cv::obsensor::getStreamChannelGroup Camera index out of range
python.exe e:/vscode_workspace/20240722_yolov8.py
[ERROR:0@3.470] global obsensor_uvc_stream_channel.cpp:156 cv::obsensor::getStreamChannelGroup Camera index out of range
python.exe e:/vscode_workspace/20240722_yolov8.py
[ WARN:0@10.173] global cap_msmf.cpp:471 `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -2147023170
[ WARN:0@10.219] global cap_msmf.cpp:483 `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -2147023170
[ WARN:1@10.234] global cap_msmf.cpp:1759 CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147023170
python.exe e:/vscode_workspace/20240722_yolov8.py
[ERROR:0@3.429] global obsensor_uvc_stream_channel.cpp:156 cv::obsensor::getStreamChannelGroup Camera index out of range
python.exe e:/vscode_workspace/20240722_yolov8.py
0: 480x640 (no detections), 592.0ms
Speed: 87.2ms preprocess, 592.0ms inference, 46.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 laptop, 150.4ms
Speed: 37.1ms preprocess, 150.4ms inference, 58.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 148.0ms
Speed: 3.0ms preprocess, 148.0ms inference, 3.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 140.0ms
Speed: 2.0ms preprocess, 140.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 143.0ms
Speed: 2.0ms preprocess, 143.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 142.0ms
Speed: 2.0ms preprocess, 142.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 140.0ms
Speed: 3.0ms preprocess, 140.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 143.0ms
Speed: 2.0ms preprocess, 143.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 141.0ms
Speed: 2.0ms preprocess, 141.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 143.0ms
Speed: 3.0ms preprocess, 143.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 139.0ms
Speed: 2.0ms preprocess, 139.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 143.0ms
Speed: 2.0ms preprocess, 143.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 140.0ms
Speed: 2.0ms preprocess, 140.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 142.0ms
Speed: 2.0ms preprocess, 142.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 person, 1 remote, 158.4ms
Speed: 2.0ms preprocess, 158.4ms inference, 2.5ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 165.7ms
Speed: 2.5ms preprocess, 165.7ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 145.0ms
Speed: 2.0ms preprocess, 145.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 314.0ms
Speed: 1.0ms preprocess, 314.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 163.0ms
Speed: 3.0ms preprocess, 163.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 155.0ms
Speed: 3.0ms preprocess, 155.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 162.0ms
Speed: 2.0ms preprocess, 162.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 210.0ms
Speed: 3.0ms preprocess, 210.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 146.0ms
Speed: 2.0ms preprocess, 146.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 2 remotes, 145.0ms
Speed: 2.0ms preprocess, 145.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 149.0ms
Speed: 4.0ms preprocess, 149.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 1 keyboard, 150.0ms
Speed: 2.0ms preprocess, 150.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 176.5ms
Speed: 2.0ms preprocess, 176.5ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 167.0ms
Speed: 4.8ms preprocess, 167.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 150.0ms
Speed: 2.0ms preprocess, 150.0ms inference, 3.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 159.0ms
Speed: 2.0ms preprocess, 159.0ms inference, 5.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 167.0ms
Speed: 2.0ms preprocess, 167.0ms inference, 3.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 1 remote, 156.0ms
Speed: 2.0ms preprocess, 156.0ms inference, 2.0ms postprocess per image at shape (1, 3, 480, 640)
0: 480x640 (no detections), 163.0ms
Speed: 3.0ms preprocess, 163.0ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
'인공지능' 카테고리의 다른 글
젯슨 나노(Jetson Nano)를 이용하여 센서(카메라)를 통해 물체의 수량을 카운트하는 방법 (0) | 2024.07.19 |
---|---|
Machine Learning 참고 사이트 (0) | 2024.01.04 |
Anomaly Detection (0) | 2023.03.17 |
chatGPT (0) | 2023.01.10 |
ESPnet(end-to-end speech processing toolkit) Installation (0) | 2022.08.11 |
댓글