mult_yolov5_post_copy.c_cursor

#include "mult_yolov5_post_copy.h"

static void swap_bbox(ttevxYoloV5BBox *a, ttevxYoloV5BBox *b);

static float iou(ttevxYoloV5BBox *box_a, ttevxYoloV5BBox *box_b);

static ttevxYoloV5BBox* quick_sort_part(ttevxYoloV5BBox *left, ttevxYoloV5BBox *right);

static void quick_sort_bbox(ttevxYoloV5BBox *left, ttevxYoloV5BBox *right);

/* ================================================================================== */

static void swap_bbox(ttevxYoloV5BBox *a, ttevxYoloV5BBox *b) {

if (a == b) return;

ttevxYoloV5BBox tmp;

memcpy(&tmp, a, sizeof(ttevxYoloV5BBox));

memcpy(a, b, sizeof(ttevxYoloV5BBox));

memcpy(b, &tmp, sizeof(ttevxYoloV5BBox));

}

static float iou(ttevxYoloV5BBox *box_a, ttevxYoloV5BBox *box_b) {

if (box_a->x1 >= box_a->x2 || box_a->y1 >= box_a->y2 || box_b->x1 >= box_b->x2 || box_b->y1 >= box_b->y2) {

return 1.0f;

}

float x1 = box_a->x1 > box_b->x1 ? box_a->x1 : box_b->x1;

float y1 = box_a->y1 > box_b->y1 ? box_a->y1 : box_b->y1;

float x2 = box_a->x2 < box_b->x2 ? box_a->x2 : box_b->x2;

float y2 = box_a->y2 < box_b->y2 ? box_a->y2 : box_b->y2;

if (x1 >= x2 || y1 >= y2) {

return 0.0f;

}

float inter_area = (x2 - x1) * (y2 - y1);

float union_area = (float)(box_a->x2 - box_a->x1) * (float)(box_a->y2 - box_a->y1)

  • (float)(box_b->x2 - box_b->x1) * (float)(box_b->y2 - box_b->y1)
  • inter_area;

return inter_area / union_area;

}

int NMS(ttevxYoloV5BBox *bbox_obj_arr, int bbox_num, float nms_thresh) {

if (bbox_num == 0) return 0;

quick_sort_bbox(bbox_obj_arr, bbox_obj_arr + bbox_num - 1);

/* 第一个目标是可信的 */

int accept_len = 1;

/* 用于循环待验证序列 */

int iter;

/* 用于循环可信序列 */

int iter_accept;

for (iter = 1; iter < bbox_num; ++iter) {

for (iter_accept = 0; iter_accept < accept_len; ++iter_accept) {

/* 如果是同一个类别才进行IoU判断 */

if (bbox_obj_arriter_accept.soltcls == bbox_obj_arriter.soltcls) {

if (iou(&bbox_obj_arriter_accept, &bbox_obj_arriter) > nms_thresh) {

/* 如果该目标框与已经accept的目标框iou过大,则确定为冗余目标框 */

break;

}

}

}

if (iter_accept == accept_len) {

/* 如果该目标框与所有accept目标框的iou都较小,则接受该目标框 */

swap_bbox(&bbox_obj_arraccept_len, &bbox_obj_arriter);

accept_len++;

}

}

return accept_len;

}

static ttevxYoloV5BBox* quick_sort_part(ttevxYoloV5BBox *left, ttevxYoloV5BBox *right) {

ttevxYoloV5BBox *index = left;

while (left < right) {

while (index < right && right->soltconfidence <= index->soltconfidence) {

right--;

}

if (left == right) break;

swap_bbox(index, right);

index = right;

while (left < index && left->soltconfidence >= index->soltconfidence) {

left++;

}

if (left == right) break;

swap_bbox(index, left);

index = left;

}

return index;

}

static void quick_sort_bbox(ttevxYoloV5BBox *left, ttevxYoloV5BBox *right) {

if (left < right) {

ttevxYoloV5BBox *index = quick_sort_part(left, right);

quick_sort_bbox(left, index-1);

quick_sort_bbox(index+1, right);

}

}

void initMult_yolov5params(ttevxYoloV5PostProcParams *yolov5params)

{

yolov5params->num_anchors = TTE_YOLOV5_NUM_ANCHOR;

yolov5params->num_classes = TTE_YOLOV5_NUM_CLASSES;

yolov5params->num_heads = TTE_YOLOV5_NUM_HEAD;

yolov5params->conf_thresh = 0.25;

yolov5params->nms_thresh = 0.45;

int i, j, k;

for (i = 0; i < TTE_YOLOV5_NUM_HEAD; ++i) {

for (j = 0; j < TTE_YOLOV5_NUM_ANCHOR; ++j) {

for (k = 0; k < 2; ++k) {

yolov5params->anchorsijk = ANCHORSijk;

}

}

}

}

