jjzjj

c++ - 用于图像故障检测的逻辑回归

coder 2024-02-12 原文

基本上,我想使用逻辑回归检测图像中的错误。我希望得到关于我的方法的反馈,如下所示:

用于训练:

  1. 取一小部分标记为“坏”和“好”的图像
  2. 对它们进行灰度化处理,然后将它们分解成一系列 5*5 像素的片段
  3. 计算每个片段的像素强度直方图
  4. 将直方图连同标签传递给逻辑回归类进行训练
  5. 将整个图像分成 5*5 个片段,并为每个片段预测“好”/“坏”。

使用 sigmod 函数,线性回归方程为:

1/ (1 - e^(xθ))

其中 x 是输入值,theta (θ) 是权重。我使用梯度下降来训练网络。我的代码是:

void LogisticRegression::Train(float **trainingSet,float *labels, int m)
{
    float tempThetaValues[m_NumberOfWeights];

    for (int iteration = 0; iteration < 10000; ++iteration)
    {
        // Reset the temp values for theta.
        memset(tempThetaValues,0,m_NumberOfWeights*sizeof(float));

        float error = 0.0f;

        // For each training set in the example
        for (int trainingExample = 0; trainingExample < m; ++trainingExample)
        {           
            float * x = trainingSet[trainingExample];
            float y = labels[trainingExample];

            // Partial derivative of the cost function.
            float h = Hypothesis(x) - y;
            for (int i =0; i < m_NumberOfWeights; ++i)
            {
                tempThetaValues[i] += h*x[i];
            }
            float cost = h-y; //Actual J(theta), Cost(x,y), keeps giving NaN use MSE for now
            error += cost*cost;
        }

        // Update the weights using batch gradient desent.
        for (int theta = 0; theta < m_NumberOfWeights; ++theta)
        {
            m_pWeights[theta] = m_pWeights[theta] - 0.1f*tempThetaValues[theta];
        }

        printf("Cost on iteration[%d] = %f\n",iteration,error);
    }
}

其中 sigmoid 和假设是使用以下方法计算的:

float LogisticRegression::Sigmoid(float z) const
{
    return 1.0f/(1.0f+exp(-z));
}

float LogisticRegression::Hypothesis(float *x) const
{
    float z = 0.0f;
    for (int index = 0; index < m_NumberOfWeights; ++index)
    {
        z += m_pWeights[index]*x[index];
    }
    return Sigmoid(z);
}

最终的预测是:

int LogisticRegression::Predict(float *x)
{
    return Hypothesis(x) > 0.5f;
}

由于我们使用的是强度直方图,因此输入和权重数组是 255 个元素。我的希望是将它用在诸如有瘀伤的苹果图片之类的东西上,并用它来识别被擦伤的部分。整个 brused 和 apple 训练集的(归一化)直方图看起来像这样:

对于苹果的“好”部分 (y=0):

对于苹果的“坏”部分 (y=1):

我不是 100% 相信单独使用强度会产生我想要的结果,但即便如此,在明显可分离的数据集上使用它也不起作用。为了测试它,我给它传递了一个带标签的全白和全黑图像。然后我在下面的小图像上运行它:

即使在这张图片上,它也无法将任何部分识别为黑色。

使用 MSE 我看到成本正在向下收敛到一个点,它仍然存在,对于黑白测试,它开始时成本约为 250,最终稳定在 100。苹果 block 开始时大约为 4000,最终稳定在 1600。

我不知道问题出在哪里。

是否方法合理但实现失败?逻辑回归是用于此任务的错误算法吗?梯度体面不够健壮吗?

最佳答案

我忘了回答这个...基本上问题出在我的直方图中,生成时没有将 memset 设置为 0。至于灰度图像的逻辑回归是否是一个好的解决方案的整体问题,答案没有。灰度只是没有提供足够的信息来进行良好的分类。使用所有颜色 channel 要好一些,但我认为我试图解决的问题(苹果上的瘀伤)的复杂性对于简单的逻辑回归本身来说有点过分。你可以在我的博客上看到结果here .

关于c++ - 用于图像故障检测的逻辑回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33976729/

有关c++ - 用于图像故障检测的逻辑回归的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  4. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  5. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  6. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  7. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  8. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  9. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  10. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

随机推荐