用Python复现二战德军enigma密码机

目录
  • 前言
  • 代码
  • 总结

前言

我们知道,enigma机是德军二战中重要的情报加密机器,其有许多特点。

首先,它是一台加解密一体机

其次,它有排己性,虽然多次输入同一明文可能得到不同的密文,但明文a永远不可能加密为其本身。这样完美掩盖本身明文的性质是由反射板造成的,但也最终在图灵的利用下给了enigma机致命一击。

enigma机先后有多种不同的型号,如3转轮型,5转轮型,5转轮选3转轮型等等。本人对三转轮enigma机进行的程序复现。需要说明的是,由于enigma机的精华部分是转子和反射板,所以代码中也着重复现了这一过程,而对接线板进行了省略。毕竟,enigma机的厉害之处在于其疯狂到近乎变态的做到了几乎“一字一换表”,而接线板只是做简单的字母替换,本身并无新意。

代码

话不多说,直接上代码:(一些使用说明见文末)

# -*- coding: utf-8 -*-
"""
Created on Tue Jan  4 09:40:42 2022
@author: burger
"""

from numpy import random
import numpy as np
import time

arr = np.array(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'])

#输入一个批次号
num = input('请输入您要使用的enigma机批次号XXX-XXX-XXX(示例:123-456-789)\n')
filename = 'enigma_code_book.txt'
with open(filename) as file_object:
    context = file_object.read()

if num in context:
    number = context.find(num)
    arr_a=context[(number+12):(number+38)]  #一号转轮
    arr_b=context[(number+39):(number+65)]  #二号转轮
    arr_c=context[(number+66):(number+92)]  #三号转轮
    arr_d=context[(number+93):(number+119)]  #反射板

else:
    arr_a=random.permutation(arr)
    arr_b=random.permutation(arr)
    arr_c=random.permutation(arr)
    arr_d=random.permutation(arr)
    with open(filename,'a') as file_object:
        str_1='\n'
        str_1=str_1+num
        str_1+=' '
        for i in range(len(arr_a)):
            str_1+=arr_a[i]
        str_1+=' '
        for i in range(len(arr_b)):
            str_1+=arr_b[i]
        str_1+=' '
        for i in range(len(arr_c)):
            str_1+=arr_c[i]
        str_1+=' '
        for i in range(len(arr_d)):
            str_1+=arr_d[i]
        str_1+=' '
        file_object.write(str_1)
zzwz=input('请输入初始转子位置(规范为三个英文字母中间加两个英文逗号)\n eg: a,b,c\n')#zzwz即转子位置
zz_1=list(zzwz)[0]
zz_2=list(zzwz)[2]
zz_3=list(zzwz)[4]
num_zz_1=ord(zz_1)-97
num_zz_2=ord(zz_2)-97
num_zz_3=ord(zz_3)-97

def main():
    global num_zz_1
    global num_zz_2
    global num_zz_3
    text=input('请输入加密内容\n')
    for n in range(len(text)):
        string=list(text)[n]
        print(zhuanhuan(string),end='')
        num_zz_1+=1
        if num_zz_1 == 26:
            num_zz_1 = 0
            num_zz_2+=1
            if num_zz_2 == 26:
                num_zz_2=0
                num_zz_3+=1
                if num_zz_3 == 26:
                    num_zz_3 = 0
def zhuanhuan(letter):
    #a号转轮
    #右侧有26个触点
    #生成a轮的随机连线方式
    a_1_1=False
    a_1_2=False
    a_1_3=False
    a_1_4=False
    a_1_5=False
    a_1_6=False
    a_1_7=False
    a_1_8=False
    a_1_9=False
    a_1_10=False
    a_1_11=False
    a_1_12=False
    a_1_13=False
    a_1_14=False
    a_1_15=False
    a_1_16=False
    a_1_17=False
    a_1_18=False
    a_1_19=False
    a_1_20=False
    a_1_21=False
    a_1_22=False
    a_1_23=False
    a_1_24=False
    a_1_25=False
    a_1_26=False
    if letter == 'a':
        a_1_1 = True
    if letter == 'b':
        a_1_2 = True
    elif letter == 'c':
        a_1_3 = True
    elif letter == 'd':
        a_1_4 = True
    elif letter == 'e':
        a_1_5 = True
    elif letter == 'f':
        a_1_6 = True
    elif letter == 'g':
        a_1_7 = True
    elif letter == 'h':
        a_1_8 = True
    elif letter == 'i':
        a_1_9 = True
    elif letter == 'j':
        a_1_10 = True
    elif letter == 'k':
        a_1_11 = True
    elif letter == 'l':
        a_1_12 = True
    elif letter == 'm':
        a_1_13 = True
    elif letter == 'n':
        a_1_14 = True
    elif letter == 'o':
        a_1_15 = True
    elif letter == 'p':
        a_1_16 = True
    elif letter == 'q':
        a_1_17 = True
    elif letter == 'r':
        a_1_18 = True
    elif letter == 's':
        a_1_19 = True
    elif letter == 't':
        a_1_20 = True
    elif letter == 'u':
        a_1_21 = True
    elif letter == 'v':
        a_1_22 = True
    elif letter == 'w':
        a_1_23 = True
    elif letter == 'x':
        a_1_24 = True
    elif letter == 'y':
        a_1_25 = True
    elif letter == 'z':
        a_1_26 = True
    a_1_first=[a_1_1,a_1_2,a_1_3,a_1_4,a_1_5,a_1_6,a_1_7,a_1_8,a_1_9,a_1_10,a_1_11,a_1_12,a_1_13,a_1_14,a_1_15,a_1_16,a_1_17,a_1_18,a_1_19,a_1_20,a_1_21,a_1_22,a_1_23,a_1_24,a_1_25,a_1_26]
#    print(a_1_first)
    a_1=[False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False]
    for i in range(26):
        global num_zz_1
        a_1[i]=a_1_first[(num_zz_1-26)+i]
#    print(a_1)
    #左侧有26个触点
    a_2_1=False
    a_2_2=False
    a_2_3=False
    a_2_4=False
    a_2_5=False
    a_2_6=False
    a_2_7=False
    a_2_8=False
    a_2_9=False
    a_2_10=False
    a_2_11=False
    a_2_12=False
    a_2_13=False
    a_2_14=False
    a_2_15=False
    a_2_16=False
    a_2_17=False
    a_2_18=False
    a_2_19=False
    a_2_20=False
    a_2_21=False
    a_2_22=False
    a_2_23=False
    a_2_24=False
    a_2_25=False
    a_2_26=False
    a_2=[a_2_1,a_2_2,a_2_3,a_2_4,a_2_5,a_2_6,a_2_7,a_2_8,a_2_9,a_2_10,a_2_11,a_2_12,a_2_13,a_2_14,a_2_15,a_2_16,a_2_17,a_2_18,a_2_19,a_2_20,a_2_21,a_2_22,a_2_23,a_2_24,a_2_25,a_2_26]
    #构建a号转轮左右对应关系

    for i in range(26):
        a_2[i]=a_1[ord(arr_a[i])-97]
#    print(a_2)
    #此时,a号转轮建模成功    

    #b号转轮
    #右侧有26个触点
    b_1_1=False
    b_1_2=False
    b_1_3=False
    b_1_4=False
    b_1_5=False
    b_1_6=False
    b_1_7=False
    b_1_8=False
    b_1_9=False
    b_1_10=False
    b_1_11=False
    b_1_12=False
    b_1_13=False
    b_1_14=False
    b_1_15=False
    b_1_16=False
    b_1_17=False
    b_1_18=False
    b_1_19=False
    b_1_20=False
    b_1_21=False
    b_1_22=False
    b_1_23=False
    b_1_24=False
    b_1_25=False
    b_1_26=False
    b_1=[b_1_1,b_1_2,b_1_3,b_1_4,b_1_5,b_1_6,b_1_7,b_1_8,b_1_9,b_1_10,b_1_11,b_1_12,b_1_13,b_1_14,b_1_15,b_1_16,b_1_17,b_1_18,b_1_19,b_1_20,b_1_21,b_1_22,b_1_23,b_1_24,b_1_25,b_1_26]

    #a轮传给b轮
    for i in range(26):
        global num_zz_2
        b_1[i]=a_2[((num_zz_2)-26)+i]
#    print(b_1)
    #左侧有26个触点
    b_2_1=False
    b_2_2=False
    b_2_3=False
    b_2_4=False
    b_2_5=False
    b_2_6=False
    b_2_7=False
    b_2_8=False
    b_2_9=False
    b_2_10=False
    b_2_11=False
    b_2_12=False
    b_2_13=False
    b_2_14=False
    b_2_15=False
    b_2_16=False
    b_2_17=False
    b_2_18=False
    b_2_19=False
    b_2_20=False
    b_2_21=False
    b_2_22=False
    b_2_23=False
    b_2_24=False
    b_2_25=False
    b_2_26=False
    b_2=[b_2_1,b_2_2,b_2_3,b_2_4,b_2_5,b_2_6,b_2_7,b_2_8,b_2_9,b_2_10,b_2_11,b_2_12,b_2_13,b_2_14,b_2_15,b_2_16,b_2_17,b_2_18,b_2_19,b_2_20,b_2_21,b_2_22,b_2_23,b_2_24,b_2_25,b_2_26]
    #构建b号转轮左右对应关系

    for i in range(26):
        b_2[i]=b_1[ord(arr_b[i])-97]
#    print(b_2)
    #此时,b号转轮建模成功 

    #c号转轮
    #右侧有26个触点
    c_1_1=False
    c_1_2=False
    c_1_3=False
    c_1_4=False
    c_1_5=False
    c_1_6=False
    c_1_7=False
    c_1_8=False
    c_1_9=False
    c_1_10=False
    c_1_11=False
    c_1_12=False
    c_1_13=False
    c_1_14=False
    c_1_15=False
    c_1_16=False
    c_1_17=False
    c_1_18=False
    c_1_19=False
    c_1_20=False
    c_1_21=False
    c_1_22=False
    c_1_23=False
    c_1_24=False
    c_1_25=False
    c_1_26=False
    c_1=[c_1_1,c_1_2,c_1_3,c_1_4,c_1_5,c_1_6,c_1_7,c_1_8,c_1_9,c_1_10,c_1_11,c_1_12,c_1_13,c_1_14,c_1_15,c_1_16,c_1_17,c_1_18,c_1_19,c_1_20,c_1_21,c_1_22,c_1_23,c_1_24,c_1_25,c_1_26]

    #b轮传给c轮
    for i in range(26):
        global num_zz_3
        c_1[i]=b_2[((num_zz_3)-26)+i]
#    print(c_1)
    #左侧有26个触点
    c_2_1=False
    c_2_2=False
    c_2_3=False
    c_2_4=False
    c_2_5=False
    c_2_6=False
    c_2_7=False
    c_2_8=False
    c_2_9=False
    c_2_10=False
    c_2_11=False
    c_2_12=False
    c_2_13=False
    c_2_14=False
    c_2_15=False
    c_2_16=False
    c_2_17=False
    c_2_18=False
    c_2_19=False
    c_2_20=False
    c_2_21=False
    c_2_22=False
    c_2_23=False
    c_2_24=False
    c_2_25=False
    c_2_26=False
    c_2=[c_2_1,c_2_2,c_2_3,c_2_4,c_2_5,c_2_6,c_2_7,c_2_8,c_2_9,c_2_10,c_2_11,c_2_12,c_2_13,c_2_14,c_2_15,c_2_16,c_2_17,c_2_18,c_2_19,c_2_20,c_2_21,c_2_22,c_2_23,c_2_24,c_2_25,c_2_26]
    #构建c号转轮左右对应关系

    for i in range(26):
        c_2[i]=c_1[ord(arr_c[i])-97]
#    print(c_2)
    #此时,c号转轮建模成功

    #c号转轮反射板

    for i in range(0,26,2):
        c_2[ord(arr_d[i])-97],c_2[ord(arr_d[i+1])-97]=c_2[ord(arr_d[i+1])-97],c_2[ord(arr_d[i])-97]

    #反向传播
    arr_c_2=[]
    arr_b_2=[]
    arr_a_2=[]
    arr_c_1=[]
    arr_b_1=[]
    arr_a_1=[]

    for i in range(26):
        arr_c_2.append(ord(arr_c[i])-97)
        arr_b_2.append(ord(arr_b[i])-97)
        arr_a_2.append(ord(arr_a[i])-97)
    arr_c_0=sorted(arr_c_2)
    arr_b_0=sorted(arr_b_2)
    arr_a_0=sorted(arr_a_2)
    for i in range(26):
        arr_c_1.append(arr_c_2.index(arr_c_0[i]))
        arr_b_1.append(arr_b_2.index(arr_c_0[i]))
        arr_a_1.append(arr_a_2.index(arr_c_0[i]))

    #c号转轮反向传播
    c_3_1=False
    c_3_2=False
    c_3_3=False
    c_3_4=False
    c_3_5=False
    c_3_6=False
    c_3_7=False
    c_3_8=False
    c_3_9=False
    c_3_10=False
    c_3_11=False
    c_3_12=False
    c_3_13=False
    c_3_14=False
    c_3_15=False
    c_3_16=False
    c_3_17=False
    c_3_18=False
    c_3_19=False
    c_3_20=False
    c_3_21=False
    c_3_22=False
    c_3_23=False
    c_3_24=False
    c_3_25=False
    c_3_26=False
    c_3=[c_3_1,c_3_2,c_3_3,c_3_4,c_3_5,c_3_6,c_3_7,c_3_8,c_3_9,c_3_10,c_3_11,c_3_12,c_3_13,c_3_14,c_3_15,c_3_16,c_3_17,c_3_18,c_3_19,c_3_20,c_3_21,c_3_22,c_3_23,c_3_24,c_3_25,c_3_26]
    for i in range(26):
        c_3[i]=c_2[arr_c_1[i]]
#    print(c_3)
    #c轮传给b轮
    b_3_1=False
    b_3_2=False
    b_3_3=False
    b_3_4=False
    b_3_5=False
    b_3_6=False
    b_3_7=False
    b_3_8=False
    b_3_9=False
    b_3_10=False
    b_3_11=False
    b_3_12=False
    b_3_13=False
    b_3_14=False
    b_3_15=False
    b_3_16=False
    b_3_17=False
    b_3_18=False
    b_3_19=False
    b_3_20=False
    b_3_21=False
    b_3_22=False
    b_3_23=False
    b_3_24=False
    b_3_25=False
    b_3_26=False
    b_3=[b_3_1,b_3_2,b_3_3,b_3_4,b_3_5,b_3_6,b_3_7,b_3_8,b_3_9,b_3_10,b_3_11,b_3_12,b_3_13,b_3_14,b_3_15,b_3_16,b_3_17,b_3_18,b_3_19,b_3_20,b_3_21,b_3_22,b_3_23,b_3_24,b_3_25,b_3_26]
    for i in range(26):
#        global num_zz_3
        b_3[i]=c_3[-(num_zz_3)+i]#左侧有26个触点
#    print(b_3)
    #b号转轮反向传播
    b_4_1=False
    b_4_2=False
    b_4_3=False
    b_4_4=False
    b_4_5=False
    b_4_6=False
    b_4_7=False
    b_4_8=False
    b_4_9=False
    b_4_10=False
    b_4_11=False
    b_4_12=False
    b_4_13=False
    b_4_14=False
    b_4_15=False
    b_4_16=False
    b_4_17=False
    b_4_18=False
    b_4_19=False
    b_4_20=False
    b_4_21=False
    b_4_22=False
    b_4_23=False
    b_4_24=False
    b_4_25=False
    b_4_26=False
    b_4=[b_4_1,b_4_2,b_4_3,b_4_4,b_4_5,b_4_6,b_4_7,b_4_8,b_4_9,b_4_10,b_4_11,b_4_12,b_4_13,b_4_14,b_4_15,b_4_16,b_4_17,b_4_18,b_4_19,b_4_20,b_4_21,b_4_22,b_4_23,b_4_24,b_4_25,b_4_26]
    for i in range(26):
        b_4[i]=b_3[arr_b_1[i]]
#    print(b_4)
    #b轮传给a轮
    a_3_1=False
    a_3_2=False
    a_3_3=False
    a_3_4=False
    a_3_5=False
    a_3_6=False
    a_3_7=False
    a_3_8=False
    a_3_9=False
    a_3_10=False
    a_3_11=False
    a_3_12=False
    a_3_13=False
    a_3_14=False
    a_3_15=False
    a_3_16=False
    a_3_17=False
    a_3_18=False
    a_3_19=False
    a_3_20=False
    a_3_21=False
    a_3_22=False
    a_3_23=False
    a_3_24=False
    a_3_25=False
    a_3_26=False
    a_3=[a_3_1,a_3_2,a_3_3,a_3_4,a_3_5,a_3_6,a_3_7,a_3_8,a_3_9,a_3_10,a_3_11,a_3_12,a_3_13,a_3_14,a_3_15,a_3_16,a_3_17,a_3_18,a_3_19,a_3_20,a_3_21,a_3_22,a_3_23,a_3_24,a_3_25,a_3_26]
    for i in range(26):
#        global num_zz_2
        a_3[i]=b_4[-(num_zz_2)+i]#左侧有26个触点
#    print(a_3)
    #a号转轮反向传播
    a_4_1=False
    a_4_2=False
    a_4_3=False
    a_4_4=False
    a_4_5=False
    a_4_6=False
    a_4_7=False
    a_4_8=False
    a_4_9=False
    a_4_10=False
    a_4_11=False
    a_4_12=False
    a_4_13=False
    a_4_14=False
    a_4_15=False
    a_4_16=False
    a_4_17=False
    a_4_18=False
    a_4_19=False
    a_4_20=False
    a_4_21=False
    a_4_22=False
    a_4_23=False
    a_4_24=False
    a_4_25=False
    a_4_26=False
    a_4=[a_4_1,a_4_2,a_4_3,a_4_4,a_4_5,a_4_6,a_4_7,a_4_8,a_4_9,a_4_10,a_4_11,a_4_12,a_4_13,a_4_14,a_4_15,a_4_16,a_4_17,a_4_18,a_4_19,a_4_20,a_4_21,a_4_22,a_4_23,a_4_24,a_4_25,a_4_26]
    for i in range(26):
        a_4[i]=a_3[arr_a_1[i]]
#    print(a_4)
    #a轮传回
    z_3_1=False
    z_3_2=False
    z_3_3=False
    z_3_4=False
    z_3_5=False
    z_3_6=False
    z_3_7=False
    z_3_8=False
    z_3_9=False
    z_3_10=False
    z_3_11=False
    z_3_12=False
    z_3_13=False
    z_3_14=False
    z_3_15=False
    z_3_16=False
    z_3_17=False
    z_3_18=False
    z_3_19=False
    z_3_20=False
    z_3_21=False
    z_3_22=False
    z_3_23=False
    z_3_24=False
    z_3_25=False
    z_3_26=False
    z_3=[z_3_1,z_3_2,z_3_3,z_3_4,z_3_5,z_3_6,z_3_7,z_3_8,z_3_9,z_3_10,z_3_11,z_3_12,z_3_13,z_3_14,z_3_15,z_3_16,z_3_17,z_3_18,z_3_19,z_3_20,z_3_21,z_3_22,z_3_23,z_3_24,z_3_25,z_3_26]
    for i in range(26):
#        global num_zz_1
        z_3[i]=a_4[-(num_zz_1)+i]
#    print(z_3)
    for i in range(26):
        if z_3[i]==True:
            return(chr(i+97))

if __name__ == '__main__':
    main()

简单解释一下代码,大体思路是用boolean类型的列表来表示每组26个触头的有电无电情况,在复现过程中用到了后来图灵在破解enigma机的时候用到的一种思想:将两个接线情况完全对称的enigma机并排放置。其中对True传递的处理方法和反射板的模拟方法是本人较为满意的地方。

反射过程中,有一个较有意思的东西。上图:

以四个触点为例,在正向传播时,我们以左面触点为基准,读取右面触点的序号为3 4 1 2,在反向传播时,我们以右面触点为基准,读取左面触点序号为2 4 1 3。如何根据3412来构建出2413是一个关键。笔者的一个朋友提供了一个很好的思路。假设3412储存在列表A中,对列表A进行从小到大的排序,储存在列表B中。将列表B中每一个元素在列表A中的下标记录到列表C中,列表C即为我们所求。

之后仿照正向传播,进行反向传播即可。

说一下代码的使用方法吧,在源码同一目录下建立一个名为enigma_code_book.txt文件,用于粗存enigma机型号,三个转轮和一个反射板的接线方式。

点击运行代码,随便输入由3组分别3个阿拉伯数字组成的enigma机批次号,如:123-456-789,点回车。此时程序会自动生成该批次号enigma机的接线方法。如果曾经使用过该批次enigma机,则在enigma_code_book中自动找到所需的接线方式。

再输入初始转轮位置,要求为三个小写英文字母,中间由逗号隔开,如:a,b,c。回车,再输入所需加密的明文内容,回车,即可生成密文。

如果想进行解密,则要求输入同一批次号,同一初始转子位置,输入密文,则可解密出明文。

需要注意的是,这里仿照历史中enigma机,只做了26个小写英文字母的加密,而没有数字,大写英文字母以及标点符号等的加密。因为这些只是在其基础上根据应用需求不同做的一些添砖加瓦的工作。笔者也同时考虑到,如果想加密汉语,可以首先将enigma机扩充进大写字母和阿拉伯数字,再结合base64的值即可。

总结

到此这篇关于用Python复现二战德军enigma密码机的文章就介绍到这了,更多相关Python enigma密码机内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python制作摩斯密码翻译器

    目录 分析 摩斯密码对照表 实现代码 结果  分析 摩斯密码是一种将文本信息作为一系列通断的音调.灯光或咔嗒声传输的方法,无需特殊设备,熟记的小伙伴即可直接翻译.它以电报发明者Samuel F. B. Morse的名字命名. 算法 算法非常简单.英语中的每个字符都被一系列"点"和"破折号"代替,或者有时只是单数的"点"或"破折号",反之亦然. 加密 在加密的情况下,我们一次一个地从单词中提取每个字符(如果不是空格),并将其与存

  • 用Python复现二战德军enigma密码机

    目录 前言 代码 总结 前言 我们知道,enigma机是德军二战中重要的情报加密机器,其有许多特点. 首先,它是一台加解密一体机 其次,它有排己性,虽然多次输入同一明文可能得到不同的密文,但明文a永远不可能加密为其本身.这样完美掩盖本身明文的性质是由反射板造成的,但也最终在图灵的利用下给了enigma机致命一击. enigma机先后有多种不同的型号,如3转轮型,5转轮型,5转轮选3转轮型等等.本人对三转轮enigma机进行的程序复现.需要说明的是,由于enigma机的精华部分是转子和反射板,所以

  • python 遗传算法求函数极值的实现代码

    废话不多说,大家直接看代码吧! """遗传算法实现求函数极大值-Zjh""" import numpy as np import random import matplotlib.pyplot as plt class Ga(): """求出二进制编码的长度""" def __init__(self): self.boundsbegin = -2 self.boundsend = 3 p

  • cookies应对python反爬虫知识点详解

    在保持合理的数据采集上,使用python爬虫也并不是一件坏事情,因为在信息的交流上加快了流通的频率.今天小编为大家带来了一个稍微复杂一点的应对反爬虫的方法,那就是我们自己构造cookies.在开始正式的构造之前,我们先进行简单的分析如果不构造cookies爬虫时会出现的一些情况,相信这样更能体会出cookies的作用. 网站需要cookies才能正常返回,但是该网站的cookies过期很快,我总不能用浏览器开发者工具获取cookies,然后让程序跑一会儿,每隔几分钟再手动获取cookies,再让

  • Python Numpy实现计算矩阵的均值和标准差详解

    目录 一.前言 二.详解计算均值和标准差 三.实践:CRITIC权重法计算变异系数 一.前言 CRITIC权重法是一种比熵权法和标准离差法更好的客观赋权法: 它是基于评价指标的对比强度和指标之间的冲突性来综合衡量指标的客观权重.考虑指标变异性大小的同时兼顾指标之间的相关性,并非数字越大就说明越重要,完全利用数据自身的客观属性进行科学评价. 对比强度是指同一个指标各个评价方案之间取值差距的大小,以标准差的形式来表现.标准差越大,说明波动越大,即各方案之间的取值差距越大,权重会越高: 指标之间的冲突

  • python目标检测yolo2详解及预测代码复现

    目录 前言 实现思路 1.yolo2的预测思路(网络构建思路) 2.先验框的生成 3.利用先验框对网络的输出进行解码 4.进行得分排序与非极大抑制筛选 实现结果 前言 ……最近在学习yolo1.yolo2和yolo3,写这篇博客主要是为了让自己对yolo2的结构有更加深刻的理解,同时要理解清楚先验框的含义. 尽量配合代码观看会更容易理解. 直接下载 实现思路 1.yolo2的预测思路(网络构建思路) YOLOv2使用了一个新的分类网络DarkNet19作为特征提取部分,DarkNet19包含19

  • python目标检测yolo3详解预测及代码复现

    目录 学习前言 实现思路 1.yolo3的预测思路(网络构建思路) 2.利用先验框对网络的输出进行解码 3.进行得分排序与非极大抑制筛选 实现结果 学习前言 对yolo2解析完了之后当然要讲讲yolo3,yolo3与yolo2的差别主要在网络的特征提取部分,实际的解码部分其实差距不大 代码下载 本次教程主要基于github中的项目点击直接下载,该项目相比于yolo3-Keras的项目更容易看懂一些,不过它的许多代码与yolo3-Keras相同. 我保留了预测部分的代码,在实际可以通过执行dete

  • python神经网络ResNet50模型的复现详解

    目录 什么是残差网络 什么是ResNet50模型 ResNet50网络部分实现代码 图片预测 什么是残差网络 最近看yolo3里面讲到了残差网络,对这个网络结构很感兴趣,于是了解到这个网络结构最初的使用是在ResNet网络里. Residual net(残差网络): 将靠前若干层的某一层数据输出直接跳过多层引入到后面数据层的输入部分. 意味着后面的特征层的内容会有一部分由其前面的某一层线性贡献. 其结构如下: 深度残差网络的设计是为了克服由于网络深度加深而产生的学习效率变低与准确率无法有效提升的

  • python神经网络MobileNet模型的复现详解

    目录 什么是MobileNet模型 MobileNet网络部分实现代码 图片预测 什么是MobileNet模型 MobileNet是一种轻量级网络,相比于其它结构网络,它不一定是最准的,但是它真的很轻 MobileNet模型是Google针对手机等嵌入式设备提出的一种轻量级的深层神经网络,其使用的核心思想便是depthwise separable convolution. 对于一个卷积点而言: 假设有一个3×3大小的卷积层,其输入通道为16.输出通道为32.具体为,32个3×3大小的卷积核会遍历

  • python神经网络Xception模型复现详解

    目录 什么是Xception模型 Xception网络部分实现代码 图片预测 Xception是继Inception后提出的对Inception v3的另一种改进,学一学总是好的 什么是Xception模型 Xception是谷歌公司继Inception后,提出的InceptionV3的一种改进模型,其改进的主要内容为采用depthwise separable convolution来替换原来Inception v3中的多尺寸卷积核特征响应操作. 在讲Xception模型之前,首先要讲一下什么是

  • python神经网络InceptionV3模型复现详解

    目录 神经网络学习小记录21——InceptionV3模型的复现详解 学习前言什么是InceptionV3模型InceptionV3网络部分实现代码图片预测 学习前言 Inception系列的结构和其它的前向神经网络的结构不太一样,每一层的内容不是直直向下的,而是分了很多的块. 什么是InceptionV3模型 InceptionV3模型是谷歌Inception系列里面的第三代模型,其模型结构与InceptionV2模型放在了同一篇论文里,其实二者模型结构差距不大,相比于其它神经网络模型,Inc

随机推荐