Système de détection et de reconnaissance des oiseaux basé sur l'apprentissage en profondeur (y compris l'interface utilisateur, le code Python)

insérez la description de l'image ici

Résumé : La reconnaissance des oiseaux est une application populaire dans le domaine de l'apprentissage en profondeur et de la vision artificielle. Cet article présente en détail le système de détection et de reconnaissance des oiseaux basé sur YOLOv5. Tout en introduisant le principe de l'algorithme, il donne également le code d'implémentation de Py th o n et l'interface utilisateur de Py th o n Qt . Dans l'interface, vous pouvez sélectionner diverses images d'oiseaux, vidéos et allumer l'appareil photo pour la détection et la reconnaissance ; vous pouvez sélectionner des fichiers via l'interface utilisateur, changer la cible de reconnaissance de marque, prendre en charge le changement de modèle et aider les utilisateurs à se connecter à l'interface utilisateur. interface d'enregistrement ; basé sur la mise en œuvre de la formation du modèle YOLOv5, fournissant un ensemble de données de formation et un code de formation, avec une vitesse de détection rapide et une précision de reconnaissance élevée ; en outre, un code et un ensemble de données pouvant être formés sont également fournis. Le billet de blog donne une introduction au code Python et un tutoriel sur la façon de l'utiliser, qui convient aux débutants. Pour le fichier de ressources de code complet, veuillez vous rendre sur le lien de téléchargement à la fin de l'article. Le catalogue de cet article de blog est le suivant :

➷Cliquez pour accéder à la page de téléchargement de tous les fichiers de code complets impliqués à la fin de l'article☇

Lien vidéo d'introduction et de démonstration du code : https://www.bilibili.com/video/BV1QL411C783/ (Il est en cours de mise à jour, bienvenue pour suivre la vidéo de la station B du blogueur)


avant-propos

        En tant qu'indicateur important de la biodiversité et de l'environnement écologique d'une région, "le nombre et la répartition des oiseaux" sont de plus en plus pris en compte par les organismes tels que les réserves naturelles, les parcs des zones humides et les services de surveillance de la protection des animaux. espèces, nombre et distribution, Il est devenu un travail normalisé dans diverses régions. Cet article utilise l'algorithme de détection de cible YOLOv5, qui peut fournir un support technique d'IA pour la surveillance et la reconnaissance des oiseaux, améliorer l'efficacité de la surveillance et de la reconnaissance, résoudre l'inefficacité et les erreurs causées par la surveillance manuelle pure et fournir un meilleur support de données pour la protection et l'élevage des oiseaux. .

        La surveillance et l'identification des oiseaux sont d'une grande complexité. Les itinéraires de vol des oiseaux sont incertains, les points d'atterrissage sont incertains et le temps est incertain. Les zones de surveillance sont diverses (forêts, zones humides, lacs, prairies, etc.) et certains oiseaux ont des habitudes extrêmement similaires, formes et couleurs. , Ces facteurs rendent les exigences en matière de technologie de surveillance et d'identification des oiseaux extrêmement élevées. Les algorithmes traditionnels de vision artificielle sont difficiles à identifier précisément et rapidement les espèces et l'emplacement des oiseaux. Ces dernières années, l'apprentissage automatique et l'apprentissage en profondeur ont fait de grands progrès. Par rapport aux méthodes traditionnelles, les méthodes d'apprentissage en profondeur ont obtenu de meilleurs résultats en termes de précision et de vitesse de détection. . YOLOv5 est la cinquième génération de l'algorithme de détection de cible en une étape YOLO. Selon les expériences, il a été considérablement amélioré en termes de vitesse et de précision. Pour son article, veuillez vous référer à TPH-YOLOv5 : Amélioration de YOLOv5 basée sur la tête de prédiction de transformateur pour Détection d'objets Sur les scénarios capturés par drone , le code source ouvert peut être trouvé sur https://github.com/ultralytics/yolov5 (entrepôt de code source officiel).

        L'identification automatisée des oiseaux peut aider les gens à comprendre plus facilement le nombre et les activités d'oiseaux spécifiques dans une zone géographique. À l'heure actuelle, il existe peu d'applications de détection et d'identification des oiseaux sur Internet, et il n'y a pas beaucoup d'exemples qui peuvent être référencés. Presque aucun on l'a développé en un logiciel complet qui peut être affiché n'est pas pratique pour sélectionner des images, des fichiers vidéo et la détection en temps réel. À cet égard, le blogueur utilise ici l'ensemble de données Caltech-UCSD Birds-200-2011 pour former le modèle YOLOv5, et donne une interface utilisateur auto-conçue, en gardant le même style simple du blogueur, et la fonction est également disponible reconnaissance et détection d'images, de vidéos et d'appareils photo, changer de modèle, enregistrer les résultats, etc. J'espère que cela vous plaira. L'interface initiale est la suivante :

