딥러닝 기반의 조류 감지 및 인식 시스템(UI 인터페이스, Python 코드 포함)

여기에 이미지 설명 삽입

요약: 조류 인식은 딥 러닝과 머신 비전 분야에서 널리 사용되는 응용 프로그램입니다. 이 기사에서는 YOLOv5 기반의 조류 감지 및 인식 시스템을 자세히 소개합니다. 알고리즘의 원리를 소개하면서 Py o n Py th o n Qt UI 인터페이스. 인터페이스에서 다양한 새 사진, 비디오를 선택하고 감지 및 인식을 위해 카메라를 켤 수 있으며, UI 인터페이스를 통해 파일을 선택하고, 마크 인식 대상을 전환하고, 전환 모델을 지원하고, 사용자가 로그인할 수 있도록 지원합니다. 등록 인터페이스; YOLOv5 모델 교육 구현을 기반으로 교육 데이터 세트 및 교육 코드를 제공하며 빠른 감지 속도와 높은 인식 정확도; 또한 교육 가능한 코드 및 데이터 세트도 제공됩니다. 블로그 게시물은 Python 코드에 대한 소개와 사용법에 대한 튜토리얼을 제공하여 초보자가 참조하기에 적합하며 전체 코드 리소스 파일을 보려면 기사 끝에 있는 다운로드 링크로 이동하십시오. 이 블로그 게시물의 카탈로그는 다음과 같습니다.

➷ 기사 끝 부분에 포함된 모든 전체 코드 파일 의 다운로드 페이지 로 이동하려면 클릭하세요.☇

코드 소개 및 데모 비디오 링크: https://www.bilibili.com/video/BV1QL411C783/ (업데이트 중입니다. 블로거 B 스테이션 비디오를 팔로우하는 것을 환영합니다)


머리말

        한 지역의 생물 다양성과 생태 환경의 중요한 지표로서 "새의 수와 분포"는 자연 보호 구역, 습지 공원 및 동물 보호 감독 부서와 같은 기관에서 점점 더 많은 관심을 받고 있습니다. 종, 수 및 분포, 다양한 지역에서 표준화된 작업이 되었습니다. 이 기사는 조류 모니터링 및 인식을 위한 AI 기술 지원을 제공하고 모니터링 및 인식 효율성을 개선하며 순수 수동 모니터링으로 인한 비효율 및 오류를 해결하고 조류 보호 및 번식을 위한 더 나은 데이터 지원을 제공할 수 있는 YOLOv5 대상 탐지 알고리즘을 사용합니다. .

        조류 모니터링 및 식별은 매우 복잡합니다. 새 비행 경로가 불확실하고, 착륙 지점이 불확실하며, 시간이 불확실합니다. 모니터링 영역이 다양하고(숲, 습지, 호수, 초원 등) 일부 새는 매우 유사한 습관을 가지고 있습니다. 모양 및 색상. , 이러한 요인으로 인해 조류 모니터링 및 식별 기술에 대한 요구 사항이 매우 높아집니다. 기존의 머신비전 알고리즘은 조류의 종류와 위치를 정확하고 신속하게 식별하기 어려우며, 최근 몇 년 동안 머신러닝과 딥러닝이 큰 발전을 이루었습니다. .성능. YOLOv5는 단일 단계 표적 탐지 알고리즘 YOLO의 5세대로, 실험에 따르면 속도와 정확도 측면 에서 크게 개선되었습니다. 개체 감지 Drone 캡처 시나리오에서 오픈 소스 코드는 https://github.com/ultralytics/yolov5 (공식 소스 코드 웨어하우스)에서 찾을 수 있습니다.

        자동화된 새 식별은 사람들이 지리적 영역에서 특정 새의 수와 활동을 보다 쉽게 ​​이해할 수 있도록 도울 수 있습니다.현재 인터넷에서 새 탐지 및 식별 응용 프로그램이 거의 없으며 참조할 수 있는 예가 거의 없습니다. 하나는 그것을 표시할 수 있는 완전한 소프트웨어로 개발했습니다. 사진, 비디오 파일 및 실시간 감지를 선택하는 데 편리하지 않습니다. 이에 여기 블로거는 Caltech-UCSD Birds-200-2011 Dataset을 사용하여 YOLOv5 모델을 훈련시키고, 블로거와 동일한 심플한 스타일을 유지하면서 자체 디자인한 UI 인터페이스를 제공하고 기능도 제공합니다. 사진, 동영상 및 카메라 인식 및 감지, 모델 전환, 결과 저장 등 초기 인터페이스는 다음과 같습니다.

