diff --git a/docs/advanced_tutorials/customization/action_recognotion/idbased_clas.md b/docs/advanced_tutorials/customization/action_recognotion/idbased_clas.md index 87c583b3b18d99e692f00c330ed37ccf1a13aced..51f281835ab0b842a0718d726ae73a533587e82a 100644 --- a/docs/advanced_tutorials/customization/action_recognotion/idbased_clas.md +++ b/docs/advanced_tutorials/customization/action_recognotion/idbased_clas.md @@ -176,3 +176,48 @@ wget https://bj.bcebos.com/v1/paddledet/models/pipeline/infer_configs/PPHGNet_ti ``` 至此,即可使用PP-Human进行实际预测了。 + + +### 自定义行为输出 +基于人体id的分类的行为识别方案中,将任务转化为对应人物的图像进行图片级别的分类。对应分类的类型最终即视为当前阶段的行为。因此在完成自定义模型的训练及部署的基础上,还需要将分类模型结果转化为最终的行为识别结果作为输出,并修改可视化的显示结果。 + +#### 转换为行为识别结果 +请对应修改[后处理函数](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/deploy/pipeline/pphuman/action_infer.py#L509)。 + +核心代码为: +```python +# 确定分类模型的最高分数输出结果 +cls_id_res = 1 +cls_score_res = -1.0 +for cls_id in range(len(cls_result[idx])): + score = cls_result[idx][cls_id] + if score > cls_score_res: + cls_id_res = cls_id + cls_score_res = score + +# Current now, class 0 is positive, class 1 is negative. +if cls_id_res == 1 or (cls_id_res == 0 and + cls_score_res < self.threshold): + # 如果分类结果不是目标行为或是置信度未达到阈值,则根据历史结果确定当前帧的行为 + history_cls, life_remain, history_score = self.result_history.get( + tracker_id, [1, self.frame_life, -1.0]) + cls_id_res = history_cls + cls_score_res = 1 - cls_score_res + life_remain -= 1 + if life_remain <= 0 and tracker_id in self.result_history: + del (self.result_history[tracker_id]) + elif tracker_id in self.result_history: + self.result_history[tracker_id][1] = life_remain + else: + self.result_history[ + tracker_id] = [cls_id_res, life_remain, cls_score_res] +else: + # 分类结果属于目标行为,则使用将该结果,并记录到历史结果中 + self.result_history[ + tracker_id] = [cls_id_res, self.frame_life, cls_score_res] + + ... +``` + +#### 修改可视化输出 +目前基于ID的行为识别,是根据行为识别的结果及预定义的类别名称进行展示的。详细逻辑请见[此处](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/deploy/pipeline/pipeline.py#L1024-L1043)。如果自定义的行为需要修改为其他的展示名称,请对应修改此处,以正确输出对应结果。 diff --git a/docs/advanced_tutorials/customization/action_recognotion/idbased_clas_en.md b/docs/advanced_tutorials/customization/action_recognotion/idbased_clas_en.md index a38ba06e2b2d8144bf9021d293b0edbaab5997e1..fc28ccc7029c7ea7f1e63d0ee4f97962747e7ad3 100644 --- a/docs/advanced_tutorials/customization/action_recognotion/idbased_clas_en.md +++ b/docs/advanced_tutorials/customization/action_recognotion/idbased_clas_en.md @@ -178,3 +178,47 @@ wget https://bj.bcebos.com/v1/paddledet/models/pipeline/infer_configs/PPHGNet_ti ``` At this point, this model can be used in PP-Human. + +### Custom Action Output +In the model of action recognition based on classification with human id, the task is defined as a picture-level classification task of corresponding person. The type of the corresponding classification is finally regarded as the action type of the current stage. Therefore, on the basis of completing the training and deployment of the custom model, it is also necessary to convert the classification model results to the final action recognition results as output, and the displayed result of the visualization should be modified. + +Please modify the [postprocessing function](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/deploy/pipeline/pphuman/action_infer.py#L509). + +The core code are: +```python +# Get the highest score output of the classification model +cls_id_res = 1 +cls_score_res = -1.0 +for cls_id in range(len(cls_result[idx])): + score = cls_result[idx][cls_id] + if score > cls_score_res: + cls_id_res = cls_id + cls_score_res = score + +# Current now, class 0 is positive, class 1 is negative. +if cls_id_res == 1 or (cls_id_res == 0 and + cls_score_res < self.threshold): + # If the classification result is not the target action or its confidence does not reach the threshold, + # determine the action type of the current frame according to the historical results + history_cls, life_remain, history_score = self.result_history.get( + tracker_id, [1, self.frame_life, -1.0]) + cls_id_res = history_cls + cls_score_res = 1 - cls_score_res + life_remain -= 1 + if life_remain <= 0 and tracker_id in self.result_history: + del (self.result_history[tracker_id]) + elif tracker_id in self.result_history: + self.result_history[tracker_id][1] = life_remain + else: + self.result_history[ + tracker_id] = [cls_id_res, life_remain, cls_score_res] +else: + # If the classification result belongs to the target action, use the result and record it in the historical result + self.result_history[ + tracker_id] = [cls_id_res, self.frame_life, cls_score_res] + + ... +``` + +#### Modify Visual Output +At present, ID-based action recognition is displayed based on the results of action recognition and predefined category names. For the detail, please refer to [here](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/deploy/pipeline/pipeline.py#L1024-L1043). If the custom action needs to be modified to another display name, please modify it accordingly to output the corresponding result. diff --git a/docs/advanced_tutorials/customization/action_recognotion/idbased_det.md b/docs/advanced_tutorials/customization/action_recognotion/idbased_det.md index c46bfc695690073a46a6ae47c49456b921ea9efe..02c7d9940c625074f24b8c651c2bcc9f9c138828 100644 --- a/docs/advanced_tutorials/customization/action_recognotion/idbased_det.md +++ b/docs/advanced_tutorials/customization/action_recognotion/idbased_det.md @@ -168,3 +168,35 @@ ppyoloe_crn_s_80e_smoking_visdrone/ ``` 至此,即可使用PP-Human进行实际预测了。 + + +### 自定义行为输出 +基于人体id的检测的行为识别方案中,将任务转化为在对应人物的图像中检测目标特征对象。当目标特征对象被检测到时,则视为行为正在发生。因此在完成自定义模型的训练及部署的基础上,还需要将检测模型结果转化为最终的行为识别结果作为输出,并修改可视化的显示结果。 + +#### 转换为行为识别结果 +请对应修改[后处理函数](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/deploy/pipeline/pphuman/action_infer.py#L338)。 +核心代码为: +```python +# 解析检测模型输出,并筛选出置信度高于阈值的有效检测框。 +# Current now, class 0 is positive, class 1 is negative. +action_ret = {'class': 1.0, 'score': -1.0} +box_num = np_boxes_num[idx] +boxes = det_result['boxes'][cur_box_idx:cur_box_idx + box_num] +cur_box_idx += box_num +isvalid = (boxes[:, 1] > self.threshold) & (boxes[:, 0] == 0) +valid_boxes = boxes[isvalid, :] + +if valid_boxes.shape[0] >= 1: + # 存在有效检测框时,行为识别结果的类别和分数对应修改 + action_ret['class'] = valid_boxes[0, 0] + action_ret['score'] = valid_boxes[0, 1] + # 由于动作的持续性,有效检测结果可复用一定帧数 + self.result_history[ + tracker_id] = [0, self.frame_life, valid_boxes[0, 1]] +else: + # 不存在有效检测框,则根据历史检测数据确定当前帧的结果 + ... +``` + +#### 修改可视化输出 +目前基于ID的行为识别,是根据行为识别的结果及预定义的类别名称进行展示的。详细逻辑请见[此处](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/deploy/pipeline/pipeline.py#L1024-L1043)。如果自定义的行为需要修改为其他的展示名称,请对应修改此处,以正确输出对应结果。 diff --git a/docs/advanced_tutorials/customization/action_recognotion/idbased_det_en.md b/docs/advanced_tutorials/customization/action_recognotion/idbased_det_en.md index 0c3cb1e9aeb9798fc3910ae7899fd8fd5f252d4d..49cac4343ae2296d9d97cff16f38002eedbb2dcf 100644 --- a/docs/advanced_tutorials/customization/action_recognotion/idbased_det_en.md +++ b/docs/advanced_tutorials/customization/action_recognotion/idbased_det_en.md @@ -165,3 +165,35 @@ ppyoloe_crn_s_80e_smoking_visdrone/ ``` At this point, this model can be used in PP-Human. + +### Custom Action Output +In the model of action recognition based on detection with human id, the task is defined to detect target objects in images of corresponding person. When the target object is detected, the behavior type of the character in a certain period of time. The type of the corresponding classification is regarded as the action of the current period. Therefore, on the basis of completing the training and deployment of the custom model, it is also necessary to convert the detection model results to the final action recognition results as output, and the displayed result of the visualization should be modified. + +#### Convert to Action Recognition Result +Please modify the [postprocessing function](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/deploy/pipeline/pphuman/action_infer.py#L338). + +The core code are: +```python +# Parse the detection model output and filter out valid detection boxes with confidence higher than a threshold. +# Current now, class 0 is positive, class 1 is negative. +action_ret = {'class': 1.0, 'score': -1.0} +box_num = np_boxes_num[idx] +boxes = det_result['boxes'][cur_box_idx:cur_box_idx + box_num] +cur_box_idx += box_num +isvalid = (boxes[:, 1] > self.threshold) & (boxes[:, 0] == 0) +valid_boxes = boxes[isvalid, :] + +if valid_boxes.shape[0] >= 1: + # When there is a valid detection frame, the category and score of the behavior recognition result are modified accordingly. + action_ret['class'] = valid_boxes[0, 0] + action_ret['score'] = valid_boxes[0, 1] + # Due to the continuity of the action, valid detection results can be reused for a certain number of frames. + self.result_history[ + tracker_id] = [0, self.frame_life, valid_boxes[0, 1]] +else: + # If there is no valid detection frame, the result of the current frame is determined according to the historical detection result. + ... +``` + +#### Modify Visual Output +At present, ID-based action recognition is displayed based on the results of action recognition and predefined category names. For the detail, please refer to [here](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/deploy/pipeline/pipeline.py#L1024-L1043). If the custom action needs to be modified to another display name, please modify it accordingly to output the corresponding result. diff --git a/docs/advanced_tutorials/customization/action_recognotion/skeletonbased_rec.md b/docs/advanced_tutorials/customization/action_recognotion/skeletonbased_rec.md index 1aeddf32694e9d5ac63f7623071fa50af3c71aec..21cca224ba8d794e00d25937e14b6f10aeaf324f 100644 --- a/docs/advanced_tutorials/customization/action_recognotion/skeletonbased_rec.md +++ b/docs/advanced_tutorials/customization/action_recognotion/skeletonbased_rec.md @@ -197,3 +197,9 @@ INFERENCE: vertex_nums: 17 # 对应V维,请对应调整为关键点数目 person_nums: 1 # 对应M维 ``` + +### 自定义行为输出 +基于人体骨骼点的行为识别方案中,模型输出的分类结果即代表了该人物在一定时间段内行为类型。对应分类的类型最终即视为当前阶段的行为。因此在完成自定义模型的训练及部署的基础上,使用模型输出作为最终结果,修改可视化的显示结果即可。 + +#### 修改可视化输出 +目前基于ID的行为识别,是根据行为识别的结果及预定义的类别名称进行展示的。详细逻辑请见[此处](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/deploy/pipeline/pipeline.py#L1024-L1043)。如果自定义的行为需要修改为其他的展示名称,请对应修改此处,以正确输出对应结果。 diff --git a/docs/advanced_tutorials/customization/action_recognotion/skeletonbased_rec_en.md b/docs/advanced_tutorials/customization/action_recognotion/skeletonbased_rec_en.md index 86ebc45321893c459b68b1c052e9f83ffc27b5d6..a1e8d1f3ca8096c03cab9bb735306ba0db742474 100644 --- a/docs/advanced_tutorials/customization/action_recognotion/skeletonbased_rec_en.md +++ b/docs/advanced_tutorials/customization/action_recognotion/skeletonbased_rec_en.md @@ -192,3 +192,9 @@ INFERENCE: vertex_nums: 17 # Corresponding to V dimension, please set it accordingly to the number of keypoints person_nums: 1 # Corresponding to M dimension ``` + +### Custom Action Output +In the skeleton-based action recognition, the classification result of the model represents the behavior type of the character in a certain period of time. The type of the corresponding classification is regarded as the action of the current period. Therefore, on the basis of completing the training and deployment of the custom model, the model output is directly used as the final result, and the displayed result of the visualization should be modified. + +#### Modify Visual Output +At present, ID-based action recognition is displayed based on the results of action recognition and predefined category names. For the detail, please refer to [here](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/deploy/pipeline/pipeline.py#L1024-L1043). If the custom action needs to be modified to another display name, please modify it accordingly to output the corresponding result. diff --git a/docs/tutorials/data/README.md b/docs/tutorials/data/README.md index 55bf469160bb27cd6d2925ad79a0cdd242929656..947b650e18cbc9cf9bb57c8b6600588ed0a6501f 100644 --- a/docs/tutorials/data/README.md +++ b/docs/tutorials/data/README.md @@ -3,7 +3,19 @@ 数据对于深度学习开发起到了至关重要的作用,数据采集和标注的质量是提升业务模型效果的重要因素。本文档主要介绍PaddleDetection中如何进行数据准备,包括采集高质量数据方法,覆盖多场景类型,提升模型泛化能力;以及各类任务数据标注工具和方法,并在PaddleDetection下使用 ## 数据采集 +在深度学习任务的实际落地中,数据采集往往决定了最终模型的效果,对于数据采集的几点建议如下: +### 确定方向 +任务类型、数据的类别和目标场景这些因素决定了要收集什么数据,首先需要根据这些因素来确定整体数据收集的工作方向。 + +### 开源数据集 +在实际场景中数据采集成本其实十分高昂,完全靠自己收集在时间和金钱上都有很高的成本,开源数据集是帮助增加训练数据量的重要手段,所以很多时候会考虑加入一些相似任务的开源数据。在使用中请遵守各个开源数据集的license规定的使用条件。 + +### 增加场景数据 +开源数据一般不会覆盖实际使用的的目标场景,用户需要评估开源数据集中已包含的场景和目标场景间的差异,有针对性地补充目标场景数据,尽量让训练和部署数据的场景一致。 + +### 类别均衡 +在采集阶段,也需要尽量保持类别均衡,帮助模型正确学习到目标特征。 ## 数据标注及格式说明