강얼쥐와 함께 즐겁게 읽는 AI

CV2 상에서 포착된 비디오 프레임 안에 있는 HOG 라이브러리를 분석하는 계수에 관하여

영웅*^%&$ 2023. 2. 1. 16:23
728x90

CCTV를 통해 AI가 사람들 숫자를 실시간으로 파악

-> 특정 지역에 사람들 숫자가 기준치 이상으로 증가 (즉 위험도 상승)

-> AI 시스템에 의해 가장 근접한 소방서, 경찰서에 자동적으로 연락

(소방서, 경찰서에 연락이 가도록 한 이유는 밀집 정도가 심각한 상태라면 거기에 계신 분들이 걸음을 늦추는 정도로는 이 문제가 해결되지는 않는다고 보았기 때문입니다. 정말 이태원 사고처럼 밀집도가 높은 상황이라면 경찰이나 소방관이 개입해서 질서를 잡아주지 않는 이상 개인들이 처리하기 어렵다고 판단했습니다. 이태원 사고 정도로 밀집도가 높지 않다면 우리나라 사람들의 성향 상 큰 문제점이 없을 것이라고 일단 추정해보았습니다.)

-> 위험도의 수준에 맞게 약간 위험이라면 해당 소방관과 경찰관들도 CCTV 화면을 확인하여 정말 위험한 정도인지 등을 파악

-> ‘아주 위험이라면 소방관 혹은 경찰관들 현장 즉시 출동

대략 이러한 방식의 프로토콜을 생각해보았고 이에 기반하여 AI 코드에 대해서 제 해설을 곁들여서 설명한 다음 마지막으로 보안 관련 사항을 간단하게 기술해보겠습니다.

 

def detect(frame):

bounding_box_cordinates, weights = HOGCV.detectMultiScale(frame, winStride = (4, 4), padding = (8, 8), scale = 1.03)

 

person = 1

for x,y,w,h in bounding_box_cordinates:

cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2)

