ディープラーニングに基づく鳥の検出および認識システム (UI インターフェイス、Python コードを含む)

ここに画像の説明を挿入

要約: 鳥認識はディープラーニングやマシンビジョンの分野で人気のあるアプリケーションです. この記事では YOLOv5 に基づく鳥の検出および認識システムを詳しく紹介します. アルゴリズムの原理を紹介しながら, Py thの実装コードも示します. o nおよびPy th o n QtUI インターフェイス。インターフェイスでは、さまざまな鳥の写真、ビデオを選択し、検出と認識のためにカメラをオンにすることができます; UIインターフェイスを介してファイルを選択し、マーク認識ターゲットを切り替え、モデルの切り替えをサポートし、ユーザーが登録インターフェイス; YOLOv5 モデル トレーニングの実装に基づいて、トレーニング データ セットとトレーニング コードを提供し、検出速度が速く、認識精度が高く、さらに、トレーニング可能なコードとデータ セットも提供されます。このブログ投稿では、Python コードの紹介とその使用方法に関するチュートリアルが提供されており、初心者が参照するのに適しています. 完全なコード リソース ファイルについては、記事の最後にあるダウンロード リンクにアクセスしてください. このブログ投稿のカタログは次のとおりです。

➷記事の最後にある、関連するすべての完全なコード ファイルのダウンロード ページにジャンプするには、クリックしてください☇

コードの紹介とデモ ビデオのリンク: https://www.bilibili.com/video/BV1QL411C783/ (更新中です。ブロガーの B ステーション ビデオをフォローしてください)


序文

        地域の生物多様性と生態環境の重要な指標として、「鳥の数と分布」は、自然保護区、湿地公園、動物保護監督部門などの機関によってますます注目されています。種、数、分布など、様々な地域で正規化された作品となっています。この記事では、YOLOv5 ターゲット検出アルゴリズムを使用します。これは、鳥の監視と認識のための AI 技術サポートを提供し、監視と認識の効率を向上させ、純粋な手動監視によって引き起こされる非効率性とエラーを解決し、鳥の保護と繁殖のためのより優れたデータ サポートを提供します。 .

        鳥の監視と識別は非常に複雑である 鳥の飛行経路、着陸地点、時間が不確実 監視地域は多様であり(森林、湿地、湖、草原など)、非常に似た習性を持つ鳥もいる形、色、これらの要因により、鳥の監視および識別技術に対する要件は非常に高くなります。従来のマシン ビジョン アルゴリズムでは、鳥の種類と場所を正確かつ迅速に特定することは困難でした.近年、機械学習とディープラーニングが大きく進歩しました.従来の方法と比較して、ディープラーニング法は検出精度と速度の点で優れています. . 性能の YOLOv5 は、単一段階のターゲット検出アルゴリズム YOLO の第 5 世代です. 実験によると、速度と精度の点で大幅に改善されています. その論文については、TPH-YOLOv5: Transformer Prediction Head に基づく改善された YOLOv5 を参照してくださいオブジェクトの検出 ドローンでキャプチャされたシナリオでは、オープン ソース コードはhttps://github.com/ultralytics/yolov5 (公式ソース コード ウェアハウス)にあります。

        自動化された鳥の識別は、人々が地理的領域内の特定の鳥の数と活動をより簡単に理解するのに役立ちます.現在、インターネット上での鳥の検出と識別のアプリケーションはほとんどなく、参照できる例も多くありません.ほとんどない表示できる完全なソフトウェアは、写真、ビデオファイル、およびリアルタイム検出の選択には便利ではありません。この点に関して、ここのブロガーはCaltech-UCSD Birds-200-2011 データセットを使用して YOLOv5 モデルをトレーニングし、ブロガーと同じシンプルなスタイルを維持しながら自己設計の UI インターフェイスを提供し、機能も利用可能です。写真、ビデオ、カメラの認識と検出、モデルの切り替え、結果の保存など. 気に入っていただけると幸いです. 初期インターフェースは次のとおりです:

ここに画像の説明を挿入

        鳥の種類を検出するときのインターフェイスのスクリーンショット (画像をクリックして拡大) は以下のとおりです。これにより、画面内の複数の鳥の種類を識別でき、カメラまたはビデオの検出も有効にすることができます。

ここに画像の説明を挿入

         詳しい機能デモ効果はブロガーのBステーション動画か次項のアニメデモを参考に いいなと思った友達はいいね、フォロー、ブックマークお願いします!システム UI インターフェースの設計負荷は比較的大きく、インターフェースの美化は慎重に作成する必要があります. 提案や意見がある場合は、以下にコメントして交換することができます.


1.効果のデモンストレーション

        鳥の検出と認識システムは、主に野生や日常生活のシーンでの鳥の画像の認識に使用され、画像内の鳥のターゲットのカテゴリ、位置、数、信頼度などを表示し、画像から読み取ることができる画像です。およびビデオファイル、または鳥は、カメラでキャプチャされたリアルタイム画像から識別され、アルゴリズムモデルを置き換えることができます;システムインターフェイスには、ユーザーが管理および使用するのに便利なユーザー登録およびログイン機能が含まれています;認識結果視覚化され、結果はリアルタイムで表示され、マークを付けて 1 つずつ表示できます. データ表示; 画面表示ウィンドウはズーム、ドラッグ、および自己適応が可能で、ボタンをクリックして結果を保存できます。 、後で参照して使用するのに便利です。

        使いやすいかどうかはともかく、見た目も大事です.まずはアニメーションで鳥認識の効果を見てみましょう.システムの主な機能は、写真、ビデオ、カメラ画像から鳥を認識することです.検出結果はインターフェースや画像で可視化され、モデル切り替えや単一ターゲット選択などの機能が提供されており、デモ効果は次のとおりです。

(1) ユーザー登録・ログイン画面

        ここでは、アカウントとパスワードを登録してログインできるログイン インターフェイスが設計されています。インターフェイスは現在人気のあるUIデザインを踏襲しており、左側は動画で、右側はアカウント番号、パスワード、認証コードなどを入力します。

ここに画像の説明を挿入

(2) 鳥画像認識を選択

        システムでは、識別用の画像ファイルを選択できます。画像選択ボタン アイコンをクリックして画像を選択すると、すべての鳥の識別結果が表示されます。1 羽の鳥の識別結果は、ドロップダウン ボックスで確認できます。この機能のインターフェース表示を下図に示します。

ここに画像の説明を挿入

(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 dataset to Yolo format」を参考に、最後に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 provides pre-trained parameters on the COCO dataset. 移行学習用のパラメーター –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 トレーニングには、主に損失の 3 つの側面が含まれます: 長方形ボックス損失 (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 にアップロードされています。 -platform. 参照用のブログとビデオを参照してください. 関連するすべてのファイルを同時にパッケージ化し、クリックして実行します. 完全なファイルのスクリーンショットは次のとおりです:

ここに画像の説明を挿入

    フォルダーの下のリソースは次のように表示されます, これには 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)


結論

        ブロガーの能力には限りがあるため、ブログ投稿に記載されている方法をテストしたとしても、抜けがあることは避けられません。次の改訂版がより完璧で厳密な方法ですべての人に提示できるように、間違いを熱心に指摘していただければ幸いです。同時に、それを達成するためのより良い方法があれば教えてください。

おすすめ

転載: blog.csdn.net/qq_32892383/article/details/129326740