insérez la description de l'image ici

        La capture d'écran de l'interface lors de la détection du type d'oiseau (cliquez sur l'image pour l'agrandir) est comme indiqué ci-dessous, qui peut identifier plusieurs types d'oiseaux à l'écran, et peut également activer la détection par caméra ou vidéo :

insérez la description de l'image ici

         Pour l'effet détaillé de démonstration des fonctions, veuillez vous référer à la vidéo de la station B du blogueur ou à la démonstration d'animation dans la section suivante. Amis qui pensent que c'est bon, veuillez aimer, suivre et mettre en signet ! La charge de travail de conception de l'interface utilisateur du système est relativement importante et l'embellissement de l'interface doit être soigneusement conçu. Si vous avez des suggestions ou des opinions, vous pouvez les commenter et les échanger ci-dessous.


1. Démonstration d'effet

        Le système de détection et de reconnaissance d'oiseaux est principalement utilisé pour la reconnaissance d'images d'oiseaux dans la nature ou dans des scènes de la vie quotidienne, affichant la catégorie, la position, le nombre, la confiance, etc. des cibles d'oiseaux dans l'image ; images pouvant être lues à partir d'images et les fichiers vidéo, ou les oiseaux sont identifiés à partir des images en temps réel capturées par la caméra, et le modèle d'algorithme peut être remplacé ; l'interface du système comprend des fonctions d'enregistrement et de connexion de l'utilisateur, ce qui est pratique pour les utilisateurs à gérer et à utiliser ; les résultats de la reconnaissance sont visualisés, et les résultats sont affichés en temps réel et peuvent être marqués et affichés un par un. et affichage des données ; la fenêtre d'affichage de l'écran peut être agrandie, déplacée et auto-adaptée, et les résultats peuvent être enregistrés en cliquant sur le bouton , ce qui est pratique pour référence et utilisation ultérieures.

        Que le logiciel soit facile à utiliser ou non, l'apparence est très importante. Tout d'abord, examinons l'effet de la reconnaissance des oiseaux par le biais d'animations. La fonction principale du système est de reconnaître les oiseaux sur des photos, des vidéos et des images de caméra. Les résultats de détection sont visualisés dans l'interface et les images, des fonctions telles que la commutation de modèle et la sélection de cible unique sont fournies, et l'effet de démonstration est le suivant.

(1) Enregistrement de l'utilisateur et interface de connexion

        Une interface de connexion est conçue ici, où vous pouvez enregistrer un compte et un mot de passe, puis vous connecter. L'interface fait toujours référence à la conception d'interface utilisateur populaire actuelle. Le côté gauche est une image animée et le côté droit entre le numéro de compte, le mot de passe, le code de vérification, etc.

insérez la description de l'image ici

(2) Sélectionnez la reconnaissance d'image d'oiseau

        Le système vous permet de sélectionner un fichier image pour l'identification. Après avoir cliqué sur l'icône du bouton de sélection d'image pour sélectionner une image, tous les résultats d'identification des oiseaux seront affichés. Vous pouvez afficher les résultats d'un seul oiseau via la liste déroulante. L'affichage de l'interface de cette fonction est illustré dans la figure ci-dessous :

insérez la description de l'image ici

(3) Affichage de l'effet de reconnaissance vidéo

        Plusieurs fois, nous avons besoin d'identifier les espèces d'oiseaux dans une vidéo, voici une fonction de sélection vidéo. Cliquez sur le bouton vidéo pour sélectionner la vidéo à détecter, et le système analysera automatiquement la vidéo pour identifier les oiseaux image par image, et marquera les résultats sur l'écran, comme indiqué dans la figure suivante :

insérez la description de l'image ici

