作者:捕鱼达人qq怎么刷金币 | 来源:互联网 | 2023-10-09 22:07
如下代码的不断调整可使得神经网络和数据集共同进步5分类成功分成了7分类,也就是说模型的能力将不属于该类的分出去l但是人们还是利用模型将这些图片强行的5分类,那么一定地不准确的也
如下代码的不断调整可使得神经网络和数据集共同进步
5分类成功分成了7分类,也就是说模型的能力将不属于该类的分出去l 但是人们还是利用模型将这些图片强行的5分类,那么一定地不准确的
也就是说本来这个图片既不是0分类和1分类,但是人们训练好模型后 识别出来只有5个结果,自然就只有5个结果,虽然这个图片哪个都不是但是还是会被认为是5个类别的一个,也就是说模型没有错而是,你强行的将其范围分类方位给缩小了也就是说你提供的数据标注,只是你所想到的那几类,但是模型完全可以将你的这种标注的所有分类都找出来 但是如果你没有可视化的话,你却不知道还有几类你根本没有想到 但是模型想到l, 所以说,模型是真的能分开,而是人类的意愿导致了模型的错误, 所以接下来将纠正这样的错误,采取模型和数据集合共同进步的方式 来解决大量的标注时间和模型达不到人类想要的结果
上面总结一句话,数据集中有一些是我们不需要的类的数据 下面将其剔除
如下图是训练数据网络能让图片分类的真实分布可以看到这个数据集应该标注为7类 而不是5类 所以,将7类的分割线上的任意两个点的坐标带入我的数据集矫正类别方法中,将数据级分为7类,去除我们不想要的类别,继续使用新标注的数据级或者说使用去除杂类的数据集合 放入自己的图片到项目中,更改readmist中的数据处理代码 生成图片标签和路径的txt文件 首先执行代码的train 训练后执行readminst中的数据人工分类cls_data() 会得到如图类似的分类 在使用鼠标在空白处选取两个点作为分割线(顺时针或者反之,分割线与分割线要挨着), 这样的格式
[ 3.35 , - 6.27 , 10.72 , - 22.7 , 8.56 , - 2.69 , 21.89 , - 3.40 , 9.37 , 2.08 , 22.34 , 4.95 , 7.75 , 6.38 , 17.57 , 15.95 , 6.12 , 9.25 , 12.28 , 19.05 , - 1.25 , 7.34 , - 8.1 , 21.92 , - 3.15 , - 5.79 , - 9.0 , - 17.15 ]
记录完后关闭图像, 将上面的数据输入到控制台 回车后就会生成,一个json文件,文件中已经将图片的地址按照上面的分割线分别存在列表中,最后只需要自己将路径读取出来再写一个 图片分别存放在相应的文件中即可完成,人工分类
代码在 https://download.csdn.net/download/weixin_32759777/12328521
可以使用如下代码进行人工分割
def get_path_and_dir ( path) : with open ( path, "r" ) as f: data= json. load( f) for i , one_path_list in enumerate ( data[ "new_path_data" ] ) : makedirs( "image" + str ( i) ) for one_path in one_path_list: with open ( one_path, "rb" ) as f: data= f. read( ) with open ( "image" + str ( i) + "/" + one_path. split( "/" ) [ - 1 ] , "wb" ) as f: f. write( data) if __name__ == '__main__' : get_path_and_dir( "/home/chenyang/PycharmProjects/arc_face/new_data_path.json" )
分类后发现图片不是按照分割线分开的而是按照上图这样分开的 检查后发现图片每个文件中都前面的都一样,也就是说我们的cls_data() 写的有问题 问题出现的原因就是所有的图片都会小于AB两条线
所以所有的造成了混淆看上去就像同心圆 实际的同心圆应该如下图 所示 所以重写 cls_data()
基本就是分为四种情况,按照上图的方向
c_x_0起点分割线上的外点x减内点x c_x_1终点分割线上的外点x减内点x x_0_1 两个分割线焦点x 带入x值到起点分割线y的值real_0 带入x值到终点分割线y的值real_1 y实际值
c_x_0 >x_0_1 c_x_1 >x_0_1 y y>real_0
c_x_1 real_1y>real_0
c_x_0 c_x_1 >x_0_1 y y c_x_1 y>real_1 y
代码如下
def cls_data ( ) : data= dis_data( ) draw_json( data[ 0 ] , data[ 1 ] ) print ( "请在图中输入分割线的坐标(线上两个点坐标共计四个值),保留两位小数" ) print ( "输入的线要按照分割的顺序输入" ) line_data= json. loads( input ( "请按照说明输入数据这样的格式[1,2,3,4,5,65]" ) ) line_data= numpy. array( line_data) . reshape( - 1 , 4 ) . tolist( ) k_b_list= [ ] cls_index_path= [ ] for xy in line_data: k_b = y_kx_b( xy) cls_index_path. append( [ ] ) k_b_list. append( k_b) k_b_list. append( k_b_list[ 0 ] ) cls_index_path. append( [ ] ) index_x= - 1 set_path= [ ] for x, y in zip ( data[ 0 ] , data[ 1 ] ) : try : index_x+= 1 k_b_index= 0 for _ in range ( len ( k_b_list) ) : k_b_index+= 1 real_0= k_b_list[ k_b_index- 1 ] [ 0 ] * x+ k_b_list[ k_b_index- 1 ] [ 1 ] real_1= k_b_list[ k_b_index] [ 0 ] * x+ k_b_list[ k_b_index] [ 1 ] c_x_0= k_b_list[ k_b_index- 1 ] [ 2 ] c_x_1= k_b_list[ k_b_index] [ 2 ] x_0_1= ( k_b_list[ k_b_index] [ 1 ] - k_b_list[ k_b_index- 1 ] [ 1 ] ) / ( k_b_list[ k_b_index- 1 ] [ 0 ] - k_b_list[ k_b_index] [ 0 ] )