pcduino9 ai视觉边缘计算开发套件开发使用分享
pcduino9 ai视觉边缘计算开发套件是一款针对图像分析的开发套件,套件包含采用hi3516d方案的普通ipc和pcduino9嵌入式ai视觉边缘计算模块。套件主要是通过pcduino9嵌入式ai视觉边缘计算模块,来处理从hi3516d上获取的视频流,并对视频流进行一系列的分析处理。该套件为开发者搭建了基础开发环境,提供了由pcduino9从hi3516d上获取的视频帧,开发者可在帧图上自由的实现各种图片开发,例如人脸检测、车牌检测、物体检测等ai图像分析处理功能。同时提供开放的api接口,开发者可以把在pcduino9上处理完成的信息回传到hi3516d上,并可在hi3516d上对检测到的图片进行删选,然后通过ftp输出。
基本框架
已提供环境:
1. pcduino9 从hi3516d获取视频帧
2. 把开发者分析处理后的信息回传到hi3516d上
3. 在hi3516d上对分析处理的图片进行质量筛选,选择质量优的图片通过ftp输出
开发举例:
1. 在pcduino9上对帧图进行各种开发,如:人脸检测、车牌检测、物体检测等ai图像分析处理。
2. 开发者可对通过ftp输出的分析检测的图片进行其他应用上的使用
3. ………
开放sdk资料
1. 如何获取hi3516d视频帧?
hi3516将bt1120数据传输到pcduino 9。pcduino 9通过lt8918将bt1120数据转换成mipi信号,然后接收。目前支持640x480 60fps帧数据传输。我们封装了协议层,使其类似于opencv样式。在读取帧数据时,我们将返回帧号,该帧号由3516传输,是用于数据交互的同步帧号。
#include
#include
#include c4l2.hpp
#include
using namespace std;
using namespace cv;
int main(int argc,char *argv[])
{
string dev = /dev/video2;
c4l2capture *cap = new c4l2capture;
int ret = cap->initialzer(dev);
if(ret < 0)
{
cout
if(frame.empty())
{
cout delete cap;
return 0;
}
2. 如何优化网络并运行物体检测?
pcduino9有一个四核cortex-a17 1.8ghz的cpu和一个arm mali-t764的gpu。如果您想在cpu上运行网络,可以参考ncnn;如果您想在gpu上运行网络,可以参考mace。
cpu benchmark:
物体检测:
#include
#include
#include
#include
#include
#include net.h
class noop : public ncnn::layer {};
define_layer_creator(noop)
struct object
{
cv::rect_ rect;
int label;
float prob;
};
static int detect_mobilenetv2(const cv::mat& bgr, std::vector& objects)
{
ncnn::net mobilenetv2;
mobilenetv2.register_custom_layer(silence, noop_layer_creator);
// original pretrained model from https://github.com/chuanqi305/mobilenetv2-ssdlite
// https://github.com/chuanqi305/mobilenetv2-
ssdlite/blob/master/ssdlite/voc/deploy.prototxt
mobilenetv2.load_param(mobilenetv2_ssdlite_voc.param);
mobilenetv2.load_model(mobilenetv2_ssdlite_voc.bin);
const int target_size = 300;
int img_w = bgr.cols;
int img_h = bgr.rows;
ncnn::mat in = ncnn::mat::from_pixels_resize(bgr.data, ncnn::mat::pixel_bgr,
bgr.cols, bgr.rows, target_size, target_size);
const float mean_vals[3] = {127.5f, 127.5f, 127.5f};
const float norm_vals[3] = {1.0/127.5,1.0/127.5,1.0/127.5};
in.substract_mean_normalize(mean_vals, norm_vals);
ncnn::extractor ex = mobilenetv2.create_extractor();
ex.set_light_mode(true);
ex.set_num_threads(4);
ex.input(data, in);
ncnn::mat out;
ex.extract(detection_out,out);
// printf(%d %d %d\n, out.w, out.h, out.c);
objects.clear();
for (int i=0; i{
const float* values = out.row(i);
object object;
object.label = values[0];
object.prob = values[1];
object.rect.x = values[2] * img_w;
object.rect.y = values[3] * img_h;
object.rect.width = values[4] * img_w - object.rect.x;
object.rect.height = values[5] * img_h - object.rect.y;
objects.push_back(object);
}
return 0;
}
static void draw_objects(const cv::mat& bgr, const std::vector& objects)
{
static const char* class_names[] = {background,
aeroplane, bicycle, bird, boat,
bottle, bus, car, cat, chair,
cow, diningtable, dog, horse,
motorbike, person, pottedplant,
sheep, sofa, train, tvmonitor};
cv::mat image = bgr.clone();
for (size_t i = 0; i < objects.size(); i++)
{
const object& obj = objects[i];
fprintf(stderr, %d = %.5f at %.2f %.2f %.2f x %.2f\n, obj.label, obj.prob,
obj.rect.x, obj.rect.y, obj.rect.width, obj.rect.height);
cv::rectangle(image, obj.rect, cv::scalar(255, 0, 0));
char text[256];
sprintf(text, %s %.1f%%, class_names[obj.label], obj.prob * 100);
int baseline = 0;
cv::size label_size = cv::gettextsize(text, cv::font_hershey_simplex, 0.5, 1,
&baseline);
int x = obj.rect.x;
int y = obj.rect.y - label_size.height - baseline;
if (y image.cols)
x = image.cols - label_size.width;
cv::rectangle(image, cv::rect(cv::point(x, y),
cv::size(label_size.width, label_size.height +
baseline)),
cv::scalar(255, 255, 255), cv_filled);
cv::puttext(image, text, cv::point(x, y + label_size.height),
cv::font_hershey_simplex, 0.5, cv::scalar(0, 0, 0));
}
cv::imshow(image, image);
cv::waitkey(0);
}
int main(int argc, char** argv)
{
if (argc != 2)
{
fprintf(stderr, usage: %s [imagepath]\n, argv[0]);
return -1;
}
const char* imagepath = argv[1];
cv::mat m = cv::imread(imagepath, cv_load_image_color);
if (m.empty())
{
fprintf(stderr, cv::imread %s failed\n, imagepath);
return -1;
}
std::vector objects;
detect_mobilenetv2(m, objects);
draw_objects(m, objects);
return 0;
}
3. 如何和ipc通信?
我们提供一个开放式api接口。开发人员可以将pcduino9上处理的信息返回到hi3516d,在hi3516d上对检测到的图像进行优化选择,然后通过ftp输出。
#include
#include json/json.h
#include spi_slave.hpp
using namespace std;
struct detectinfo
{
int id; //tracker id
int x; // bbox left top x
int y; // bbox left top y
int w; // bbox width
int h; // bbox height;
int syn; // sync frame count
int quality; // object quality (0 -- 100)
int confidence; // object confidence (0 -- 100)
};
void detect_out(std::vector &detectboxs, std::string &message)
{
json::value root;
json::value faces;
json::fastwriter writer;
for(int i = 0; i init() < 0)
{
printf(spi test spi_init error.\n);
return -1;
}
unsigned char *r_buf = new unsigned char[max_data_length];
unsigned char *w_buf = new unsigned char[max_data_length];
while (true)
{
std::string message;
std::vector detectboxs;
//do object detect get message
detect_out(detectboxs, message);
sof = 0;
memset(r_buf, 0, max_data_length);
strcpy((char *)w_buf,message.c_str());
int ret = rk3288_spi->spi_slave_xfer(r_buf,max_data_length, w_buf,
max_data_length, &sof);
if(ret > 0 )
{
memset(w_buf, 0, max_data_length);
if(spi_m_tx == sof)
{
std::cout << recv : << r_buf << std::endl;
usleep(30000);
}
}
else
{
std::cout << get message failed!\n;
break;
}
}
return 0;
}
硬件介绍
pcduino9嵌入式ai视觉边缘计算模块介绍
接口图
引脚图
原文链接:
http://linksprite.com/wiki/index.php?title=pcduino9_ai_visual_edge_computing_development_kit
蓄电池鼓涨的八种原因
微雪电子24QN50K14040 QFN24 测试座介绍
BlueNRG-Mesh创建蓝牙网状网络解决方案
新能源电瓶—简单精确检测电池3
超声应用处理器改善成像质量
pcDuino9 AI视觉边缘计算开发套件开发使用分享
用铁丝做“电路板”你见过吗?
小米7配置曝光:骁龙845+无线充电,依旧是最良心的国产旗舰
机械继电器故障的主要原因
谷歌大脑高级研究科学家:机器学习六年读博经历中的经验与教训
如何计算噪声的功率谱密度?
合宙Air001创意DIY——自制炫酷“地球名片”
安捷伦推出高效能6GHz X系列讯号产生器
这些 STMicroelectronics 电路板为电动汽车制造噪音
基于大气压强传感器TP015P的多功能海拔仪设计
启明云端将推出基于ESP32-C6的Wi-Fi/BLE+ LoRa®低成本单通道网关方案
国行iPhone7/7 Plus刚上市不久就集体跌价 降幅多达400元
光伏发电站:太阳能怎么发电?为什么能扶贫?
RT-Thread入门学习笔记-熟悉全局中断的操作
rk3568是什么架构的?