# [Yolov3](https://pjreddie.com/media/files/papers/YOLOv3.pdf) YoloはYou Look Only Onceの略。一度しか画像見なくていいよと言っていて、単一モデルで検出できることを表しています。 Yolov3はSSDと同じくらいの精度で速度は3倍早いです。 著者はTwitterやGANを触っていたため、あまり研究が進んでいなかったそうで、本人曰く、v2からすごく進化しているわけではなく、小さな改善の積み重ねだそう(十分すごい進化に感じてしまうが。。) 下記はYolov3の性能グラフ ![](https://i.imgur.com/2C8KWE9.png =400x) ## モデル構造 * 106層の畳み込み層(ダウンスケール->アップスケール) * 3つの異なるスケールで検出(82層、94層、106層)を行うことによって、細かい物体も検出できるようになった。 * 特徴的なスキップ構造。最初の方のfeaturemapから画像の細かい情報を取得できる。 例) 入力画像 416 x 416の場合: 検出器1(feature size):13 x 13 検出器2(feature size):26 x 26 検出器3(feature size):52 x 52 13x13が大きなオブジェクト検出を担当し、52x52が小さなオブジェクト検出を担当する。 ![](https://i.imgur.com/RpxTaSF.png) ## 検出概要 ![](https://i.imgur.com/50VrGLt.png) Bはfeatureマップ上のセルが予測できるboundingboxの数:各検出器あたり3 ![](https://i.imgur.com/auVIxtC.png =300x) ## AnchorBox Yolov3は各検出器のセルあたり3つのアンカーボックスを使用する。このAnchorboxは事前に生成する必要があります。 なので、予測する総BoundingBox数は ``` (13 x 13 + 26 x 26 + 52 x 52) * 3 ``` この検出結果から最もらしいBoundingBoxを取り出す方法として、Non-maximum Suppressionを利用しています。 ## 損失関数 ref:[Pytorch-Yolov2](https://github.com/eriklindernoren/PyTorch-YOLOv3) ```python # Loss : Mask outputs to ignore non-existing objects (except with conf. loss) loss_x = self.mse_loss(x[obj_mask], tx[obj_mask]) loss_y = self.mse_loss(y[obj_mask], ty[obj_mask]) loss_w = self.mse_loss(w[obj_mask], tw[obj_mask]) loss_h = self.mse_loss(h[obj_mask], th[obj_mask]) loss_conf_obj = self.bce_loss(pred_conf[obj_mask], tconf[obj_mask]) loss_conf_noobj = self.bce_loss(pred_conf[noobj_mask], tconf[noobj_mask]) loss_conf = self.obj_scale * loss_conf_obj + self.noobj_scale * loss_conf_noobj loss_cls = self.bce_loss(pred_cls[obj_mask], tcls[obj_mask]) total_loss = loss_x + loss_y + loss_w + loss_h + loss_conf + loss_cls ``` [link](https://github.com/eriklindernoren/PyTorch-YOLOv3/blob/47b7c912877ca69db35b8af3a38d6522681b3bb3/models.py#L191) ## Softmaxを使用しない(マルチラベル対応) Softmaxは各ラベルが排他である前提となっています。 つまりオブジェクトが1つのクラスに属している場合、そのオブジェクトは他のクラスに属することができない。 例えばクラスにPerson, Womanのような要素がある場合に対応できます。