我正在尝试编写一个应用SURF对象检测的代码,所以我采用了一个openCV示例(示例3)并开始更新onCameraViewStarted()和onCameraFrame()方法,但是当我在我的Galaxy S3手机上尝试它时,我一直收到运行时错误找不到任何可以解决我的问题的方法是我的代码和我更新的内容:
public class Sample3Native extends Activity implements CvCameraViewListener{
private static final String TAG = "OCVSample::Activity";
private Mat mRgba;
private Mat mGrayMat;
private CameraBridgeViewBase mOpenCvCameraView;
Mat descriptors ;
List<Mat> descriptorsList;
FeatureDetector featureDetector;
MatOfKeyPoint keyPoints;
DescriptorExtractor descriptorExtractor;
DescriptorMatcher descriptorMatcher;**
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
// Load native library after(!) OpenCV initialization
System.loadLibrary("native_sample");
mOpenCvCameraView.enableView();
} break;
default:
{ …Run Code Online (Sandbox Code Playgroud) 我正在设置新的Tensorflow Object Detection API,以便在大面积的卫星图像中查找小物体.它工作得很好 - 它找到我想要的所有10个对象,但我也得到50-100个误报[看起来有点像目标对象的东西,但不是].
我使用的样本配置从"宠物"的教程,以微调的faster_rcnn_resnet101_coco,它们的价格模型.我从小开始,只有100个我的对象训练样例(只有1个类).我的验证集中有50个示例.每个示例都是200x200像素的图像,中心带有标记对象(~40x40).我训练直到我的精确度和损失曲线高原.
我对使用深度学习进行物体检测相对较新.提高精度的最佳策略是什么?例如硬阴性采矿?增加我的训练数据集大小?我还没有尝试他们提供的最准确的模型,faster_rcnn_inception_resnet_v2_atrous_coco因为我想保持一定的速度,但如果需要的话也会这样做.
硬负采矿似乎是合乎逻辑的一步.如果您同意,如何为我的训练数据集设置tfrecord文件?假设我为50-100个误报中的每一个制作200x200图像:
machine-learning object-detection computer-vision deep-learning tensorflow
我正在尝试使用TF Object Detection API返回在图像中找到的对象列表.
要做到这一点,我print([category_index.get(i) for i in classes[0]])用来打印已找到的对象列表或print(num_detections)显示已找到对象的数量,但在这两种情况下,它给我列表300个值或[300.]相应的值.
怎么可能只返回图像上的对象?或者,如果有一些错误,请帮助找出问题所在.
我在训练时使用了更快的RCNN模型配置文件和检查点.确保它在图像中确实检测到很少的对象,这里是:
我的代码:
import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile
from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt
from PIL import Image
from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util
PATH_TO_CKPT = 'frozen_graph/frozen_inference_graph.pb'
PATH_TO_LABELS = 'object_detection/pascal_label_map.pbtxt'
NUM_CLASSES = 7
detection_graph …Run Code Online (Sandbox Code Playgroud) 我在mobilenet和SSD之间有些困惑。据我所知,mobilenet是用于分类和识别的神经网络,而SSD是用于实现多盒检测器的框架。只有两者结合才能进行对象检测。因此,移动网络可以与resnet,inception等互换。SSD可以与RCNN互换。我的陈述正确吗?
我正在阅读YOLOv4论文,该论文经常使用术语“一级和二级目标检测”。我无法理解这两种类型的物体探测器之间有什么区别。我假设
这个假设正确吗?
artificial-intelligence machine-learning object-detection computer-vision yolo
我试图找到一种可接受的复杂性的有效方法
自从我进入图像处理世界已经有3个星期了,我已经阅读过如此多的算法(筛选,蛇,更多蛇,与傅里叶相关等),以及我不知道从何处开始的启发式算法和哪一个算法对于我想要达到的目标来说,它是"最好的".考虑到感兴趣的图像数据集非常大,我甚至不知道是否应该使用在OpenCV中实现的某些算法,或者我是否应该实现自己的算法.
总结:
先感谢您.
编辑 - 有关数据集的更多信息
每个数据集由共享相同的80K产品图像组成
显然,每个数据集中的所有图片看起来几乎与产品本身完全相同.为了使事情更加清晰,我们只考虑"监视数据集":
集合中的所有图片看起来几乎都是这样的:

(再次,除了手表本身).我想提取表带和表盘.事实上,有许多不同的手表风格,因此形状.从我到目前为止所读到的,我认为我需要一种模板算法,允许弯曲和拉伸,以便能够匹配不同风格的带子和表盘.
而不是创建三个不同的模板(表带的上半部分,表带的下部,表盘),仅创建一个并将其分成3个部分是合理的.这样,我就可以确信每个部件都是相互检测到的,例如在表带的下部不会检测到表盘.
从我遇到的所有算法/方法中,活跃的形状模型似乎是最有希望的.不幸的是,我没有设法找到一个下降实现,我不能确信这是最好的方法,以便继续自己写一个.
如果有人能指出我应该寻找的东西(算法/启发式/库/等),我会非常感激.如果您再次认为我的描述有点模糊,请随时要求更详细的描述.
我想检测图像中的徽标以便将其删除,我有一个想法,即寻找具有大量像素然后移除的对象,另一个想法是遍历所有白色像素(我已经颠倒了我的图像)和寻找形成一个大区域的像素,然后删除这个区域,是否有任何算法比这更好,opencv中的哪些方法将帮助我检测大像素数的对象.
我目前正致力于增强现实游戏.游戏使用的控制器(我在这里谈论的是物理输入设备)是单色的,长方形的纸片.我必须在摄像机的捕获流中检测该矩形的位置,旋转和大小.检测应在尺度上不变,并且在沿X和Y轴旋转时不变.
在用户将纸张移开或朝向相机移动的情况下,需要比例不变性.我不需要知道矩形的距离,因此尺度不变性转换为尺寸不变性.
如果用户沿其局部X和/或Y轴倾斜矩形,则需要旋转不变性.这种旋转将纸张的形状从矩形变为梯形.在这种情况下,面向对象的边界框可用于测量纸张的尺寸.
开始时有一个校准步骤.窗口显示摄像机源,用户必须单击矩形.单击时,鼠标指向的像素颜色将作为参考颜色.帧被转换为HSV颜色空间以改善颜色区分.我有6个滑块可以调整每个通道的上限和下限.这些阈值用于对图像进行二值化(使用opencv inRange函数).
在那之后,我正在侵蚀和扩展二进制图像以消除噪声并联合nerby块(使用opencv erode和dilate函数).
下一步是findContours在二进制图像中查找轮廓(使用opencv 函数).这些轮廓用于检测最小的方向矩形(使用opencv minAreaRect函数).作为最终结果,我正在使用面积最大的矩形.
该程序的简短结论:
您可能已经注意到,我没有利用有关纸张实际形状的知识,仅仅因为我不知道如何正确使用这些信息.
我也考虑过使用opencv的跟踪算法.但有三个原因使我无法使用它们:
这是一个 - 相对 - 好的捕获(侵蚀和扩张后的二进制图像)

如何提高检测效果,尤其是更能抵抗照明变化?
以下是一些用于测试的原始图像.
你不能只使用更厚的材料吗?
是的,我可以而且我已经做过了(不幸的是我现在无法访问这些内容).但问题仍然存在.即使我使用像cartboard这样的材料.它不像纸一样容易弯曲,但仍然可以弯曲它.
你如何获得矩形的大小,旋转和位置?opencv
的minAreaRect功能返回一个RotatedRect对象.该对象包含我需要的所有数据.
注意
由于矩形是单色的,因此无法区分顶部和底部或左右.这意味着旋转始终在[0, 180]我的目的范围内完全正常.矩形两边的比例总是如此w:h > 2:1.如果矩形是方形,则旋转范围将变为[0, 90],但这可以认为是无关紧要的.
正如评论中所建议的那样,我将尝试使用直方图均衡来减少亮度问题并查看ORB,SURF和SIFT.
我会更新进展情况.
我有一个项目来检测和计算从海滩拍摄的航拍图像中的密封幼崽(动物).与成年海豹相比,海豹幼崽是黑色和小的,棕色和大.
一些密封箱重叠/部分遮挡.海滩颜色接近黄色但是有一些黑色的岩石增加了探测难度.
什么样的描述符最适合我的项目?HOG,SIFT,Haar一样的功能?
我在问这个问题的理论部分.我想要实现我的项目,第一步应该选择能够最能代表对象的正确描述符,然后(结合几个弱特征,不是必要的?)使用机器学习方法训练分类器,如boost/SVM/neural_network,我是对的?
示例图片:
我正在从我的图像检测器算法中收集结果.所以基本上我所做的是,从一组图像(大小为320 x 480),我将通过它运行一个64x128的滑动窗口,并且还在许多预定义的比例下运行.
我明白那个:
但真正的否定者呢?这些真正的否定因为我的分类器给了我负面结果的所有窗口吗?这听起来很奇怪,因为我一次将一个小窗口(64x128)滑动4个像素,并且我在检测中使用了大约8个不同的比例.如果我这样做,那么每张图片都会有很多真正的底片.
或者我准备一组纯负面图像(根本没有物体/人物),我只是滑动,如果这些图像中有一个或多个正面检测,我会将其视为假阴性,副反之?
这是一个示例图像(绿色作为基本事实)
object-detection ×10
opencv ×6
c++ ×2
tensorflow ×2
android ×1
image ×1
java ×1
python ×1
yolo ×1