여기에 이미지 설명 삽입

        새 유형을 감지할 때 인터페이스의 스크린샷(확대하려면 그림을 클릭)은 다음과 같으며 화면에서 여러 새 유형을 식별할 수 있으며 카메라 또는 비디오 감지를 활성화할 수도 있습니다.

여기에 이미지 설명 삽입

         자세한 기능 시연 효과는 블로거의 B 스테이션 영상이나 다음 섹션의 애니메이션 시연을 참고해주세요~ 좋다고 생각하는 친구들은 좋아요, 팔로우, 북마크 부탁드립니다! 시스템 UI 인터페이스의 디자인 작업량은 비교적 크고 인터페이스 미화는 신중하게 제작해야 합니다.제안이나 의견이 있으면 아래에 의견을 말하고 교환할 수 있습니다.


1. 효과 시연

        새 감지 및 인식 시스템은 주로 야생 또는 일상 생활 장면에서 새 이미지를 인식하는 데 사용되며 이미지에서 새 대상의 범주, 위치, 번호, 신뢰도 등을 표시합니다. 사진에서 읽을 수 있는 이미지 카메라에 실시간으로 촬영된 영상에서 새를 식별하고 알고리즘 모델을 대체할 수 있으며 시스템 인터페이스에는 사용자 등록 및 로그인 기능이 포함되어 사용자가 관리하고 사용하기 편리하며 인식 결과 실시간으로 결과가 표시되며 하나하나 표시 및 표시가 가능하며, 데이터 표시 화면 표시창은 확대/축소, 드래그, 자체적응이 가능하며 버튼을 클릭하면 결과를 저장할 수 있습니다. , 후속 참조 및 사용에 편리합니다.

        소프트웨어가 사용하기 쉬운지 아닌지는 외관이 매우 중요합니다 먼저 애니메이션을 통한 조류인식의 효과를 살펴보겠습니다 시스템의 주요 기능은 사진, 비디오 및 카메라 이미지에서 새를 인식하는 것입니다. 탐지 결과는 인터페이스와 이미지에서 시각화되며, 모델 전환, 단일 대상 선택 등의 기능이 제공되며 데모 효과는 다음과 같습니다.

(1) 사용자 등록 및 로그인 인터페이스

        여기에서 계정과 암호를 등록한 다음 로그인할 수 있는 로그인 인터페이스가 설계되었습니다. 인터페이스는 여전히 현재 유행하는 UI 디자인을 참고하고 있으며, 왼쪽은 동영상, 오른쪽은 계좌번호, 비밀번호, 인증코드 등을 입력합니다.

여기에 이미지 설명 삽입

(2) 새 그림 인식 선택

        시스템에서 식별할 그림 파일을 선택할 수 있습니다.그림 선택 버튼 아이콘을 클릭하여 그림을 선택하면 모든 새 식별 결과가 표시됩니다.드롭 다운 상자를 통해 단일 새의 결과를 볼 수 있습니다. 이 기능의 인터페이스 표시는 아래 그림과 같습니다.

여기에 이미지 설명 삽입

(3) 비디오 인식 효과 표시

        비디오에서 새의 종을 식별해야 하는 경우가 많습니다. 여기 비디오 선택 기능이 있습니다. 비디오 버튼을 클릭하여 감지할 비디오를 선택하면 시스템이 자동으로 비디오를 분석하여 프레임별로 새를 식별하고 다음 그림과 같이 화면에 결과를 표시합니다.

여기에 이미지 설명 삽입

(4) 카메라 감지 효과 표시

        실제 장면에서는 장치 카메라를 사용하여 실시간 이미지를 얻는 경우가 많으며 동시에 이미지에서 새를 식별해야 하므로 이 문서에서는 이 기능을 고려합니다. 아래 그림과 같이 카메라 버튼을 클릭하면 시스템이 준비 상태로 들어가고, 시스템은 실시간 사진을 보여주고 사진 속 새를 감지하기 시작하며, 인식 결과는 아래 그림과 같이 표시됩니다. :

여기에 이미지 설명 삽입
(5) 조류 감지 모델 전환

        훈련된 탐지 모델을 선택하고 최적화된 모델을 탐지에 사용할 수 있으며 일반적으로 YOLOv5의 사전 훈련된 모델에 적용할 수 있습니다. 여기에서 서로 다른 모델 사이를 자유롭게 전환하여 서로 다른 감지 효과를 비교할 수 있습니다.