int getMult_yolov5e2eResult(ttevxYoloV5PostProcParams *yolov5params, ttevxYoloV5Detections *detections)

{

int status = 0;

/*开始对端到端车位后处理进行解码*/

int width, height, outPadL, outPadT, inPadL, inPadT;

int output_sizesTTE_APP_MAX_TENSOR_DIMS;

void *output_buffer;

int map_id_output, map_id_input;

int output_stridesTTE_APP_MAX_TENSOR_DIMS;

int output_startTTE_APP_MAX_TENSOR_DIMS;

int head_idx, h_idx, w_idx, anchor_idx;

int yolov5_class_stride = TTE_YOLOV5_NUM_CLASSES + 5 + 8 + 6; //cls confxywh points slot

int bbox_num = 0;

ttevxYoloV5BBox *bbox_obj_arr = detections->buffer;

/* for mulTask_yolov5_det decode*/

for(int head_idx = 0; head_idx < yolov5params->num_heads; head_idx++)

{

output_sizes0 = yolov5params->outWidthhead_idx + yolov5params->outPadLhead_idx + yolov5params->outPadRhead_idx;

output_sizes1 = yolov5params->outHeighthead_idx + yolov5params->outPadThead_idx + yolov5params->outPadBhead_idx;

output_sizes2 = yolov5params->outNumChannelshead_idx;

width = yolov5params->outWidthhead_idx;

height = yolov5params->outHeighthead_idx;

outPadL = yolov5params->outPadLhead_idx;

outPadT = yolov5params->outPadThead_idx;

int in_w = yolov5params->inWidthhead_idx > 0 ? yolov5params->inWidthhead_idx : yolov5params->inWidth0;

int in_h = yolov5params->inHeighthead_idx > 0 ? yolov5params->inHeighthead_idx : yolov5params->inHeight0;

//获取内存块

output_start0 = output_start1 = output_start2 = output_start3 = 0;

output_strides0 = 1;

output_strides1 = output_sizes0;

output_strides2 = output_sizes1 * output_strides1;

if(width > 0)

{

/* 初始时将指针定位到第一个有效内存位置 */

unsigned short *pOut = (unsigned short *)yolov5params->output_tensorshead_idx;

unsigned short *raw_data = (unsigned short*)(pOut) + (output_sizes0 * outPadT + outPadL);

/* TIDL中内存实际是CHW排布,但是以WHC记录,所以查找内存时首先定位正确的通道,再进行WH的偏移 */

for (h_idx = 0; h_idx < yolov5params->outHeighthead_idx; ++h_idx) {

for (w_idx = 0; w_idx < yolov5params->outWidthhead_idx; ++w_idx) {

for (anchor_idx = 0; anchor_idx < yolov5params->num_anchors; ++anchor_idx) {

/* 在内存片中对应h,w的线性位置 */

int obj_hw_idx = h_idx * output_sizes0 + w_idx;

/* 找到正确conf内存通道位置,并做hw偏移 */

int obj_conf_idx = (anchor_idx * yolov5_class_stride + 4) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

/* 获得conf并将conf缩放回输入尺度 */

float conf = (float)(raw_dataobj_conf_idx) / (float)yolov5params->scalehead_idx;

if(conf>1)

{

printf("save to (float)(raw_dataobj_conf_idx) = %f!!!\n", (float)(raw_dataobj_conf_idx));

printf("save to (float)yolov5params->scalehead_idx = %f!!!\n", (float)yolov5params->scalehead_idx);

printf("save to conf = %f!!!\n", conf);

}

// printf("端到端车位解码耗时2 \n");

if (conf >= yolov5params->conf_thresh) {

/* 计算xywh和cls内存位置并转化为输出值 */

int obj_x_idx = (anchor_idx * yolov5_class_stride + 0) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_y_idx = (anchor_idx * yolov5_class_stride + 1) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_w_idx = (anchor_idx * yolov5_class_stride + 2) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_h_idx = (anchor_idx * yolov5_class_stride + 3) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

float x = (float)raw_dataobj_x_idx / yolov5params->scalehead_idx;

x = (x * 2.0 - 0.5 + w_idx) * (float)in_w / (float)(yolov5params->outWidthhead_idx);

float y = (float)raw_dataobj_y_idx / yolov5params->scalehead_idx;

y = (y * 2.0 - 0.5 + h_idx) * (float)in_h / (float)(yolov5params->outHeighthead_idx);

float w = (float)raw_dataobj_w_idx / yolov5params->scalehead_idx;

w = (w * 2.0) * (w * 2.0) * yolov5params->anchorshead_idxanchor_idx0;

float h = (float)raw_dataobj_h_idx / yolov5params->scalehead_idx;

h = (h * 2.0) * (h * 2.0) * yolov5params->anchorshead_idxanchor_idx1;

/*计算points关键点的值*/

int obj_front1x_idx = (anchor_idx * yolov5_class_stride + 5) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_front1y_idy = (anchor_idx * yolov5_class_stride + 6) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_front2x_idx = (anchor_idx * yolov5_class_stride + 7) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_front2y_idx = (anchor_idx * yolov5_class_stride + 8) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_rear1x_idx = (anchor_idx * yolov5_class_stride + 9) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_rear1y_idx = (anchor_idx * yolov5_class_stride + 10) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_rear2x_idx = (anchor_idx * yolov5_class_stride + 11) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_rear2y_idx = (anchor_idx * yolov5_class_stride + 12) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

float front1x_sig = (float)raw_dataobj_front1x_idx / yolov5params->scalehead_idx;

float front1x_log = -log((1/(front1x_sig + 1e-8)) - 1);

float front1x = front1x_log * yolov5params->anchorshead_idxanchor_idx0 + w_idx * (float)in_w / (float)(yolov5params->outWidthhead_idx);

float front1y_sig = (float)raw_dataobj_front1y_idy / yolov5params->scalehead_idx;

float front1y_log = -log((1/(front1y_sig + 1e-8)) - 1);

float front1y = front1y_log * yolov5params->anchorshead_idxanchor_idx1 + h_idx * (float)in_h / (float)(yolov5params->outHeighthead_idx);

float front2x_sig = (float)raw_dataobj_front2x_idx / yolov5params->scalehead_idx;

float front2x_log = -log((1/(front2x_sig + 1e-8)) - 1);

float front2x = front2x_log * yolov5params->anchorshead_idxanchor_idx0 + w_idx * (float)in_w / (float)(yolov5params->outWidthhead_idx);

float front2y_sig = (float)raw_dataobj_front2y_idx / yolov5params->scalehead_idx;

float front2y_log = -log((1/(front2y_sig + 1e-8)) - 1);

float front2y = front2y_log * yolov5params->anchorshead_idxanchor_idx1 + h_idx * (float)in_h / (float)(yolov5params->outHeighthead_idx);

float rear1x_sig = (float)raw_dataobj_rear1x_idx / yolov5params->scalehead_idx;

float rear1x_log = -log((1/(rear1x_sig + 1e-8)) - 1);

float rear1x = rear1x_log * yolov5params->anchorshead_idxanchor_idx0 + w_idx * (float)in_w / (float)(yolov5params->outWidthhead_idx);

float rear1y_sig = (float)raw_dataobj_rear1y_idx / yolov5params->scalehead_idx;

float rear1y_log = -log((1/(rear1y_sig + 1e-8)) - 1);

float rear1y = rear1y_log * yolov5params->anchorshead_idxanchor_idx1 + h_idx * (float)in_h / (float)(yolov5params->outHeighthead_idx);

float rear2x_sig = (float)raw_dataobj_rear2x_idx / yolov5params->scalehead_idx;

float rear2x_log = -log((1/(rear2x_sig + 1e-8)) - 1);

float rear2x = rear2x_log * yolov5params->anchorshead_idxanchor_idx0 + w_idx * (float)in_w / (float)(yolov5params->outWidthhead_idx);

float rear2y_sig = (float)raw_dataobj_rear2y_idx / yolov5params->scalehead_idx;

float rear2y_log = -log((1/(rear2y_sig + 1e-8)) - 1);

float rear2y = rear2y_log * yolov5params->anchorshead_idxanchor_idx1 + h_idx * (float)in_h / (float)(yolov5params->outHeighthead_idx);

/*计算车位属性的值*/

int obj_solt_occ_idx = (anchor_idx * yolov5_class_stride + 13) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_solt_vip_idx = (anchor_idx * yolov5_class_stride + 14) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_solt_woman_idx = (anchor_idx * yolov5_class_stride + 15) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_solt_disabled_idx = (anchor_idx * yolov5_class_stride + 16) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_solt_charging_idx = (anchor_idx * yolov5_class_stride + 17) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

int obj_solt_step_idx = (anchor_idx * yolov5_class_stride + 18) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

float occ = (float)raw_dataobj_solt_occ_idx / yolov5params->scalehead_idx;

float vip = (float)raw_dataobj_solt_vip_idx / yolov5params->scalehead_idx;

float woman = (float)raw_dataobj_solt_woman_idx / yolov5params->scalehead_idx;

float disable = (float)raw_dataobj_solt_disabled_idx / yolov5params->scalehead_idx;

float charging = (float)raw_dataobj_solt_charging_idx / yolov5params->scalehead_idx;

float step = (float)raw_dataobj_solt_step_idx / yolov5params->scalehead_idx;

int cls = 0;

float cls_prob = 0.0;

/* 遍历查找类别内存,找到最大的置信度进行赋值 */

{

int obj_cls_idx;

int max_prob_idx;

float p;

for (max_prob_idx = 0; max_prob_idx < yolov5params->num_classes; ++max_prob_idx) {

obj_cls_idx = (anchor_idx * yolov5_class_stride + 5 + 8 + 6 + max_prob_idx) * yolov5params->outChannelPitchhead_idx + obj_hw_idx;

p = (float)raw_dataobj_cls_idx / yolov5params->scalehead_idx;

if (p > cls_prob) {

cls_prob = p;

cls = max_prob_idx;

}

}

}

/* 输出概率 = 存在目标概率 * 类别置信概率 */

bbox_obj_arrbbox_num.soltconfidence = conf * cls_prob;

if (bbox_obj_arrbbox_num.soltconfidence >= yolov5params->conf_thresh) {

// printf("save to conf = %f!!!\n", conf);

// printf("save to cls_prob = %f!!!\n", cls_prob);

// printf("save to bbox_obj_arrbbox_num.soltconfidence = %f!!!\n", bbox_obj_arrbbox_num.soltconfidence);

// printf("save to (float)raw_dataobj_cls_idx = %f!!!\n", (float)raw_dataobj_cls_idx);

bbox_obj_arrbbox_num.x1 = (int)(x - w / 2 + 0.5);

bbox_obj_arrbbox_num.y1 = (int)(y - h / 2 + 0.5);

bbox_obj_arrbbox_num.x2 = (int)(x + w / 2 + 0.5);

bbox_obj_arrbbox_num.y2 = (int)(y + h / 2 + 0.5);

bbox_obj_arrbbox_num.soltcls = (int)cls;

bbox_obj_arrbbox_num.occ_conf = occ;

bbox_obj_arrbbox_num.vip_conf = vip;

bbox_obj_arrbbox_num.woman_conf = woman;

bbox_obj_arrbbox_num.disabled_conf = disable;

bbox_obj_arrbbox_num.charging_conf = charging;

bbox_obj_arrbbox_num.step_conf = step;

{

if (front1x < 0) front1x = 0;

if (front1y < 0) front1y = 0;

if (front2x < 0) front2x = 0;

if (front2y < 0) front2y = 0;

if (rear1x < 0) rear1x = 0;

if (rear1y < 0) rear1y = 0;

if (rear2x < 0) rear2x = 0;

if (rear2y < 0) rear2y = 0;

bbox_obj_arrbbox_num.soltpoints0 = (int)front1x;

bbox_obj_arrbbox_num.soltpoints1 = (int)front1y;

bbox_obj_arrbbox_num.soltpoints2 = (int)front2x;

bbox_obj_arrbbox_num.soltpoints3 = (int)front2y;

bbox_obj_arrbbox_num.soltpoints4 = (int)rear1x;

bbox_obj_arrbbox_num.soltpoints5 = (int)rear1y;

bbox_obj_arrbbox_num.soltpoints6 = (int)rear2x;

bbox_obj_arrbbox_num.soltpoints7 = (int)rear2y;

}

bbox_num++;

}

}

}

}

}

}

}

//NMS

bbox_num = NMS(bbox_obj_arr, bbox_num, yolov5params->nms_thresh);

detections->num_bbox = bbox_num;

for(int num = 0; num < bbox_num; num++)

{

detections->buffernum = bbox_obj_arrnum;

}

int num = detections->num_bbox;

ttevxYoloV5BBox num0 = detections->buffer0;

ttevxYoloV5BBox num1 = detections->buffer1;

return status;

}

相关推荐
qq_163135759 分钟前
Linux 【07-rm命令超详细教程】
linux
zh路西法27 分钟前
【SSH 免密登录全流程】Windows Linux 通用方案
linux·windows·ssh
abcy07121329 分钟前
python pandas csv异步后台清洗前端优先返回成功信息
前端·python·pandas
米小虾33 分钟前
AI 安全攻防 2026:从对抗样本到 Agent 安全,开发者必须面对的五道防线
人工智能·安全
And_Ii40 分钟前
基于 LangGraph 搭建反思迭代 Agent:实现文章自动优化
人工智能
basketball61640 分钟前
AI Infra 硬件体系与编程模型:9. 使用 NVCC 进行编译
人工智能
硅谷秋水1 小时前
HumanEgo:基于人类第一人称视角数分钟视频的零样本机器人学习
人工智能·机器学习·计算机视觉·机器人
颜酱1 小时前
LangChain使用RAG 入门:让大模型读懂你的私有文档
python·langchain
IT_陈寒1 小时前
Vite这个坑我帮你踩了,动态导入居然这样才生效
前端·人工智能·后端
ScilogyHunter1 小时前
GCC完全指南
linux·gcc