on
모델링 - 케일 LAI 예측 모델 with AIHub
모델링 - 지난 글
목차
이용 데이터 항목
AIHub에서 구득한 이미지 메타 데이터 내에 생육 조사 항목을 이용하였다.
생육 데이터
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
: 재식 밀도
케일 LAI 예측에 사용한 데이터 항목
DAP
: 정식 후 일자
LAI
: 엽면적 지수
LAI의 경우 해당 데이터셋에서는 엽면적 데이터를 제공하지 않기 때문에 정확한 엽면적 값을 얻는 것이 불가능하다. 따라서 정확한 값은 알 수 없겠지만, 패턴은 볼 수 있을 것이라 판단하여 다음 식을 통해 LAI를 간이로 산출하였다.
LAI
: 엽수 * 엽장 * 엽폭 * plantDensity (24) /10000
DAP에 따른 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 예측
수식 정의
우선 엽수에 따른 엽장의 길이를 예측하기 위헤서 배추모델의 eachLenDistribution
과 eachLeafArea
수식을 엑셀에 옮겨 값을 도출해 보았다.
케일의 LAI 예측을 위한 엑셀 테이블은 다음과 같다.
LAI 예측을 위한 엑셀 테이블
엑셀에서 엽장 및 엽면적을 예측하기 위해서는 엽수별로 계산해야 했다.
우선 엽수의 경우 엽수별로 계산하기 위하여 1~엽수를 의미하는 leafnumber_range1
, 엽수 갯수 만큼의 엽수를 의미하는 leafnumber_range2
컬럼을 만들어야 했다.
그리고 eachLenDistribution
의 a
, 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
엽장에 따른 엽면적에 대한 2차식을 도출하고, eachLeafArea
의 수식을 다음과 같이 변경하였다.
eachLeafArea
: =0.4179eachLen^2 + 3.6915eachLen
엽면적 모수 찾기
위에서 정의한 수식에서 케일에 맞는 모수를 찾기 위해 처음에 계산한 간이 LAI 값을 바탕으로 오차를 구하여 엑셀 해찾기를 통해 모수를 찾고자 하였다.
해찾기를 위해 찾아야 하는 모수를 위한 변수를 만들어 주고, (LAI - LAI_expect)^2를 하여 error를 구하였다.
해찾기를 위한 테이블
그리고 위 수식에 해찾기를 위한 변수를 적용하기 위해 수식을 일부 변경하였다.
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
가 최소가 되는 해를 찾을 수 있도록 설정하였다.
해찾기 설정
해찾기 결과에 따른 결과는 다음과 같다.
eachLenDist_a
: =IF(M2<3, 1, 11.258377311819 * LN(leafnumber) - 9.66635313517988)
eachLenDist_b
: =IF(M2<3, 1, 0.0929621981017087 * leafnumber + 1.85657767789082)
해찾기 결과에 따른 LAI_expect의 결과는 다음과 같다.
데이터셋으로 계산한 간이 LAI와 모델로 계산한 LAI_expect 값은 다음과 같은 결과를 보였으며,
데이터셋으로 계산한 간이 LAI와 모델로 계산한 LAI_expect 사이의 상관관계는 다음과 같다.
원으로 피팅하기
잎의 모양은 둥글다. 하지만 위에서 계산한 간이 LAI는 leaf_width
와 leaf_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)
원으로 피팅한 최종적인 예측 결과는 다음과 같다.
직사각형과 원으로 피팅한 결과를 비교해 보았다.
결론
-
배추 모델의 stage.py을 참고하여 케일의 LAI 예측 모델을 엑셀로 구현하였다.
-
배추 모델의 경우
eachLenDistribution
에서 엽서에 따른 엽장을 계산하고,eachLeafArea
은eachLenDistribution
에서 계산한 엽장을 기반으로 엽면적을 계산한다. -
AIHub에서 구득한 데이터에는 엽면적 데이터가 존재하지 않았기 때문에,
leaf width
,leaf length
를 이용하여 간이 엽면적을 계산하였고,leaf_cnt * leafd width * leaf length * plantDensity / 10000
를 통해 간이 LAI를 계산하여 피팅하였다. -
AIHub에서 구득한
leaf length
와 간이로 도출한 엽면적의 관계에서 2차식을 도출하여eachLeafArea
에 적용하였다. -
배추 모델의 수식을 기반으로 엑셀 해찾기 기능을 통해
eachLenDistribution
수식에서 케일에 맞는 모수를 찾아 적용하였다. -
잎 면적을 직사각형과 원으로 고려하여 계산한 결과를 비교해 보았다. 결과적으로 원으로 피팅한 결과에 더 잘 맞는 것을 확인할 수 있었다.
-
잎의 면적을 구하여 계산하였으나 결과적으로 엽폭의 비로 계산한 것과 다름이 없을 뿐더러 관측한 결과를 토대로 다시 같은 데이터에 피팅하였기 때문에 과적합이 된 결과일 가능성이 높다. 따라서 정확한 식을 도출하기 위해서는 추가 실험을 통해서 다른 데이터 셋을 확보하여 다시 확인해야 할 필요가 있다.
-
eachLenDistribution
은 엽서에 따른 엽장을 계산한다. 위eachLen
그래프를 보면 엽서에 따라 엽장의 길이가 증가했다가 감소하는 그래프의 양상을 보였다. 이는 배추의 결구 형성을 반영했기 때문으로 보이며, 케일의 경우 결구가 형성되지 않기 때문에 확인할 필요가 있다.
배추의 엽서에 따른 엽장 비교
참고문헌
https://docs.google.com/presentation/d/1xkE72TZSHm_989IAr774iyOr8nvSY-Hv/edit