여기에 이미지 설명 삽입


2. 조류 데이터 세트 및 훈련

        여기서 사용하는 조류 인식 데이터셋은 Caltech-UCSD Birds-200-2011 Dataset 입니다.CUB 데이터셋에는 총 200개의 카테고리와 총 11,788개의 사진이 있습니다.각 사진에는 카테고리가 포함되어 있습니다.레이블 외에도 표시된 개체 프레임(경계 상자), 키 포인트 및 기타 속성은 더 세분화된 새 이미지 데이터 세트에 속합니다.

여기에 이미지 설명 삽입
        CUB 데이터 세트의 각 종은 Wikipedia 기사와 연관되어 있으며 과학적 분류(목, 과, 속, 종)로 구성되어 있으며, 200개의 새 하위 범주를 포함하며 훈련 데이터 세트에 5994개의 이미지가 있고 테스트 세트 이미지에 5794개가 있습니다. 각각의 이미지는 이미지 태그 정보, 이미지 속 새의 바운딩 박스, 새의 주요 부위 정보, 새의 속성 정보를 제공하며, CUB 데이터를 다운받아 압축을 풀면 아래와 같은 폴더가 나옵니다.

여기에 이미지 설명 삽입
        CUB 데이터셋의 주석 파일이 YOLO 형식과 일치하지 않기 때문에 여기서는 CUB 데이터셋에서 범주를 선택하고 YOLO 형식으로 변환합니다. 레이블 형식 변환 코드는 블로그: CUB_200_2011 데이터 세트를 Yolo 형식으로 참조 하고 마지막으로 데이터 세트 파일을 YOLO 형식으로 가져오고 모델 교육을 수행합니다.

        모델을 훈련시키기 전에 YOLO에서 우리의 데이터를 찾기 위해서는 data.yaml 파일을 작성하여 케이스 디렉토리에 저장하고 데이터의 경로와 모델이 인식할 태그 카테고리를 기록해야 합니다. 파일의 내용은 다음과 같습니다. YOLO는 디렉토리에서 data.yaml 파일을 읽은 다음 훈련 및 검증을 위해 데이터를 읽기 위해 데이터 세트가 저장된 위치를 찾습니다.

train: F:\BlogCode\BirdDet\Bird\train.txt # 训练集
val: F:\BlogCode\BirdDet\Bird\test.txt    # 验证集
nc: 36   # 训练的类别
names: ['Acadian_Flycatcher','American_Crow','American_Goldfinch','American_Pipit',
'American_Redstart','American_Three_toed_Woodpecker','Anna_Hummingbird','Artic_Tern','Baird_Sparrow','Baltimore_Oriole',
'Bank_Swallow','Barn_Swallow','Bay_breasted_Warbler','Belted_Kingfisher',
'Bewick_Wren','Black_Tern','Black_and_white_Warbler','Black_billed_Cuckoo','Black_capped_Vireo','Black_footed_Albatross','Black_throated_Blue_Warbler',
'Black_throated_Sparrow','Blue_Grosbeak','Blue_Jay','Blue_headed_Vireo','Blue_winged_Warbler','Boat_tailed_Grackle',
'Bobolink','Bohemian_Waxwing','Brandt_Cormorant','Brewer_Blackbird','Brewer_Sparrow','Bronzed_Cowbird',
'Brown_Creeper','Brown_Pelican','Brown_Thrasher']

        학습 모델은 모델 폴더 아래 train.py를 호출하여 수행되며, -batch 매개변수와 -epochs 매개변수를 통해 학습 배치 크기와 학습 라운드 수를 조정할 수 있습니다. YOLOv5는 COCO 데이터셋에 사전 훈련된 매개변수를 제공합니다. 마이그레이션 학습을 위해 –weights yolov5s.pt 매개변수를 통해 사전 훈련된 매개변수를 로드하거나 대규모 데이터세트(예: COCO)를 훈련할 때 빈 –weights ''를 사용할 수 있습니다. 매개변수는 처음부터 학습됩니다. 그런 다음 다양한 매개 변수를 설정하면 코드는 다음과 같습니다.

parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+', type=str, default='./weights/best.pt',
                    help='model.pt path(s)')  # 模型路径仅支持.pt文件
