前提・実現したいこと
OpenCVを利用して、Mask理を行いたい。
####環境
・opencv4.5.x
・java 14
・ubuntu 20.04 LTS
・mask r-cnn
####利用するmodelとデータ
・mask_rcnn_inception_v2_coco_2018_01_28/frozen_inference_graph.pb
・mask_rcnn_inception_v2_coco_2018_01_28.pbtxt
・colors.txt
・mscoco_labels.names
####参考サイト
https://www.pyimagesearch.com/2018/11/19/mask-r-cnn-with-opencv
等
####質問内容
Javaでopencvを利用たマスク処理を行おうとしています。
①net#forwardを実行したあとに取得される、detection_masksを15*15のマスク画像に変換したいのです。
c++のサンプルでは、classIdの値を元に該当のデータを取得してMatデータを作成しているように見えるのですが、
Javaではどのように実装したら良いのでしょうか?変換方法がわからないので、教えて頂けませんでしょうか?
②Matデータは、100 * 90 * 15 * 15 * CV_32FC1 となっておりますが、
100件のmaskデータ、90classでの分類、15 * 15のサイズとの認識で良いのでしょうか?
c++でのサンプルでは、質問の箇所は、下記のようになっています。
for (int i = 0; i < numDetections; ++i) { float score = outDetections.at<float>(i, 2); if (score > confThreshold) { // Extract the bounding box int classId = static_cast<int>(outDetections.at<float>(i, 1)); int left = static_cast<int>(frame.cols * outDetections.at<float>(i, 3)); int top = static_cast<int>(frame.rows * outDetections.at<float>(i, 4)); int right = static_cast<int>(frame.cols * outDetections.at<float>(i, 5)); int bottom = static_cast<int>(frame.rows * outDetections.at<float>(i, 6)); left = max(0, min(left, frame.cols - 1)); top = max(0, min(top, frame.rows - 1)); right = max(0, min(right, frame.cols - 1)); bottom = max(0, min(bottom, frame.rows - 1)); Rect box = Rect(left, top, right - left + 1, bottom - top + 1); // Extract the mask for the object 質問の箇所 Mat objectMask(outMasks.size[2], outMasks.size[3], CV_32F, outMasks.ptr<float>(i, classId)); // Draw bounding box, colorize and show the mask on the image drawBox(frame, classId, score, box, objectMask); } }
よろしくお願いいたします。
Javaでの実装
java
1// NCHW 2Mat blobImage = Dnn.blobFromImage(orgImage); 3 4net.setInput(blobImage); 5 6List<Mat> outputBlobs = new ArrayList<>(); 7List<String> outputNames = Arrays.asList(new String[] { "detection_out_final", "detection_masks" }); 8 9net.forward(outputBlobs, outputNames); 10 11Mat detectionOutFinal = outputBlobs.get(0); 12Mat detectionMasks = outputBlobs.get(1); // 本件で質問させていただいている値 13 14// Output size of masks is NxCxHxW where 15// N - number of detected boxes 16// C - number of classes (excluding background) 17// HxW - segmentation shape 18// detections.size(3) == 7 19Mat detection = detectionOutFinal.reshape(1, (int) detectionOutFinal.total() / detectionOutFinal.size(3)); 20// detections.size(2) ==100 21int numDetections = detectionOutFinal.size(2); 22// masks.size(1) == 90 23int numClasses = detectionMasks.size(1); 24 25int thickness = 3; 26double threshold = 0.5; 27 28int height = orgImage.height(); 29int width = orgImage.width(); 30 31Mat dstImage = orgImage.clone(); 32Scalar color = new Scalar(0, 255, 0); 33IntStream.range(0, numDetections).filter(i -> detection.get(i, 2)[0] > threshold).forEach(i -> { 34 int classId = (int) detection.get(i, 1)[0]; 35 String className = names.get(classId); 36 double score = detection.get(i, 2)[0]; 37 double left = detection.get(i, 3)[0] * width; 38 double top = detection.get(i, 4)[0] * height; 39 double right = detection.get(i, 5)[0] * width; 40 double bottom = detection.get(i, 6)[0] * height; 41 42 left = Math.max(0, Math.min(left, height - thickness)); 43 top = Math.max(0, Math.min(top, width - thickness)); 44 right = Math.max(0, Math.min(right, height - thickness)); 45 bottom = Math.max(0, Math.min(bottom, width - thickness)); 46 47 System.out.println(score + " " + classId + " " + className + " " + left + " " + top + " " + right + " " + bottom); 48 Rect rect = new Rect(new double[] { left, top, right - left + 1, bottom - top + 1 }); 49 Imgproc.rectangle(dstImage, rect, color, thickness); 50}); 51 52HighGui.imshow("Input Image", dstImage); 53
# mask_rcnn_inception_v2_coco_2018_01_28.pbtxt 略 5928 node { 5929 name: "detection_out_final" 5930 op: "DetectionOutput" 5931 input: "variance_encoded/flatten" 5932 input: "SecondStageBoxPredictor/Reshape_1/Reshape" 5933 input: "detection_out/slice/reshape" 5934 attr { 5935 key: "background_label_id" 5936 value { 5937 i: 91 5938 } 5939 } 略 7577 node { 7578 name: "detection_masks" 7579 op: "Sigmoid" 7580 input: "SecondStageBoxPredictor_1/transpose" 7581 } 略
試したこと
detectionMasks.get(i, classId)
等...
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。