(4) Affichage de l'effet de détection de caméra

        Dans les scènes réelles, nous utilisons souvent la caméra de l'appareil pour obtenir des images en temps réel, et en même temps nous devons identifier les oiseaux dans les images, donc cet article prend cette fonction en considération. Comme le montre la figure ci-dessous, après avoir cliqué sur le bouton de la caméra, le système entre dans l'état prêt, le système affiche l'image en temps réel et commence à détecter l'oiseau dans l'image, et le résultat de la reconnaissance est affiché comme indiqué dans la figure ci-dessous :

insérez la description de l'image ici
(5) Changez le modèle de détection d'oiseau

        Le modèle de détection formé peut être sélectionné et le modèle optimisé peut être utilisé pour la détection, ce qui est généralement applicable au modèle pré-formé de YOLOv5. Ici, vous pouvez librement basculer entre différents modèles pour comparer différents effets de détection.

insérez la description de l'image ici


2. Ensemble de données sur les oiseaux et formation

        L'ensemble de données de reconnaissance des oiseaux que nous utilisons ici est l'ensemble de données Caltech-UCSD Birds-200-2011 . L'ensemble de données CUB a un total de 200 catégories et un total de 11 788 images. Chaque image comprend des catégories En plus de l'étiquette, il y a aussi une marque cadre d'objet (boîte englobante), points clés et certains autres attributs, qui appartiennent à un ensemble de données d'images d'oiseaux avec une granularité plus élevée.

insérez la description de l'image ici
        Chaque espèce du jeu de données CUB est associée à un article Wikipédia et organisée par classification scientifique (ordre, famille, genre, espèce), contenant 200 sous-catégories d'oiseaux, avec 5994 images dans le jeu de données d'entraînement et 5794 dans les images du jeu de test. Chaque image fournit les informations de balise d'image, la boîte englobante de l'oiseau dans l'image, les informations sur la partie clé de l'oiseau et les informations d'attribut de l'oiseau. Après avoir téléchargé les données CUB et les avoir décompressées, vous obtiendrez le dossier suivant

insérez la description de l'image ici
        Étant donné que le fichier d'annotation du jeu de données CUB est incompatible avec le format de YOLO, nous sélectionnons ici la catégorie dans le jeu de données CUB et la convertissons au format YOLO. Pour le code de conversion du format d'étiquette, veuillez vous référer au blog : ensemble de données CUB_200_2011 au format Yolo , et enfin nous obtenons le fichier d'ensemble de données au format YOLO et effectuons la formation du modèle.

        Avant de former le modèle, pour que nos données soient trouvées par YOLO, nous devons écrire un fichier data.yaml et le stocker dans le répertoire de cas, et enregistrer le chemin des données et la catégorie de balise à reconnaître par le modèle Le contenu du fichier est le suivant. YOLO lit le fichier data.yaml dans le répertoire, puis trouve l'emplacement où notre ensemble de données est stocké pour lire les données à des fins de formation et de vérification.

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']

        Le modèle de formation est exécuté en appelant train.py sous le dossier du modèle, et la taille du lot de formation et le nombre de cycles de formation peuvent être ajustés via le paramètre –batch et le paramètre –epochs. YOLOv5 fournit des paramètres pré-formés sur l'ensemble de données COCO. Nous pouvons charger les paramètres pré-formés via le paramètre -weights yolov5s.pt pour l'apprentissage de la migration, ou utiliser un vide -weights '' lors de la formation d'un grand ensemble de données (tel que COCO). les paramètres sont formés à partir de zéro. Définissez ensuite divers paramètres, le code est le suivant :

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)  # 读取模型

        Nous pouvons entrer la commande suivante dans le terminal pour nous entraîner, bien sûr, nous pouvons également cliquer directement sur train.py pour exécuter.

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

        En apprentissage profond, nous observons généralement la situation d'entraînement du modèle à travers la courbe de déclin de la fonction de perte. La formation YOLOv5 comprend principalement trois aspects de la perte : perte de boîte rectangulaire (box_loss), perte de confiance (obj_loss) et perte de classification (cls_loss). Une fois la formation terminée, nous pouvons également trouver certains processus de formation dans le répertoire des journaux. graphique de synthèse. La figure ci-dessous montre la courbe d'entraînement du modèle pour la reconnaissance des oiseaux d'entraînement des blogueurs.

insérez la description de l'image ici
        Au cours de notre processus de formation, mAP50, en tant qu'indicateur d'évaluation de détection de cible couramment utilisé, a rapidement atteint un niveau élevé, et mAP50:95 a également continué à s'améliorer au cours du processus de formation, indiquant que notre modèle a bien fonctionné du point de vue de la formation-validation. Lisez dans un dossier de test pour la prédiction, sélectionnez le poids best.pt avec le meilleur effet sur l'ensemble de vérification obtenu grâce à la formation pour mener des expériences, et obtenez la courbe PR comme indiqué dans la figure ci-dessous.

