【发布时间】:2018-04-26 06:40:58
【问题描述】:
这是一个问题,我不知道如何处理。
问题行在svm.trainAuto(param1,....)。我读了 400 个 imgs 并存储在trainningSet(200 个有车牌,200 个没有),它们的标签存储在类中,我想训练一个 SVM 模型但trainAuto 方法捕获异常。 trainningData 和 clusses 不为空,我已经检查过了,
package com.xjtu.svm;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.ml.Ml;
import org.opencv.ml.SVM;
public class ReadInPlate {
private final static int amount=200;
private static int width;
private static int height;
/**
* @param hasPlate
* @param label
*/
public static void readInPlateImg(Mat mat, List<Byte>label) {
String path="E:/HasPlate";
File file=new File(path);
File[] fileArray=file.listFiles();
if(fileArray.length==0) {
System.out.println("empty file");
}
for(int i=0; i<amount; i++) {
path=fileArray[i].getAbsolutePath();
Mat tmp=Imgcodecs.imread(path);
width=tmp.cols();
height=tmp.rows();
Mat feature=Feature.extractFeature(tmp);
mat.push_back(feature);
label.add((byte)1);
}
}
/**
* @param noPlate
* @param label
*/
public static void readInNoPlateImg(Mat mat, List<Byte>label) {
String path="E:/NoPlate";
File file=new File(path);
File[] fileArray=file.listFiles();
if(fileArray.length==0) {
System.out.println("empty file");
}
for(int i=0; i<amount; i++) {
path=fileArray[i].getAbsolutePath();
Mat tmp=Imgcodecs.imread(path);
Mat feature=Feature.extractFeature(tmp);
mat.push_back(feature);
label.add((byte)0);
}
}
public static void main(String []args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
List<Byte> label=new ArrayList<Byte>();
Mat trainningSet=new Mat();
Mat trainningData=new Mat();
Mat classes=new Mat(2*amount, 1, CvType.CV_8UC1);
Mat clusses=new Mat();
readInPlateImg(trainningSet, label);
readInNoPlateImg(trainningSet, label);
trainningSet.convertTo(trainningData, CvType.CV_32F);
for(int i=0; i<label.size(); i++) {
byte[] t=new byte[1];
t[0]=label.get(i);
classes.put(i, 0, t);
}
classes.convertTo(clusses, CvType.CV_32F);
SVM svm =SVM.create();
svm.setType(SVM.C_SVC);
svm.setKernel(SVM.LINEAR);
svm.setDegree(0.1);
svm.setGamma(1);
svm.setCoef0(0);
svm.setC(1);
System.out.println("trainningDataType: "+CvType.typeToString(trainningData.type()));
System.out.println("classesType: "+CvType.typeToString(clusses.type()));
System.out.println(trainningData.rows()==clusses.rows());
*svm.trainAuto(trainningData, //exception catched in this line
Ml.ROW_SAMPLE,
clusses,
10,
SVM.getDefaultGridPtr(SVM.C),
SVM.getDefaultGridPtr(SVM.GAMMA),
SVM.getDefaultGridPtr(SVM.P),
SVM.getDefaultGridPtr(SVM.NU),
SVM.getDefaultGridPtr(SVM.COEF),
SVM.getDefaultGridPtr(SVM.DEGREE),
true);*
System.out.println("classes.size(): "+classes.rows()+", "+classes.cols());
System.out.println(label.size()+", "+trainningSet.rows()+", "+trainningSet.cols());
}
}
Exception in thread "main" java.lang.Exception: unknown exception
at org.opencv.ml.SVM.trainAuto_0(Native Method)
at org.opencv.ml.SVM.trainAuto(SVM.java:145)
at com.xjtu.svm.ReadInPlate.main(ReadInPlate.java:106)
【问题讨论】:
-
请完成堆栈跟踪
-
这个堆栈跟踪没有用。堆栈跟踪中是否有更多信息?究竟是什么问题?我看到您正在调用一个方法,但我们不知道方法签名或任何其他(技术)信息在幕后发生。您尝试过什么来解决这个问题?这个问题实质上是:“我有问题,请解决。”
-
@mustabelMo @Dudemanword ,我添加了所有代码,请帮我找出问题,非常感谢
-
@yadongzhou 你必须完成stacktrace,否则没人知道是什么问题
-
@mustabelMo @Dudemanword,问题解决了,是因为数据格式不符合opencv的要求