瀏覽代碼

Merge pull request #299 from PaddlePaddle/develop_tmp

YOLOv3兼容低版本Paddle
Jason 5 年之前
父節點
當前提交
dd754cebf2
共有 3 個文件被更改,包括 56 次插入23 次删除
  1. 4 0
      paddlex/cv/models/ppyolo.py
  2. 29 13
      paddlex/cv/nets/detection/loss/yolo_loss.py
  3. 23 10
      paddlex/cv/nets/detection/yolo_v3.py

+ 4 - 0
paddlex/cv/models/ppyolo.py

@@ -18,6 +18,7 @@ import tqdm
 import os.path as osp
 import numpy as np
 from multiprocessing.pool import ThreadPool
+import paddle
 import paddle.fluid as fluid
 from paddle.fluid.layers.learning_rate_scheduler import _decay_step_counter
 from paddle.fluid.optimizer import ExponentialMovingAverage
@@ -123,6 +124,9 @@ class PPYOLO(BaseAPI):
         self.use_ema = False
         self.with_dcn_v2 = with_dcn_v2
 
+        if paddle.__version__ < '1.8.4' and paddle.__version__ != '0.0.0':
+            raise Exception("PPYOLO requires paddlepaddle or paddlepaddle-gpu >= 1.8.4")
+
     def _get_backbone(self, backbone_name):
         if backbone_name.startswith('ResNet50_vd'):
             backbone = paddlex.cv.nets.ResNet(

+ 29 - 13
paddlex/cv/nets/detection/loss/yolo_loss.py

@@ -16,6 +16,7 @@ from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
+import paddle
 from paddle import fluid
 try:
     from collections.abc import Sequence
@@ -67,19 +68,34 @@ class YOLOv3Loss(object):
                 scale_x_y = self.scale_x_y if not isinstance(
                     self.scale_x_y, Sequence) else self.scale_x_y[i]
                 anchor_mask = anchor_masks[i]
-                loss = fluid.layers.yolov3_loss(
-                    x=output,
-                    gt_box=gt_box,
-                    gt_label=gt_label,
-                    gt_score=gt_score,
-                    anchors=anchors,
-                    anchor_mask=anchor_mask,
-                    class_num=num_classes,
-                    ignore_thresh=self._ignore_thresh,
-                    downsample_ratio=self.downsample[i],
-                    use_label_smooth=self._label_smooth,
-                    scale_x_y=scale_x_y,
-                    name=prefix_name + "yolo_loss" + str(i))
+                if paddle.__version__ < '1.8.4' and paddle.__version__ != '0.0.0':
+                    loss = fluid.layers.yolov3_loss(
+                        x=output,
+                        gt_box=gt_box,
+                        gt_label=gt_label,
+                        gt_score=gt_score,
+                        anchors=anchors,
+                        anchor_mask=anchor_mask,
+                        class_num=num_classes,
+                        ignore_thresh=self._ignore_thresh,
+                        downsample_ratio=self.downsample[i],
+                        use_label_smooth=self._label_smooth,
+                        name=prefix_name + "yolo_loss" + str(i))
+                else:
+                    loss = fluid.layers.yolov3_loss(
+                        x=output,
+                        gt_box=gt_box,
+                        gt_label=gt_label,
+                        gt_score=gt_score,
+                        anchors=anchors,
+                        anchor_mask=anchor_mask,
+                        class_num=num_classes,
+                        ignore_thresh=self._ignore_thresh,
+                        downsample_ratio=self.downsample[i],
+                        use_label_smooth=self._label_smooth,
+                        scale_x_y=scale_x_y,
+                        name=prefix_name + "yolo_loss" + str(i))
+
 
                 losses.append(fluid.layers.reduce_mean(loss))
 

+ 23 - 10
paddlex/cv/nets/detection/yolo_v3.py

@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import paddle
 from paddle import fluid
 from paddle.fluid.param_attr import ParamAttr
 from paddle.fluid.regularizer import L2Decay
@@ -407,16 +408,28 @@ class YOLOv3:
             scale_x_y = self.scale_x_y if not isinstance(
                 self.scale_x_y, Sequence) else self.scale_x_y[i]
 
-            box, score = fluid.layers.yolo_box(
-                x=input,
-                img_size=im_size,
-                anchors=self.mask_anchors[i],
-                class_num=self.num_classes,
-                conf_thresh=self.nms.score_threshold,
-                downsample_ratio=self.downsample[i],
-                name=self.prefix_name + 'yolo_box' + str(i),
-                clip_bbox=self.clip_bbox,
-                scale_x_y=self.scale_x_y)
+            if paddle.__version__ < '1.8.4' and paddle.__version__ != '0.0.0':
+                box, score = fluid.layers.yolo_box(
+                    x=input,
+                    img_size=im_size,
+                    anchors=self.mask_anchors[i],
+                    class_num=self.num_classes,
+                    conf_thresh=self.nms.score_threshold,
+                    downsample_ratio=self.downsample[i],
+                    name=self.prefix_name + 'yolo_box' + str(i),
+                    clip_bbox=self.clip_bbox)
+            else:
+                box, score = fluid.layers.yolo_box(
+                    x=input,
+                    img_size=im_size,
+                    anchors=self.mask_anchors[i],
+                    class_num=self.num_classes,
+                    conf_thresh=self.nms.score_threshold,
+                    downsample_ratio=self.downsample[i],
+                    name=self.prefix_name + 'yolo_box' + str(i),
+                    clip_bbox=self.clip_bbox,
+                    scale_x_y=self.scale_x_y)
+
             boxes.append(box)
             scores.append(fluid.layers.transpose(score, perm=[0, 2, 1]))