-
- Steps
- 模拟单个牙齿和标记,并通过集合变形插入牙模中
- 在tooth alignment前后记录牙齿标记
- 通过采用3D thin plate spline技术生产新牙模 > 同时使用到牙冠和牙根的数据,对一颗完整的牙齿进行重排,而mesh数据中仅有牙冠,因此不适用。
-
本文主要针对虚拟正畸中的关键步骤:特征提取(牙齿表面特征:尖(cusps),grooves(凹槽),边缘(incisal edges),marginal ridges(边缘脊),occlusal surface boundary(咬合面边界)
虚拟正畸中输入数据是对3D mesh分割后所得到的单颗牙齿的集合。- 尖(cusps): Watershed Algorithm
- 其他特征: 基于曲率和二维截面聚类 > 这篇文章对牙齿表面的各个特征的特征讲的蛮详细的
Lian, C., Wang, L., Wu, T. H., Wang, F., Yap, P. T., Ko, C. C., & Shen, D. (2020). Deep multi-scale mesh feature learning for automated labeling of raw dental surfaces from 3D intraoral scanners. IEEE transactions on medical imaging, 39(7), 2440-2450. > Precisely labeling teeth on digitalized 3D dental surface models is the precondition for tooth position rearrangements in orthodontic treatment planning
基于深度学习 MeshSegNet, 具有开源代码,是专门针对牙齿的,将牙齿加上labal,是自动排牙所必备的一步
-
和上面那篇差不多
-
方法:The Signed Feature Histogram
需要输入训练数据后再检测
主要是为了识别出牙齿中的特征点,也是自动排牙所必备的一步 -
采用卷积神经网络
分割完后加上标签,输入多层感知机,进行位置重排
使用PointNet
提取特征点
Some command of mysql
许多网站程序例如WordPress都需要用到数据库。记录一下数据库的各种常用命令。
新建数据库 - create database example_database;
删除数据库 - drop database example_database;
新建用户 - CREATE USER 'example_user' IDENTIFIED BY 'enter_a_password_here';
给用户授权某个数据库所有权限 - GRANT ALL ON example_database.* TO 'example_user' IDENTIFIED BY 'enter_a_password_here';
安装完Mysql 或 MariaDB后,为了设置root密码,首先执行 mysql_secure_installation
Numerical Optimization chapter3
Symbols count in article: 1.2k Reading time ≈ 1 mins.

This method depend on both the direction \(p_k\) and the step length \(a_k\)
\(x_{k+1}=x_k+a_kp_k\)
\(wolfe\; conditions \begin{cases} sufficient\;decrease\;condition \\ curvature\;conditions\end{cases}\)
\(\begin{cases} f(x_k+a_kp_k) \leq f(x_k)+c_1a_k\nabla f_k^Tp_k \\ \nabla f(k_k+a_kp_k)^T\geq c_2\nabla f_k^T p_k\end{cases}\)
lemma 3.1
\(P_K\)is a desent direction at \(x_k\) and assume that f is bounded below along the ray {\(x_k+\alpha p_k|\alpha >0\)},if \(0<c_1<c_2<1\),show that there exist intervals of step lengths satisfying the wolfe conditions and the strong wolfe conditions.
proof:
since \(\phi(\alpha)=f(x_k+\alpha p_k)\) is bounded below,the \(l(\alpha)=f(x_k)+\alpha _k c_1\nabla f_k ^Tp_k\) must intersect with the \(\phi (\alpha)\),thus there exist a \(\alpha '\)
\(f(x_k+\alpha' p_k)=f(x_k)+\alpha ' c_1\nabla f_k ^Tp_k\)
then the \(\alpha <\alpha'\)meet the sufficient decrease condition.
since the mean value theorem,\(f(x_k+\alpha' p_k)-f(x_k)=\alpha'\nabla f(x_k+\alpha ''p_k)^Tp_k\;\;\;\alpha ''\in (0,\alpha')\)
thus \(\nabla f(x_k+\alpha ''p_k)^Tp_k=c_1\nabla f_k ^Tp_k>c_2\nabla f_k ^Tp_k\),which meet the curvature condition,because the left of the inequalities is negetive ,so the strong wolfe conditions hold in the same interval.
The coldstein conditions
Numerical Optimization chapter2
Symbols count in article: 1.7k Reading time ≈ 2 mins.

unconstained optimization of smooth function
- line search method
- Newton direction
- Quasi-Newton
Rates Of Convergence
- \(Q-linear\) \[\frac{||x_{k+1}-x_{k}^{*}||}{||x_{k}-x^*||}\leq r \qquad for\; all\; k\; sufficiently\; large\]
- \(Q-superlinear\) \[\lim_{k \to \infty}\frac{||x_{k+1}-x_{k}^{*}||}{||x_{k}-x^*||}=0\]
- \(Q-quadratic\) \[\frac{||x_{k+1}-x_{k}^{*}||}{||x_{k}-x^*||^2}\leq M \qquad for\; all\; k\; sufficiently\; large\]
the transformation from derived class to base class

派生类向基类转换的可访问性主要有如下三种:
1. 当D共有继承B时,用户代码才能使用派生类向基类的转换。
此处理解关键是用户代码
1
2
3
4
5class sample : public sample_base{
//member
};
sample s1;
sample_base *s2=&s1;
无论D什么方式继承B,D的成员函数和友元都能使用派生类像基类转换
此时成员函数为func,而友元为func_frid()1
2
3
4
5
6
7
8
9class D : public B{
void func{
//member function
}
friend void func_frid();
};
void D::func_frid(){
//functions
}如果D继承自B的方式是公有有或者受保护,则D的派生类成员和友元可以使用D向B的类型转换。
此处的主要矛盾转换向了D派生类的(成员和友元)
,也就是说变成了派生再派生此时的E中可以使用转换1
2
3
4
5
6class D : protected B{
//members
};
class E : public D{
//members
};
dynamic binding

只有在指针或者引用调用虚函数时候才会发生动态绑定,这时候编译器可以通过动态类型的对象来选择。
1
2
3
4
5
6
7
8
9
10
11
12
13class A {
virtual void func(){
//...
}
};
class B : public A{
void func(){
//...
}
};
B b_obj;
A *a_obj=&b_obj;
a_obj->func();//发生了动态绑定,调用的是B::func()
Template

首先,类模板定义 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17template<typename T> class MyTemplateClass{
//在类模板自己的作用域中,可以直接使用模板名字而不提供实参,实参指的是`<typename T>`这种
MyTemplateClass ret_func(const MyTemplateClass &customclass){
return customclass;
}
//当实例化是T会被输入的实参而代替
T cal_fun(T temp){
return T*T;
}
//在类外定义,类内定义的函数时默认内联的
T out_func(T temp);
};
//类外定义成员函数的写法
template<typename T>
T MyTemplateClass<T>::cal_func(T temp){
return T+T;
}
dynamic memory

智能指针有3类 1. shared_ptr
: 多个指针指向一个对象,此类指针有一个关联的计数器,称为引用计数,表示指向这个对象的指针的数,当没有指针指向这个对象后,就会自动释放自己管理的对象。 2. unique_ptr
: 只有这个指针指向这个对象 3. weak_ptr
: 指向shared_ptr
管理的对象
对于动态指针中p
与p.get()
根据代码运行 1
2
3
4int main() {
shared_ptr<string> p1 = make_shared<string>("rua");
cout << p1 << endl << p1.get() << endl;
}
为什么要用动态对象呢?
1. 可以共享数据,允许多个对象一起用
associative-container
Const and mutable

有时候,在常量const
的成员函数中,由于const
意味着其中的常量指针this
指向一个常量对象,由此而导致了在该成员函数中,无法修改类中的数据成员,此时在类的数据成员之前加关键词mutable
修饰则可以使得该数据成员在任何时候都可以改变。 例如C++ primer 5th中P245页的代码所示 1
2
3
4
5
6
7
8
9
10class Screen {
public:
void some_member() const; //指向常量对象的常量指针
private:
mutable size_t access_ctr;// mutable关键词修饰,在任何时候都可以实现可以被改变
//other variables
};
void Screen::some_member() const{
++access+ctr; //虽然是const,但由于mutable的存在,依旧可以被改变
}