1.介绍我们的CVPR论文
2.用MFC编写一个指针型时钟程序,时钟还具有闹钟和倒计时功能,求能在mfc里执行的整个文件
3.手把手教你Typora图床配置(Typora+PicGo+SMMS)
4.ONNX一本通:综述&使用&源码分析(持续更新)
介绍我们的CVPR论文
我们的新论文,Noise-Tolerant Paradigm for Training Face Recognition CNNs,在CVPR 获得终审接收通知,现正式向大家介绍。源码照明方大师
CVPR,全称IEEE Conference on Computer Vision and Pattern Recognition,是计算机视觉与模式识别领域的顶级会议,其影响力在Google学术的最新排名中位居计算机学科第一。
训练人脸模型时,深度学习方法对数据集的规模和质量有极高要求。MS-Celeb-1M数据集虽包含大量人脸图像,但错误标注率高达近%,大规模数据集的审核优化成本巨大。这导致人脸领域的竞争集中在有能力获取大规模高质量数据集的企业。
我们专注于人脸识别问题多年,研究成果在各大公开测试集中与一线厂商保持相近水平。然而,数据质量和规模是我们面临的最大瓶颈。于是,我们尝试降低对高质量数据的依赖,新论文即介绍一种创新方法。
该方法不再依赖人工优化数据集,而是利用人脸识别模型特性,在训练过程中识别并自动调节错误标注样本的权重。通过文中提出的cos[公式]分布判断错误标注可能性,最终在低质量数据上得到的模型识别准确率优于高质量数据训练的模型。这意味着,建站之星php源码研究人员可通过互联网构建超大规模但质量相对较低的数据集,提升人脸识别模型性能。
评审专家一致认可新方法的创新性和实用性,尽管论文准备仓促,实验与理论完整性受到一定挑战。我们已采纳反馈,近期将在Arxiv和GitHub上发布论文与源码,敬请期待。
用MFC编写一个指针型时钟程序,时钟还具有闹钟和倒计时功能,求能在mfc里执行的整个文件
一、程序窗口设计步骤
(1)用AppWizard生成一个名为Clock的单文档(SDI)程序框架。为了简化应用程序,在第四步时去掉Docking toolbar和Initial status bar选择项(不删除也可),其他各选项均可用缺省设置。
(2)编辑项目的菜单资源,在主框架窗口的主菜单(IDR_MAINFRAME)中添加一个名为“时钟控制”的下拉菜单。在“时钟控制”菜单中添加三个菜单选项“启动时钟”、“停止时钟”和“时间设置”。并在菜单属性项中设定“启动时钟”菜单的ID标号为ID_START,“停止时钟”菜单的ID标号为ID_STOP,“时间设置”菜单的ID标号为ID_SETTIME。为了简化菜单,可删除系统原有的“文件”、“编辑”菜单项。
(3)利用ClassWizard为视图类添加菜单命令处理函数。进入ClassWizard的Message Maps选项卡,选择Class Name项为CClockView类,c源码生成exe在Object IDs列表框中分别选择新添加的菜单选项的ID,在Messages列表框中选择COMMAND,按下Add Function按钮添加成员函数。ClassWizard会为“启动时钟”、“停止时钟”和“时间设置”菜单选项添加相应的消息响应函数OnStart ( )、OnStop ( )和OnSettime ( )。
(4)利用ClassWizard为视图类添加定时器和鼠标消息处理函数。进入ClassWizard的Message Maps选项卡,选择Class Name项为 CClockView类,在Messages列表框中分别选择定时器消息WM_TIMER和鼠标消息WM_LBUTIONDOWN,按下Add Function按钮添加成员函数。ClassWizard会添加相应的定时器和鼠标消息响应函数OnTimer和OnLButtonDown。
(5)使用Developer Studio菜单的Insert / Resource…选项调出Insert Source对话框,为项目添加新的对话框资源。在对话框属性中,修改对话框名为“时间设定”。在对话框中增加用来输入年、月、日、时、分、秒的编辑框控件。
通过控件属性,将年、月、日、时、分、python的property源码秒等编辑控件的ID改为IDC_YEAR、IDC_MONTH、IDC_DAY、IDC_HOUR、IDC_MINUTE和IDC_SECOND。
(6)利用ClassWizard自动建立对话框类。进入ClassWizard后,弹出一个对话框询问是否要为该对话框模板建立类。按下“OK”按钮,会弹出New Class对话框,在Name栏填写对话框类的名称CSetTimeDlg后按“OK”按钮,即可为对话框创建一个对应的类。
(7) 利用ClassWizard为对话框类添加与各控件对应的数据成员。选择MemberVariables选项卡,确保Class Name项为对话框CSetTimeDlg类,然后在选项卡下方的窗口中选择各控件的ID并按下“Add Variable…”按钮,为其添加对应成员变量。
控制ID
变量类型
变量名
变量范围
IDC_YEAR
int
m_Year
0~
IDC_MONTH
int
m_Month
1~
IDC_DAY
int
m_Day
1~
IDC_HOUR
int
m_Hour
0~
IDC_MINUTE
int
m_Minute
0~
IDC_SECOND
int
m_Second
0~
最后一列为变量取值范围。
(8)编辑工程的图标资源,在Resource View选项窗口中修改Icon结点所包含的主框架图标(IDR_MAINFRAME)。此步非必须。
(9)完成以上工作后,即可修改程序框架,添加必要的代码。
二、主要源代码:
按以下步骤向视图类(CClockView)添加下列数据成员及成员函数。
(1) 添加表示年、月、微厦完整源码日、时、分、秒的变量。
int year;
int month;
int day;
int hour;
int minute;
int second;
(2) 添加秒表的计数变量。
int watch;
(3) 添加时钟的画笔及画刷变量。
CPen m_HouPen, m_MinPen, m_SecPen; // 各种针的画笔
CBrush m_MarkBrush; // 表盘标记的画刷
(4) 添加时钟控制变量。
CPoint m_Center; // 表的中心
double m_Radius; // 表的半径
CPoint m_Hour [2], m_OldHour [2]; // 时针当前及前一次位置
CPoint m_Minute [2], m_OldMin [2]; // 分针当前及前一次位置
CPoint m_Second [2], m_OldSec [2]; // 秒针当前及前一次位置
(5) 添加秒表的两个按钮位置变量。
CRect m_WatchStart;
CRect m_WatchStop;
(6) 添加两个函数,计算时钟各指针位置。
void SetClock (int hour, int minute, int second);
CPoint GetPoint (int nLenth, int nValue);
(7) 在视图类构造函数中增加初始化语句,之前加上头文件
#include<ctime>
CClockView::CClockView()
{
// 设定时间
char time[];
SYSTEMTIME st;
GetLocalTime(&st);
day = st.wDay;
hour = st.wHour;
minute = st.wMinute;
month = st.wMonth;
second = st.wSecond;
year = st.wYear;
// 设定画笔/画刷
m_HouPen. CreatePen (PS_SOLID, 5, RGB (, 0, 0) ); // 时针画笔
m_MinPen. CreatePen (PS_SOLID, 3, RGB (0, 0, ) ); // 分针画笔
m_SecPen. CreatePen (PS_SOLID, 1, RGB (0, 0, 0) ); // 秒针画笔
m_MarkBrush. CreateSolidBrush (RGB (, , 0) );
// 设定表心位置
m_Center. x = ;
m_Center. y = ;
// 设定时钟半径
m_Radius = ;
// 计算指针位置
SetClock (hour, minute, second);
// 设定秒表计数器及按钮位置
watch = 0;
m_WatchStart = CRect (, , , ); // 启动钮
m_WatchStop = CRect (, , , ); // 停止钮
}
编写指针位置计算函数SetClock和GetPoint。首先在ClockView. cpp文件头部添加下面两行代码,以便进行数学计算。
#include "math.h"
#define PI 3.
然后添加下列代码:
//计算各个指针位置的函数
void CClockView::SetClock(int hour, int minute, int second)
{
hour=hour*5;
hour=hour+minute/;
// 保存时针原位置
m_OldHour [0] = m_Hour[0];
m_OldHour [1] = m_Hour[1];
// 计算时针当前位置
m_Hour[0]= GetPoint(int(m_Radius/2),hour);
m_Hour[1]= GetPoint(7,hour + );
// 保存分针原位置
m_OldMin[0]= m_Minute[0];
m_OldMin[1]= m_Minute[1];
// 计算分针当前位置
m_Minute[0]=GetPoint(int(m_Radius*7/), minute);
m_Minute[1]=GetPoint(, minute+);
// 保存秒针原位置
m_OldSec [0] = m_Second [0];
m_OldSec [1] = m_Second [1];
// 计算秒针当前位置
m_Second [0]= GetPoint (int(m_Radius * 8/), second);
m_Second [1] = GetPoint (, second + );
}
// 计算以表心为原点的指针的端点位置
CPoint CClockView ::GetPoint (int nLenth, int nValue)
{
CPoint p;
double angle = nValue* PI /-PI/2;
p.x = m_Center.x + (int) (nLenth * cos(angle));
p.y = m_Center.y + (int) (nLenth * sin(angle));
return p;
}
绘制表盘上的标记、时针、分针和秒针,并显示数字时钟及秒表,在OnDraw函数中添加下面代码:
void CClockView::OnDraw(CDC* pDC)
{
CClockDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// 绘制表盘上的标记
pDC->SelectObject(m_MarkBrush);
int k=0;
for(int i=0;i<;i++)
{
CPoint pt=GetPoint(,i);
if (i%5==0)
{
//显示表盘上的数字
CString str[]={ "","1","2","3","4","5","6","7","8","9","",""};
pDC->TextOut(pt.x-5,pt.y-5,str[k]);
k++;
}else
{
//显示数字之间的圆圈
pDC->Ellipse(pt.x-2,pt.y-2,pt.x+2,pt.y+2);
}
}
// 画时针
pDC->SelectObject (m_HouPen);
if (m_OldHour[0]!= m_Hour[0])
{
// 用白色覆盖原位置时针
pDC->SetROP2(R2_WHITE);
pDC->MoveTo(m_OldHour [0] );
pDC->LineTo(m_OldHour [1] );
pDC->SetROP2(R2_COPYPEN);
//时针绘制
pDC->MoveTo(m_Hour[0]);
pDC->LineTo(m_Hour[1]);
}
else
{
// 时针绘制
pDC->MoveTo(m_Hour[0]);
pDC->LineTo(m_Hour[1]);
}
// 画分针
pDC->SelectObject (m_MinPen);
if (m_OldMin[0]!=m_Minute[0])
{
// 用白色覆盖原位置分针
pDC->SetROP2(R2_WHITE);
pDC->MoveTo(m_OldMin[0]);
pDC->LineTo(m_OldMin[1]);
pDC->SetROP2(R2_COPYPEN);
// 分针绘制
pDC->MoveTo(m_Minute[0]);
pDC->LineTo(m_Minute[1]);
}
else
{
// 分针绘制
pDC->MoveTo(m_Minute[0]);
pDC->LineTo(m_Minute[1]);
}
// 用白色覆盖原位置秒针
pDC->SelectObject(m_SecPen);
pDC->SetROP2(R2_WHITE);
pDC->MoveTo(m_OldSec[0]);
pDC->LineTo(m_OldSec[1]);
pDC->SetROP2(R2_COPYPEN);
// 秒针绘制
pDC->MoveTo(m_Second[0]);
pDC->LineTo(m_Second[1]);
// 数字时钟显示
pDC->SelectStockObject(WHITE_BRUSH);
pDC->Rectangle(,,,);
pDC->TextOut(,,"当前时间");
CString m_Date,m_Time;
m_Date.Format ("% 4d年%4d月%4d日",year,month,day);
pDC->TextOut(,,m_Date);
m_Time.Format("%4d点%4d分%4d秒",hour,minute,second);
pDC->TextOut(,,m_Time);
// 秒表显示
pDC->Rectangle(,,,);
pDC->TextOut(,,"秒 表");
int minSec= watch%;
int Sec=(watch/)%;
int Min=(watch/)/;
m_Time.Format("% d: % d: % d",Min,Sec,minSec);
pDC->TextOut(,,m_Time);
pDC->Rectangle(&m_WatchStart);
pDC->Rectangle(&m_WatchStop);
pDC->TextOut(m_WatchStart.left + ,m_WatchStart.top + 5,"启动");
pDC->TextOut(m_WatchStop.left + ,m_WatchStop.top + 5,"停止");
}
请注意将表示时间的整数转换为CString字符串类型的方法以及秒表的显示方法。另外,watch计数器以1/秒为计数单位,每达到则秒数加1。
按照下列步骤增加时钟控制代码:
修改Onstart和OnStop函数,设置时钟运动消息。按比正常时钟快倍的假定,ms产生一个消息。本程序采用和正常时间同步,即ms产生一个消息, 其代码为:
void CClockView::OnStart()
{
SetTimer (1, , NULL);
}
void CClockView::OnStop()
{
KillTimer (1);
}
修改OnTimer函数,正确计算并处理年、月、日、时、分、秒等变量的联动变化 ,其代码为:
void CClockView::OnTimer(UINT nIDEvent)
{
if (nIDEvent == 1)
{
second++; // 秒增加
if (second>)
{
second=0;
minute++; // 分增加
}
if (minute>)
{
minute= 0;
hour++; // 小时增加
}
if (hour>)
{
hour=0;
day++; // 日增加
}
switch(month)
{
case 1: // 大月
case 3:
case 5:
case 7:
case 8:
case :
case :
if (day>)
{
day= 1;
month++; // 月增加
}
break;
case 4: // 小月
case 6:
case 9:
case :
if (day>)
{
day=1;
month++; // 月增加
}
break;
case 2:
if (year%4 ==0 && day>) // 润二月
{
day=1;
month++; // 月增加
}
if (year%4!=0 && day>) // 二月
{
day=1;
month++;
}
break;
}
if (month > )
{
// 年增加
year++;
month=1;
}
SetClock (hour, minute, second);
Invalidate (false);
}
// 秒表定时器消息处理
if (nIDEvent == 2)
{
watch++;
Invalidate (false);
}
CView::OnTimer(nIDEvent);
}
添加时间设置对话框代码。
首先在ClockView. cpp文件头部添加下列语句:
#include “SetTimeDlg. h”
在时间设定对话框类的构造函数中,做如下修改,将初始日期设为当前时间,之前要加上头文件
#include<ctime>
CSetTimeDlg::CSetTimeDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSetTimeDlg::IDD, pParent)
{
//||AFX_DATA_INIT(CSetTimeDlg)
char time[];
SYSTEMTIME st;
GetLocalTime(&st);
m_Day = st.wDay;
m_Hour = st.wHour;
m_Minute = st.wMinute;
m_Month = st.wMonth;
m_Second = st.wSecond;
m_Year = st.wYear;// ||AFX_DATA_INIT
}
最后,在OnSettime函数中添加代码如下:
void CClockView::OnSettime()
{
CSetTimeDlg SetDlg;
if (SetDlg.DoModal ()==IDOK)
{
year=SetDlg.m_Year;
month= SetDlg.m_Month;
day= SetDlg.m_Day;
hour=SetDlg.m_Hour;
minute=SetDlg.m_Minute;
second=SetDlg.m_Second;
}
// 计算各指针位置
SetClock (hour,minute,second);
Invalidate (true);
}
按以下步骤设计秒表控制程序:
在OnLButtonDown函数中增加下列内容,以便响应单击秒表启动、停止框所发出的消息:
void CClockView::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_WatchStart.PtInRect(point))
{
watch=0;
SetTimer(2,,NULL);
}
if (m_WatchStop.PtInRect(point))
{
KillTimer (2);
}
CView::OnLButtonDown(nFlags, point);
}
编译,连接,运行程序。
运行结果:
手把手教你Typora图床配置(Typora+PicGo+SMMS)
现在大部分自媒体平台和博客平台的文章编辑器多为Markdown和富文本模式。Markdown的使用深受我们互联网从业人员的喜爱,使用频繁。直接在平台上编辑,虽然有草稿箱实时保存,但是调整起来很不方便或者网络不佳的时候,一切编写排版都付之东流。所以我们一般写文章还是喜欢在本地电脑将文字、版本等编辑调整好再上传到平台上。
图床是什么?举个例子,我们平时喜欢刷微博、刷抖音快手以及头条。我们肯定会看到文章或图集里的,特别是哪些带平台水印的。那些肯定不是你们手机相册里的吧,是平台服务器上存储的而且有这唯一的链接,而这个链接指向的空间就叫图床。
我们之所以搭建图床的目的是:在日常使用Typora写文档的时候,资源都是保存到本地目录,这样不论在分享文档给他人或者上传平台的时候,因为资源是本地的,每次分享都要附带资源包,每次上传文档资源是找不到的,需要一个个再手动上传至平台。还有一个原因就是各平台现如今都有外链防盗的功能。所以才需要使用在线图床解决这个扰人的问题。
所以很多自媒体从业者和博主都使用本地文档编辑器+图床的方式编写文章,在需要发布时直接将内容复制粘贴上传即可,根据链接直接在线读取显示。
1、Typora的下载安装
官网地址:typoraio.cn/
Typora是一款由Abner Lee开发的轻量级Markdown编辑器,与其他Markdown编辑器不同的是,Typora没有采用源代码和预览双栏显示的方式,而是采用所见即所得的编辑方式,实现了即时预览的功能,但也可切换至源代码编辑模式。
2、SMMS图床服务
SMMS图床分海外和国内,如果海外访问不了,可以通过国内进行注册申请
海外网址:sm.ms/
国内网址:smms.app/
注册:点击Sign Up进行SMMS的账号注册
获取Token密钥(后面上传需要用)
登录SMMS系统,找到用户信息,选择API Token,点击Generate Secret Token生成token
3、Typora上传服务配置3-1 下载PicGo工具
PicGO是一款功能非常强大的图床管理工具,支持SM.MS、腾讯COS、GitHub图床、七牛云图床、Imgur图床、阿里云OSS、gitee、华为云OBS等多种图床平台。
使用这款工具,第一是因为功能非常强大,支持插件扩展,融合多平台图床服务;第二则是Typora设置中可选工具之一就是PicGo工具。
下载地址:molunerfinn.com/PicGo/
在PicGo中配置服务API Token,如果你是SM.MS服务就配置SMMS的token,如果是阿里云OSS的服务就配置阿里云的token(token就是上面第2个文章标题下生成的API Token)
3-2 配置Typora上传服务
打开设置-图像
验证上传(点击上图中的“验证上传选项”),经测试一直显示验证上传失败,但是实际上可以上传,为Typora Bug,可忽略。
至此Typora图床配置完成,我们打开Typora新建一个markdown文档,进行粘贴时就会自动上传至SM.MS服务器中。我们可以通过SM.MS查看或者PicGo查看
5、总结
由于我们经常使用的编辑器模式为markdown格式,不同于富文本,在编辑内容时,markdown采取固定的排版方式,无需关注具体的编辑,只需要专注内容创作即可。
声明:本文借鉴原文链接(如果大家想配置阿里云OSS和华为云OBS,可参考以下作者文章进行配置) 请你喝杯 Java blog.cto.com/u_... 炒香菇的书呆子 blog.csdn.net/qq_...
ONNX一本通:综述&使用&源码分析(持续更新)
ONNX详解:功能概述、Python API应用与源码解析
ONNX的核心功能集中在模型定义、算子操作、序列化与反序列化,以及模型验证上。它主要通过onnx-runtime实现运行时支持,包括图优化和平台特定的算子库。模型转换工具如tf、pytorch和mindspore的FMK工具包负责各自框架模型至ONNX的转换。ONNX Python API实战
场景一:构建线性回归模型,基础操作演示了API的使用。
场景二至四:包括为op添加常量参数、属性以及控制流(尽管控制流在正式模型中应尽量避免)。
场景五和后续:涉及for循环和自定义算子的添加,如Cos算子,涉及算子定义、添加到算子集、Python实现等步骤。
源码分析
onnx.checker:负责模型和元素的检查,cpp代码中实现具体检查逻辑。
onnx.compose、onnx.defs、onnx.helper等:提供模型构建、算子定义和辅助函数。
onnx.numpy_helper:处理numpy数组与onnx tensor的转换。
onnx.reference:提供Python实现的op推理功能。
onnx.shape_inference:进行模型的形状推断。
onnx.version_converter:处理不同op_set_version的转换。
转换实践
ONNX支持将tf、pytorch和mindspore的模型转换为ONNX格式,同时也有ONNX到TensorRT、MNN和MS-Lite等其他格式的转换选项。总结
ONNX提供了一个统一的IR(中间表示)框架,通过Python API构建模型,支持算子定义的检查和模型的序列化。同时,它利用numpy实现基础算子,便于模型的正确性验证,并支持不同框架模型之间的转换。2024-12-22 13:50
2024-12-22 13:42
2024-12-22 13:37
2024-12-22 12:45
2024-12-22 12:29
2024-12-22 12:12