You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1358 lines
46 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* @Author: turboLIU
* @Date: 2023-06-12 14:13:24
* @LastEditTime: 2025-06-26 09:36:32
* @Description: Do not edit
* @FilePath: /Algo_ACL_Common/demo/AI_API_demo.cpp
*/
// #include <type_traits>
#include <unistd.h>
#include <thread>
#include <sys/time.h>
#include <dirent.h>
#include <sys/stat.h>
// #include <pthread.h>
#include "AI_API.h"
#include "detection_type_api.h"
// #include "environment.h"
#include "opencv2/opencv.hpp"
// #include "utils.h"
#define IMAGECOUNT 500
// #define IMAGEWIDTH 512
// #define IMAGEHEIGHT 512
#define GSTREAM NV12
#define IMAGEWIDTH_VIS 1920
#define IMAGEHEIGHT_VIS 1088
#define IMAGEWIDTH_IR 640
#define IMAGEHEIGHT_IR 512
#define InitWithJson 1
#define UseGDVideoFrame 0
// #define TESTIMAGEVIS "../models/Detect/quantImages/1488264581.jpg"
// #define TESTIMAGEIR "../models/Detect/quantImages/webwxgetmsgimg.jpeg"
// static bool TESTVIS = false;
// static bool TESTIR = false;
static std::string VIDEONAME = "1970010100052511";
static std::string IMGFOLDER = "../models/Detect/test_images/" + VIDEONAME;
static std::string DSTFOLDER = "./results/";
// std::vector<std::string> imgnames;
bool stopFlag = false;
static unsigned char SegDet_Colors[36] = {255,0,0, 0,255,0, 0,0,255,
100,100,0, 0,100,100, 100,0,100,
100,100,100, 50,100,50, 50,50,100,
100,50,50, 20,60,120, 120,60,20};
int GetDirNames(std::string dirpath, std::vector<std::string> &filenames){
DIR* pdir;
struct dirent *ptr;
int ret;
pdir = opendir(dirpath.c_str());
if(!pdir){
printf("dripath not exist, path: %s\n", dirpath.c_str());
return -1;
}
while ((ptr = readdir(pdir)) != NULL)
{
if(strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0){
filenames.push_back(dirpath + "/" + ptr->d_name);
}
}
closedir(pdir);
return 0;
}
float getDtimeMiliSecond(timeval starttime, timeval endtime){
float dtime;
dtime = 1000000 * (endtime.tv_sec - starttime.tv_sec) + (endtime.tv_usec - starttime.tv_usec);
dtime = dtime/1000000;
return dtime * 1000;
}
std::vector<int> get_color(int cls){
cls += 1;
int stride = 200;
std::vector<int> clr = {0,0,0};
for(int k=0; k<cls; k++){
int i = k % 3;
clr[i] += stride;
}
for(int k = 0; k< 3; k++){
clr[k] = clr[k] %255;
}
return clr;
}
void draw_dotted_line(cv::Mat img, cv::Point2f p1, cv::Point2f p2, cv::Scalar color, int thickness)
{
float n = 15; //虚点间隔
float w = p2.x - p1.x, h = p2.y - p1.y;
float l = sqrtf(w * w + h * h);
int m = l / n;
n = l / m; // 矫正虚点间隔,使虚点数为整数
cv::circle(img, p1, 1, color, thickness); // 画起点
cv::circle(img, p2, 1, color, thickness); // 画终点
// 画中间点
if (p1.y == p2.y) // 水平线y = m
{
float x1 = std::min(p1.x, p2.x);
float x2 = std::max(p1.x, p2.x);
for (float x = x1 + n; x < x2; x = x + n)
cv::circle(img, cv::Point2f(x, p1.y), 1, color, thickness);
}
else if (p1.x == p2.x) // 垂直线, x = m
{
float y1 = std::min(p1.y, p2.y);
float y2 = std::max(p1.y, p2.y);
for (float y = y1 + n; y < y2; y = y + n)
cv::circle(img, cv::Point2f(p1.x, y), 1, color, thickness);
}
else // 倾斜线与x轴、y轴都不垂直或平行
{
// 直线方程的两点式:(y-y1)/(y2-y1)=(x-x1)/(x2-x1) -> y = (y2-y1)*(x-x1)/(x2-x1)+y1
float m = n * abs(w) / l;
float k = h / w;
float x1 = std::min(p1.x, p2.x);
float x2 = std::max(p1.x, p2.x);
for (float x = x1 + m; x < x2; x = x + m)
cv::circle(img, cv::Point2f(x, k * (x - p1.x) + p1.y), 1, color, thickness);
}
}
void draw_dotted_rect(cv::Mat img, cv::Point2f p1, cv::Point2f p2, cv::Scalar color, int thickness){
cv::Point2f lt(p1.x, p1.y);
cv::Point2f rt(p2.x, p1.y);
cv::Point2f lb(p1.x, p2.y);
cv::Point2f rb(p2.x, p2.y);
draw_dotted_line(img, lt, rt, color, thickness);
draw_dotted_line(img, rt, rb, color, thickness);
draw_dotted_line(img, lb, rb, color, thickness);
draw_dotted_line(img, lt, lb, color, thickness);
return;
}
void swapYUV_I420toNV12(unsigned char* i420bytes, unsigned char* nv12bytes, int width, int height)
{
int nLenY = width * height;
int nLenU = nLenY / 4;
memcpy(nv12bytes, i420bytes, width * height);
for (int i = 0; i < nLenU; i++)
{
nv12bytes[nLenY + 2 * i] = i420bytes[nLenY + i]; // U
nv12bytes[nLenY + 2 * i + 1] = i420bytes[nLenY + nLenU + i]; // V
}
}
void BGR2YUV_nv12(cv::Mat src, cv::Mat &dst)
{
int w_img = src.cols;
int h_img = src.rows;
dst = cv::Mat(h_img*1.5, w_img, CV_8UC1, cv::Scalar(0));
cv::Mat src_YUV_I420(h_img*1.5, w_img, CV_8UC1, cv::Scalar(0)); //YUV_I420
cvtColor(src, src_YUV_I420, cv::COLOR_BGR2YUV_I420);
swapYUV_I420toNV12(src_YUV_I420.data, dst.data, w_img, h_img);
}
template<typename T>
int draw_mask(cv::Mat &showImg, TenMat* mask){
float alpha = 0.5;
int inwidth = mask->width;
int inheight = mask->height;
int depth = showImg.channels();
T* maskdata = (T*)mask->data;
for(int i=0; i<inheight; i++){
for(int j=0; j<inwidth; j++){
uint8_t uvalue = (uint8_t)maskdata[i*inwidth + j];
std::vector<int> color = get_color(uvalue);
for(int k=0; k<depth; k++){
showImg.data[i*inwidth*depth + j*depth + k] \
= (uint8_t)((1-alpha)*showImg.data[i*inwidth*depth + j*depth + k] + alpha * color.at(k));
}
}
}
return 0;
}
int draw_dets(cv::Mat &showImg, std::vector<objinfo> dets){
int ret = 0;
for(auto det: dets){
int x1 = det.x1;
int x2 = det.x2;
int y1 = det.y1;
int y2 = det.y2;
int cls = det.classNum;
std::vector<int> color = {SegDet_Colors[3*cls + 0], SegDet_Colors[3*cls + 1], SegDet_Colors[3*cls + 2]};//get_color(cls);
cv::rectangle(showImg, cv::Point(x1,y1), cv::Point(x2,y2), cv::Scalar(color[0],color[1],color[2]),2);
// draw_dotted_rect(resizedImg, cv::Point2f(det.x1, det.y1), cv::Point2f(det.x2, det.y2), cv::Scalar(color[0],color[1],color[2]),4);
char name[50];
sprintf(name, "%d_%.3f", det.classNum, det.score);
cv::putText(showImg, name, cv::Point(x1,y1), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(color[0],color[1],color[2]), 4);
}
return ret;
}
int test_class(){
int ret = 0;
// bool initWithJson = true;
// bool useGDVideo = true;
std::string visdetmodelname = "../models/Detect/atlas200/xh.xu/507A_IR_20241111_dynamic.om";
std::string visdetparamname = "../models/Detect/atlas200/xh.xu/507A_IR_20241111_dynamic.json";
// build class
DETECTION_API* detAPI = new DETECTION_API();
if(InitWithJson){
ret = detAPI->AIGOinit(visdetmodelname.c_str(), visdetparamname.c_str(), 0);
}else{
detAPI->netWidth = 640;
detAPI->netHeight = 640;
detAPI->clsnum = 15;
detAPI->anchors = {{10,13, 16,30, 33,23},{30,61, 62,45, 59,119},{116,90, 156,198, 373,326}};
// 标签标请咨询对应的算法工程师
uint32_t modelclass[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
uint32_t standerclass[] = {10000, 20000, 30000, 40000, 50000,
60000, 70000, 80000, 90000, 100000,
110000, 120000, 130000, 140000, 150000};
ret = detAPI->AIGOinit(visdetmodelname.c_str(), 0);
if(ret){
printf("init error with ret=%d\n", ret);
return ret;
}
ret = detAPI->AIGOsetLabelMap(modelclass, standerclass, sizeof(modelclass)/sizeof(uint32_t));
if(ret){
printf("setLabelMap error with ret=%d\n", ret);
return ret;
}
}
std::string visdetimgname = "../models/Detect/quantImages/IR_test_tank.avi_000147.jpg";
std::string vissegimgname = "../models/Segment/test_images_vl/20230704_102059.MP4_20230711_195345.335.bmp";
float timecost = 0;
float durtime = 0;
struct timeval st, et;
cv::Mat visdetImage = cv::imread(visdetimgname);
cv::cvtColor(visdetImage, visdetImage, cv::COLOR_BGR2RGB);
if(visdetImage.empty()){
printf("read image error %s\n", visdetimgname.c_str());
return 1;
}
cv::Mat visdetresize, vissegresize;
cv::resize(visdetImage, visdetresize, cv::Size(detAPI->netWidth, detAPI->netHeight));
// char* zerosInput = (char*)malloc(visdetresize.cols*visdetresize.rows*visdetresize.channels() * sizeof(char));
cv::Mat NV12Matvis, NV12Matir;
// convert BGR to NV12
BGR2YUV_nv12(visdetresize, NV12Matvis);
std::vector<objinfo> dets;
GD_VIDEO_FRAME_S* config = (GD_VIDEO_FRAME_S*)malloc(sizeof(GD_VIDEO_FRAME_S));
for(int i =0; i<1; i++){
ImgMat imgvis;
if(UseGDVideoFrame){
if(GSTREAM == NV12){
imgvis.data = NULL;
imgvis.inlayout = NV12;
imgvis.depth = 1;
// Y
config->u64VirAddr[0] = NV12Matvis.data;
// UV
config->u64VirAddr[1] = NV12Matvis.data + visdetresize.cols * visdetresize.rows;
config->u32Stride[0] = visdetresize.cols;
config->u32Stride[1] = visdetresize.rows;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = NULL;
imgvis.inlayout = RGB;
imgvis.depth = visdetresize.channels();
config->u64VirAddr[0] = visdetresize.data;
config->u32Stride[0] = visdetresize.cols;
}
imgvis.width = visdetresize.cols;
imgvis.height = visdetresize.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
imgvis.timestamp = i;
imgvis.cfg = (long long)config;
}else{
if(GSTREAM == NV12){
imgvis.data = NV12Matvis.data;
imgvis.inlayout = NV12;
imgvis.depth = 1;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = visdetresize.data;
imgvis.inlayout = RGB;
imgvis.depth = visdetresize.channels();
}
imgvis.width = visdetresize.cols;
imgvis.height = visdetresize.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
imgvis.timestamp = i;
imgvis.cfg = (long long)config;
}
// printf("loop ImgMat * %p", &img);
gettimeofday(&st, NULL);
// imgvis.data = (unsigned char*)zerosInput;
dets.clear();
ret = detAPI->AIGOpreprocess(imgvis, true);
ret = detAPI->AIGOinfer();
ret = detAPI->AIGOpostprocess(dets);
printf("result dets %d\n", dets.size());
gettimeofday(&et, NULL);
durtime = getDtimeMiliSecond(st, et);
printf("runsync cost: %.3f", durtime);
timecost += durtime;
}
printf("avg timecost is: %f\n", timecost/IMAGECOUNT);
for(auto d : dets){
std::vector<int> color = get_color(d.classNum);
cv::rectangle(visdetresize, cv::Point2d(d.x1, d.y1), cv::Point2d(d.x2, d.y2), cv::Scalar(color.at(0), color.at(1), color.at(2)), 2);
char name[50];
sprintf(name, "%d_%.4f", d.classNum, d.score);
cv::putText(visdetresize, name, cv::Point2d(d.x1, d.y1), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(color.at(0), color.at(1), color.at(2)), 1);
// cv::putText(img, )
}
cv::imwrite("./result.jpg", visdetresize);
ret = detAPI->AIGOdeinit();
printf("\n---------------------current model size: %dx%d\n", visdetresize.cols, visdetresize.rows);
printf("\n-----------end--------------\n");
sleep(2);
}
template<typename T>
void run_folder(T* classor, std::string imgfolder){
int ret = 0;
std::vector<std::string> imgnames;
ret = GetDirNames(imgfolder, imgnames);
if(ret){
printf("get images error\n");
exit(1);
}
std::sort(imgnames.begin(), imgnames.end());
struct timeval st,et;
float durtime = 0;
for(int i=0; i<imgnames.size(); i++){
GD_VIDEO_FRAME_S* config = (GD_VIDEO_FRAME_S*)malloc(sizeof(GD_VIDEO_FRAME_S));
gettimeofday(&st, NULL);
cv::Mat img = cv::imread(imgnames.at(i));
int ww = img.cols;
int hh = img.rows;
cv::Mat resizeImage;
cv::resize(img, resizeImage, cv::Size(960,768));
cv::Rect roi(960/2 - 512/2, 768/2-512/2, 512,512);
cv::Mat roiImg = resizeImage(roi);
cv::Mat NV12Mat;
BGR2YUV_nv12(roiImg, NV12Mat);
ImgMat frame;
frame.data = NV12Mat.data;
frame.width = roiImg.cols;
frame.height = roiImg.rows;
frame.depth = 1;
frame.layout = HWC;
frame.inlayout = NV12;
frame.mode = IR;
config->u32FrameCnt = i;
config->u32Width = frame.width;
config->u32Height = frame.height;
frame.cfg = (long long)config;
gettimeofday(&et, NULL);
durtime = getDtimeMiliSecond(st, et);
if(durtime < 40){
usleep((40 - durtime)*1000); // 满足25hz的帧间隔
}
ret = classor->AIGOrunAsync(frame, true);
if(ret){
printf("\nERROR\n");
}
// sleep(0.04);
}
stopFlag = true;
// free(config);
}
template<typename T>
void get_folder_result(T* classor, std::string imgfolder){
int ret = 0;
std::vector<std::string> imgnames;
ret = GetDirNames(imgfolder, imgnames);
std::sort(imgnames.begin(), imgnames.end());
std::string dstpath = DSTFOLDER;
std::vector<objinfo> dets;
TenMat* mask = (TenMat*)malloc(sizeof(TenMat));
mask->data = (void*)malloc(2000*2000*3); // 尽量分配足够空间
mask->dataByte = 2000*2000*3;
float alpha = 0.5;
bool drawed = true;
int timestamp = 0;
long long cfg = 0;
int last_timestamp = 0;
GD_VIDEO_FRAME_S* config = NULL;
while (timestamp + 1 < imgnames.size())
{
sleep(0.01);
if constexpr (std::is_same<T, DETECTION_API>::value){
dets.clear();
ret = classor->AIGOgetResult(cfg, dets, true);
if(ret == -1)break;
if(ret == 0){
config = (GD_VIDEO_FRAME_S*)cfg;
cv::Mat im = cv::imread(imgnames.at(config->u32FrameCnt));
timestamp = config->u32FrameCnt;
printf("\ntimestamp: %d get result -------\n", timestamp);
last_timestamp = timestamp;
// dets.insert(dets.end(), visdets.begin(), visdets.end());
if(drawed){
printf("get_result det=%d\n", dets.size());
cv::Mat showImg;
cv::resize(im, showImg, cv::Size(config->u32Width, config->u32Height));
ret = draw_dets(showImg, dets);
char savename[100];
sprintf(savename, "%s/%08d.jpg", dstpath.c_str(), timestamp);
cv::imwrite(savename, showImg);
// drawed = false;
}
free(config);
}
if(ret == 1){
usleep(10);
}
}else if constexpr(std::is_same<T, SEGMENTION_API>::value){
ret = classor->AIGOgetResult(cfg, mask, true);
if(ret == -1)break;
if(ret == 0){
config = (GD_VIDEO_FRAME_S*)cfg;
cv::Mat im = cv::imread(imgnames.at(config->u32FrameCnt));
timestamp = config->u32FrameCnt;
printf("\ntimestamp: %d get result -------\n", timestamp);
last_timestamp = timestamp;
cv::Mat showImg;
cv::resize(im, showImg, cv::Size(config->u32Width, config->u32Height));
if(drawed){
if(mask->type == AI_FLOAT){
ret = draw_mask<float>(showImg, mask);
}else if(mask->type == AI_UINT8){
ret = draw_mask<uint8_t>(showImg, mask);
}else if(mask->type == AI_INT32){
ret = draw_mask<int32_t>(showImg, mask);
}
if(ret){
printf("draw mask error\n");
}
// drawed = false;
char savename[100];
sprintf(savename, "%s/%08d.jpg", dstpath.c_str(), timestamp);
cv::imwrite(savename, showImg);
}
free(config);
}else if(ret == 1){
usleep(10);
}
free(mask->data);
free(mask);
}else{
return;
}
}
}
template<typename T>
void run_image_(T* classor, ImgMat img){
int ret = 0;
GD_VIDEO_FRAME_S* config = (GD_VIDEO_FRAME_S*)img.cfg;
for(int i=0; i<IMAGECOUNT; i++){
// config->u32FrameCnt = i;
// img.cfg = (long long)config;
// if(i == IMAGECOUNT/2){
// printf("\n-------sleeping 60seconds--------\n");
// sleep(60);
// }
config->u32FrameCnt = i;
img.cfg = (long long)config;
ret = classor->AIGOrunAsync(img, false);
if(ret){
printf("\nERROR\n");
}
sleep(0.5);
}
stopFlag = true;
// free(config);
}
template<typename T>
void run_image_sync(T* classor, ImgMat img){
int ret = 0;
cv::Mat showImg;
bool draw = true;
std::vector<objinfo> dets;
// GD_VIDEO_FRAME_S* config = (GD_VIDEO_FRAME_S*)img.cfg;
for(int i=0; i<IMAGECOUNT; i++){
dets.clear();
ret = classor->AIGOpreprocess(img, true);
ret = classor->AIGOinfer();
ret = classor->AIGOpostprocess(dets);
if(ret){
printf("\nERROR\n");
}
sleep(0.5);
}
// if(draw){
// if(GSTREAM == NV12){
// cv::Mat nv12Mat(int(img.height*1.5), img.width, CV_8UC1, img.data);
// cv::cvtColor(nv12Mat, showImg, cv::COLOR_YUV2BGR_NV12);
// }else{
// showImg = cv::Mat(cv::Size(img.height, img.width), CV_8UC3, img.data);
// }
// ret = draw_dets(showImg, dets);
// cv::imwrite("./result.jpg", showImg);
// draw = false;
// }
}
template<typename T>
void get_result_(T* classor, ImgMat img){
int ret = 0;
cv::Mat showImg;
void* data = (void*)malloc(img.width*img.height*3);
if(UseGDVideoFrame){
GD_VIDEO_FRAME_S * config = (GD_VIDEO_FRAME_S*)img.cfg;
if(GSTREAM == NV12){
printf("memcpy Y\n");
for(int i=0; i<img.height; i++){
memcpy(data+i*img.width,
config->u64VirAddr[0]+i*config->u32Stride[0],
img.width);
}
printf("memcpy UV\n");
for(int i=0; i<img.height/2; i++){
memcpy(data+img.width*img.height + i*img.width,
config->u64VirAddr[1]+i*config->u32Stride[1],
img.width);
}
cv::Mat nv12Mat(int(img.height*1.5), img.width, CV_8UC1, data);
cv::cvtColor(nv12Mat, showImg, cv::COLOR_YUV2BGR_NV12);
}else{
showImg = cv::Mat(cv::Size(img.height, img.width), CV_8UC3, config->u64VirAddr[0]);
}
}else{
if(GSTREAM == NV12){
cv::Mat nv12Mat(int(img.height*1.5), img.width, CV_8UC1, img.data);
cv::cvtColor(nv12Mat, showImg, cv::COLOR_YUV2BGR_NV12);
}else{
showImg = cv::Mat(cv::Size(img.height, img.width), CV_8UC3, img.data);
}
}
bool drawed = false;
int timestamp = 0;
long long cfg = 0;
int last_timestamp = 0;
GD_VIDEO_FRAME_S* config = NULL;
while (timestamp+1 < IMAGECOUNT)
{
sleep(0.01);
if constexpr (std::is_same<T, DETECTION_API>::value){
std::vector<objinfo> dets;
ret = classor->AIGOgetResult(cfg, dets, true);
if(ret == -1)break;
if(ret == 0){
// dets.insert(dets.end(), visdets.begin(), visdets.end());
if(drawed){
printf("get_result det=%d\n", dets.size());
ret = draw_dets(showImg, dets);
cv::imwrite("./result.jpg", showImg);
drawed = false;
}
config = (GD_VIDEO_FRAME_S*)cfg;
timestamp = config->u32FrameCnt;
printf("\ntimestamp: %d get result -------\n", timestamp);
last_timestamp = timestamp;
}
if(ret == 1){
usleep(10);
}
}else if constexpr(std::is_same<T, SEGMENTION_API>::value){
TenMat* mask = (TenMat*)malloc(sizeof(TenMat));
// mask->width = img.width;
// mask->height = img.height;
// mask->depth = 1;
// mask->dataByte = mask->height*mask->width*sizeof(float); //
mask->data = (void*)malloc(2000*2000*3); // 尽量分配足够空间
mask->dataByte = 2000*2000*3;
float alpha = 0.5;
ret = classor->AIGOgetResult(cfg, mask, true);
if(ret == -1)break;
if(ret == 0){
if(drawed){
if(mask->type == AI_FLOAT){
ret = draw_mask<float>(showImg, mask);
}else if(mask->type == AI_UINT8){
ret = draw_mask<uint8_t>(showImg, mask);
}else if(mask->type == AI_INT32){
ret = draw_mask<int32_t>(showImg, mask);
}
if(ret){
printf("draw mask error\n");
// return ret;
}
drawed = false;
cv::imwrite("../models/Segment/result1.jpg", showImg);
}
config = (GD_VIDEO_FRAME_S*)cfg;
timestamp = config->u32FrameCnt;
printf("\ntimestamp: %d get result -------\n", timestamp);
last_timestamp = timestamp;
}else if(ret == 1){
usleep(10);
}
free(mask->data);
free(mask);
}else{
return;
}
}
}
template<typename T>
void run_image_cfg(T* detector, ImgMat img){
int ret = 0;
GD_VIDEO_FRAME_S* config = (GD_VIDEO_FRAME_S*)malloc(sizeof(GD_VIDEO_FRAME_S));
ImgMat tmpimg;
memcpy(&tmpimg, &img, sizeof(ImgMat));
for(int i=0; i<IMAGECOUNT; i++){
if(GSTREAM == RGB || GSTREAM == BGR){
config->u64VirAddr[0] = tmpimg.data;
config->u32Stride[0] = tmpimg.width;
img.data = NULL;
}else if(GSTREAM == NV12 || GSTREAM == NV21){
config->u64VirAddr[0] = tmpimg.data;
config->u64VirAddr[1] = (unsigned char*)tmpimg.data + tmpimg.width*tmpimg.height;
config->u32Stride[0] = tmpimg.width;
config->u32Stride[1] = tmpimg.width;
img.data = NULL;
}else{
printf("\nGSTREAM not support\n");
exit(1);
}
config->u32FrameCnt = i;
img.cfg = (long long)config;
// img.cfg = i;
printf("\n------cfg %p--%p--%p--\n", img.cfg, config->u64VirAddr[0], config->u64VirAddr[1]);
ret = detector->AIGOrunAsync(img, false);
if(ret){
printf("\nERROR\n");
}
// sleep(1);
}
stopFlag = true;
free(config);
}
int test_class_async(){
int ret = 0;
// bool InitWithJson = false;
// bool useGDVideo = true;
std::string imgname = "../models/Detect/quantImages/1488264581.jpg";
std::string modelname = "../models/Detect/1684x/vis_common_headers_1280x1024_bm1684x_F16_false.bmodel";
std::string paramname = "../models/Detect/1684x/vis_common_headers_1280x1024_bm1684x_F16_false.json";
// build class
DETECTION_API* detAPI = new DETECTION_API();
if(InitWithJson){
ret = detAPI->AIGOinit(modelname.c_str(), paramname.c_str(), 0);
}else{
detAPI->netWidth = 512;
detAPI->netHeight = 512;
detAPI->clsnum = 15;
// detAPI->anchors = {{10,13, 16,30, 33,23},{30,61, 62,45, 59,119},{116,90, 156,198, 373,326}};
detAPI->anchors = {{11,19, 23,30, 28,68},{62,53, 51,138, 123,130},{103,265, 217,371, 563,321}}; // x2500
// 标签标请咨询对应的算法工程师
uint32_t modelclass[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
uint32_t standerclass[] = {10000, 20000, 30000, 40000, 50000,
60000, 70000, 80000, 90000, 100000,
110000, 120000, 130000, 140000, 150000};
ret = detAPI->AIGOinit(modelname.c_str(), 0);
if(ret){
printf("init error with ret=%d\n", ret);
return ret;
}
ret = detAPI->AIGOsetLabelMap(modelclass, standerclass, sizeof(modelclass)/sizeof(uint32_t));
if(ret){
printf("setLabelMap error with ret=%d\n", ret);
return ret;
}
}
printf("get det threshold\n");
ret = detAPI->AIGOsetConfThr(0.3, 60000); // 设置 conf阈值 时调用, 仅展示调用方式
if(ret){
printf("set det threshold error\n");
return ret;
}
printf("\nclasses setted\n");
ret = detAPI->AIGOsetNMSThr(0.45); // 设置 nms阈值 时调用, 仅展示调用方式
float timecost = 0;
float durtime = 0;
struct timeval st, et;
cv::Mat detImage = cv::imread(imgname);
cv::cvtColor(detImage, detImage, cv::COLOR_BGR2RGB);
if(detImage.empty()){
printf("read image error %s\n", imgname.c_str());
return 1;
}
cv::Mat detresize;
cv::resize(detImage, detresize, cv::Size(detAPI->netWidth, detAPI->netHeight));
char* zerosInput = (char*)malloc(detresize.cols*detresize.rows*detresize.channels() * sizeof(char));
cv::Mat NV12Mat;
BGR2YUV_nv12(detresize, NV12Mat);
std::vector<objinfo> dets;
GD_VIDEO_FRAME_S* config = (GD_VIDEO_FRAME_S*)malloc(sizeof(GD_VIDEO_FRAME_S));
// 传建输入参数
ImgMat imgvis;
if(UseGDVideoFrame){
if(GSTREAM == NV12){
imgvis.data = NULL;
imgvis.inlayout = NV12;
imgvis.depth = 1;
// Y
config->u64VirAddr[0] = NV12Mat.data;
// UV
config->u64VirAddr[1] = NV12Mat.data + detresize.cols * detresize.rows;
config->u32Stride[0] = detresize.cols;
config->u32Stride[1] = detresize.cols;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = NULL;
imgvis.inlayout = RGB;
imgvis.depth = detresize.channels();
config->u64VirAddr[0] = detresize.data;
config->u32Stride[0] = detresize.cols;
}
imgvis.width = detresize.cols;
imgvis.height = detresize.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
// imgvis.timestamp = i;
imgvis.cfg = (long long)config;
}else{
if(GSTREAM == NV12){
imgvis.data = NV12Mat.data;
imgvis.inlayout = NV12;
imgvis.depth = 1;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = detresize.data;
imgvis.inlayout = RGB;
imgvis.depth = detresize.channels();
}
imgvis.width = detresize.cols;
imgvis.height = detresize.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
// imgvis.timestamp = i;
imgvis.cfg = (long long)config;
}
gettimeofday(&st, NULL);
// imgvis.data = (unsigned char*)zerosInput;
std::thread feed_data, result_data;
feed_data = std::thread(run_image_<DETECTION_API>, detAPI, imgvis);
result_data = std::thread(get_result_<DETECTION_API>, detAPI, imgvis);
feed_data.join();
result_data.join();
printf("result dets %d\n", dets.size());
gettimeofday(&et, NULL);
durtime = getDtimeMiliSecond(st, et);
printf("runAsync cost: %.3f\n", durtime/IMAGECOUNT);
timecost += durtime;
printf("avg timecost is: %f\n", timecost/IMAGECOUNT);
ret = detAPI->AIGOdeinit();
printf("\n---------------------current model size: %dx%d\n", imgvis.width, imgvis.height);
printf("\n-----------end--------------\n");
sleep(2);
}
int test_segment_async(){
int ret = 0;
std::string testimg = "../models/Segment/quantImages/s729_VL.jpg";
std::string modelname = "../models/Segment/bm1684x/seg_1280_1024_vis_gray_1280x1024_bm1684x_F16_false.bmodel";
std::string cfgfile = "../models/Segment/bm1684x/seg_1280_1024_vis_gray_1280x1024_bm1684x_F16_false.json";
SEGMENTION_API* segmemtor = new SEGMENTION_API();
ret = segmemtor->AIGOinit(modelname.c_str(), cfgfile.c_str(), 0);
if(ret){
printf("AIGO init error with ret=%d\n", ret);
return ret;
}
// building ImgMat
cv::Mat org = cv::imread(testimg, cv::IMREAD_COLOR);
cv::Mat resizeImg;
cv::resize(org, resizeImg, cv::Size(segmemtor->netWidth, segmemtor->netHeight));
cv::Mat NV12Mat;
BGR2YUV_nv12(resizeImg, NV12Mat);
GD_VIDEO_FRAME_S* config = (GD_VIDEO_FRAME_S*)malloc(sizeof(GD_VIDEO_FRAME_S));
// 传建输入参数
ImgMat imgvis;
if(UseGDVideoFrame){
if(GSTREAM == NV12){
imgvis.data = NULL;
imgvis.inlayout = NV12;
imgvis.depth = 1;
// Y
config->u64VirAddr[0] = NV12Mat.data;
// UV
config->u64VirAddr[1] = NV12Mat.data + resizeImg.cols * resizeImg.rows;
config->u32Stride[0] = resizeImg.cols;
config->u32Stride[1] = resizeImg.cols;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = NULL;
imgvis.inlayout = RGB;
imgvis.depth = resizeImg.channels();
config->u64VirAddr[0] = resizeImg.data;
config->u32Stride[0] = resizeImg.cols;
}
imgvis.width = resizeImg.cols;
imgvis.height = resizeImg.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
// imgvis.timestamp = i;
imgvis.cfg = (long long)config;
}else{
if(GSTREAM == NV12){
imgvis.data = NV12Mat.data;
imgvis.inlayout = NV12;
imgvis.depth = 1;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = resizeImg.data;
imgvis.inlayout = RGB;
imgvis.depth = resizeImg.channels();
}
imgvis.width = resizeImg.cols;
imgvis.height = resizeImg.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
// imgvis.timestamp = i;
imgvis.cfg = (long long)config;
}
float timecost = 0;
float durtime = 0;
struct timeval st, et;
gettimeofday(&st, NULL);
// imgvis.data = (unsigned char*)zerosInput;
std::thread feed_data, result_data;
// {
// feed_data = std::thread(run_image_, detAPI, imgvis);
// result_data = std::thread(get_result_, detAPI, imgvis, std::ref(dets));
// }
// if(!InitWithJson){
// // feed_data = std::thread(run_image_, detAPI, img);
// // result_data = std::thread(get_result_, detAPI, std::ref(dets));
feed_data = std::thread(run_image_<SEGMENTION_API>, segmemtor, imgvis);
result_data = std::thread(get_result_<SEGMENTION_API>, segmemtor, imgvis);
// }else{
// feed_data = std::thread(run_image_cfg, detAPI, imgvis);
// result_data = std::thread(get_result_cfg, detAPI, std::ref(dets));
// }
feed_data.join();
result_data.join();
gettimeofday(&et, NULL);
durtime = getDtimeMiliSecond(st, et);
printf("runAsync cost: %.3f\n", durtime/IMAGECOUNT);
timecost += durtime;
printf("avg timecost is: %f\n", timecost/IMAGECOUNT);
printf("\n---------------------current model size: %dx%d\n", segmemtor->netWidth, segmemtor->netHeight);
printf("\n-----------end--------------\n");
ret = segmemtor->AIGOdeinit();
sleep(2);
return ret;
}
int test_segment_sync(){
int ret = 0;
std::string testimg = "../models/Segment/quantImages/VIS/20230704_102059.MP4_20230711_195345.335.bmp";
std::string modelname = "../models/Segment/atlas200/vis_segment_dynamicShape_nv12_fp16.om";
std::string cfgfile = "../models/Segment/atlas200/vis_segment_dynamicShape_nv12_fp16.json";
SEGMENTION_API* segmemtor = new SEGMENTION_API();
ret = segmemtor->AIGOinit(modelname.c_str(), cfgfile.c_str(), 0);
if(ret){
printf("AIGO init error with ret=%d\n", ret);
return ret;
}
// building ImgMat
cv::Mat org = cv::imread(testimg, cv::IMREAD_COLOR);
cv::Mat resizeImg;
cv::resize(org, resizeImg, cv::Size(segmemtor->netWidth, segmemtor->netHeight));
cv::Mat NV12Mat;
BGR2YUV_nv12(resizeImg, NV12Mat);
GD_VIDEO_FRAME_S* config = (GD_VIDEO_FRAME_S*)malloc(sizeof(GD_VIDEO_FRAME_S));
// 传建输入参数
ImgMat imgvis;
if(UseGDVideoFrame){
if(GSTREAM == NV12){
imgvis.data = NULL;
imgvis.inlayout = NV12;
imgvis.depth = 1;
// Y
config->u64VirAddr[0] = NV12Mat.data;
// UV
config->u64VirAddr[1] = NV12Mat.data + resizeImg.cols * resizeImg.rows;
config->u32Stride[0] = resizeImg.cols;
config->u32Stride[1] = resizeImg.cols;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = NULL;
imgvis.inlayout = RGB;
imgvis.depth = resizeImg.channels();
config->u64VirAddr[0] = resizeImg.data;
config->u32Stride[0] = resizeImg.cols;
}
imgvis.width = resizeImg.cols;
imgvis.height = resizeImg.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
// imgvis.timestamp = i;
imgvis.cfg = (long long)config;
}else{
if(GSTREAM == NV12){
imgvis.data = NV12Mat.data;
imgvis.inlayout = NV12;
imgvis.depth = 1;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = resizeImg.data;
imgvis.inlayout = RGB;
imgvis.depth = resizeImg.channels();
}
imgvis.width = resizeImg.cols;
imgvis.height = resizeImg.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
// imgvis.timestamp = i;
imgvis.cfg = (long long)config;
}
float timecost = 0;
float durtime = 0;
struct timeval st, et;
gettimeofday(&st, NULL);
ret = segmemtor->AIGOpreprocess(imgvis, true);
if(ret){
printf("preprocess error\n");
return 1;
}
ret = segmemtor->AIGOinfer();
if(ret){
printf("infer error\n");
return 1;
}
TenMat* mask = (TenMat*)malloc(sizeof(TenMat));
mask->width = imgvis.width;
mask->height = imgvis.height;
mask->depth = 1;
// mask->dataByte = mask->height*mask->width*sizeof(float); //
mask->data = NULL;//(void*)malloc(mask->dataByte);
ret = segmemtor->AIGOpostprocess(mask);
if(ret){
printf("postprocess error");
return 1;
}
if(mask->type == AI_FLOAT){
ret = draw_mask<float>(resizeImg, mask);
}else if(mask->type == AI_UINT8){
ret = draw_mask<uint8_t>(resizeImg, mask);
}else if(mask->type == AI_INT32){
ret = draw_mask<int32_t>(resizeImg, mask);
}
if(ret){
printf("draw mask error\n");
return ret;
}
// cv::Mat maskcv(cv::Size(mask->height, mask->width), CV_8UC3, mask->data);
// cv::imwrite("../models/Segment/mask.jpg", maskcv);
cv::imwrite("../models/Segment/result.jpg", resizeImg);
free(mask);
free(config);
ret = segmemtor->AIGOdeinit();
if(ret){
printf("AIGOdeinit error\n");
return ret;
}
free(segmemtor);
sleep(1);
return ret;
}
int test_segment(bool useAsync){
if(useAsync){
return test_segment_async();
}else{
return test_segment_sync();
}
}
int test_sync_multi(){
int ret = 0;
int envNum = 2;
std::string visdetmodelname = "../models/Detect/hisi3403/hq.han/3403_2class_rpn.om";
std::string visdetparamname = "../models/Detect/hisi3403/hq.han/3403_2class_rpn.json";
std::vector<DETECTION_API*> apis;
std::vector<std::thread> runthreads, getthreads;
for(int i=0; i<envNum; i++){
DETECTION_API* detapi = new DETECTION_API();
ret = detapi->AIGOinit(visdetmodelname.c_str(), visdetparamname.c_str(), 0);
if(ret){
printf("init error with ret=%d\n", ret);
return ret;
}
apis.push_back(detapi);
// std::thread runthread, getthread;
// runthreads.push_back(runthread);
// getthreads.push_back(getthread);
}
std::string visdetimgname = "../models/Detect/quantImages/1488264581.jpg";
std::string vissegimgname = "../models/Segment/test_images_vl/20230704_102059.MP4_20230711_195345.335.bmp";
float timecost = 0;
float durtime = 0;
struct timeval st, et;
cv::Mat visdetImage = cv::imread(visdetimgname);
cv::cvtColor(visdetImage, visdetImage, cv::COLOR_BGR2RGB);
if(visdetImage.empty()){
printf("read image error %s\n", visdetimgname.c_str());
return 1;
}
cv::Mat visdetresize, vissegresize;
cv::resize(visdetImage, visdetresize, cv::Size(apis.at(0)->netWidth, apis.at(0)->netHeight));
// char* zerosInput = (char*)malloc(visdetresize.cols*visdetresize.rows*visdetresize.channels() * sizeof(char));
cv::Mat NV12Matvis, NV12Matir;
// convert BGR to NV12
BGR2YUV_nv12(visdetresize, NV12Matvis);
std::vector<objinfo> dets;
GD_VIDEO_FRAME_S* config = (GD_VIDEO_FRAME_S*)malloc(sizeof(GD_VIDEO_FRAME_S));
ImgMat imgvis;
if(UseGDVideoFrame){
if(GSTREAM == NV12){
imgvis.data = NULL;
imgvis.inlayout = NV12;
imgvis.depth = 1;
// Y
config->u64VirAddr[0] = NV12Matvis.data;
// UV
config->u64VirAddr[1] = NV12Matvis.data + visdetresize.cols * visdetresize.rows;
config->u32Stride[0] = visdetresize.cols;
config->u32Stride[1] = visdetresize.rows;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = NULL;
imgvis.inlayout = RGB;
imgvis.depth = visdetresize.channels();
config->u64VirAddr[0] = visdetresize.data;
config->u32Stride[0] = visdetresize.cols;
}
imgvis.width = visdetresize.cols;
imgvis.height = visdetresize.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
imgvis.timestamp = 0;
imgvis.cfg = (long long)config;
}else{
if(GSTREAM == NV12){
imgvis.data = NV12Matvis.data;
imgvis.inlayout = NV12;
imgvis.depth = 1;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = visdetresize.data;
imgvis.inlayout = RGB;
imgvis.depth = visdetresize.channels();
}
imgvis.width = visdetresize.cols;
imgvis.height = visdetresize.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
imgvis.timestamp = 0;
imgvis.cfg = (long long)config;
}
for(int i=0; i<envNum; i++){
// std::thread runthread = std::thread(run_image_sync<DETECTION_API>, apis.at(i), imgvis);
runthreads.push_back(std::thread(run_image_sync<DETECTION_API>, apis.at(i), imgvis));
}
for(int i=0; i<envNum; i++){
runthreads.at(i).join();
}
printf("result dets %d\n", dets.size());
for(DETECTION_API* api : apis){
ret = api->AIGOdeinit();
if(ret){
printf("AIGOdeinit error with ret=%d\n", ret);
return ret;
}
}
printf("sleeping\n");
sleep(15);
return 0;
}
int test_async_multi(){
int ret = 0;
int envNum = 3;
std::string visdetmodelname = "../models/Detect/atlas200/hq.han/732_VL_dynamic_nms_nv12_0609.om";
std::string visdetparamname = "../models/Detect/atlas200/hq.han/732_VL_dynamic_nms_nv12_0609.json";
std::vector<DETECTION_API*> apis;
std::vector<std::thread> runthreads, getthreads;
for(int i=0; i<envNum; i++){
DETECTION_API* detapi = new DETECTION_API();
ret = detapi->AIGOinit(visdetmodelname.c_str(), visdetparamname.c_str(), 0);
if(ret){
printf("init error with ret=%d\n", ret);
return ret;
}
apis.push_back(detapi);
// std::thread runthread, getthread;
// runthreads.push_back(runthread);
// getthreads.push_back(getthread);
}
std::string visdetimgname = "../models/Detect/quantImages/1488264581.jpg";
std::string vissegimgname = "../models/Segment/test_images_vl/20230704_102059.MP4_20230711_195345.335.bmp";
float timecost = 0;
float durtime = 0;
struct timeval st, et;
cv::Mat visdetImage = cv::imread(visdetimgname);
cv::cvtColor(visdetImage, visdetImage, cv::COLOR_BGR2RGB);
if(visdetImage.empty()){
printf("read image error %s\n", visdetimgname.c_str());
return 1;
}
cv::Mat visdetresize, vissegresize;
cv::resize(visdetImage, visdetresize, cv::Size(apis.at(0)->netWidth, apis.at(0)->netHeight));
// char* zerosInput = (char*)malloc(visdetresize.cols*visdetresize.rows*visdetresize.channels() * sizeof(char));
cv::Mat NV12Matvis, NV12Matir;
// convert BGR to NV12
BGR2YUV_nv12(visdetresize, NV12Matvis);
std::vector<objinfo> dets;
GD_VIDEO_FRAME_S* config = (GD_VIDEO_FRAME_S*)malloc(sizeof(GD_VIDEO_FRAME_S));
ImgMat imgvis;
if(UseGDVideoFrame){
if(GSTREAM == NV12){
imgvis.data = NULL;
imgvis.inlayout = NV12;
imgvis.depth = 1;
// Y
config->u64VirAddr[0] = NV12Matvis.data;
// UV
config->u64VirAddr[1] = NV12Matvis.data + visdetresize.cols * visdetresize.rows;
config->u32Stride[0] = visdetresize.cols;
config->u32Stride[1] = visdetresize.rows;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = NULL;
imgvis.inlayout = RGB;
imgvis.depth = visdetresize.channels();
config->u64VirAddr[0] = visdetresize.data;
config->u32Stride[0] = visdetresize.cols;
}
imgvis.width = visdetresize.cols;
imgvis.height = visdetresize.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
imgvis.timestamp = 0;
imgvis.cfg = (long long)config;
}else{
if(GSTREAM == NV12){
imgvis.data = NV12Matvis.data;
imgvis.inlayout = NV12;
imgvis.depth = 1;
}else if(GSTREAM == RGB || GSTREAM == BGR){
imgvis.data = visdetresize.data;
imgvis.inlayout = RGB;
imgvis.depth = visdetresize.channels();
}
imgvis.width = visdetresize.cols;
imgvis.height = visdetresize.rows;
imgvis.layout = HWC;
imgvis.mode = VIS;
imgvis.timestamp = 0;
imgvis.cfg = (long long)config;
}
for(int i=0; i<envNum; i++){
runthreads.push_back(std::thread(run_image_<DETECTION_API>, apis.at(i), imgvis));
getthreads.push_back(std::thread(get_result_<DETECTION_API>, apis.at(i), imgvis));
}
for(int i=0; i<envNum; i++){
runthreads.at(i).join();
getthreads.at(i).join();
}
printf("result dets %d\n", dets.size());
for(DETECTION_API* api : apis){
ret = api->AIGOdeinit();
if(ret){
printf("AIGOdeinit error with ret=%d\n", ret);
return ret;
}
}
}
int test_multi_class(bool useAsync){
if(useAsync){
return test_async_multi();
}else{
// for(int i=0; i<10;i++){
// test_sync_multi();
// }
return test_sync_multi();
// sleep(10);
// return 0;
}
};
int test_initdeinit(){
int ret = 0;
int envNum = 2;
std::string visdetmodelname = "../models/Detect/hisi3403/hq.han/yolov5_1280_704_2class_nv12_8_nms.om";
std::string visdetparamname = "../models/Detect/hisi3403/hq.han/yolov5_1280_704_2class_nv12_8_nms.json";
std::vector<DETECTION_API*> apis;
std::vector<std::thread> runthreads, getthreads;
// DETECTION_API* detapi = new DETECTION_API();
// ret = detapi->AIGOinit(visdetmodelname.c_str(), visdetparamname.c_str(), 0);
// if(ret){
// printf("init error with ret=%d\n", ret);
// return ret;
// }
// ret = detapi->AIGOdeinit();
// if(ret){
// printf("AIGOdeinit error with ret=%d\n", ret);
// return ret;
// }
// delete detapi;
// detapi = NULL;
for(int i=0; i<envNum; i++){
DETECTION_API* detapi = new DETECTION_API();
ret = detapi->AIGOinit(visdetmodelname.c_str(), visdetparamname.c_str(), 0);
if(ret){
printf("init error with ret=%d\n", ret);
return ret;
}
apis.push_back(detapi);
}
printf("init done sleeping");
sleep(5);
for(DETECTION_API* api : apis){
ret = api->AIGOdeinit();
if(ret){
printf("AIGOdeinit error with ret=%d\n", ret);
return ret;
}
delete api;
api = NULL;
}
printf("sleeping\n");
sleep(15);
}
int main(){
// cpu_set_t mask;
// CPU_ZERO(&mask);
// CPU_SET(0, &mask);
// if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) == -1) {
// printf("warning: could not set CPU affinity, continuing...\n");
// }
int ret = 0;
ret = Init_ACL();
// ret = test_class();
// ret = test_class_async();
// ret = test_segment(true);
ret = test_multi_class(false);
// ret = test_initdeinit();
ret= Uninit_ACL();
return ret;
}