parser.add_argument('--img-size', type=int, default=480, help='inference size (pixels)')  # 检测图像大小,仅支持480
parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')  # 置信度阈值
parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')  # NMS阈值
# 选中运行机器的GPU或者cpu,有GPU则GPU,没有则cpu,若想仅使用cpu,可以填cpu即可
parser.add_argument('--device', default='',
                    help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--save-dir', type=str, default='inference', help='directory to save results')  # 文件保存路径
parser.add_argument('--classes', nargs='+', type=int,
                    help='filter by class: --class 0, or --class 0 2 3')  # 分开类别
parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')  # 使用NMS
opt = parser.parse_args()  # opt局部变量,重要
out, weight, imgsz = opt.save_dir, opt.weights, opt.img_size  # 得到文件保存路径,文件权重路径,图像尺寸
device = select_device(opt.device)  # 检验计算单元,gpu还是cpu
half = device.type != 'cpu'  # 如果使用gpu则进行半精度推理

model = attempt_load(weight, map_location=device)  # 读取模型

        터미널에 다음 명령을 입력하여 훈련할 수 있으며 물론 train.py를 직접 클릭하여 실행할 수도 있습니다.

python train.py --batch 32 --epochs 300 --data data.yaml --weights yolov5s.pt --hyp data/hyps/hyp.scratch-med.yaml --cache

        딥 러닝에서는 일반적으로 손실 함수 감소 곡선을 통해 모델 훈련 상황을 관찰합니다. YOLOv5 훈련은 주로 직사각형 상자 손실(box_loss), 신뢰 손실(obj_loss) 및 분류 손실(cls_loss)의 세 가지 손실 측면을 포함합니다.훈련이 끝나면 로그 디렉토리에서 일부 훈련 프로세스를 찾을 수도 있습니다.요약 그래프. 아래 그림은 새 인식을 훈련하는 블로거를 위한 모델 훈련 곡선을 보여줍니다.

여기에 이미지 설명 삽입
        학습 과정에서 흔히 사용되는 표적 탐지 평가 지표인 mAP50은 빠르게 높은 수준에 도달했고, mAP50:95도 학습 과정에서 지속적으로 개선되어 우리 모델이 학습-검증 관점에서 잘 수행되었음을 나타냅니다. 예측을 위해 테스트 폴더를 읽어와 훈련을 통해 얻은 검증 세트에 가장 좋은 영향을 미치는 가중치 best.pt를 선택하여 실험을 수행하고 아래 그림과 같은 PR 곡선을 얻습니다.

여기에 이미지 설명 삽입


3. 조류 감지 및 식별

        학습이 완료되면 최적의 모델을 얻고 다음으로 예측을 위해 프레임 이미지를 네트워크에 입력하여 예측 결과를 얻습니다. 예측 방법(predict.py) 부분의 코드는 다음과 같습니다.

def predict(img):
    img = torch.from_numpy(img).to(device)
    img = img.half() if half else img.float()
    img /= 255.0
    if img.ndimension() == 3:
        img = img.unsqueeze(0)

    t1 = time_synchronized()
    pred = model(img, augment=False)[0]
    pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes,
                               agnostic=opt.agnostic_nms)
    t2 = time_synchronized()
    InferNms = round((t2 - t1), 2)

    return pred, InferNms

        예측 결과를 얻은 후 프레임 이미지에서 새의 프레임을 만든 다음 그림에서 opencv 그리기 작업을 사용하여 새의 범주와 새의 예측 점수를 출력할 수 있습니다. 다음은 새 그림을 읽고 감지하기 위한 스크립트로, 먼저 그림 데이터를 전처리하여 감지를 위한 예측으로 전송한 다음 마킹된 프레임의 위치를 ​​계산하여 그림에 마킹합니다.

