セキュリティは常に最重要事項です。セキュリティ インシデントを早期に検出し、早期に阻止できれば、結果はまったく異なるものになる可能性があります。この記事の中心的な目的は非常に単純です。次のような危険なオブジェクトの検出モデルを構築しようとすることです。ターゲット検出モデルに基づいて銃やナイフとして識別システムは、人工知能の手段に基づいて犯罪と戦うことを望んでいます。レンダリングを見てください。
この種のシーンは比較的機密性が高いため、モデルを開発するために実際に自分でデータセットを収集するのは基本的に困難であるため、ここでのデータのほとんどは主に実用的な分析と使用のために Huchao.com から取得しています。データセットは次のとおりです。
VOC 形式のアノテーション ファイルは次のとおりです。
アノテーションの例の内容は次のとおりです。
<annotation>
<folder>DATASET</folder>
<filename>images/0a53eb41-a382-4463-ad29-3e63bef6420d.jpg</filename>
<source>
<database>The DATASET Database</database>
<annotation>DATASET</annotation>
<image>DATASET</image>
</source>
<owner>
<name>YMGZS</name>
</owner>
<size>
<width>416</width>
<height>416</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>pistol</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>3</xmin>
<ymin>7</ymin>
<xmax>403</xmax>
<ymax>395</ymax>
</bndbox>
</object>
</annotation>
YOLO形式のアノテーションファイルは以下のとおりです。
アノテーションの例の内容は次のとおりです。
1 0.546875 0.492788 0.122596 0.466346
コアのトレーニング構成は次のようになります。
def parse_opt(known=False):
parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='weights/yolov5n.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default='models/yolov5n.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default='data/self.yaml', help='dataset.yaml path')
parser.add_argument('--hyp', type=str, default='data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')
parser.add_argument('--epochs', type=int, default=100, help='total training epochs')
parser.add_argument('--batch-size', type=int, default=8, help='total batch size for all GPUs, -1 for autobatch')
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=416, help='train, val image size (pixels)')
parser.add_argument('--rect', action='store_true', help='rectangular training')
parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
parser.add_argument('--noval', action='store_true', help='only validate final epoch')
parser.add_argument('--noautoanchor', action='store_true', help='disable AutoAnchor')
parser.add_argument('--noplots', action='store_true', help='save no plot files')
parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')
parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')
parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')
parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
parser.add_argument('--workers', type=int, default=0, help='max dataloader workers (per RANK in DDP mode)')
parser.add_argument('--project', default='runs/train', help='save to project/name')
parser.add_argument('--name', default='yolov5n', help='save to project/name')
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
parser.add_argument('--quad', action='store_true', help='quad dataloader')
parser.add_argument('--cos-lr', action='store_true', help='cosine LR scheduler')
parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')
parser.add_argument('--freeze', nargs='+', type=int, default=[0], help='Freeze layers: backbone=10, first3=0 1 2')
parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')
parser.add_argument('--seed', type=int, default=0, help='Global training seed')
parser.add_argument('--local_rank', type=int, default=-1, help='Automatic DDP Multi-GPU argument, do not modify')
ここでは n シリーズ モデルを使用しています。画像サイズは 416x416 で、デフォルトでは 100 エポックの反復計算が実行されます。
結果の詳細は次のとおりです。
F1 値と PR カーブは次のとおりです。
適合率と再現率の曲線は次のとおりです。
トレーニング全体の視覚化は次のとおりです。
バッチ計算例は以下のとおりです。
興味があれば試してみてください。
混同行列は次のとおりです。
データの視覚化は次のとおりです。