我的程序想将opencv行人检测迁移到别的检测中,但是我的图片是1:1,无法分解到3780维,请问这种有什么解决方法吗?
能否直接更改setSVMDetector()的默认参数3780维?
-
还是说可以更改图片大小,但我期望的原图仍要保持1:1的比例,分解3780只能得到
3780 = 2*2*3*5*7*9 # 9是9个bin
贴一段自己的检测代码
PosNum = 1997 # 有1997张正样本
NegNum = 1931
winSize = (20, 20) # 窗口刚好就是一张图的大小
blockSize = (10, 10) # 有4个块
blockStride = (5, 5) # 块步长5,5
cellSize = (5, 5) # 有4个cell
nBin = 9 # 9个bin 一共3780维是opencv固定的
# 创建hog对象
hog = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nBin)
# 创建svm对象
svm = cv2.ml.SVM_create()
# 计算hog
# 设置特征维度
featureNum = int(((20-10)/5+1)*((20-10)/5+1)*4*9) # 324就不符合3780
# 初始化特征数组
featureArray = np.zeros(((PosNum+NegNum), featureNum), np.float32) # 二维数组,通过ij访问
# 初始化标签数组
labelArray = np.zeros(((PosNum+NegNum), 1), np.int32)
# svm 监督学习 样本 标签
for i in range(0, PosNum):
fileName = r'pic_pos\\'+str(i+1)+'.jpg'
img = cv2.imread(fileName) # 图片加载
hist = hog.compute(img, (5, 5)) # 计算hog
for j in range(0, featureNum):
featureArray[i, j] = hist[j]
labelArray[i, 0] = 1
for i in range(0, NegNum):
fileName = r'pic_neg\\' + str(i + 1) + '.jpg'
img = cv2.imread(fileName) # 图片加载
hist = hog.compute(img, (2, 2)) # 计算hog
for j in range(0, featureNum):
featureArray[i+PosNum, j] = hist[j]
labelArray[i+PosNum, 0] = -1
# 负样本label=-1
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setC(0.01)
# 训练
ret = svm.train(featureArray, cv2.ml.ROW_SAMPLE, labelArray)
# 检测
# rho是svm得到的hog描述信息(不详细讨论)
alpha = np.zeros((1), np.float32) # 一行一列数组
rho = svm.getDecisionFunction(0, alpha) # get方法获取rho
print(rho)
print(alpha)
alphaArray = np.zeros((1, 1), np.float32) # 大小1*1
supportVArray = np.zeros((1, featureNum), np.float32) # 1*featureNum
resultArray = np.zeros((1, featureNum), np.float32) # 1*featureNum
alphaArray[0, 0] = alpha
resultArray = -1*alphaArray*supportVArray
# 检测
myDetect = np.zeros((325), np.float32) # 放检测结果
# myDetect = np.zeros((8101), np.uint8) # 放检测结果 我怀疑是灰度图uint8导致,因为源程序是rgb彩色图片
for i in range(0, 324):
myDetect[i] = resultArray[0, i] # 前3780来自resultArray[0,i]
# print(i, myDetect[i])
myDetect[324] = rho[0] # 最后一位来自rho[0]
# 构建hog(重要 )
myHog = cv2.HOGDescriptor()
myHog.setSVMDetector(myDetect) # 把myDetect属性传到myHog
imageSrc = cv2.imread('s2.jpg', 0) # 读取待检测图片,2:彩色图片1,灰度图0
objs = myHog.detectMultiScale(imageSrc, 0, (5, 5), (20, 20), 1.05, 2) # 对应目标的检测
x = int(objs[0][0][0])
y = int(objs[0][0][1])
w = int(objs[0][0][2])
h = int(objs[0][0][3])
cv2.rectangle(imageSrc, (x, y), (x+w, y+h), (255, 0, 0), 2) # 绘制矩形框
cv2.imshow('dst', imageSrc) # 最终结果展示
cv2.waitKey(0)
补充说明:
程序运行后出现error: (-215) checkDetectorSize() in function cv::HOGDescriptor::setSVMDetector
报错行69 myHog.setSVMDetector(myDetect) # 把myDetect属性传到myHog,目前我的猜测报错是因为维数问题,所以想着如何去更改维度