if __name__ == '__main__':
    img_path = "./UI_rec/test_/Bobolink_0079_10736.jpg"
    image = cv_imread(img_path)
    img0 = image.copy()
    img = letterbox(img0, new_shape=imgsz)[0]
    img = np.stack(img, 0)
    img = img[:, :, ::-1].transpose(2, 0, 1)  # BGR to RGB, to 3x416x416
    img = np.ascontiguousarray(img)

    pred, useTime = predict(img)

    det = pred[0]
    p, s, im0 = None, '', img0
    if det is not None and len(det):  # 如果有检测信息则进入
        det[:, :4] = scale_coords(img.shape[1:], det[:, :4], im0.shape).round()  # 把图像缩放至im0的尺寸
        number_i = 0  # 类别预编号
        detInfo = []
        for *xyxy, conf, cls in reversed(det):  # 遍历检测信息
            c1, c2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3]))
            # 将检测信息添加到字典中
            detInfo.append([names[int(cls)], [c1[0], c1[1], c2[0], c2[1]], '%.2f' % conf])
            number_i += 1  # 编号数+1

            label = '%s %.2f' % (names[int(cls)], conf)

            # 画出检测到的目标物
            plot_one_box(image, xyxy, label=label, color=colors[int(cls)])
    # 实时显示检测画面
    cv2.imshow('Stream', image)
    # if cv2.waitKey(1) & 0xFF == ord('q'):
    #     break
    c = cv2.waitKey(0) & 0xff

        실행 결과는 아래 그림과 같이 새의 종과 신뢰도 값이 그림에 표시되어 있으며 예측 속도가 빠릅니다. 이 모델을 기반으로 인터페이스가 있는 시스템으로 설계하고 인터페이스에서 사진, 비디오 또는 카메라를 선택한 다음 탐지를 위해 모델을 호출할 수 있습니다.

여기에 이미지 설명 삽입
        블로거는 전체 시스템에 대한 자세한 테스트를 수행하고 마침내 블로그 게시물의 데모 부분, 완전한 UI 인터페이스, 테스트 사진 비디오, 코드 파일 및 Python 오프라인 표시인 부드럽고 상쾌한 인터페이스가 있는 버전을 개발했습니다. 종속성 패키지(설치 및 실행이 쉬울 뿐만 아니라 환경을 직접 구성할 수도 있음)가 모두 패키징 및 업로드되었으며 관심 있는 친구들은 다운로드 링크를 통해 다운로드할 수 있습니다.

여기에 이미지 설명 삽입


다운로드 링크

블로그 게시물에 포함된 완전하고 완전한 프로그램 파일(아래 그림과 같은 테스트 사진, 동영상, py, UI 파일 등         포함)을 얻으려면 패키징하여 블로거의 Bread Multi에 업로드했습니다. -플랫폼. 참조를 위해 블로그 및 비디오를 참조하십시오. 관련된 모든 파일을 동시에 패키징하고 클릭하여 실행하십시오. 전체 파일의 스크린샷은 다음과 같습니다.

여기에 이미지 설명 삽입

    폴더 아래의 리소스는 Python의 오프라인 종속성 패키지를 포함하여 다음과 같이 표시됩니다.독자는 Anaconda 및 Pycharm 소프트웨어를 올바르게 설치한 후 설치할 수 있습니다.자세한 데모는 내 B 스테이션 비디오에서도 볼 수 있습니다.

여기에 이미지 설명 삽입

참고 : 이 코드는 Pycharm+Python3.8로 개발되었으며 테스트 후 성공적으로 실행될 수 있습니다.실행 인터페이스의 주요 프로그램은 runMain.py 및 LoginUI.py입니다.테스트 그림 스크립트는 testPicture.py를 실행할 수 있으며 테스트 비디오 스크립트는 testVideo.py를 실행할 수 있습니다. 프로그램이 원활하게 실행되도록 하려면 requirements.txt에 따라 Python 종속성 패키지의 버전을 구성하십시오. Python 버전: 3.8 , 다른 버전을 사용하지 마십시오. 자세한 내용은 requirements.txt 파일을 참조하십시오. 프로젝트의 전체 파일을 다운로드하십시오. 참조 블로그 또는 참조 비디오를 참조하십시오 : ➷➷➷

참조 블로그 게시물: https://zhuanlan.zhihu.com/p/612187570

참조 비디오 데모: https://www.bilibili.com/video/BV1QL411C783/

오프라인 종속성 라이브러리 다운로드 링크 : https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n (추출 코드: oy4n)


결론

        블로거의 제한된 능력으로 인해 블로그 게시물에 언급된 방법이 테스트되었다고 하더라도 누락이 있을 수밖에 없습니다. 다음 개정판이 보다 완벽하고 엄밀하게 여러분께 선보일 수 있도록 잘못된 점은 적극적으로 지적해 주시기 바랍니다. 동시에 이를 달성할 수 있는 더 좋은 방법이 있으면 알려주십시오.

Supongo que te gusta

Origin blog.csdn.net/qq_32892383/article/details/129326740
Recomendado
Clasificación