나는 지금 라즈베리파이5를 사용해서 hailo8L을 사용하고 있다
인텔 뎁스카메라를 활용해서 파이썬에서 구현을 하고 있는데
yolov5s_personface_h8l.hef 파일을 활용해서 파이썬 코드를 구현하고 싶은데
import cv2
import pyrealsense2 as rs
import numpy as np
from gpiozero import Buzzer
from hailo_platform import (HEF, Device, VDevice, ConfigureParams, InputVStreamParams,
OutputVStreamParams, InputVStreams, OutputVStreams, FormatType, HailoStreamInterface)
Hailo 모델 설정
hef_file = “/usr/share/hailo-models/yolov5s_personface_hl.hef” # Hailo HEF 모델 경로
person_class_id = 15 # “person” 클래스 ID
confidence_threshold = 0.5 # 신뢰도 임계값
depth_alert_distance = 3.0 # 거리 임계값 (3미터)
RealSense 카메라 설정
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
pipeline.start(config)
부저 설정
buzzer = Buzzer(16)
Hailo 장치 설정 및 모델 로드
devices = Device.scan()
if not devices:
raise RuntimeError(“Hailo device not found”)
with VDevice(device_ids=devices) as target:
hef = HEF(hef_file)
configure_params = ConfigureParams.create_from_hef(hef, interface=HailoStreamInterface.PCIe)
network_group = target.configure(hef, configure_params)[0]
input_shape = hef.get_input_vstream_infos()[0].shape[:2] # (H, W)
network_group_params = network_group.create_params()
# 입력 및 출력 스트림 구성
input_vstreams = InputVStreamParams.make_from_network_group(network_group)
output_vstreams = OutputVStreamParams.make_from_network_group(network_group)
try:
with InputVStreams(network_group, input_vstreams) as inputs, \
OutputVStreams(network_group, output_vstreams) as outputs:
with network_group.activate(network_group_params):
while True:
# RealSense 데이터 가져오기
frames = pipeline.wait_for_frames()
depth_frame = frames.get_depth_frame()
color_frame = frames.get_color_frame()
if not depth_frame or not color_frame:
continue
# 컬러 프레임 처리
color_image = np.asanyarray(color_frame.get_data())
resized_image = cv2.resize(color_image, input_shape[::-1]) # Hailo 입력 크기에 맞게 조정
resized_image = np.expand_dims(resized_image, axis=0) # 배치 차원 추가
# Hailo 입력 데이터 전송
for input_stream in inputs:
input_stream.send(resized_image)
# Hailo 출력 데이터 수신
segmentation_maps = []
for output_stream in outputs:
segmentation_maps.append(output_stream.recv())
# 세그멘테이션 결과 시각화 및 처리
person_detected_nearby = False
for seg_map in segmentation_maps:
if seg_map.shape[-1] <= person_class_id:
print(f"Segmentation map does not include class ID {person_class_id}")
continue
# 특정 클래스 ID의 세그멘테이션 마스크 추출
mask = seg_map[..., person_class_id]
mask = (mask > confidence_threshold).astype(np.uint8) # 이진화
if np.any(mask):
# 마스크 크기 조정 및 컬러맵 적용
mask_resized = cv2.resize(mask, (color_image.shape[1], color_image.shape[0]),
interpolation=cv2.INTER_NEAREST)
#mask_colored = cv2.applyColorMap(mask_resized * 255, cv2.COLORMAP_JET)
#color_image = cv2.addWeighted(color_image, 0.6, mask_colored, 0.4, 0)
# 마스크 중심의 깊이 계산
indices = np.column_stack(np.where(mask_resized > 0))
if len(indices) > 0:
center_y, center_x = np.mean(indices, axis=0).astype(int)
depth = depth_frame.get_distance(center_x, center_y)
# 깊이 정보 유효성 검사 및 "person" 클래스에만 표시
if depth > 0 and depth <= depth_alert_distance:
person_detected_nearby = True
cv2.putText(color_image, f'Person ({depth:.2f}m)', (center_x, center_y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 부저 제어
if person_detected_nearby:
buzzer.on()
else:
buzzer.off()
# 결과 이미지 표시
cv2.imshow('Hailo + RealSense Segmentation', color_image)
# 'q' 키로 종료
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
# 자원 정리
pipeline.stop()
buzzer.off()
cv2.destroyAllWindows()
현재 코드는 이런 상황이고 사람이라는 객체를 인식한 상황에서 얼굴이 잡히면 소리를 울리지 않고 잡히지 않는다면 소리를 울리지 않게 하고싶은데
hef파일에 대한 정보나 코드 수정에 대한 방법을 알려주면 감사하겠습니다
코딩 초보라 자세하게 부탁드려요