insérez la description de l'image ici


3. Détection et identification des oiseaux

        Une fois la formation terminée, le meilleur modèle est obtenu. Ensuite, nous entrons l'image de trame dans le réseau pour la prédiction, afin d'obtenir le résultat de la prédiction. Le code de la partie méthode de prédiction (predict.py) est le suivant :

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

        Après avoir obtenu le résultat de la prédiction, nous pouvons encadrer l'oiseau dans l'image du cadre, puis utiliser l'opération de dessin opencv sur l'image pour afficher la catégorie de l'oiseau et le score de prédiction de l'oiseau. Voici un script pour lire et détecter une image d'oiseau. Tout d'abord, les données d'image sont prétraitées et envoyées pour prédire la détection, puis la position du cadre marqué est calculée et marquée dans l'image.

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

        Le résultat de l'exécution est illustré dans la figure ci-dessous. Les espèces et les valeurs de confiance des oiseaux sont indiquées sur la figure et la vitesse de prédiction est rapide. Sur la base de ce modèle, nous pouvons le concevoir comme un système avec une interface, sélectionner une image, une vidéo ou une caméra sur l'interface, puis appeler le modèle pour la détection.

insérez la description de l'image ici
        Le blogueur a effectué un test détaillé sur l'ensemble du système et a finalement développé une version avec une interface fluide et rafraîchissante, qui est l'affichage de la partie démo du billet de blog, une interface utilisateur complète, une vidéo d'image de test, des fichiers de code et Python hors ligne. package de dépendance (facile à installer et à exécuter, mais vous pouvez également configurer l'environnement par vous-même), qui ont tous été emballés et téléchargés, et les amis intéressés peuvent les obtenir via le lien de téléchargement.

insérez la description de l'image ici


lien de téléchargement

        Si vous souhaitez obtenir les fichiers de programme complets et complets impliqués dans l'article de blog (y compris les images de test, les vidéos, les fichiers py, l'interface utilisateur , etc., comme indiqué dans la figure ci-dessous), ils ont été emballés et téléchargés sur le Bread Multi du blogueur. -plate-forme. Consultez les blogs et les vidéos pour référence. Regroupez tous les fichiers concernés en même temps et cliquez pour exécuter. La capture d'écran du fichier complet est la suivante :

insérez la description de l'image ici

    Les ressources sous le dossier sont affichées comme suit, qui inclut le package de dépendance hors ligne de Python.Les lecteurs peuvent installer les logiciels Anaconda et Pycharm après les avoir installés correctement.La démonstration détaillée peut également être vue dans ma vidéo de la station B.

insérez la description de l'image ici

Remarque : Ce code est développé avec Pycharm+Python3.8, et il peut s'exécuter avec succès après le test. Les principaux programmes de l'interface en cours d'exécution sont runMain.py et LoginUI.py. Le script d'image de test peut exécuter testPicture.py, et le test le script vidéo peut exécuter testVideo.py. Pour garantir le bon fonctionnement du programme, veuillez configurer la version du package de dépendances Python en fonction de requirements.txt. Version Python : 3.8 , ne pas utiliser d'autres versions, voir le fichier requirements.txt pour plus de détails ; téléchargez le fichier complet du projet, veuillez vous référer au blog ou à la vidéo de référence : ➷➷➷

Article de blog de référence : https://zhuanlan.zhihu.com/p/612187570

Démonstration vidéo de référence : https://www.bilibili.com/video/BV1QL411C783/

Lien de téléchargement de la bibliothèque de dépendances hors ligne : https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n (code d'extraction : oy4n)


conclusion

        En raison de la capacité limitée du blogueur, même si la méthode mentionnée dans le billet de blog a été testée, il est inévitable qu'il y ait des omissions. J'espère que vous pourrez signaler les erreurs avec enthousiasme, afin que la prochaine révision puisse être présentée à tous d'une manière plus parfaite et plus rigoureuse. En même temps, s'il existe une meilleure façon d'y parvenir, veuillez me le faire savoir.

Je suppose que tu aimes

Origine blog.csdn.net/qq_32892383/article/details/129326740
conseillé
Classement