Android 鼻子模型替换 ndk开发 (人工智能)

舌头模型bug问题:
1.vivo有个5.0的版本用不了。以前也用不勒
2.小米6.0.1,相机预览非常卡顿
3.ren mi手机相册选择有问题
4.分析页面提示不对,拍照已完成
 
1.把最新的demo移植到项目中,通过bitmap的形式,能否识别图片=====不行。ncn版本不对
2.在旧项目中改代码
 
 
C++ unsigned char *是表示无bai符号字符指针的意du思。
 
方案:
1.确定camera2输入bitmap的格式
2.opencv的功能
3.必须先看下之前的代码意思。理解才行
 
 
 
解决方案:
1.在nvnn新demo上。把加载跑通。确定发现是数据源问题。
发现:ncnn新demo上,可以用旧模型在GPU上运行。新模型必须用cpu才行。坐标不一样,一点差异
去掉openCV。然后java里面转成BGR,在ncnn里面加载。但是还是不对
 
不用openCV,和下面是一样的。构建一个对象而已
cv::Mat imgSrc(height, width, CV_8UC3, (unsigned char *) yuv);
 
猜测:旧版框架识别不了量化模型。新版框架解决不了编译的问题。
 
 
源代码分析《一》
1.在java里面,把rgb转灰度图片
public static byte[] rgb2YCbCr420(int[] pixels, int width, int height) {
2.创建8位无符号的单通道---灰度图片
然后把图片转为3通道得图片
cv::Mat imgSrc(height, width, CV_8UC1, (unsigned char *) yuv);//旧版本
cv::Mat imgDst = convertTo3Channels(imgSrc);
<span style="color:#000000"><span style="color:#444444"><code><span style="color:#888888">//【1】CV_8UC1---则可以创建----8位无符号的单通道---灰度图片------grayImg</span>
<span style="color:#2b6ea1">#define CV_8UC1 CV_MAKETYPE(CV_8U,1)</span>
<span style="color:#2b6ea1">#define CV_8UC2 CV_MAKETYPE(CV_8U,2)</span>
<span style="color:#888888">//【2】CV_8UC3---则可以创建----8位无符号的三通道---RGB彩色图像---colorImg </span>
<span style="color:#2b6ea1">#define CV_8UC3 CV_MAKETYPE(CV_8U,3)</span>
<span style="color:#888888">//【3】CV_8UC4--则可以创建-----8位无符号的四通道---带透明色的RGB图像 </span>
<span style="color:#2b6ea1">#define CV_8UC4 CV_MAKETYPE(CV_8U,4)</span></code></span></span>
<span style="color:#000000"><span style="color:#444444"><code> 1<span style="color:#888888">--灰度图片--grayImg---是--单通道图像</span>
         2<span style="color:#888888">--RGB彩色图像---------是--3通道图像</span>
         3<span style="color:#888888">--带Alph通道的RGB图像--是--4通道图像</span></code></span></span>
Mat convertTo3Channels(const Mat &binImg)
{
    Mat three_channel = Mat::zeros(binImg.rows, binImg.cols, CV_8UC3);
    vector<Mat> channels;
    for(int i = 0; i < 3; i++)
    {
        channels.push_back(binImg);
    }
    merge(channels, three_channel);
    return three_channel;
}
3.BGR2GRAY
ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR2GRAY, bgr.cols,
                                             bgr.rows, 300, 300); //2.5M 320*180   1.5M 320*240
const float mean_vals[1] = {127.5};
in.substract_mean_normalize(mean_vals, 0);
 

  从名字中可以看出:

    ALPHA_8:数字为8,图形参数应该由一个字节来表示,应该是一种8位的位图

    ARGB_4444:4+4+4+4=16,图形的参数应该由两个字节来表示,应该是一种16位的位图.

    ARGB_8888:8+8+8+8=32,图形的参数应该由四个字节来表示,应该是一种32位的位图.

    RGB_565:5+6+5=16,图形的参数应该由两个字节来表示,应该是一种16位的位图.

 

    网上讲,ALPHA_8,ARGB_4444,ARGB_8888都是透明的位图,也就是所字母A代表透明.

    ARGB_4444:意味着有四个参数,即A,R,G,B,每一个参数由4bit表示.

    同理:

    ARGB_8888:意味着有四个参数,即A,R,G,B,每一个参数由8bit来表示.

    同理:

    RGB_565:意味着有三个参数,R,G,B,三个参数分别占5bit,6bit,5bit.

    我想一定该存在其他格式的BMP文件,但每个参数的值之和必须是8的整数倍,应该是这个规律.

 

 

图像通道:

Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)
 
1.so库里面可以包含so库吗?字节跳动
2.多个so库重复,相同的so库问题。

 
 
 
参数不同会奔溃的地方:
ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, bgr.cols,
                                  bgr.rows, 300, 300); //2.5M 320*180   1.5M 320*240
 
 
 

