모델링 - 케일 LAI 예측 모델 with AIHub
AIHub에서 구득한 데이터로 케일 LAI 예측 모델 제작



모델링 - 지난 글

목차

  1. 이용 데이터 항목
  2. LAI 예측용 데이터
  3. 배추 모델에서의 LAI
  4. 수식 정의
  5. 엽장 모수 찾기
  6. 엽면적 모수 찾기
  7. 결론
  8. 참고문헌




이용 데이터 항목

AIHub에서 구득한 이미지 메타 데이터 내에 생육 조사 항목을 이용하였다.

image생육 데이터

crops_id: 작물개체코드
measured_date: 측정일
stem_length: 초장
leaf_cnt: 엽수
leaf_width: 엽폭
leaf_length: 엽장
fr_weight: 착 (과중)
petiole_length: 엽병장
leaf_index: 엽형지수
spad: 엽록소 함량
fname: 이미지의 이름


LAI 예측용 데이터

케일의 LAI 예측을 위해서 사용한 데이터는 다음과 같다.

leaf_cnt: 엽수
leaf_width: 엽폭
leaf_length: 엽장
plantDensity: 재식 밀도


image케일 LAI 예측에 사용한 데이터 항목

DAP: 정식 후 일자
LAI: 엽면적 지수

LAI의 경우 해당 데이터셋에서는 엽면적 데이터를 제공하지 않기 때문에 정확한 엽면적 값을 얻는 것이 불가능하다. 따라서 정확한 값은 알 수 없겠지만, 패턴은 볼 수 있을 것이라 판단하여 다음 식을 통해 LAI를 간이로 산출하였다.

LAI: 엽수 * 엽장 * 엽폭 * plantDensity (24) /10000


imageDAP에 따른 LAI



배추 모델에서의 LAI

배추 모델에서 LAI를 산출하는 순서는 다음과 같다.

def eachLenDistribution(self, leafnumber):  ## internal function
    eachLenDist = []
    if leafnumber < 8:                    ## limit of leafnumber 8장 보다 작을 경우 오류 방지
        for i in range(leafnumber):
            eachLenDist.append(1.0)
    else:
        a = 20.347*np.log(leafnumber) - 40.703
        b = 0.2086*(leafnumber) + 1.6862
        for i in range(1,leafnumber+1):
            eachLen = a * np.exp(-0.5 * ((i - b) / b)**2)
            eachLenDist.append(eachLen)
    # print(eachLenDist)
    return eachLenDist

def eachLeafArea(self, eachLenDist):       ## internal function
    eachLeafArea = [0.3512*each**2 + 1.1328*each for each in eachLenDist]
    # print(eachLeafArea)
    return eachLeafArea

lai  =  plantGreenLeafArea * plantDensity / 10000


eachLenDistribution에서 엽서에 따른 엽장의 길이에 대한 경험적 회귀식을 적용하여 엽서에 따른 엽장을 도출한다.

eachLeafArea에서는 엽장엽면적의 비율에 대한 경험적 2차식을 적용하여 엽면적을 도출한다.



케일 LAI 예측

수식 정의

우선 엽수에 따른 엽장의 길이를 예측하기 위헤서 배추모델의 eachLenDistributioneachLeafArea 수식을 엑셀에 옮겨 값을 도출해 보았다.

케일의 LAI 예측을 위한 엑셀 테이블은 다음과 같다.

imageLAI 예측을 위한 엑셀 테이블


엑셀에서 엽장 및 엽면적을 예측하기 위해서는 엽수별로 계산해야 했다.

우선 엽수의 경우 엽수별로 계산하기 위하여 1~엽수를 의미하는 leafnumber_range1, 엽수 갯수 만큼의 엽수를 의미하는 leafnumber_range2 컬럼을 만들어야 했다. 그리고 eachLenDistributiona, b,eachLen 세 변수를 각각 eachLenDist_a, eachLenDist_b, eachLen의 컬럼에서 계산하였다.


엽장

엽장 계산을 위한 엑셀 수식은 다음과 같다. 배추 모델에서는 음수가 나오는 오류를 방지하기 위해 엽수가 8장 이하일 경우 엽장을 1로 고려하였다. 하지만 케일의 경우 정식후 엽수가 3~4장이기 때문에 엽수가 3장 미만일 경우 엽장이 1이 되도록 수식을 변경하였다.

