基本的な考え方:プロジェクトのニーズにより、Android Studioで最新のdarknet yolo4の認識効果をテストする必要があります。ここでは、構成環境と開発プロセスを記録します。ブログの最後に、2つのBaiduリンクが提供されます。 Javaはopencv DNNのyolo4モデルを呼び出し、androidはC ++を使用してopencv DNNのyolo4モデルを呼び出します。
1.使用可能なAndroid Studioプロジェクトを作成します。その構成は基本的に次のとおりです。
次に、環境コンパイルツールを構成します。私の環境ツール構成ツールは次のとおりです。
Androidフォンに次のように表示されます:(期間中に発生したその他の問題は、自分で解決してください)
2. opencv公式Webサイトにアクセスして、opencvに対応するAndroidコードをダウンロードします。
axel -n 100 https://jaist.dl.sourceforge.net/project/opencvlibrary/4.4.0/opencv-4.4.0-android-sdk.zip
解凍されたディレクトリ構造は次のとおりです。
ubuntu @ ubuntu:OpenCV-android-sdk $ tree -L 2
。
├──ライセンス
├──README.android
├──サンプル
│├──15パズル
│├──build.gradle
│├──カメラ校正
│├──色ブロブ検出
│├──顔面検出
│├──のGradle
│├──gradle.properties
│├──gradlew
│├──gradlew.bat
│├──画像操作
│├──settings.gradle
│├──チュートリアル-1- camerapreview
│├ ──チュートリアル-2- mixedprocessing
│└──チュートリアル-3- cameracontrol
└──SDK
├──build.gradle
├──など
├──ジャワ
├──libcxx_helper
└──ネイティブ
15ディレクトリ、8ファイル
次に、Android Studioでopencv4.4.0モジュールのインポートを開始します---> file ---> new ---> import Module
次に、対応するプロジェクトに対応するパッケージを設定します。
Android Studioでopencv4.4によってyolo4を呼び出すための構成ファイルのダウンロードアドレスは、https://github.com/opencv/opencv_extra/blob/4.4.0/testdata/dnnです。
モデルをダウンロードするには、yoloの公式Webサイトにアクセスしてください。
Android Sudioのコードファイルは、\ app \ src \ main \ java \ com \ example \ testyolo4 \ MainActivity.javaです。
package com.example.androidyolo;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.dnn.Dnn;
import org.opencv.dnn.Net;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.io.File;
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("opencv_java4");
}
private String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
boolean load = OpenCVLoader.initDebug();
if (load) {
Log.i("MainActivity", "Open CV Libraries loaded...");
} else {
Log.i("MainActivity", "Open CV Libraries not loaded...");
}
//
String image_file = sdPath + File.separator + "1.png";//IMG_9452.JPG
Mat im = Imgcodecs.imread(image_file, Imgcodecs.IMREAD_COLOR);
// get a new Frame
// Mat im = inputFrame.rgba();
String[] names = new String[]{
"aeroplane","bicycle","bird","boat","bottle",
"bus","car","cat","chair","cow",
"diningtable","dog","horse","motorbike","person",
"pottedplant","sheep","sofa","train","tvmonitor"
};
///\\storage\\sdcard0\\360\\yolov4-tiny.cfg
String cfg_path= sdPath + File.separator + "yolov4.cfg";
String model_path= sdPath + File.separator + "yolov4.weights";
Net net = Dnn.readNetFromDarknet(cfg_path, model_path);
if ( net.empty() ) {
System.out.println("Reading Net error");
}
if( im.empty() ) {
System.out.println("Reading Image error");
}
Mat frame = new Mat();
Size sz1 = new Size(im.cols(),im.rows());
Imgproc.resize(im, frame, sz1);
Mat resized = new Mat();
Size sz = new Size(416,416);
Imgproc.resize(im, resized, sz);
float scale = 1.0F / 255.0F;
Mat inputBlob = Dnn.blobFromImage(im, scale, sz, new Scalar(0), false, false);
net.setInput(inputBlob, "data");//
Mat detectionMat = net.forward();//Mat detectionMat = net.forward("detection_out");
if( detectionMat.empty() ) {
System.out.println("No result");
}
for (int i = 0; i < detectionMat.rows(); i++)
{
int probability_index = 5;
int size = (int) (detectionMat.cols() * detectionMat.channels());
float[] data = new float[size];
detectionMat.get(i, 0, data);
float confidence = -1;
int objectClass = -1;
for (int j=0; j < detectionMat.cols();j++)
{
if (j>=probability_index && confidence<data[j])
{
confidence = data[j];
objectClass = j-probability_index;
}
}
if (confidence > 0.3)
{
System.out.println("Result Object: "+i);
for (int j=0; j < detectionMat.cols();j++)
System.out.print(" "+j+":"+ data[j]);
System.out.println("");
float x = data[0];
float y = data[1];
float width = data[2];
float height = data[3];
float xLeftBottom = (x - width / 2) * frame.cols();
float yLeftBottom = (y - height / 2) * frame.rows();
float xRightTop = (x + width / 2) * frame.cols();
float yRightTop = (y + height / 2) * frame.rows();
System.out.println("Class: "+ names[objectClass]);
System.out.println("Confidence: "+confidence);
System.out.println("ROI: "+xLeftBottom+" "+yLeftBottom+" "+xRightTop+" "+yRightTop+"\n");
Imgproc.rectangle(frame, new Point(xLeftBottom, yLeftBottom),
new Point(xRightTop,yRightTop),new Scalar(0, 255, 0),3);
}
}
Imgcodecs.imwrite(sdPath + File.separator +"out.jpg", frame );
///
}
}
出力画像
パッケージ化されたAndroid StudioとOpencv4.4.0プロジェクトを提供する
リンク:https
://pan.baidu.com/s/1iEvY9yYJzXn3ZcBFD4n40A抽出コード:uyx1
補足:Androidのc ++モジュールでopencv4.4.0を使用する場合は、次の手順を実行するだけで済みます。opencv4.4.0のSDK全体をインポートする必要はありません。libsパッケージと対応するインクルードヘッダーファイルをインポートするだけです。対応するAndroid cmakefile.txtおよび対応するgradleを構成する必要があります):
対応するファイルを対応するディレクトリにコピーします。フォルダがない場合は、自分で作成してください。
対応する他のファイルの変更と構成は次のとおりです。
CMakefile.txtファイルの変更された内容は次のとおりです。
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.1)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
# 添加opencv的头文件目录
include_directories(${CMAKE_SOURCE_DIR}/include)
# 导入opencv的so
add_library(libopencv_java4 SHARED IMPORTED)
set_target_properties(libopencv_java4 PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/../jniLibs/libs/${ANDROID_ABI}/libopencv_java4.so)
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
native-lib.cpp )
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
native-lib
jnigraphics
libopencv_java4 # 链接opencv的so
# Links the target library to the log library
# included in the NDK.
${log-lib} )
対応するGradleファイルの変更。
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
arguments '-DANDROID=c++_shared'
abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
}
}
}
sourceSets{
main{
jniLibs.srcDirs=["src/main/jniLibs/libs"]
}
}
その後、Android C ++モデルでopencvを呼び出すことができます。
以下は、opencv4.4.0を使用してC ++ yolo4を呼び出すandroidの例です(このコードでは、C ++のリストデータ構造を使用して、コードロジックをAndroidに渡されるリスト構造にカプセル化し、参照できます~~)
リンク:https
://pan.baidu.com/s/1PDHyaCGTwq-LE95vv4yAxg抽出コード:k2yn