opencv之理解创建图片类型 及CV_8UC1,CV_8UC2等参数详解

  • CV_8UC1 – 单通道8 bit无符号整数
  • CV_8UC3 – 3通道8 bit为无符号整数
 
opencv
 
CV_8UC4都不行
cv::Mat imgSrc(height, width, CV_8UC3, (unsigned char *)yuv);
cv::Mat imgDst;
cv::cvtColor(imgSrc, imgDst, CV_RGB2BGR);
或者直接这个
cv::Mat imgSrc(height, width, CV_8UC3, (unsigned char *)yuv);
 
CV_8UC3靠谱点
 
阀值控制:
#define thres_val 0.7//0.9
 
2020-07-02 20:10:05.471 24711-24711/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.yuedong.sport, PID: 24711
    java.lang.IllegalArgumentException: appid不能为空
        at com.bytedance.sdk.openadsdk.utils.z.b(SourceFile:42)
        at com.bytedance.sdk.openadsdk.utils.z.a(SourceFile:20)
        at com.bytedance.sdk.openadsdk.core.h.e(SourceFile:378)
        at com.bytedance.sdk.openadsdk.core.h.o(SourceFile:373)
        at com.bytedance.sdk.openadsdk.core.v.createAdNative(SourceFile:109)
        at com.yuedong.sport.main.task.RewardVideoManager.<init>(SourceFile:35)
        at com.yuedong.sport.main.task.RewardVideoADMgr$4.<init>(SourceFile:190)
        at com.yuedong.sport.main.task.RewardVideoADMgr.getTTVideoAdManager(SourceFile:190)
        at com.yuedong.sport.main.task.RewardVideoADMgr.loadAd(SourceFile:170)
        at com.yuedong.sport.main.task.RewardVideoADMgr.b(SourceFile:18)
        at com.yuedong.sport.main.task.RewardVideoADMgr$3.onNetFinished(SourceFile:157)
        at com.yuedong.common.net.YDNetWorkBase$HttpCallBack$5.run(SourceFile:569)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:198)
        at android.app.ActivityThread.main(ActivityThread.java:7069)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:523)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:841)
2020-07-02 20:10:05.512 24711-26526/? E/CursorWindow: Could not allocate CursorWindow '/data/user/0/com.yuedong.sport/databases/downloader.db' of size 2097152 due to error -12.
2020-07-02 20:10:05.530 24711-26516/? E/zygote: Not gen hprof when OOME
2020-07-02 20:10:05.530 24711-26516/? E/AndroidRuntime: FATAL EXCEPTION: bd_tracker_w
    Process: com.yuedong.sport, PID: 24711
    java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
        at java.lang.Thread.nativeCreate(Native Method)
        at java.lang.Thread.start(Thread.java:733)
        at com.bytedance.embedapplog.a.e.handleMessage(SourceFile:131)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:198)
        at android.os.HandlerThread.run(HandlerThread.java:65)
 
=======================================================
1.把舌头的图片放在新的方式里面加载
 
 
2种方式都不不行
1.直接替换模型,不能加载压缩模型
2.新方式加载模型,耗时10s,不能商用
优化方案:暂时没有,模型加载框架ncnn。需要深入研究或者用换模型加载框darknet2ncnn 
 
 
问题:
1.直接替换模型:ncnn加载模型-1
2.在旧版本,升级ncnn
3.新方式:模型加载太慢。
 
 
 
2020-06-29 13:46:13.437 10574-10574/com.tencent.mobilenetssdncnn D/MobilenetSSDNcnn: onCreate
2020-06-29 13:46:13.439 10574-10574/com.tencent.mobilenetssdncnn D/MobilenetSSDNcnn: load_param success
2020-06-29 13:46:20.917 10574-10574/com.tencent.mobilenetssdncnn D/MobilenetSSDNcnn: load_model success
2020-06-29 13:46:20.917 10574-10574/com.tencent.mobilenetssdncnn D/MobilenetSSDNcnn: start
2020-06-29 13:46:20.917 10574-10574/com.tencent.mobilenetssdncnn D/MobilenetSSDNcnn: end
2020-06-29 13:46:20.917 10574-10574/com.tencent.mobilenetssdncnn D/MobilenetSSDNcnn: ret_init------
 
模型加载用了7s
 
 
 
 
 
 
 
旧版本:40ms
2020-06-30 18:30:20.193 20102-20151/com.jsmapp.jsm D/james: load_person_param :0
2020-06-30 18:30:20.236 20102-20151/com.jsmapp.jsm D/james: load_person_model:0
 
 
报这个错,说明libncnn.a文件报错了
 
 
发现:和ndk的版本还有关系,有很大关系
ndk.dir=/Users/mac/ndk/android-ndk-r16b
#ndk.dir=/Users/mac/ndk/android-ndk-r16b

ndk.dir=/Users/mac/Library/Android/sdk/ndk/16.1.4479499
ndk.dir=/Users/mac/Library/Android/sdk/ndk-bundle
 
 
中间生成的so库
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值