cv2.putText(frame, f'person {person}', (x,y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 1)

person += 1

 

cv2.putText(frame, 'Status : Detecting ', (40,40), cv2.FONT_HERSHEY_DUPLEX, 0.8, (255,0,0), 2)

cv2.putText(frame, f'Total Persons : {person-1}', (40,70), cv2.FONT_HERSHEY_DUPLEX, 0.8, (255,0,0), 2)

cv2.imshow('output', frame)

return frame

 

코드 출처 : https://data-flair.training/blogs/python-project-real-time-human-detection-counting

(파이썬 코드인데 구성이 조금 깨져서 가독성이 많이 떨어집니다 -> 실제로 확인하고픈 분은 출처를 확인해주세요)

 

저의 해설 : 이 코드는 파이썬에서 HOG(Histogram of Oriented Gradients) 라이브러리와 CV2(OpenCV) 라이브러리를 사용하여 비디오 프레임의 사람 수를 감지하고 계산하는 기능을 구현하고 있습니다.

이 함수는 처리할 비디오 프레임을 단일 인수로 쪼개서 탐지된 사람 주위에 그려진 경계 상자와 사람 수를 처리한 프레임을 반환하는 역할을 합니다.

 

함수의 첫 번째 줄은 프레임에서 사람을 감지하는 데 사용되는 HOGCV 개체의 detect MultiScale 메서드를 호출합니다. 이 방법은 처리할 프레임, 사람을 검색하는 데 사용되는 슬라이딩 스트라이드 크기, 탐지 전 프레임 크기 조정을 위한 축척 계수를 포함한 여러 인수를 사용합니다.

그런 다음 함수는 detect MultiScale 메서드에서 반환한 경계 상자 좌표 목록을 루프하고 프레임의 각 사용자 주위에 직사각형을 그립니다. 또한 1부터 시작하여 사용자의 번호를 표시하는 레이블을 추가합니다.

그런 다음 함수는 프레임에 두 개의 텍스트 레이블을 추가합니다. "Status: 탐지 중" "Total Persons: [숫자]", 여기서 [숫자]는 프레임에서 탐지된 총 사람 수입니다. 마지막으로, 함수는 cv2 라이브러리의 imshow 메서드를 사용하여 처리된 프레임을 표시하고 프레임을 반환하고 있습니다.

 

def humanDetector(args):

image_path = args["image"]

video_path = args['video']

if str(args["camera"]) == 'true' : camera = True

else : camera = False

writer = None

if args['output'] is not None and image_path is None:

writer = cv2.VideoWriter(args['output'],cv2.VideoWriter_fourcc(*'MJPG'), 10, (600,600))

if camera:

print('[INFO] Opening Web Cam.')

detectByCamera(ouput_path,writer)

elif video_path is not None:

print('[INFO] Opening Video from path.')

detectByPathVideo(video_path, writer)

elif image_path is not None:

print('[INFO] Opening Image from path.')

detectByPathImage(image_path, args['output'])

 

코드 출처 : https://data-flair.training/blogs/python-project-real-time-human-detection-counting

 

제 해설 : 이 함수는 이미지 또는 비디오 파일에 대한 경로, 입력 소스로 카메라를 사용할지 여부를 나타내는 부울 값, 처리된 이미지 또는 비디오를 저장하기 위한 출력 파일에 대한 경로를 포함하는 인수를 입력으로 가져옵니다.

 

함수는 먼저 인수 값을 확인하여 입력 소스와 출력 대상을 결정합니다. 카메라 인수가 참이면 함수는 detectByCamera 메서드를 호출하여 output_path writer 인수를 전달합니다. video_path 인수가 있으면 함수는 detectByPathVideo 메서드를 호출하여 video_path writer 인수를 전달합니다. image_path 인수가 없는 상태가 아니면 함수는 detectByPathImage 메서드를 호출하여 image_path output 인수를 전달합니다.

 

detectByCamera, detectByPathVideo detectByPathImage 메서드는 다른 코드에 정의되어 있습니다. 분량 관계상 모든 내용을 설명할 수가 없었습니다.

 

 

if __name__ == "__main__":

HOGCV = cv2.HOGDescriptor()

HOGCV.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

args = argsParser()

humanDetector(args)

 

코드 출처 : https://data-flair.training/blogs/python-project-real-time-human-detection-counting

 

제 해설 : 메인 함수입니다. 이 기능은 이미지 및 비디오에서 사람을 감지하는 데 사용되는 HOG(지향 gradient) 설명자의 히스토그램인 HOGCV 개체를 정의하는 것으로 시작합니다. 위에 내용을 참고해주시면 됩니다. HOGCV 개체는 cv2 라이브러리의 HOGDescriptor_getDefaultPeopleDetector 메서드에서 제공하는 사람에 대한 기본 HOG 설명자로 초기화됩니다.

다음으로, 함수는 코드에 정의되지 않은 argsParser 메서드를 호출하여 프로그램의 인수를 구문 분석합니다. 그런 다음 구문 분석된 인수는 이전 답변에서 설명한 휴먼 디텍터 메서드로 전달됩니다.

요약하면, 이 코드는 이미지와 비디오에서 사람을 탐지하기 위한 HOGCV 객체를 정의하고, 프로그램의 명령줄 인수를 구문 분석하며, 입력 이미지 또는 비디오를 처리하고 그 안에서 사람을 탐지하기 위해 Human detector Method를 호출합니다.

출처 : https://data-flair.training/blogs/python-project-real-time-human-detection-counting

분량 관계상 많은 내용을 스킵하였지만, 대략 위의 흐름을 이용하면 사람을 인지하도록 코드를 구성할 수 있습니다. 더 자세한 내용 혹은 다른 코드들은 위의 출처를 참고해주시길 부탁드립니다.

728x90