eachLenDist_a: =IF(M2<3, 1, 20.347 * LN(leafnumber) - 40.703)
eachLenDist_b: =IF(M2<3, 1, 0.2086 * leafnumber + 1.6862)
eachLen: =eachLenDist_a * exp(-0.5 * ((leafnumber_range1 - eachLenDist_b) / eachLenDist_b)^2)


엽면적

엽면적 계산을 위한 엑셀 수식은 다음과 같다.

eachLeafArea: =0.3512 * eachLen^2 + 1.1328 * eachLen
LeafArea: =SUM(eachLeafArea)


LAI

LAI 계산을 위한 엑셀 수식은 다음과 같다.

LAI_expect: =LeafArea * plantDensity / 10000


엽장 모수 찾기

우선 엽면적과 엽장에 대한 2차식을 도출하여 엽장으로 엽면적을 예측할 수 있도록 하였다.

엽면적의 경우 해당 데이터셋에는 포함되어있지 않기 때문에 앞서 설명했듯 패턴을 볼 수 있도록 간이 엽면적을 계산하였다.

leaf_area: leaf_width * leaf_length

Leaf length_Leaf Area


엽장에 따른 엽면적에 대한 2차식을 도출하고, eachLeafArea의 수식을 다음과 같이 변경하였다.

eachLeafArea: =0.4179eachLen^2 + 3.6915eachLen



엽면적 모수 찾기

위에서 정의한 수식에서 케일에 맞는 모수를 찾기 위해 처음에 계산한 간이 LAI 값을 바탕으로 오차를 구하여 엑셀 해찾기를 통해 모수를 찾고자 하였다.

해찾기를 위해 찾아야 하는 모수를 위한 변수를 만들어 주고, (LAI - LAI_expect)^2를 하여 error를 구하였다.

image해찾기를 위한 테이블


그리고 위 수식에 해찾기를 위한 변수를 적용하기 위해 수식을 일부 변경하였다.

eachLenDist_a: =IF(M2<3, 1, a1 * LN(leafnumber) - a2)
eachLenDist_b: =IF(M2<3, 1, b1 * leafnumber + b2)

그리고 목표 설정을 error로 설정하고, 변수 셀을 a1,a2,b1,b2로 설정하여 최소 error가 최소가 되는 해를 찾을 수 있도록 설정하였다.

image해찾기 설정


해찾기 결과에 따른 결과는 다음과 같다.

eachLenDist_a: =IF(M2<3, 1, 11.258377311819 * LN(leafnumber) - 9.66635313517988)
eachLenDist_b: =IF(M2<3, 1, 0.0929621981017087 * leafnumber + 1.85657767789082)


eachLenDist_a eachLenDist_b eachLen eachLeafArea LeafArea

해찾기 결과에 따른 LAI_expect의 결과는 다음과 같다.

LAI predict


데이터셋으로 계산한 간이 LAI와 모델로 계산한 LAI_expect 값은 다음과 같은 결과를 보였으며,

LAI_compare


데이터셋으로 계산한 간이 LAI와 모델로 계산한 LAI_expect 사이의 상관관계는 다음과 같다.

LAI Corr


원으로 피팅하기

잎의 모양은 둥글다. 하지만 위에서 계산한 간이 LAI는 leaf_widthleaf_length를 곱하여 구했기 때문에 직사각형 면적으로 간주한 것이나 다름이 없다. 따라서 적확도를 조금 더 높이기 위해 직사각형의 면적에 80%를 잎의 면적이라 간주하고 계산을 다시해 보았다.

잎의 면적을 원이라 간주하고 계산을 다시 해본 결과는 다음과 같다.

eachLeafArea: =0.3344 * eachLen^2 + 2.9532 * eachLen
eachLenDist_a: =IF(M2<3, 1, 11.7865562792926 * LN(leafnumber) - 11.6352702232264)
eachLenDist_b: =IF(M2<3, 1, 0.01 * leafnumber + 3.87977912347845)


원으로 피팅한 최종적인 예측 결과는 다음과 같다.

LAI_compare


직사각형과 원으로 피팅한 결과를 비교해 보았다.

LAI_results


결론

image배추의 엽서에 따른 엽장 비교

드라이브



참고문헌

https://docs.google.com/presentation/d/1xkE72TZSHm_989IAr774iyOr8nvSY-Hv/edit